Skip to content

muggle-stack/RAG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

RAG(Retrieval-Augmented Generation)轻量级实现

把「检索(Retrieval)」和「大模型生成(Generation)」两条链路拼在一起的一个推理框架,用来让 LLM 在推理时动态地引用外部知识,而不是只依赖训练时学到的参数记忆。

两种实现方式

本项目提供两种 RAG 实现,适合不同场景:

原始实现(RAG.py)- 适合学习

  • 多格式支持:TXT、PDF、DOCX、PPTX、XLSX、HTML、MD、PY
  • 向量检索:使用余弦相似度进行文档片段检索
  • 流式回答:实时显示生成的回答内容
  • 智能分块:自动将文档切分为合适的语义块
  • 本地部署:基于Ollama,数据完全本地化
  • 轻量级:无需复杂的向量数据库,直接内存计算
  • 代码简洁:156行代码,易于理解 RAG 原理

LangChain 实现(RAG_langchain.py)- 适合生产

  • 模块化设计:使用 LangChain 框架,组件可替换
  • 向量数据库:使用 Chroma,支持持久化和索引加速
  • 智能切分:RecursiveCharacterTextSplitter,更好的文档处理
  • 链式调用:RetrievalQA Chain,简化流程
  • 扩展性强:轻松添加记忆、多轮对话等功能
  • 生产级:更好的错误处理、缓存、可观测性
  • 显示来源:自动显示答案的参考文档

快速开始

1. 安装 Ollama

curl -fsSL https://ollama.com/install.sh | sh

2. 下载所需模型

# 下载嵌入模型(用于向量化文档)
ollama pull nomic-embed-text

# 下载语言模型(用于生成回答)
ollama pull qwen3:0.6b

# 启动服务
ollama serve

3. 安装 Python 依赖

原始实现(轻量级):

pip install numpy openai pypdf python-docx python-pptx openpyxl beautifulsoup4 lxml tiktoken

LangChain 实现(功能丰富):

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

使用方法

原始实现(RAG.py)

# 基本用法
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(检索增强生成)是一种...

LangChain 实现(RAG_langchain.py)

# 用法与原始实现相同
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.py)如果你:

  • 想深入理解 RAG 工作原理
  • 需要最小化依赖和快速启动
  • 只需要基础的问答功能
  • 想要完全可控的代码

选择 LangChain 实现(RAG_langchain.py)如果你:

  • 需要快速开发和迭代
  • 计划添加更多功能(记忆、多轮对话等)
  • 需要经常切换不同的模型和向量库
  • 构建生产环境的应用
  • 需要持久化向量库

LangChain 扩展示例

持久化向量库

vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    persist_directory="./chroma_db"  # 添加这一行即可
)

切换到 OpenAI

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
)
# 现在支持多轮对话,会记住上下文

常见问题

Q: Python 3.13+ 安装 unstructured 失败?

A: 代码已做兼容处理,会自动使用备用加载器。如需完整功能:

pip install "unstructured[all-docs]"

Q: 两个版本结果不一样?

A: 文本切分策略不同(token vs 字符),检索到的上下文可能略有差异,这是正常的。

Q: 如何选择?

A: 学习用原始版,生产用 LangChain 版。建议两个都试试,对比学习效果最佳。

Q: Ollama 连接失败?

A: 确保 Ollama 服务已启动:

ollama serve

LangChain 的核心优势

  1. 开箱即用的组件:10+ 种文档加载器,无需手动解析
  2. 模块化设计:切换模型/向量库只需改一行代码
  3. 智能文本切分:自动处理代码块、Markdown、层次结构
  4. 向量数据库:支持持久化、索引加速、增量更新
  5. 链式调用:检索→格式化→LLM→返回,一气呵成
  6. 生产级特性:错误处理、重试、缓存、可观测性
  7. 丰富的生态:记忆、工具调用、Agent、多轮对话等

学习路径

  1. 第一步:运行 RAG.py,理解每行代码的作用
  2. 第二步:运行 RAG_langchain.py,体验 LangChain 的便利
  3. 第三步:对比两个实现,理解抽象的价值
  4. 第四步:尝试扩展 LangChain 版本(添加新功能)
  5. 第五步:根据实际需求选择合适的实现

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages