Skip to main content

概述

在本教程中,我们将使用 LangGraph 构建一个检索智能体。 LangChain 提供了内置的智能体实现,使用 LangGraph 原语实现。如果需要更深层次的自定义,可以直接在 LangGraph 中实现智能体。本指南演示了一个检索智能体的示例实现。检索智能体在你希望大语言模型(LLM)决定是从向量存储中检索上下文还是直接回复用户时非常有用。 在本教程结束时,我们将完成以下工作:
  1. 获取和预处理用于检索的文档。
  2. 为语义搜索索引这些文档并为智能体创建检索工具。
  3. 构建一个能够决定何时使用检索工具的智能 RAG 系统。
混合 RAG

概念

我们将涵盖以下概念:

设置

让我们下载所需的包并设置 API 密钥:
注册 LangSmith 以快速发现问题并提高 LangGraph 项目的性能。LangSmith 让你使用追踪数据来调试、测试和监控使用 LangGraph 构建的大语言模型(LLM)应用。

1. 预处理文档

  1. 获取用于 RAG 系统的文档。我们将使用 Lilian Weng 的优秀博客中最近的三个页面。我们首先使用 CheerioWebBaseLoader 获取页面内容:
  1. 将获取的文档分割成较小的块以索引到向量存储中:

2. 创建检索工具

现在我们有了分割后的文档,可以将它们索引到向量存储中用于语义搜索。
  1. 使用内存向量存储和 OpenAI 嵌入:
  1. 使用 LangChain 预构建的 createRetrieverTool 创建检索工具:

3. 生成查询

现在我们将开始构建智能 RAG 图的组件(节点)。
  1. 构建 generateQueryOrRespond 节点。它将调用大语言模型(LLM)根据当前图状态(消息列表)生成响应。根据输入消息,它将决定使用检索工具进行检索,还是直接回复用户。注意我们通过 .bindTools 让聊天模型访问之前创建的 tools
  1. 在随机输入上试试:
输出:
  1. 提一个需要语义搜索的问题:
输出:

4. 评估文档

  1. 添加一个节点——gradeDocuments——来判断检索到的文档是否与问题相关。我们将使用带有 Zod 结构化输出的模型进行文档评分。我们还将添加一个条件边——checkRelevance——检查评分结果并返回下一个要前往的节点名称(generaterewrite):
  1. 使用不相关的文档在工具响应中运行:
  1. 确认相关文档被正确分类:

5. 重写问题

  1. 构建 rewrite 节点。检索工具可能会返回不相关的文档,这表明需要改进原始用户问题。为此,我们将调用 rewrite 节点:
  1. 试试看:
输出:

6. 生成答案

  1. 构建 generate 节点:如果通过了评分检查,我们可以根据原始问题和检索到的上下文生成最终答案:
  1. 试试看:
输出:

7. 组装图

现在我们将所有节点和边组装成一个完整的图:
  • generateQueryOrRespond 开始,确定是否需要调用检索工具
  • 使用条件边路由到下一步:
    • 如果 generateQueryOrRespond 返回了 tool_calls,调用检索工具检索上下文
    • 否则,直接回复用户
  • 评估检索到的文档内容与问题的相关性(gradeDocuments)并路由到下一步:
    • 如果不相关,使用 rewrite 重写问题,然后再次调用 generateQueryOrRespond
    • 如果相关,继续到 generate,使用包含检索文档上下文的 ToolMessage 生成最终响应

8. 运行智能 RAG

现在让我们用一个问题测试完整的图:
输出: