手把手教你搭建本地 RAG 知识库:LangChain + Ollama + ChromaDB 全流程

原创 发布日期:
64

一、什么是 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

手把手教你搭建本地 RAG 知识库:LangChain + Ollama + ChromaDB 全流程

五、完整代码实现:从零到可用

以下是一个可直接运行的完整示例,假设你的文档放在 ./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 知识库的核心流程可以浓缩为四步:

  1. 装好 Ollama,拉取 deepseek-r1 或 qwen3 模型

  2. 用 LangChain 加载文档,RecursiveCharacterTextSplitter 切分文本块

  3. 用 ChromaDB 向量化存储,OllamaEmbeddings 生成向量

  4. 用 RetrievalQA 链将检索结果与 LLM 串联,生成答案

这套方案零成本、零联网、零数据泄露风险,是个人知识管理和企业私有化部署的最优解之一。从安装到跑通,30 分钟足矣。

现在就打开终端,输入 ollama pull deepseek-r1:14b,开始构建你的专属知识库。

打赏
THE END
作者头像
AI铺子
关注ai行业发展,专注ai工具推荐