RAG基于LangChain实现
·
RAG基于LangChain实现
一、RAG原理概述
1.1 什么是RAG
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合信息检索与文本生成的技术架构。
1.2 为什么需要RAG
| LLM局限性 | RAG解决方案 |
|---|---|
| 知识过时 | 实时检索最新信息 |
| 幻觉问题 | 基于检索到的事实生成 |
| 领域知识不足 | 接入专业知识库 |
| 上下文窗口有限 | 只检索相关内容 |
| 无法引用来源 | 提供文档来源追溯 |
1.3 RAG vs 微调 vs 提示工程
1.4 RAG vs 传统搜索
二、RAG核心流程
2.1 文档加载(Document Loading)
理解:将各种格式的文档加载为统一的文本格式。
2.2 文本切分(Text Splitting)
理解:将长文档切分为适当大小的片段,便于检索和处理。
切分参数选择:
| 参数 | 建议值 | 影响 |
|---|---|---|
| chunk_size | 500-1000 | 太大:检索精度下降;太小:上下文不完整 |
| chunk_overlap | 50-200 | 增加重叠可提高召回,但增加存储 |
2.3 向量化(Embedding)
理解:将文本转换为高维向量,使语义相似的文本在向量空间中距离更近。
2.4 向量存储(Vector Store)
理解:专门存储向量并支持高效相似度搜索的数据库。
2.5 检索(Retrieval)
理解:根据用户问题,从向量库中找到最相关的文档片段。
三、LangChain核心组件
3.1 组件概览
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 完整架构图
4.4 Prompt模板
你是一个专业的问答助手。请根据以下参考文档回答用户问题。
要求:
1. 只使用参考文档中的信息回答
2. 如果文档中没有相关信息,请明确说明
3. 在回答末尾标注引用的文档编号
参考文档:
{context}
用户问题:{question}
请给出回答:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)