Retrieval 与 RAG 完整教程:从基础概念到架构实践¶
什么是检索增强生成(RAG)?¶
大型语言模型(LLM)虽然强大,但存在两个关键限制:
- 有限上下文 — 无法一次性处理整个知识库
- 静态知识 — 训练数据在某个时间点被冻结
检索通过在查询时获取相关外部知识来解决这些问题,这就是检索增强生成(RAG) 的基础:用特定上下文信息增强LLM的回答能力。
构建知识库¶
知识库是在检索过程中使用的文档或结构化数据存储库。
自定义知识库构建¶
如果需要自定义知识库,可以使用LangChain的文档加载器和向量存储从自有数据构建:
# 示例:构建知识库的基本流程
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 1. 加载文档
loader = TextLoader("your_document.txt")
documents = loader.load()
# 2. 分割文本
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 3. 创建嵌入并存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
使用现有知识库¶
如果已有知识库(如SQL数据库、CRM或内部文档系统),无需重建:
- 将其作为工具连接到Agentic RAG中的智能体
- 查询它并将检索内容作为上下文提供给LLM(2-Step RAG)
检索流程详解¶
典型的检索工作流程如下:
数据源 → 文档加载器 → 文档 → 文本分割 → 嵌入转换 → 向量存储
↑
用户查询 → 查询嵌入 → 检索器 → LLM使用检索信息 → 生成答案
每个组件都是模块化的:可以替换加载器、分割器、嵌入或向量存储,而无需重写应用逻辑。
核心构建模块¶
组件 | 功能 | 关键特性 |
---|---|---|
文档加载器 | 从外部源(Google Drive、Slack、Notion等)提取数据 | 返回标准化的Document对象 |
文本分割器 | 将大文档拆分为可检索的小块 | 确保适合模型的上下文窗口 |
嵌入模型 | 将文本转换为数值向量 | 相似含义的文本在向量空间中位置相近 |
向量存储 | 专门用于存储和搜索嵌入的数据库 | 支持相似性搜索 |
检索器 | 根据非结构化查询返回文档的接口 | 支持多种检索策略 |
RAG架构模式¶
1. 2-Step RAG(两步式RAG)¶
特点:检索总是在生成之前执行,简单且可预测
适用场景:FAQ、文档问答机器人等简单应用
# 2-Step RAG 基本示例
from langchain.chains import RetrievalQA
# 创建检索增强的QA链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)
# 执行查询
result = qa_chain({"query": "你的问题"})
print(result["result"])
优势: - ✅ 控制度高 - ⚡ 延迟低且可预测 - 🎯 适用于明确检索需求
2. Agentic RAG(智能体RAG)¶
特点:LLM驱动的智能体在推理过程中决定何时和如何检索
适用场景:需要访问多个工具的研究助手
import requests
from langchain.tools import tool
from langchain.agents import create_agent
@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-0",
tools=[fetch_url], # 检索工具
system_prompt="需要时使用fetch_url从网页获取信息",
)
工作流程:
用户输入 → 智能体判断是否需要外部信息
↓ 是 → 使用工具搜索 → 判断是否足够回答
↓ 否 → 生成最终答案 → 返回用户
优势: - ✅ 灵活性高 - 🧠 能够进行复杂推理 - 🔧 可集成多个工具
3. Hybrid RAG(混合RAG)¶
特点:结合2-Step和Agentic RAG特性,加入验证步骤
适用场景:需要质量验证的领域特定问答系统
典型组件: - 查询增强:改进输入问题以提高检索质量 - 检索验证:评估检索文档的相关性和充分性 - 答案验证:检查生成答案的准确性、完整性和与源内容的一致性
graph LR
A[用户问题] --> B[查询增强]
B --> C[检索文档]
C --> D{信息是否充分?}
D -- 否 --> E[优化查询]
E --> C
D -- 是 --> F[生成答案]
F --> G{答案质量合格?}
G -- 否 --> H{尝试不同方法?}
H -- 是 --> E
H -- 否 --> I[返回最佳答案]
G -- 是 --> I
I --> J[返回用户]
实践建议¶
选择适合的架构¶
需求特征 | 推荐架构 | 理由 |
---|---|---|
简单问答、低延迟 | 2-Step RAG | 结构简单,响应快速 |
复杂推理、多源查询 | Agentic RAG | 灵活决策,适应复杂场景 |
高质量要求、需要验证 | Hybrid RAG | 平衡控制与灵活性 |
性能优化考虑¶
- 分块策略:根据文档类型调整块大小和重叠
- 检索优化:使用混合检索(关键词+向量)提高召回率
- 缓存机制:对频繁查询实现结果缓存
- 增量更新:支持知识库的增量更新
错误处理¶
# 检索失败的处理示例
try:
result = qa_chain({"query": user_question})
if not result["source_documents"]:
return "抱歉,没有找到相关信息。"
return result["result"]
except Exception as e:
return f"检索过程中出现错误:{str(e)}"
下一步学习¶
要深入了解和实践RAG,建议:
- 从2-Step RAG开始:掌握基本的检索增强生成流程
- 尝试Agentic RAG:体验智能体驱动的动态检索
- 探索高级特性:如查询重写、多跳检索、自我修正等
通过本教程,你应该对RAG的基本概念、不同架构及其适用场景有了全面了解。根据具体需求选择合适的架构,开始构建你的检索增强应用吧!