把「检索(Retrieval)」和「大模型生成(Generation)」两条链路拼在一起的一个推理框架,用来让 LLM 在推理时动态地引用外部知识,而不是只依赖训练时学到的参数记忆。
本项目提供两种 RAG 实现,适合不同场景:
- 多格式支持:TXT、PDF、DOCX、PPTX、XLSX、HTML、MD、PY
- 向量检索:使用余弦相似度进行文档片段检索
- 流式回答:实时显示生成的回答内容
- 智能分块:自动将文档切分为合适的语义块
- 本地部署:基于Ollama,数据完全本地化
- 轻量级:无需复杂的向量数据库,直接内存计算
- 代码简洁:156行代码,易于理解 RAG 原理
- 模块化设计:使用 LangChain 框架,组件可替换
- 向量数据库:使用 Chroma,支持持久化和索引加速
- 智能切分:RecursiveCharacterTextSplitter,更好的文档处理
- 链式调用:RetrievalQA Chain,简化流程
- 扩展性强:轻松添加记忆、多轮对话等功能
- 生产级:更好的错误处理、缓存、可观测性
- 显示来源:自动显示答案的参考文档
curl -fsSL https://ollama.com/install.sh | sh# 下载嵌入模型(用于向量化文档)
ollama pull nomic-embed-text
# 下载语言模型(用于生成回答)
ollama pull qwen3:0.6b
# 启动服务
ollama serve原始实现(轻量级):
pip install numpy openai pypdf python-docx python-pptx openpyxl beautifulsoup4 lxml tiktokenLangChain 实现(功能丰富):
pip install -r requirements_langchain.txt
# 或手动安装
pip install langchain langchain-community langchain-ollama chromadb pypdf docx2txt python-pptx openpyxl beautifulsoup4 lxml numpy tiktoken openai unstructured markdown# 基本用法
python RAG.py document.pdf notes.txt
# 处理多个文件
python RAG.py doc1.pdf doc2.docx data.xlsx report.md
# 处理整个目录
python RAG.py docs/*.pdf交互示例:
正在加载文件并构建向量库…
已生成 127 段文本向量。Ctrl-C / 回车 退出。
问题> 什么是 RAG?
回答: RAG(检索增强生成)是一种...
# 用法与原始实现相同
python RAG_langchain.py document.pdf notes.txt
# 处理多个文件
python RAG_langchain.py doc1.pdf doc2.docx data.xlsx report.md交互示例:
LangChain RAG 系统
============================================================
正在加载文件...
✓ 加载文件: document.pdf (15 个文档)
正在切分文档...
已生成 132 个文档片段
正在构建向量库 (使用 nomic-embed-text)...
向量库构建完成
初始化语言模型 (qwen3:0.6b)...
============================================================
系统就绪!输入问题开始对话,回车或 Ctrl-C 退出
============================================================
问题> 什么是 RAG?
回答: RAG(检索增强生成)是一种...
参考来源:
[1] document.pdf
[2] notes.txt
| 特性 | 原始实现 (RAG.py) | LangChain 实现 (RAG_langchain.py) |
|---|---|---|
| 代码行数 | 156 行 | 215 行 |
| 依赖包数 | 7-8 个 | 10+ 个 |
| 启动速度 | 快(1-2秒) | 中等(3-5秒) |
| 文档加载 | 手动实现每种格式 | 使用成熟的 Loaders |
| 文本切分 | 自定义算法 | RecursiveCharacterTextSplitter |
| 向量存储 | NumPy 数组(内存) | Chroma 向量数据库 |
| 检索方式 | O(n) 线性检索 | O(log n) ANN 索引 |
| 持久化 | 不支持 | 支持 |
| 扩展性 | 需要修改核心代码 | 插件式扩展 |
| 来源追踪 | 无 | 自动显示来源 |
| 适合场景 | 学习、理解原理 | 生产环境、快速开发 |
- 想深入理解 RAG 工作原理
- 需要最小化依赖和快速启动
- 只需要基础的问答功能
- 想要完全可控的代码
- 需要快速开发和迭代
- 计划添加更多功能(记忆、多轮对话等)
- 需要经常切换不同的模型和向量库
- 构建生产环境的应用
- 需要持久化向量库
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db" # 添加这一行即可
)from langchain_openai import ChatOpenAI, OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
llm = ChatOpenAI(model="gpt-4")from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory
)
# 现在支持多轮对话,会记住上下文A: 代码已做兼容处理,会自动使用备用加载器。如需完整功能:
pip install "unstructured[all-docs]"A: 文本切分策略不同(token vs 字符),检索到的上下文可能略有差异,这是正常的。
A: 学习用原始版,生产用 LangChain 版。建议两个都试试,对比学习效果最佳。
A: 确保 Ollama 服务已启动:
ollama serve- 开箱即用的组件:10+ 种文档加载器,无需手动解析
- 模块化设计:切换模型/向量库只需改一行代码
- 智能文本切分:自动处理代码块、Markdown、层次结构
- 向量数据库:支持持久化、索引加速、增量更新
- 链式调用:检索→格式化→LLM→返回,一气呵成
- 生产级特性:错误处理、重试、缓存、可观测性
- 丰富的生态:记忆、工具调用、Agent、多轮对话等
- 第一步:运行
RAG.py,理解每行代码的作用 - 第二步:运行
RAG_langchain.py,体验 LangChain 的便利 - 第三步:对比两个实现,理解抽象的价值
- 第四步:尝试扩展 LangChain 版本(添加新功能)
- 第五步:根据实际需求选择合适的实现