RAG基于LangChain实现

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}

请给出回答:
相关推荐
christine_rr2 小时前
linux常用命令(3)压缩命令
linux
L_09072 小时前
【Linux】实现简易 shell 程序
linux·bash
爱学习的程序媛2 小时前
WSL2:Windows上运行Linux的完整指南
linux·运维·windows·ubuntu·wsl2
Yupureki2 小时前
《Linux系统编程》20.常见程序设计模式
linux·服务器·c语言·c++·单例模式·建造者模式·责任链模式
M1nat0_2 小时前
Linux基础 Ext 文件系统:从磁盘硬件到目录路径的全链路解析
linux·服务器·网络·数据库
moical2 小时前
关于docker-compose启动elasticsearch:7.17.29报"permission denied": unknown错误解决
linux
s6516654962 小时前
编译linux内核
linux
济6172 小时前
ARM Linux 驱动开发篇:阻塞与非阻塞IO详解(含等待队列+poll机制)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
老王熬夜敲代码3 小时前
持久化记忆redis
langchain