Chroma + Ollama + Llama 3.1 搭建本地知识库
介绍如何使用 Chroma、Ollama 和 Llama 3.1 搭建本地私有知识库系统。通过 RAG 架构结合向量检索与本地大模型,保障数据安全并减少幻觉。内容涵盖整体架构设计、推荐技术栈选择(含文档解析、分块、Embedding 及向量数据库)、具体搭建步骤(环境安装、依赖配置、脚本编写)、安全性能优化建议以及效果验证方法。适合希望部署本地 AI 助手的技术人员参考。

介绍如何使用 Chroma、Ollama 和 Llama 3.1 搭建本地私有知识库系统。通过 RAG 架构结合向量检索与本地大模型,保障数据安全并减少幻觉。内容涵盖整体架构设计、推荐技术栈选择(含文档解析、分块、Embedding 及向量数据库)、具体搭建步骤(环境安装、依赖配置、脚本编写)、安全性能优化建议以及效果验证方法。适合希望部署本地 AI 助手的技术人员参考。

作为大模型开发人员,搭建一套 本地私有知识库系统(Local RAG Pipeline)是提升 AI 助手专业性、保障数据安全、避免幻觉的关键基础设施。以下是一套 成熟开源、支持中文、可扩展性强的技术栈方案与详细搭建步骤。
原始文档 (PDF/Word/TXT/Markdown)
文档解析 & 分块
向量化 (Embedding)
向量数据库
大模型 Agent
LLM 推理引擎 (本地运行)
用户问答
| 组件 | 推荐方案 | 选择理由 |
|---|---|---|
| 文档解析 | Unstructured + PyPDF2 / docx2txt | 支持 PDF/Word/PPT/HTML,保留表格结构 |
| 文本分块 | LangChain RecursiveCharacterTextSplitter | 智能按段落/句子切分,避免语义割裂 |
| 嵌入模型(Embedding) | BAAI/bge-large-zh-v1.5(中文)或 nomic-ai/nomic-embed-text-v1.5(多语言) | 中文 SOTA,4096 上下文,HuggingFace 开源 |
| 向量数据库 | ChromaDB(轻量)或 Qdrant(高性能) | Chroma:单机文件存储,零配置;Qdrant:支持过滤、分布式,适合未来扩展 |
| 大模型推理 | Ollama + Llama 3.1 8B/70B或 vLLM(高吞吐) | Ollama:一键启动,API 兼容 OpenAI;vLLM:PagedAttention,吞吐提升 24x |
| 应用框架 | LangChain 或 LlamaIndex | LangChain:生态丰富,调试工具完善 |
💡 为什么不用 Elasticsearch?
虽然 ES 支持向量检索(≥8.0),但配置复杂、资源占用高。Chroma/Qdrant 专为 embedding 设计,更轻量高效。
# 安装 Python ≥3.10
sudo apt install python3-pip
# 安装 Ollama(自动下载 Llama 3)
curl -fsSL https://ollama.com/install.sh | sh
# 启动 Ollama 服务(后台运行)
ollama serve &
pip install langchain chromadb unstructured PyPDF2 python-docx sentence-transformers
将你的知识文件放入 ./docs/ 目录,支持:
.pdf, .docx, .txt, .md, .html创建 build_kb.py:
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
import os
# 1. 加载文档
loader = DirectoryLoader('./docs', glob="**/*.pdf", show_progress=True)
docs = loader.load()
# 2. 文本分块(按字符递归切分)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n","\n","。","!","?",";"," ",""]
)
chunks = text_splitter.split_documents(docs)
# 3. 加载中文 Embedding 模型(首次运行会自动下载 ~1.3GB)
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-large-zh-v1.5",
model_kwargs={'device': 'cuda'} # 若无 GPU 改为 'cpu'
)
# 4. 存入 Chroma 向量库(持久化到 ./chroma_db)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
vectorstore.persist()
print(f"✅ 知识库构建完成!共 {len(chunks)} 个片段")
运行:
python build_kb.py
⏱️ 首次运行需下载模型(约 10–30 分钟),后续秒级加载。
创建 query_kb.py:
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import Ollama
from langchain.chains import RetrievalQA
# 加载向量库
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# 初始化本地 LLM(Ollama 需提前 pull 模型)
llm = Ollama(model="llama3:8b", temperature=0.1)
# 构建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k":3}),
return_source_documents=True
)
# 问答循环
while True:
query = input("\n❓ 请输入问题(输入 'quit' 退出): ")
if query == "quit":
break
result = qa_chain({"query": query})
print(f"\n💡 回答:\n{result['result']}")
# 显示引用来源
print("\n📚 参考片段:")
for i, doc in enumerate(result["source_documents"]):
print(f"[{i+1}] {doc.page_content[:100]}...")
首次运行前,拉取 Llama 3 模型:
ollama pull llama3:8b # 或 llama3:70b(需 48GB+ 内存)
运行问答:
python query_kb.py
./chroma_db)可加密存储(如使用 gocryptfs)| 场景 | 优化方案 |
|---|---|
| GPU 资源充足 | 使用 vLLM 替代 Ollama:pip install vllm + --model meta-llama/Llama-3.1-8B-Instruct |
| 大文档集(>10 万页) | 改用 Qdrant:docker run -p 6333:6333 qdrant/qdrant |
| 低延迟要求 | 将 Embedding 模型转为 ONNX 格式(提速 2–3x) |
text_splitter 的 separators 中加入中文标点(已包含)拒答能力
'公司的股票代码是多少?'(若文档未提及)
→ 应回答'知识库中未找到相关信息'
跨文档推理
'对比 A 产品和 B 产品的技术参数'
→ 应聚合多个文档信息
事实性问题
'根据文档,公司 2025 年战略目标是什么?'
→ 应准确引用原文片段
| 需求 | 方案 |
|---|---|
| Web 界面 | 集成 Gradio 或 Streamlit |
| 自动更新 | 监听 ./docs 目录变动,增量更新向量库 |
| 多模态支持 | 用 Donut 解析 PDF 表格,转为结构化文本 |
| Agent 能力 | 接入 LangGraph 实现多跳推理 |
| 组件 | 选用方案 | 启动命令 |
|---|---|---|
| LLM | Ollama + Llama 3.1 8B | ollama run llama3:8b |
| Embedding | BAAI/bge-large-zh-v1.5 | 自动加载 |
| 向量库 | ChromaDB | ./chroma_db 文件夹 |
| 框架 | LangChain | pip install langchain |
💡 总耗时:环境搭建 < 30 分钟,知识库构建速度 ≈ 100 页/分钟(RTX 4090)。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online