AI

本地RAG实现笔记

Nanlan2026年4月26日编辑于 2026年4月27日10 min

一、本地RAG核心逻辑(一句话吃透)

核心是“检索+生成”结合,避免大模型“失忆”和“胡说”,流程可简化为7步:

  1. 加载本地文档(PDF/Word/Txt/Markdown等);

  2. 将长文档拆分为小文本块(适配大模型上下文长度);

  3. 将文本块向量化(把文字转化为可计算相似度的数字向量);

  4. 将向量存入本地向量库,方便快速检索;

  5. 用户提问时,从向量库中检索最相关的文本片段;

  6. 将“用户问题+检索到的相关片段”一起传入本地大模型;

  7. 大模型基于检索到的私有文档,生成准确、可控的答案。

二、完整实现步骤(标准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是新手部署本地大模型的最优选择,一键操作,无需复杂配置:

  1. 下载Ollama:https://ollama.com/(支持Windows/Mac/Linux);

  2. 安装完成后,打开终端,执行命令下载模型(以qwen:7b为例): `ollama pull qwen:latest`;

  3. 等待下载完成(约几个G,根据网络速度而定),下载完成后即可通过代码调用。

七、核心总结

本地RAG的核心就是3个组件:本地文档处理(加载+分块)、本地向量库(存向量+检索)、本地大模型(生成答案)。

文档处理

加载文档(PyPDFLoader)->RecursiveCharacterTextSplitter (分块)

本地向量库

向量化m3e-base,中文支持最友好,使用 HuggingFaceEmbeddings 的 sentence-transformers 加载,因为 HuggingFaceEmbeddings 封装了 sentence-transformers,对 Chroma 支持更优好,但是国内访问受限,所以最终还是用了OllamaEmbeddings ,存向量库(Chroma),

本地大模型

LLM Ollama + qwen:latest