检索 (Retrieval)

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

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

构建知识库

知识库是在检索过程中使用的文档或结构化数据的存储库。

如果你需要自定义知识库,可以使用 LangChain 的文档加载器和向量存储从你自己的数据构建。

注意:如果你已经有知识库(例如 SQL 数据库、CRM 或内部文档系统),你不需要重建它。你可以:

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

从检索到 RAG

检索允许 LLM 在运行时访问相关上下文。但大多数实际应用更进一步:它们将检索与生成集成以产生有根据的、上下文感知的答案。

这是检索增强生成 (RAG) 的核心思想。检索管道成为一个更广泛系统的基础,该系统将搜索与生成相结合。

检索管道

典型的检索工作流程如下:

  1. 加载 - 使用文档加载器从各种来源获取数据
  2. 分割 - 将文档分割成较小的块
  3. 嵌入 - 使用嵌入模型将文本转换为向量
  4. 存储 - 将向量存储在向量数据库中
  5. 检索 - 根据查询检索相关文档

每个组件都是模块化的:你可以在不重写应用程序逻辑的情况下替换加载器、分割器、嵌入或向量存储。

构建模块

RAG 架构

RAG 可以根据系统需求以多种方式实现。我们在下面概述每种类型。

架构 描述 控制性 灵活性 延迟 示例用例
两步 RAG 检索总是在生成之前进行。简单且可预测 FAQ、文档机器人
智能体 RAG LLM 驱动的智能体决定何时如何在推理过程中检索 可变 可访问多个工具的研究助手
混合 结合两种方法的特点,带有验证步骤 中等 中等 可变 带质量验证的领域特定问答

延迟说明:两步 RAG 中,延迟通常更加可预测,因为 LLM 调用的最大次数是已知且有上限的。

两步 RAG

两步 RAG 中,检索步骤总是在生成步骤之前执行。这种架构简单且可预测。

// 两步 RAG: 先检索,后生成
async function twoStepRAG(query: string) {
  // 步骤 1: 检索
  const docs = await retriever.invoke(query);

  // 步骤 2: 生成
  const response = await model.invoke([
    { role: "system", content: `基于以下文档回答:\n${docs.map(d => d.pageContent).join("\n")}` },
    { role: "user", content: query }
  ]);

  return response;
}

智能体 RAG

智能体 RAG 中,智能体决定何时以及如何检索信息。

import { createAgent, tool } from "langchain";
import * as z from "zod";

const searchDocs = tool(
  async ({ query }) => {
    const docs = await retriever.invoke(query);
    return docs.map(d => d.pageContent).join("\n");
  },
  {
    name: "search_docs",
    description: "搜索知识库中的相关文档",
    schema: z.object({
      query: z.string().describe("搜索查询"),
    }),
  }
);

const agent = createAgent({
  model: "gpt-4o",
  tools: [searchDocs],
  prompt: "你是一个研究助手。根据需要搜索文档来回答问题。",
});

最佳实践

下一步