检索与增强生成
一句话
检索(Retrieval)通过查询时获取相关外部知识,解决了大语言模型(LLM)的有限上下文和静态知识限制,构成了检索增强生成(RAG)的基础。
什么时候翻这页
当你需要构建基于外部知识的问答系统、处理超出模型训练数据范围的问题,或者需要将最新信息整合到LLM回答中时。
核心概念
- 检索(Retrieval):在查询时获取相关外部知识的过程,解决LLM的有限上下文和静态知识问题
- 知识库(Knowledge Base):用于检索的文档或结构化数据存储库
- 检索增强生成(RAG):将检索与生成结合,增强LLM回答的上下文相关性和准确性
- 2-Step RAG:检索始终在生成前执行的架构,简单且可预测
- Agentic RAG:由LLM驱动的代理决定何时以及如何检索信息的架构,灵活性高
- Hybrid RAG:结合两种架构特点并包含验证步骤的混合架构
怎么做
-
构建知识库:
- 使用文档加载器(Document Loaders)从外部源(如Google Drive、Slack、Notion等)摄取数据
- 使用文本分割器(Text Splitters)将大文档分割成适合检索的小块
- 使用嵌入模型(Embedding Models)将文本转换为向量表示
- 使用向量存储(Vector Stores)存储和搜索嵌入
-
实现RAG架构:
- 2-Step RAG:先检索相关文档,再生成答案
- Agentic RAG:创建代理,使用工具(如fetch_url)在推理过程中决定何时检索
- Hybrid RAG:结合查询增强、检索验证和答案验证等中间步骤
命令 / API 速查
# 创建代理工具
@tool
def fetch_url(url: str) -> str:
"""从URL获取文本内容"""
response = requests.get(url, timeout=10.0)
response.raise_for_status()
return response.text
# 创建代理
agent = create_agent(
model="claude-sonnet-4-6",
tools=[fetch_url],
system_prompt="使用fetch_url当需要从网页获取信息时;引用相关片段",
)
与 LangGraph / RAG 手册的联系
LangChain提供高层级的RAG实现框架,而LangGraph更专注于底层编排和代理控制。在LangChain中,RAG主要通过create_agent和工具实现,而在LangGraph中,可以更精细地控制检索和生成的流程。
初学者易错点
- 忽略知识库的质量:检索效果很大程度上取决于知识库的质量和相关性
- 过度依赖单一检索策略:不同场景可能需要不同的检索架构
- 忽略上下文窗口限制:即使使用RAG,也要注意LLM的上下文窗口限制
- 不验证检索结果:特别是在Agentic RAG中,需要验证检索到的信息是否足够回答问题
相关词条
- Document Loaders:从外部源摄取数据并返回标准化Document对象
- Text Splitters:将大文档分割成可检索的小块
- Embedding Models:将文本转换为向量表示,使相似含义的文本在向量空间中靠近
- Vector Stores:专门用于存储和搜索嵌入的数据库
- Retrievers:根据非结构化查询返回文档的接口
- Tools:代理用于获取外部知识的函数接口