手把手教你搭建本地 RAG 知识库:LangChain + Ollama + ChromaDB 全流程
一、什么是 RAG?为什么要在本地搭建?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将向量检索与大语言模型(LLM)深度结合的技术。它的核心思路并不复杂:当你提问时,系统先从你的私有文档中检索出最相关的片段,再把这些片段连同问题一起喂给大模型,让模型基于真实资料生成答案,而不是凭空" hallucinate(幻觉)"。
本地搭建 RAG 的三大理由:
| 优势维度 | 云端方案 | 本地 RAG 方案 |
|---|---|---|
| 数据隐私 | 文档需上传至第三方服务器 | 所有数据本地存储,零泄露风险 |
| 使用成本 | 按 API 调用次数收费,量大昂贵 | 一次部署,无限次使用,零边际成本 |
| 知识时效性 | 依赖模型训练数据,更新滞后 | 文档实时更新,知识库随时可扩展 |
对于处理企业内部文档、个人笔记、法律合同、医疗资料等敏感信息的场景,本地 RAG 是唯一值得信赖的方案。
二、技术选型:为什么是 LangChain + Ollama + ChromaDB?
在众多开源工具中,这三者的组合堪称"黄金三角":
| 组件 | 角色定位 | 核心优势 |
|---|---|---|
| LangChain | 应用编排框架 | 统一管理文档加载、文本切分、向量存储、提示模板等全链路 |
| Ollama | 本地大模型运行时 | 一条命令拉取并运行 Llama3、Qwen、DeepSeek 等模型,自带 RESTful API |
| ChromaDB | 本地向量数据库 | 轻量、无需配置、支持持久化存储,与 LangChain 原生集成 |
这套组合的最大优势在于:完全免费、完全离线、完全可控。你不需要任何 API Key,不需要联网,甚至不需要 GPU——普通 16GB 内存的笔记本就能跑起来。
三、环境搭建:三步安装所有依赖
3.1 安装 Ollama
Ollama 是整个系统的"大脑引擎",负责运行本地大模型。
Linux(Ubuntu):
curl -fsSL https://ollama.com/install.sh | sh systemctl start ollama
Windows / macOS: 直接从官网下载安装包,双击安装即可自动启动。
验证安装:
ollama --version
3.2 下载大模型
推荐使用 deepseek-r1:14b(推理能力强)或 qwen3:8b(中文能力优秀):
ollama pull deepseek-r1:14b ollama pull qwen3:8b
硬件参考: 7B 模型需要约 8GB 内存,14B 模型建议 16GB 以上。如遇卡顿,可换用量化版本(如 Q4_K_M)。
3.3 安装 Python 依赖
pip install langchain langchain-community chromadb ollama sentence-transformers pip install pypdf "unstructured[all-docs]" python-docx python-pptx lxml openpyxl
各包的作用如下:
| 包名 | 作用 |
|---|---|
| langchain / langchain-community | 链式调用 AI 任务,文档加载与处理 |
| chromadb | 本地向量数据库,存储与检索文本向量 |
| ollama | Python 客户端,调用 Ollama API |
| sentence-transformers | 备用嵌入模型(可选,Ollama 自带 nomic-embed-text) |
| pypdf / python-docx 等 | 多格式文档解析器 |
四、核心概念:RAG 的四个关键环节
在写代码之前,必须理解 RAG 的工作链路:
文档加载 → 文本切分 → 向量化存储 → 检索 → 增强生成
| 环节 | 说明 | 对应工具 |
|---|---|---|
| 文档加载(Loading) | 将 PDF、Word、TXT 等转为纯文本 | LangChain Document Loaders |
| 文本切分(Splitting) | 将长文档切成 500 字左右的小块,保留语义完整性 | RecursiveCharacterTextSplitter |
| 向量化(Embedding) | 用嵌入模型将每个文本块转为向量 | OllamaEmbeddings(nomic-embed-text) |
| 检索与生成(Retrieve & Generate) | 查询时检索最相似的文本块,连同问题一起送入 LLM 生成答案 | ChromaDB + Ollama LLM |

五、完整代码实现:从零到可用
以下是一个可直接运行的完整示例,假设你的文档放在 ./my_docs/ 目录下。
5.1 加载文档
from langchain.document_loaders import DirectoryLoader, PyPDFLoader, TextLoader, Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 根据文件类型自动选择加载器
loader = DirectoryLoader(
'./my_docs/',
glob="**/*.pdf",
loader_cls=PyPDFLoader,
show_progress=True
)
documents = loader.load()
# 也可以混合加载多种格式
# loader = DirectoryLoader('./my_docs/', glob="**/*", loader_cls=TextLoader)5.2 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个文本块约 500 字
chunk_overlap=50 # 相邻块重叠 50 字,保持语义连贯
)
texts = text_splitter.split_documents(documents)
print(f"文档已切分为 {len(texts)} 个文本块")关键参数:
chunk_size建议 2561024 tokens 之间,chunk_overlap建议设为 chunk_size 的 10%20%,避免切分时切断语义。
5.3 创建向量数据库
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
# 使用 Ollama 的嵌入模型(无需额外下载)
embeddings = OllamaEmbeddings(model="nomic-embed-text:latest")
# 创建向量数据库并持久化到本地
db = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory="./chroma_db" # 数据持久化路径
)
# 创建检索器
retriever = db.as_retriever(search_kwargs={"k": 4}) # 每次检索返回前 4 个最相关的块5.4 构建 RAG 问答链
from langchain_community.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
# 初始化本地大模型
llm = Ollama(model="deepseek-r1:14b", temperature=0.1)
# 定义 RAG 提示模板
RAG_TEMPLATE = """你是一个专业的知识助手,请仅根据以下上下文回答问题。
如果上下文中没有相关信息,请直接回答"我在文档中没有找到相关内容"。
上下文:
{context}
问题:{question}
回答:"""
PROMPT = PromptTemplate(
template=RAG_TEMPLATE,
input_variables=["context", "question"]
)
# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": PROMPT}
)5.5 开始提问
# 提问
result = qa_chain.invoke({"query": "我们项目的 API 认证机制是怎样的?"})
print("回答:", result["result"])
print("\n引用来源:")
for i, doc in enumerate(result["source_documents"]):
print(f" [{i+1}] {doc.metadata.get('source', '未知来源')}")六、进阶优化:让你的 RAG 更聪明
基础版本能用,但要达到生产级效果,还需要关注以下几个优化点:
6.1 使用 Rerank 模型提升检索精度
初步向量检索返回的结果可能包含噪声,使用 Rerank 模型进行二次精排可以显著提升答案质量:
| 方案 | 说明 |
|---|---|
| bge-reranker-v2-m3 | 中文效果优秀,Ollama 可直接加载 |
| cohere-rerank(API) | 英文场景表现极佳 |
在 LangChain 中接入:
from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import CohereRerank # 先粗检 Top-20,再精排到 Top-4 compression_retriever = ContextualCompressionRetriever( base_compressor=CohereRerank(), base_retriever=retriever )
6.2 混合检索:向量 + 关键词
纯向量检索在专业术语场景下可能失效,混合检索(Hybrid Search)结合 BM25 关键词检索与向量检索,效果更稳:
# ChromaDB 支持 mmr 搜索类型,可降低冗余
retriever = db.as_retriever(
search_type="mmr", # 最大边际相关性,降低冗余
search_kwargs={"k": 4, "fetch_k": 20}
)| 搜索类型 | 特点 | 适用场景 |
|---|---|---|
| similarity | 余弦相似度,速度快 | 通用语义检索 |
| mmr | 降低冗余,增加多样性 | 长篇文档、多主题查询 |
| similarity_score_threshold | 带阈值过滤 | 高精度要求场景 |
6.3 文档分块策略对比
| 分块策略 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 固定长度(500字) | 简单高效 | 可能切断语义 | 通用场景 |
| 滑动窗口(重叠50字) | 保持上下文连贯 | 存储量略增 | 大多数场景 |
| 语义分块(按段落/标题) | 语义完整 | 实现复杂 | 长文档、技术文档 |
七、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 模型下载极慢 | 默认从国外源拉取 |
使用国内镜像源,或手动下载模型文件放至 ~/.ollama/models |
| 回答不相关 | 分块过大/过小,或嵌入模型不匹配 | 调整 chunk_size 至 512~768,换用 bge-large-zh 中文嵌入模型 |
| 内存不足 OOM | 模型太大 | 换用 7B 小模型,或使用 Q4_K_M 量化版本 |
| PDF 表格/图片丢失 | 加载器不支持 OCR |
使用 unstructured 加载器,或搭配 OCR 预处理 |
| 答案仍然有幻觉 | 提示模板约束不够 | 在 Prompt 中明确要求"仅基于上下文回答,不要自行发挥" |
八、模型选择指南
根据你的硬件条件和使用场景,选择合适的模型组合:
| 场景 | 推荐 LLM | 推荐 Embedding | 最低硬件 |
|---|---|---|---|
| 通用问答(中文) | qwen3:8b | nomic-embed-text | 16GB 内存 |
| 深度推理/代码 | deepseek-r1:14b | bge-m3 | 32GB 内存 |
| 轻量快速响应 | llama3.2:3b | all-MiniLM-L6-v2 | 8GB 内存 |
| 极致中文效果 | qwen2.5:72b(量化) | gte-large-zh | 64GB 内存 + GPU |
九、一键启动:完整项目结构
my_rag_project/ ├── my_docs/ # 你的文档目录(PDF/Word/TXT) ├── chroma_db/ # 向量数据库持久化目录(自动生成) ├── rag_app.py # 上面的完整代码 └── requirements.txt # 依赖清单
requirements.txt:
langchain langchain-community chromadb ollama sentence-transformers pypdf unstructured[all-docs] python-docx python-pptx lxml openpyxl
安装并运行:
pip install -r requirements.txt python rag_app.py
十、总结
搭建本地 RAG 知识库的核心流程可以浓缩为四步:
装好 Ollama,拉取 deepseek-r1 或 qwen3 模型
用 LangChain 加载文档,RecursiveCharacterTextSplitter 切分文本块
用 ChromaDB 向量化存储,OllamaEmbeddings 生成向量
用 RetrievalQA 链将检索结果与 LLM 串联,生成答案
这套方案零成本、零联网、零数据泄露风险,是个人知识管理和企业私有化部署的最优解之一。从安装到跑通,30 分钟足矣。
现在就打开终端,输入 ollama pull deepseek-r1:14b,开始构建你的专属知识库。
版权及免责申明:本文由@AI铺子原创发布。该文章观点仅代表作者本人,不代表本站立场。本站不承担任何相关法律责任。
如若转载,请注明出处:https://www.aipuzi.cn/ai-tutorial/1236.html

