本地RAG实现笔记
一、本地RAG核心逻辑(一句话吃透)
核心是“检索+生成”结合,避免大模型“失忆”和“胡说”,流程可简化为7步:
-
加载本地文档(PDF/Word/Txt/Markdown等);
-
将长文档拆分为小文本块(适配大模型上下文长度);
-
将文本块向量化(把文字转化为可计算相似度的数字向量);
-
将向量存入本地向量库,方便快速检索;
-
用户提问时,从向量库中检索最相关的文本片段;
-
将“用户问题+检索到的相关片段”一起传入本地大模型;
-
大模型基于检索到的私有文档,生成准确、可控的答案。
二、完整实现步骤(标准5步,落地性拉满)
Step 1:文档加载(Load)
核心是读取本地各类文档,最常用PDF格式,推荐用成熟工具简化开发。
-
支持格式:TXT/Markdown(最易处理)、PDF(最常用)、Word/Excel、图片(需OCR识别);
-
推荐工具:LangChain(全能框架,支持多格式)、LlamaIndex(专注文档处理,更简洁);
-
补充:PDF加载可搭配PyPDF2,图片OCR可搭配Unstructured。
Step 2:文本分块(Split)
长文档(如几百页PDF)无法直接传入模型,必须拆分,否则会降低检索精度、超出模型上下文限制。
-
核心原则:块大小适中、带少量重叠(保证上下文连贯性);
-
常用策略:按段落分割、固定长度分割(512/1024字符,根据模型调整);
-
工具:LangChain的RecursiveCharacterTextSplitter(最常用,自动适配不同文档格式)。
Step 3:向量化(Embedding)
向量化是检索的核心——将文本转化为高维向量,通过计算向量相似度,找到与用户问题最匹配的文本片段。优先选择本地向量化模型,避免数据上传。
推荐本地免费模型(中文优先):
-
m3e-base:中文向量化效果最优,轻量易部署;
-
BGE-small/BGE-base:通用型,速度快,适配多语言;
-
sentence-transformers系列:开源成熟,可根据需求选择大小模型。
Step 4:本地向量库(Vector DB)
用于存储向量数据,并提供快速相似度检索功能,无需联网,本地文件即可运行,新手优先选轻量型。
新手首选(按简单程度排序):
-
Chroma:文件型数据库,无需额外部署,一行代码即可创建,最适合新手;
-
FAISS:Facebook开源,检索速度极快,适合文档量较大的场景;
-
Qwen:支持本地模式,功能更全面,适合有一定基础后进阶使用。
Step 5:本地大模型生成(LLM)
核心是“本地运行”,不联网、不依赖云端API,避免数据泄露,新手推荐用Ollama一键部署。
-
推荐本地大模型(按易部署程度排序):Qwen(通义千问本地化,中文效果好)、Llama 3(通用型,性能强)、ChatGLM3/4(轻量,适配低配置电脑)、Mistral(速度快);
-
部署工具:Ollama(重点推荐!一键下载、启动本地大模型,无需复杂配置)。
三、新手最简技术栈(10分钟搭建)
无需复杂配置,这套组合可快速跑通本地RAG,适合零基础入门:
-
框架:LangChain(串联全流程,简化开发);
-
文档加载:PyPDF2(PDF专用)、Unstructured(多格式适配);
-
向量化:m3e-base(中文最优,本地运行);
-
向量库:Chroma(轻量无部署);
-
本地LLM:Ollama + Qwen:latest(中文效果好,易部署);
-
运行环境:Python 3.8+(建议3.10,兼容性最好)。
四、可直接复制运行的完整代码
1. 安装依赖(终端执行)
pip install langchain pypdf chromadb sentence-transformers ollama
2. 完整代码(替换文件路径即可运行)
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.llms import Ollama
from langchain_classic.chains import RetrievalQA
# ===================== 1. 加载本地 PDF =====================
loader = PyPDFLoader("phase2/rag/我的 AI龙虾三万养成日记(傅盛).pdf") # 换成你的文件路径
docs = loader.load()
# ===================== 2. 文本分块 =====================
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50 # 每块大小 # 块重叠,保证上下文
)
splits = text_splitter.split_documents(docs)
# ===================== 3. 本地向量库(Chroma) =====================
# 使用本地中文 Embedding 模型:m3e-base
embedding = OllamaEmbeddings(model="bge-m3")
# 创建向量库
vector_db = Chroma.from_documents(
documents=splits,
embedding=embedding,
persist_directory="./chroma_db", # 存在本地文件夹
)
# ===================== 4. 连接本地大模型(Ollama) =====================
llm = Ollama(model="qwen:latest") # 通义千问本地版
# ===================== 5. 构建 RAG 链 =====================
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vector_db.as_retriever(search_kwargs={"k": 3}), # 检索最相关 3 条
return_source_documents=True, # 返回来源片段,可验证
)
# ===================== 6. 开始提问 =====================
question = "这份文档里讲了什么?"
result = rag_chain.invoke({"query": question})
print("【AI 回答】")
print(result["result"])
五、运行前必做:部署本地大模型(Ollama)
Ollama是新手部署本地大模型的最优选择,一键操作,无需复杂配置:
-
下载Ollama:https://ollama.com/(支持Windows/Mac/Linux);
-
安装完成后,打开终端,执行命令下载模型(以qwen:7b为例): `ollama pull qwen:latest`;
-
等待下载完成(约几个G,根据网络速度而定),下载完成后即可通过代码调用。
七、核心总结
本地RAG的核心就是3个组件:本地文档处理(加载+分块)、本地向量库(存向量+检索)、本地大模型(生成答案)。
文档处理
加载文档(PyPDFLoader)->RecursiveCharacterTextSplitter (分块)
本地向量库
向量化m3e-base,中文支持最友好,使用 HuggingFaceEmbeddings 的 sentence-transformers 加载,因为 HuggingFaceEmbeddings 封装了 sentence-transformers,对 Chroma 支持更优好,但是国内访问受限,所以最终还是用了OllamaEmbeddings ,存向量库(Chroma),
本地大模型
LLM Ollama + qwen:latest