Skip to main content
本教程将带您了解如何使用 xParse SDK + LangGraph 构建 Agentic RAG,智能重写问题、检索与回答,实现更准确的企业知识问答。

什么是 Agentic RAG?

Agentic RAG(Retrieval-Augmented Generation)是一种结合信息检索和生成式 AI 的技术。与传统的 RAG 不同,Agentic RAG 通过智能决策机制,能够:
  1. 智能判断:判断问题是否需要检索,还是可以直接回答
  2. 问题重写:当检索结果不相关时,自动重写问题以获取更好的结果
  3. 相关性评估:评估检索到的文档片段是否与问题相关
  4. 迭代优化:通过多轮检索和重写,逐步优化答案质量
Agentic RAG 的核心流程包括:
  1. 文档处理:将非结构化文档转换为向量表示
  2. 向量存储:将向量数据存储到向量数据库
  3. 智能检索:根据用户问题智能检索相关文档片段
  4. 问题重写:当检索结果不相关时,重写问题再次检索
  5. 生成回答:基于检索到的相关上下文生成高质量答案

Agentic RAG 工作流程

环境准备

首先安装必要的依赖:
创建 .env 文件存储配置:
提示:TEXTIN_APP_IDTEXTIN_SECRET_CODE 参考 API Key,请登录 Textin 工作台 获取。示例中使用 通义千问 的大模型能力,其他模型用法类似。
下面我们将分步骤构建 Agentic RAG 系统。首先导入必要的库:

Step 1: 使用 xParse SDK 构建知识库

首先,我们需要使用 xParse SDK 解析文档,再通过 LangChain 进行分块和向量化,最终存入 Milvus 向量数据库。这是知识库构建的基础步骤。 初始化 xParse 客户端并构建知识库:

Step 2: 初始化向量数据库和大模型

接下来,我们需要初始化向量数据库和大模型。重要:向量数据库必须使用与构建知识库时相同的 embedding 模型,以确保语义空间一致。

Step 3: 定义状态结构

LangGraph 使用状态来管理工作流中的数据流。我们需要定义一个 GraphState 来存储工作流中的各种信息:
状态字段说明:
  • question:用户提出的原始问题
  • rewritten_question:重写后的问题(用于优化检索)
  • documents:检索到的相关文档片段
  • generation:最终生成的答案
  • next:指示下一步应该执行哪个节点
  • retrieval_count:检索次数(用于防止无限循环)

Step 4: 定义节点函数

工作流由多个节点组成,每个节点负责特定的任务。让我们逐个实现这些节点:

4.1 判断是否需要检索

should_retrieve 节点使用 LLM 判断问题是否需要从知识库检索信息:

4.2 检索相关文档

retrieve 节点使用向量检索在知识库中查找相关内容:
注意:这里优先使用 rewritten_question(如果存在),否则使用原始问题。每次检索后,retrieval_count 会增加 1。

4.3 评估检索结果的相关性

grade_documents 节点评估检索到的文档是否与问题相关:
如果文档不相关,将触发问题重写。为了避免无限循环,当检索次数达到 2 次时,即使文档不相关也会强制生成答案。

4.4 重写问题

rewrite_question 节点基于检索结果或原始问题,生成更优化的查询:

4.5 生成答案

generate 节点基于检索结果或直接生成答案:

Step 5: 构建 LangGraph 工作流

现在我们将所有节点组合成一个完整的工作流:
工作流逻辑:
  1. should_retrieve 开始
  2. 如果需要检索,进入 retrievegrade_documents
  3. 如果文档相关,进入 generate;如果不相关,进入 rewrite_questionretrieve(循环)
  4. 如果不需要检索,直接进入 generate

Step 6: 使用示例

创建一个便捷的提问函数:
使用示例:

完整代码示例

下面是一个完整的、可以直接运行的示例:

与普通 RAG 的区别

普通 RAG

Agentic RAG

核心优势
  1. 智能决策:自动判断是否需要检索,避免不必要的检索
  2. 质量保证:评估检索结果的相关性,确保答案质量
  3. 迭代优化:通过问题重写,逐步优化检索结果
  4. 灵活应对:能够处理简单问题和复杂问题

实际应用场景

场景 1: 企业知识库问答

需求:员工可以通过自然语言提问,快速找到产品文档、技术文档等信息。 实现
  • 使用 xParse SDK 解析企业文档,通过 LangChain 分块和向量化
  • Agentic RAG 自动判断问题类型
  • 智能检索和重写,确保找到最相关的信息

场景 2: 客服助手

需求:客服团队需要快速回答客户问题,从 FAQ 和产品手册中找到答案。 实现
  • 将 FAQ 和产品手册存入知识库
  • Agentic RAG 能够:
    • 识别简单问候,直接回答
    • 识别需要检索的问题,智能检索
    • 当检索结果不相关时,自动优化查询

场景 3: 技术文档问答

需求:开发者可以通过自然语言提问,快速找到 API 文档、使用示例等。 实现
  • 使用 xParse SDK 解析文档后,通过 MarkdownHeaderTextSplitter 按标题层级分块,保持文档结构
  • Agentic RAG 能够理解技术术语,重写查询以匹配文档中的关键词

进阶优化

1. 添加检索次数限制

避免无限循环重写和检索:

2. 添加对话历史

支持多轮对话:

3. 混合检索策略

结合向量检索和关键词检索:

4. 添加引用来源

在答案中标注信息来源:

常见问题

Q: Agentic RAG 比普通 RAG 慢吗? A: 可能会稍慢一些,因为增加了判断和评估步骤。但通过智能决策,可以避免不必要的检索,整体效率可能更高。 Q: 如何控制重写次数? A: 在 grade_documents 函数中添加检索次数限制,避免无限循环。 Q: 可以使用其他 LLM 吗? A: 可以。LangChain 支持多种 LLM,只需替换 ChatTongyi 为对应的类,如 ChatOpenAI(OpenAI)、ChatZhipuAI(智谱AI)等。 Q: 如何提高检索质量? A:
  1. 优化分块策略,确保文档块大小和重叠合适
  2. 使用高质量的 embedding 模型(如 text-embedding-v4
  3. 调整检索数量(k 值)
  4. 优化问题重写的提示词
Q: 如何处理多轮对话? A: 在状态中添加 chat_history 字段,在生成答案时考虑历史对话上下文。

总结

通过本教程,您已经学会了如何构建一个 Agentic RAG 系统。核心思路是:
  1. xParse SDK 负责文档解析:使用 xParse SDK 将文档转换为 Markdown,再通过 LangChain 分块和向量化构建知识库
  2. LangGraph 负责工作流:构建智能的检索和生成流程
  3. 智能决策:通过判断、评估、重写等步骤,逐步优化答案质量
相比普通 RAG,Agentic RAG 能够:
  • 智能判断是否需要检索
  • 评估检索结果的相关性
  • 自动重写问题以优化检索
  • 生成更准确、更相关的答案
这样,您就有了一个”会思考”的 RAG 系统!

下一步