原文链接: https://docs.langchain.com/oss/python/langchain/retrieval
大型语言模型(LLM)很强大,但有两个关键限制:
- 上下文有限(Finite context):一次无法吞下整个语料库;
- 知识静态(Static knowledge):训练数据冻结在某个时间点。
检索(Retrieval) 通过在查询时获取相关的外部知识来解决这些问题,这是 检索增强生成(Retrieval-Augmented Generation, RAG) 的基础:
- 在 LLM 的回答中加入与当前问题紧密相关的外部信息,使结果更加“有据可依”。
知识库(knowledge base) 是在检索阶段使用的一组文档或结构化数据。
如果你需要自定义知识库,可以使用 LangChain 的:
- 文档加载器(Document loaders);
- 向量存储(Vector stores);
从你的数据中构建一个可检索的库。
如果你已经有了知识库(如 SQL 数据库、CRM、内部文档系统),不必重建:
- 在 Agentic RAG 中,将它作为智能体的一个 工具(tool);
- 或在 2-Step RAG 中,先查询知识库,再将检索结果作为上下文提供给 LLM。
教程示例:Semantic search
学习如何使用 LangChain 的文档加载器、embedding 和向量存储,从你自己的数据构建一个可检索的知识库,并在其上实现一个最小 RAG 工作流(如 PDF 上的语义搜索 + 基于检索结果的回答)。
检索让 LLM 能在运行时访问相关上下文。但大多数真实应用会更进一步:
- 将“检索 + 生成”结合起来,输出基于检索证据的、上下文感知的答案;
这就是 RAG 的核心思想:
- 检索管线成为更大系统的基础,将“搜索”和“生成”组合到一起。
一个典型的检索工作流大致如下(原文有图示):
- 加载与预处理数据(load & split);
- 生成向量 / 索引(embeddings + vector store);
- 根据查询检索相关文档(retriever);
- 使用检索到的文档作为上下文,让 LLM 生成答案;
每个组件都是 模块化的:
- 你可以在不改业务逻辑的前提下,替换加载器、切分器、embedding 模型或向量存储。
- 从外部源(Google Drive、Slack、Notion 等)导入数据;
- 返回标准化的
Document对象。
- 将大文档切分成较小的 chunk;
- 这些 chunk 可以单独被检索,且能适配模型的上下文窗口。
- 将文本映射到向量空间;
- 含义相近的文本在向量空间中彼此接近。
- 用于存储和检索 embedding 的专用数据库;
- 支持相似度搜索、过滤等。
- 一个统一接口:给定“非结构化查询”,返回相关
Document列表; - 可以基于向量存储、关键词搜索、混合检索等实现。
根据系统需求,RAG 可以用不同方式实现。主要有三种:
| 架构 | 描述 | 控制力 | 灵活性 | 延迟 | 典型用例 |
|---|---|---|---|---|---|
| 2-Step RAG | 检索总是先于生成执行,流程简单且可预测 | ✅ 高 | ❌ 低 | ⚡ 快 | FAQ、文档问答机器人 |
| Agentic RAG | 由智能体(LLM)在推理过程中决定“何时 / 如何”检索 | ❌ 低 | ✅ 高 | ⏳ 可变 | 拥有多工具的研究助手 |
| Hybrid RAG | 结合 2-Step 与 Agentic 的特点,加入校验等中间步骤 | ⚖️ 中 | ⚖️ 中 | ⏳ 可变 | 需要质量校验的领域问答 |
延迟说明:
- 在 2-Step RAG 中,LLM 调用次数是固定且上限已知的,延迟更可预测;
- 现实场景还会受:
- 检索步骤的 API 响应时间、网络延迟、数据库性能等影响。
在 2-Step RAG 中:
- 检索步骤总是在生成步骤之前执行;
- 流程相对固定、可预测;
- 很适合“先取文档、再基于文档回答”的经典场景。
可参见教程:Retrieval-Augmented Generation (RAG)
- 展示如何构建一个基于你数据的 Q&A 聊天机器人;
- 包含两种方案:
- 使用“RAG 智能体”,通过灵活工具执行搜索;
- 使用“2-step RAG 链”,每次查询只需一次 LLM 调用,速度快且简单。
Agentic RAG 将 RAG 与智能体推理结合:
- 不再“先固定地检索、再回答”;
- 而是由一个智能体在多步推理过程中,动态决定:
- 何时检索;
- 使用哪种检索工具;
- 是否再次检索或组合多个来源。
要实现 Agentic RAG,智能体只需要能访问一个或多个检索工具(tools):
- 文档加载器 / 向量检索接口;
- Web API;
- 数据库查询接口等。
import requests
from langchain.tools import tool
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
@tool
def fetch_url(url: str) -> str:
"""Fetch text content from a URL"""
response = requests.get(url, timeout=10.0)
response.raise_for_status()
return response.text
system_prompt = """\
Use fetch_url when you need to fetch information from a web-page; quote relevant snippets.
"""
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[fetch_url], # 一个用于检索的工具
system_prompt=system_prompt,
)下面示例实现了一个 Agentic RAG 系统,帮助用户查询 LangGraph 文档:
- 智能体首先加载
llms.txt(列出可用文档 URL); - 再通过
fetch_documentation工具按需抓取 / 解析文档内容; - 基于这些内容回答用户问题。
import requests
from langchain.agents import create_agent
from langchain.messages import HumanMessage
from langchain.tools import tool
from markdownify import markdownify
ALLOWED_DOMAINS = ["https://langchain-ai.github.io/"]
LLMS_TXT = "https://langchain-ai.github.io/langgraph/llms.txt"
@tool
def fetch_documentation(url: str) -> str:
"""Fetch and convert documentation from a URL"""
if not any(url.startswith(domain) for domain in ALLOWED_DOMAINS):
return (
"Error: URL not allowed. "
f"Must start with one of: {', '.join(ALLOWED_DOMAINS)}"
)
response = requests.get(url, timeout=10.0)
response.raise_for_status()
return markdownify(response.text)
# 预先获取 llms.txt 内容,这一步无需 LLM 调用
llms_txt_content = requests.get(LLMS_TXT).text
# 智能体的系统提示
system_prompt = f"""
You are an expert Python developer and technical assistant.
Your primary role is to help users with questions about LangGraph and related tools.
Instructions:
1. If a user asks a question you're unsure about — or one that likely involves API usage,
behavior, or configuration — you MUST use the `fetch_documentation` tool to consult the relevant docs.
2. When citing documentation, summarize clearly and include relevant context from the content.
3. Do not use any URLs outside of the allowed domain.
4. If a documentation fetch fails, tell the user and proceed with your best expert understanding.
You can access official documentation from the following approved sources:
{llms_txt_content}
You MUST consult the documentation to get up to date documentation
before answering a user's question about LangGraph.
Your answers should be clear, concise, and technically accurate.
"""
tools = [fetch_documentation]
model = init_chat_model("claude-sonnet-4-0", max_tokens=32_000)
agent = create_agent(
model=model,
tools=tools,
system_prompt=system_prompt,
name="Agentic RAG",
)
response = agent.invoke({
"messages": [
HumanMessage(
content=(
"Write a short example of a langgraph agent using the "
"prebuilt create react agent. the agent should be able "
"to look up stock pricing information."
)
)
]
})
print(response["messages"][-1].content)更多完整示例参见 RAG 教程。
Hybrid RAG 结合了 2-Step 与 Agentic RAG 的特点,通常会加入若干“中间步骤”作为质量控制:
常见组件包括:
-
Query enhancement(查询增强):
- 修改输入问题以提升检索质量;
- 如重写模糊问题、生成多个变体、注入更多上下文等。
-
Retrieval validation(检索验证):
- 评估检索到的文档是否“足够相关 / 足够充分”;
- 如果不满意,可以重写查询并重新检索。
-
Answer validation(答案验证):
- 检查生成答案的准确性、完整性以及是否与源文档一致;
- 不满足要求时,可触发“再生成 / 修订”。
这类架构通常允许在上述步骤之间多次往返迭代,适用于:
- 查询本身模糊或信息不足;
- 对答案质量与可追溯性有较高要求;
- 需要结合多来源、多轮 refinement 的复杂工作流。
教程示例:Agentic RAG with Self-Correction
- 展示了如何构建带有自我纠错能力的 Agentic RAG 系统,是典型的 Hybrid RAG 架构。
本文档由 LangChain 官方文档翻译而来