RAG基于LangChain实现
一、RAG原理概述
1.1 什么是RAG
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合信息检索与文本生成的技术架构。
RAG架构
用户问题
检索相关文档
问题+上下文
大语言模型
基于事实的回答
传统LLM
用户问题
大语言模型
回答(可能产生幻觉)
1.2 为什么需要RAG
| LLM局限性 | RAG解决方案 |
|---|---|
| 知识过时 | 实时检索最新信息 |
| 幻觉问题 | 基于检索到的事实生成 |
| 领域知识不足 | 接入专业知识库 |
| 上下文窗口有限 | 只检索相关内容 |
| 无法引用来源 | 提供文档来源追溯 |
1.3 RAG vs 微调 vs 提示工程
微调 (Fine-tuning)
成本: 高
效果: 最佳
适用: 特定领域深度定制
RAG
成本: 中
效果: 好
适用: 知识密集型应用
提示工程 (Prompt Engineering)
成本: 低
效果: 有限
适用: 快速原型
1.4 RAG vs 传统搜索
RAG
语义检索
相关文档
LLM生成答案
自然语言回答
传统搜索
关键词匹配
排序算法
返回结果列表
二、RAG核心流程
生成阶段
在线检索阶段
离线索引阶段
索引库
文档加载
文本切分
向量化Embedding
存入向量数据库
用户提问
问题向量化
向量相似度搜索
返回相关文档
问题+相关文档
构建Prompt
LLM生成回答
返回结果
2.1 文档加载(Document Loading)
理解:将各种格式的文档加载为统一的文本格式。
输出
加载器
输入源
PDF文件
文本文件
Markdown
CSV/Excel
网页
数据库
Document Loader
Document对象
(page_content + metadata)
2.2 文本切分(Text Splitting)
理解:将长文档切分为适当大小的片段,便于检索和处理。
切分参数
chunk_size: 片段大小
chunk_overlap: 重叠大小
切分策略
按字符数切分
按段落切分
按语义切分
递归切分
切分参数选择:
| 参数 | 建议值 | 影响 |
|---|---|---|
| chunk_size | 500-1000 | 太大:检索精度下降;太小:上下文不完整 |
| chunk_overlap | 50-200 | 增加重叠可提高召回,但增加存储 |
2.3 向量化(Embedding)
理解:将文本转换为高维向量,使语义相似的文本在向量空间中距离更近。
向量空间
文本
语义相近
语义远离
苹果公司发布了新手机
Apple推出了新款iPhone
今天买了5斤苹果
0.2, 0.8, 0.3, ...
科技相关
0.25, 0.75, 0.35, ...
科技相关
0.9, 0.1, 0.2, ...
水果相关
2.4 向量存储(Vector Store)
理解:专门存储向量并支持高效相似度搜索的数据库。
向量数据库对比
FAISS
Meta开源
本地运行
适合开发测试
Chroma
轻量级
支持持久化
适合中小规模
Milvus
分布式
高性能
适合生产环境
2.5 检索(Retrieval)
理解:根据用户问题,从向量库中找到最相关的文档片段。
检索结果 向量数据库 Embedding模型 用户问题 检索结果 向量数据库 Embedding模型 用户问题 "如何配置数据库连接?" 向量化 查询向量 [0.1, 0.3, ...] 计算相似度 Top-K相关文档
三、LangChain核心组件
3.1 组件概览
LangChain核心组件
Document Loaders
文档加载器
Text Splitters
文本切分器
Embeddings
向量化
Vector Stores
向量存储
Retrievers
检索器
Chains
链
3.2 Document Loaders
| 加载器 | 用途 | 示例 |
|---|---|---|
| TextLoader | 加载纯文本 | .txt文件 |
| PyPDFLoader | 加载PDF | PDF文档 |
| UnstructuredMarkdownLoader | 加载Markdown | .md文档 |
| CSVLoader | 加载CSV | 表格数据 |
| WebBaseLoader | 加载网页 | URL内容 |
3.3 Text Splitters
| 切分器 | 特点 | 使用场景 |
|---|---|---|
| CharacterTextSplitter | 按字符数切分 | 简单文本 |
| RecursiveCharacterTextSplitter | 递归按分隔符切分 | 通用场景(推荐) |
| MarkdownHeaderTextSplitter | 按Markdown标题切分 | Markdown文档 |
| CodeTextSplitter | 按代码结构切分 | 代码文件 |
3.4 Embeddings
| 模型 | 特点 | 使用场景 |
|---|---|---|
| OpenAIEmbeddings | 高质量,需API Key | 生产环境 |
| HuggingFaceEmbeddings | 开源免费 | 本地开发 |
| SentenceTransformerEmbeddings | 本地运行 | 隐私敏感场景 |
3.5 Vector Stores
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| FAISS | Meta开源,高效 | 本地开发测试 |
| Chroma | 轻量级,易用 | 中小规模应用 |
| Pinecone | 云服务,托管 | 生产环境 |
| Milvus | 分布式,高性能 | 大规模生产 |
四、代码实战
4.1 基础
💻 对应脚本:
5.1.rag_basic_langchain.py
使用LangChain构建提示词优化。
输出示例:
qwen3-max模型回答:
```python
for i in range(1, 101):
print(i)
```
4.2 RAG基础
💻 对应脚本:
5.2.rag_advanced_langchain.py
带对话记忆的RAG系统,支持多轮对话。
输出示例:
{'messages': [HumanMessage(content='明天上海的天气如何?', additional_kwargs={}, response_metadata={}, id='930fbea5-1e92-422d-8e4b-da35db85d6c6'), AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'arguments': '{}', 'name': 'get_weather'}, 'id': 'call_70c8980f4e2641bfb2395978', 'index': 0, 'type': 'function'}]}, response_metadata={'model_name': 'qwen3-max', 'finish_reason': 'tool_calls', 'request_id': '873a8f2f-c10f-4e20-9346-845a9926fe54', 'token_usage': {'input_tokens': 250, 'output_tokens': 11, 'prompt_tokens_details': {'cached_tokens': 0}, 'total_tokens': 261}}, id='lc_run--019d1421-8712-7d82-9b67-aeb174cc2fdb-0', tool_calls=[{'name': 'get_weather', 'args': {}, 'id': 'call_70c8980f4e2641bfb2395978', 'type': 'tool_call'}], invalid_tool_calls=[]), ToolMessage(content='晴天', name='get_weather', id='b9dedf71-f5c7-4bf4-9625-f348da5be29a', tool_call_id='call_70c8980f4e2641bfb2395978'), AIMessage(content='明天上海的天气是晴天。记得做好防晒哦!', additional_kwargs={}, response_metadata={'model_name': 'qwen3-max', 'finish_reason': 'stop', 'request_id': 'df57c9cc-52cf-4b2b-963b-7d5080a443e6', 'token_usage': {'input_tokens': 278, 'output_tokens': 13, 'prompt_tokens_details': {'cached_tokens': 0}, 'total_tokens': 291}}, id='lc_run--019d1421-8e61-7560-9d8a-50047450f795-0', tool_calls=[], invalid_tool_calls=[])]}
**********
HumanMessage 明天上海的天气如何?
AIMessage
ToolMessage 晴天
AIMessage 明天上海的天气是晴天。记得做好防晒哦!
4.3 完整架构图
模型层
数据层
应用层
API层
用户层
用户界面
API Gateway
认证授权
限流控制
查询处理
检索服务
重排序
生成服务
向量数据库
缓存层
日志存储
Embedding模型
大语言模型
4.4 Prompt模板
你是一个专业的问答助手。请根据以下参考文档回答用户问题。
要求:
1. 只使用参考文档中的信息回答
2. 如果文档中没有相关信息,请明确说明
3. 在回答末尾标注引用的文档编号
参考文档:
{context}
用户问题:{question}
请给出回答: