用Chroma构建本地知识库

入门·10 分钟·通过可运行代码讲解「用Chroma构建本地知识库」,覆盖环境准备、核心代码、参数说明、异常处理、工程化改造和练习任务,适合 AI 编程入门。

用Chroma构建本地知识库

Chroma 是一个适合本地开发和小型项目的向量数据库。用它可以快速构建一个本地知识库问答原型,不需要一开始就部署复杂服务。

适合场景

Chroma 适合:

  • 个人文档问答;
  • 本地 RAG 原型;
  • 小团队知识库验证;
  • 教程和实验项目。

如果是大规模生产环境,还需要评估并发、权限、备份和监控。

安装依赖

pip install chromadb langchain langchain-community

根据使用的 embedding 模型,可能还要安装额外包。

准备文档

可以从简单文本开始:

from langchain_core.documents import Document
 
docs = [
    Document(page_content='差旅报销需要提交发票和审批单', metadata={'source': 'travel.md'}),
    Document(page_content='请假超过三天需要直属主管审批', metadata={'source': 'leave.md'}),
]

真实项目中可以从 Markdown、PDF、网页或数据库加载。

写入Chroma

from langchain_chroma import Chroma
 
vectorstore = Chroma.from_documents(
    documents=docs,
    embedding=embedding_model,
    persist_directory='./chroma_db'
)

persist_directory 用于保存本地索引,下次启动可以继续加载。

查询知识库

results = vectorstore.similarity_search('报销出差费用要什么材料?', k=2)
for doc in results:
    print(doc.page_content, doc.metadata)

返回结果应该包含内容和来源,方便后续引用。

接入大模型回答

检索到文档后,把内容拼成 context:

context = '\n'.join([doc.page_content for doc in results])
prompt = f'请根据资料回答问题。\n资料:{context}\n问题:报销出差费用要什么材料?'

模型回答时要求基于资料,不知道就说不知道。

常见坑

  • 文档没有来源,无法追溯;
  • chunk 太大导致检索噪声多;
  • 修改文档后忘记重建索引;
  • embedding 模型换了但旧向量还在;
  • 本地路径写死,部署后找不到数据。

小结

Chroma 很适合学习 RAG。先用少量文档跑通“加载—向量化—检索—回答”流程,再考虑权限、更新、评估和上线。