返回资源中心

LangChain + LlamaIndex Hybrid RAG Pipeline

工作流
机器学习
1 次浏览
0 个赞
raghybridproduction

资源描述

面向生产环境的 LangChain + LlamaIndex 混合 RAG 工作流,融合 BM25 稀疏检索与向量密集检索,支持多文档分块、查询路由、答案验证及溯源标注。适用于需要高精度、可解释性与鲁棒性的企业级知识问答系统,显著提升长尾查询召回率与答案可信度。

详细内容

# LangChain + LlamaIndex 混合 RAG 工作流指南 ## 工作流概述 本工作流构建于 LangChain 的链式编排能力与 LlamaIndex 的高效索引机制之上,实现双引擎协同的 Hybrid RAG:通过 BM25(关键词匹配)与 dense embedding(语义匹配)并行检索,结合查询路由决策器动态选择最优检索路径,并引入答案验证(Answer Validation)与溯源标注(Citation Anchoring)模块,确保输出结果具备可追溯性与可信度。适用于金融、法律、医疗等对准确性与可解释性要求严苛的生产场景。 ## 分步骤操作说明 ### 步骤 1:环境准备与依赖安装 ```bash pip install langchain==0.1.16 llama-index==0.10.34 sentence-transformers python-dotenv # 注意:需与 LangChain 主仓库中 `libs/langchain/langchain/chains/retrieval` 模块版本兼容(推荐使用 v0.1.x 系列) ``` ### 步骤 2:构建混合索引(LlamaIndex 端) - 使用 `SimpleDirectoryReader` 加载多源文档(PDF/Markdown/CSV); - 配置双路径分块策略:按语义段落切分(`SentenceSplitter`)+ 按标题层级切分(`HierarchicalNodeParser`); - 分别构建 BM25Index(基于 `BM25Retriever`)和 VectorStoreIndex(使用 `SentenceTransformerEmbedding`); - 将两个索引注册至 `StorageContext` 并持久化至本地(`./hybrid_index/`)。 ### 步骤 3:定义检索器与路由逻辑(LangChain 端) - 实例化 `HybridRetriever`(继承自 `BaseRetriever`),封装 BM25 和 vector retrievers; - 构建 `QueryRouterChain`:基于 LLM(如 `ChatOpenAI(temperature=0)`)对输入 query 进行意图分类(e.g., "factual", "comparative", "definition"),自动选择主检索器(BM25 优先处理术语精确查询,dense 优先处理语义模糊查询); - 设置 `TopK` 统一为 5,合并后去重并重排序(RRF 或 score-weighted fusion)。 ### 步骤 4:组装端到端 RAG Chain - 使用 `RetrievalQAWithSourcesChain`(或自定义 `ConversationalRetrievalChain`); - Prompt 模板需显式要求:① 输出答案;② 标注引用来源(`source: <file_name> | page: <num> | chunk_id: <uuid>`);③ 对低置信度答案添加 `[VERIFICATION_REQUIRED]` 标识; - 后处理启用 `AnswerValidator`(基于 `SelfQueryRetriever` + 规则校验:检查答案是否含矛盾陈述、是否超出检索上下文范围)。 ### 步骤 5:部署与监控集成 - 将 Chain 封装为 FastAPI endpoint,暴露 `/query` POST 接口; - 添加结构化日志(`logging` + `structlog`),记录 query、检索耗时、top-k 文档 ID、验证状态; - 集成 Prometheus metrics:`rag_retrieval_latency_seconds`, `rag_verification_rate`, `rag_citation_coverage_ratio`; - 定期用 `RAGAS` 评估集(如 `context_recall`, `faithfulness`, `answer_relevancy`)进行离线 benchmark。 ## 注意事项与最佳实践 - ✅ **索引一致性**:LlamaIndex 的 `VectorStoreIndex` 与 LangChain 的 `Chroma`/`FAISS` 向量库需共享同一 embedding model,避免语义空间错位; - ✅ **路由泛化性**:避免硬编码 query 分类规则,建议用 few-shot 示例微调轻量 LLM(如 `phi-3-mini`)替代规则引擎; - ✅ **溯源可靠性**:启用 `node_with_score` 保留原始 chunk 元数据(`doc_id`, `page_label`, `section_title`),禁止仅返回向量相似度分数; - ⚠️ **内存优化**:BM25Index 在大规模文档下内存占用高,建议搭配 `RankBM25` + `diskcache` 或改用 `Elasticsearch` 替代; - ⚠️ **验证开销**:`AnswerValidator` 默认同步执行,高并发场景下应异步化或降级为采样验证(10% 请求)。 ## 常见问题提示 - **Q:检索结果不相关,但 embedding 相似度高?** A:检查分块粒度是否过粗(导致语义混杂),建议在 LlamaIndex 中启用 `SentenceWindowNodeParser` 并关联前后句上下文。 - **Q:BM25 与 dense 检索结果完全不重叠?** A:确认两者均基于相同预处理(统一小写、去停用词、未 stem),且 BM25 使用 `tokenize` 而非 `whitespace` 分词器。 - **Q:溯源标注显示 `source: unknown`?** A:确保加载文档时设置 `file_metadata_fn` 显式提取 `file_name` 和 `page` 属性,并在 `Node` 构建时传入 `metadata` 字典。 - **Q:路由决策不稳定?** A:增加路由 prompt 的 system message 约束,例如:`"Output ONLY one of: [factual, comparative, definition, procedural]. No explanation."`,并启用 `output_parser = StrOutputParser()` 强制格式。 > 参考实现位置:[LangChain 官方 retrieval chains](https://github.com/langchain-ai/langchain/tree/master/libs/langchain/langchain/chains/retrieval) —— 重点关注 `RetrievalQA` 与 `ConversationalRetrievalChain` 的扩展机制。