100行代码搭建私人AI知识库:用Ollama+ChromaDB实现本地RAG

## 什么是RAG?为什么你需要一个本地的

RAG(Retrieval-Augmented Generation,检索增强生成)是2026年最实用的AI技术之一。它让AI在回答问题之前,先从你的私有文档中检索相关信息,再基于检索结果生成回答。

**通俗理解**:普通AI是「闭卷考试」——只能凭训练时的记忆回答。RAG是「开卷考试」——AI可以先翻你的资料再回答。

为什么需要本地RAG?
– **隐私**:敏感文档不用上传到云端
– **成本**:使用本地开源模型,0 API费用
– **可控**:你决定AI能「看到」哪些文档

## 技术栈

本教程使用三个开源组件:

| 组件 | 作用 | 替代方案 |
|——|——|———|
| Ollama | 本地运行大模型 | LM Studio |
| ChromaDB | 向量数据库(存储文档) | FAISS, Qdrant |
| LangChain | 编排RAG流程 | LlamaIndex |

## 第一步:安装依赖

“`bash
# 安装Ollama(如果还没装)
curl -fsSL https://ollama.com/install.sh | sh

# 下载一个中文能力强的模型
ollama pull qwen2.5:7b

# 安装Python依赖
pip install chromadb langchain langchain-ollama sentence-transformers
“`

## 第二步:准备你的知识库

创建一个文件夹,把你想让AI「学会」的文档放进去:

“`bash
mkdir ~/my-knowledge-base
cd ~/my-knowledge-base

# 示例:创建几份文档
echo “公司请假流程:员工需提前1天在企业微信提交请假申请,
经直属领导审批后方可休假。年假每年15天,病假需提供医院证明。” > policy.txt

echo “产品定价:基础版99元/月,专业版299元/月,
企业版999元/月。年付享8折优惠。新用户7天免费试用。” > pricing.txt

echo “技术栈:后端用Python FastAPI,前端用React+TypeScript,
数据库PostgreSQL,部署在阿里云ACK集群。CI/CD用GitHub Actions。” > tech-stack.txt
“`

## 第三步:写代码(100行)

创建 `rag.py`:

“`python
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import os

# 1. 加载文档
loader = DirectoryLoader(
“./”,
glob=”**/*.txt”,
loader_cls=TextLoader,
loader_kwargs={“encoding”: “utf-8″},
)
documents = loader.load()
print(f”加载了 {len(documents)} 个文档”)

# 2. 切分文档(太长的话切成小块)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块500字符
chunk_overlap=50, # 相邻块重叠50字符
)
chunks = text_splitter.split_documents(documents)
print(f”切分为 {len(chunks)} 个文本块”)

# 3. 创建向量数据库
embeddings = OllamaEmbeddings(
model=”qwen2.5:7b”
)

vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=”./chroma_db”, # 持久化存储
)
print(“向量数据库创建完成”)

# 4. 创建RAG问答链
llm = ChatOllama(
model=”qwen2.5:7b”,
temperature=0.1, # 低温度让回答更准确
)

# 自定义提示词模板
prompt_template = “””你是一个基于公司内部文档的AI助手。
请严格根据以下文档内容回答问题。如果文档中没有相关信息,请如实说明。

文档内容:
{context}

用户问题:{question}

回答:”””

PROMPT = PromptTemplate(
template=prompt_template,
input_variables=[“context”, “question”],
)

qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type=”stuff”,
retriever=vectorstore.as_retriever(
search_kwargs={“k”: 3} # 每次检索最相关的3个文本块
),
chain_type_kwargs={“prompt”: PROMPT},
return_source_documents=True, # 同时返回引用的文档
)

# 5. 提问
def ask(question):
result = qa_chain.invoke({“query”: question})
print(f”\n📖 问题: {question}”)
print(f”🤖 回答: {result[‘result’]}”)
print(f”📄 引用来源:”)
for doc in result[“source_documents”]:
source = doc.metadata.get(“source”, “未知”)
print(f” – {source}: {doc.page_content[:80]}…”)

# 测试几个问题
ask(“请假流程是怎样的?”)
ask(“专业版多少钱?”)
ask(“公司用什么编程语言?”)
ask(“公司有多少员工?”) # 文档中没有的信息
“`

## 第四步:运行测试

“`bash
python rag.py
“`

预期输出:

“`text
加载了 3 个文档
切分为 3 个文本块
向量数据库创建完成

📖 问题: 请假流程是怎样的?
🤖 回答: 员工需提前1天在企业微信提交请假申请,经直属领导审批后方可休假。
年假每年15天,病假需提供医院证明。
📄 引用来源:
– ./policy.txt: 公司请假流程:员工需提前1天…

📖 问题: 专业版多少钱?
🤖 回答: 专业版299元/月。
📄 引用来源:
– ./pricing.txt: 产品定价:基础版99元/月…

📖 问题: 公司有多少员工?
🤖 回答: 文档中没有关于公司员工数量的信息。
“`

> 注意最后一个问题的回答:「文档中没有相关信息」——这就是RAG的核心价值:AI不会瞎编,它只会基于你的文档回答。

## 进阶:接入更多数据源

学会了基础,你可以扩展数据源:

“`python
# 支持PDF文档
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(“report.pdf”)

# 支持网页内容
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader(“https://your-company.com/docs”)

# 支持Markdown
from langchain_community.document_loaders import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader(“readme.md”)
“`

## 性能参考

| 文档数量 | 切分块数 | 索引时间 | 查询速度 | 内存占用 |
|:—:|:—:|:—:|:—:|:—:|
| 10篇 | ~50块 | 3秒 | <1秒 | ~500MB | | 100篇 | ~500块 | 30秒 | 1-2秒 | ~1.5GB | | 1000篇 | ~5000块 | 5分钟 | 2-3秒 | ~5GB | > 个人知识库100篇以内,普通笔记本完全够用。

🔥 关注LC智趣厅,每周从零到一搭建实用AI工具

👇 你想用RAG解决什么问题?评论区聊聊

滚动至顶部
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅