LangChain:检索器和检索增强生成(RAG)

LangChain 的检索器是 RAG(检索增强生成)系统的核心组件,它提供了一套统一的接口来连接各种不同的数据源。无论是向量数据库、搜索引擎,还是传统的数据库,都可以通过这个接口被 LLM 应用轻松调用。

大型语言模型(LLM)功能强大,但它们有两个关键限制:

  • 有限的上下文——无法一次性处理整个语料库。
  • 静态的知识——它们的训练数据在某个时间点之后就固定了。

检索通过在查询时获取相关的外部知识来解决这些问题。这是检索增强生成(RAG)的基础:用特定上下文的信息来增强大型语言模型(LLM)的答案。

构建知识库

知识库是检索时使用的文档或结构化数据的存储库。如果你需要一个自定义知识库,可以使用 LangChain 的文档加载器和向量存储来基于你自己的数据构建一个。

如果已经有一个知识库(例如 SQL 数据库、CRM 或内部文档系统),则无需重建。可以:

  • 将其作为工具连接到 Agentic RAG 中的智能体。
  • 查询它,并将检索到的内容作为上下文提供给 LLM(2步式 RAG)。

请参考以下教程,构建一个可搜索的知识库和一个最小化的 RAG 工作流:

从检索到 RAG

检索使大语言模型( LLMs)能够在运行时访问相关上下文。但大多数实际应用更进一步:它们将检索与生成相结合,以生成有据可依、具备上下文感知的答案。

这就是 检索增强生成(RAG) 背后的核心理念。检索管道成为了一个更广泛系统的基石,该系统将搜索与生成相结合。

检索管道

一个典型的检索工作流如下所示:

flowchart LR
  S(["Sources
(Google Drive, Slack, Notion, etc.)"]) --> L[Document Loaders] L --> A([Documents]) A --> B[Split into chunks] B --> C[Turn into embeddings] C --> D[(Vector Store)] Q([User Query]) --> E[Query embedding] E --> D D --> F[Retriever] F --> G[LLM uses retrieved info] G --> H([Answer]) classDef trigger fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#14532D classDef process fill:#DBEAFE,stroke:#2563EB,stroke-width:2px,color:#1E3A8A classDef output fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#581C87 classDef neutral fill:#F3F4F6,stroke:#9CA3AF,stroke-width:2px,color:#374151 class S,Q trigger class L,B,C,E,F,G process class D output class A,H neutral

每个组件都是模块化的:你可以更换加载器、分割器、嵌入模型或向量存储,而无需重写应用程序的逻辑。

构建模块

使用到的组件:

  • 文档加载器:从外部来源(如Google Drive、Slack、Notion等)获取数据,并返回标准化的Document对象。
  • 嵌入模型:将文本转换为数字向量,以便语义相似的文本在向量空间中聚集在一起。
  • 向量数据库:用于存储和搜索嵌入数据的专用数据库。
  • 检索器:是一个接口,它根据非结构化查询返回文档。

RAG 架构

RAG 可以通过多种方式实现,具体取决于你的系统需求。我们将在以下各节中概述每种类型。

架构 描述 控制力 灵活性 延迟 示例用例
2步式 RAG 检索总是在生成之前执行。简单且可预测 ✅ 高 ❌ 低 ⚡ 快 常见问题解答、文档机器人
Agentic RAG 由 LLM 驱动的智能体在推理过程中决定何时以及如何检索 ❌ 低 ✅ 高 ⏳ 可变 可访问多个工具的研究助手
混合式 结合了两种方法的特点,并加入了验证步骤 ⚖️ 中等 ⚖️ 中等 ⏳ 可变 带有质量验证的领域特定问答

延迟:在 2步式 RAG 中,延迟通常更可预测,因为 LLM 调用的最大次数是已知且有上限的。这种可预测性假设 LLM 推理时间是主导因素。然而,实际延迟也可能受检索步骤性能的影响——例如 API 响应时间、网络延迟或数据库查询——这些可能因所使用的工具和基础设施而异。

2步式 RAG

在 2步式 RAG 中,检索步骤总是在生成步骤之前执行。这种架构简单明了且可预测,适合许多应用场景,在这些场景中,检索相关文档作为生成答案的明确前提条件。

graph LR
    A[User Question] --> B["Retrieve Relevant Documents"]
    B --> C["Generate Answer"]
    C --> D[Return Answer to User]

    %% Styling
    classDef startend fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#14532D
    classDef process fill:#DBEAFE,stroke:#2563EB,stroke-width:1.5px,color:#1E3A8A

    class A,D startend
    class B,C process

教程:检索增强生成(RAG) -> 使用LangChain构建RAG智能体

了解如何使用检索增强生成技术构建一个能够基于你的数据回答问题的问题与回答(Q&A)聊天机器人。本教程将介绍两种方法:

  • 一个使用灵活工具进行搜索的RAG智能体——非常适合通用用途。
  • 一个两步的RAG链,每个查询只需要调用一次大型语言模型(LLM)——对于较简单的任务来说,既快速又高效。

Agentic RAG

Agentic 检索增强生成(RAG)结合了检索增强生成的优势和基于智能体的推理能力。智能体(由大语言模型 LLM 驱动)不是先检索再回答,而是逐步推理,并在交互过程中决定何时以及如何检索信息

智能体要实现 RAG 行为,唯一需要的是能够访问一个或多个可以获取外部知识的**工具(tools)**——例如文档加载器、网络 API 或数据库查询。

graph LR
    A[User Input / Question] --> B["Agent (LLM)"]
    B --> C{Need external info?}
    C -- Yes --> D["Search using tool(s)"]
    D --> H{Enough to answer?}
    H -- No --> B
    H -- Yes --> I[Generate final answer]
    C -- No --> I
    I --> J[Return to user]

    %% Dark-mode friendly styling
    classDef startend fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#14532D
    classDef decision fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px,color:#78350F
    classDef process fill:#DBEAFE,stroke:#2563EB,stroke-width:1.5px,color:#1E3A8A

    class A,J startend
    class B,D,I process
    class C,H decision
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { tool, createAgent } from "langchain";

const fetchUrl = tool(
(url: string) => {
return `Fetched content from ${url}`;
},
{ name: "fetch_url", description: "Fetch text content from a URL" }
);

const agent = createAgent({
model: "claude-sonnet-4-0",
tools: [fetchUrl],
systemPrompt,
});

扩展示例,创建一个能够获取文档的LangChain智能体:针对 LangGraph 的 llms.txt 的 Agentic RAG

此示例实现了一个 Agentic RAG 系统,以帮助用户查询 LangGraph 文档。智能体首先加载 llms.txt,其中列出了可用的文档 URL,然后可以根据用户的问题动态使用 fetch_documentation 工具来检索和处理相关内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// 1. 导入必要的模块
// - tool: 用于定义工具(函数),让智能体可以调用
// - createAgent: 创建 Agentic RAG 智能体的工厂函数
// - HumanMessage: 表示用户输入的消息类型
import { tool, createAgent, HumanMessage } from "langchain";
// 导入 Zod,用于定义工具输入参数的 schema(结构校验)
import * as z from "zod";

// 2. 定义允许访问的域名白名单,仅限 LangChain 官方文档域名
const ALLOWED_DOMAINS = ["https://langchain-ai.github.io/"];
// 预先定义的 llms.txt 地址,该文件列出了所有可用文档的 URL
const LLMS_TXT = "https://langchain-ai.github.io/langgraph/llms.txt";

// 3. 定义一个名为 fetchDocumentation 的工具
// 该工具用于从指定的 URL 获取文档内容,并带有安全检查
const fetchDocumentation = tool(
// 工具的实际执行函数,异步接收一个 input 对象
async (input) => {
// 安全检查:检查 URL 是否以允许的域名开头
if (!ALLOWED_DOMAINS.some((domain) => input.url.startsWith(domain))) {
return `错误:不允许的 URL。必须以以下之一开头:${ALLOWED_DOMAINS.join(", ")}`;
}
// 发起网络请求获取 URL 内容
const response = await fetch(input.url);
// 如果响应状态码不是 2xx,则抛出错误
if (!response.ok) {
throw new Error(`HTTP 错误!状态码:${response.status}`);
}
// 返回响应文本(即文档内容)
return response.text();
},
{
// 工具名称,智能体通过名称引用
name: "fetch_documentation",
// 工具描述,帮助智能体判断何时使用此工具
description: "从 URL 获取并转换文档",
// 定义工具输入参数的 schema,使用 Zod 确保格式正确
schema: z.object({
url: z.string().describe("要获取的文档的 URL"),
}),
}
);

// 4. 预先获取 llms.txt 的内容,将其作为系统提示的一部分
// 这样智能体一开始就知道有哪些可用文档
const llmsTxtResponse = await fetch(LLMS_TXT);
const llmsTxtContent = await llmsTxtResponse.text();

// 5. 定义系统提示(system prompt)
// 该提示指导智能体的行为:必须查阅文档、如何引用、域名限制等
const systemPrompt = `
你是一名专业的 TypeScript 开发者和技术助理。
你的主要职责是帮助用户解决有关 LangGraph 及相关工具的问题。

指令:

1. 如果用户提出的问题你不太确定,或者可能涉及 API 用法、行为或配置,你必须使用 \`fetch_documentation\` 工具查阅相关文档。
2. 引用文档时,请清晰地总结,并包含相关内容上下文。
3. 不要使用允许域之外的任何 URL。
4. 如果文档获取失败,请告知用户,并继续运用你作为专家的最佳理解来回答。

你可以从以下经批准的来源获取官方文档:

${llmsTxtContent}

在回答用户关于 LangGraph 的问题之前,你必须查阅文档以获取最新的文档信息。

你的回答应清晰、简洁且技术准确。
`;

// 6. 将定义好的工具放入工具数组
const tools = [fetchDocumentation];

// 7. 创建智能体(agent)
// 指定使用的模型、工具、系统提示和名称
const agent = createAgent({
model: "claude-sonnet-4-0", // 使用的 LLM 模型
tools, // 可用的工具列表
systemPrompt, // 系统级提示,定义角色和规则
name: "Agentic RAG", // 智能体名称
});

// 8. 调用智能体,传入用户消息
// 用户询问一个具体的示例:用 LangGraph 的预构建 create react agent 写一个能查股票价格的智能体
const response = await agent.invoke({
messages: [
new HumanMessage(
"写一个使用预构建的 create react agent 的 langgraph 智能体的简短示例。" +
"该智能体应能够查找股票价格信息。"
),
],
});

// 9. 输出智能体回复的最后一条消息(即最终答案)
console.log(response.messages.at(-1)?.content);

这段代码演示了如何构建一个 Agentic RAG 智能体:

  • 智能体拥有一个名为 fetch_documentation 的工具,可以从 LangChain 官方文档域名下获取网页内容。
  • 系统提示强制智能体在回答关于 LangGraph 的问题前,必须使用该工具查阅最新文档。
  • 通过预先加载 llms.txt,智能体知道有哪些可用文档的 URL。
  • 最终用户询问一个具体示例时,智能体会先调用工具获取相关文档,再根据文档内容生成答案。

混合式 RAG

混合式 RAG 结合了 2步式 RAG 和 Agentic RAG 的特点。它引入了中间步骤,例如查询预处理、检索验证和生成后检查。这些系统提供了比固定管道更高的灵活性,同时保留了对执行流程的一定控制。典型组件包括:

  • 查询增强:修改输入问题以提高检索质量。这可能涉及重写模糊的查询、生成多个变体或使用附加上下文扩展查询。
  • 检索验证:评估检索到的文档是否相关且充分。如果不是,系统可能会优化查询并重新检索。
  • 答案验证:检查生成的答案的准确性、完整性以及与源内容的一致性。如果需要,系统可以重新生成或修改答案。

该架构通常支持在这些步骤之间进行多次迭代:

graph LR
    A[User Question] --> B[Query Enhancement]
    B --> C[Retrieve Documents]
    C --> D{Sufficient Info?}
    D -- No --> E[Refine Query]
    E --> C
    D -- Yes --> F[Generate Answer]
    F --> G{Answer Quality OK?}
    G -- No --> H{Try Different Approach?}
    H -- Yes --> E
    H -- No --> I[Return Best Answer]
    G -- Yes --> I
    I --> J[Return to User]

    classDef startend fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#14532D
    classDef decision fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px,color:#78350F
    classDef process fill:#DBEAFE,stroke:#2563EB,stroke-width:1.5px,color:#1E3A8A

    class A,J startend
    class B,C,E,F,I process
    class D,G,H decision

此架构适用于:

  • 查询模糊或条件不足的应用
  • 需要验证或质量控制步骤的系统
  • 涉及多个来源或迭代优化的工作流

教程:具有自我修正功能的主动式RAG ->使用LangGraph构建一个自定义的RAG代理

一个将代理推理与检索和自我纠正相结合的混合式检索增强生成(RAG)示例。

RAG示例

LangChain:检索器和检索增强生成(RAG)

http://blog.gxitsky.com/2026/03/24/AI-LangChain-029-Retrieval/

作者

光星

发布于

2026-03-24

更新于

2026-03-26

许可协议

评论