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}

请给出回答:
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐