向量数据库实战:用Chroma+BGE从零搭建RAG知识库,5步搞定专属AI助手
2026/9/16 12:19:07 网站建设 项目流程

文章目录

  • 前言
  • 一、为什么选Chroma?
  • 二、准备工作(5分钟搞定)
    • 2.1 环境要求
    • 2.2 安装依赖
  • 三、实战五步走
    • 第一步:初始化 Chroma 数据库库
    • 第二步:准备知识库数据
    • 第三步:加载嵌入模型,文本转向量这里选用 **BGE-small** 模型——384 维,兼顾精度和速度,对中文友好,普通电脑就能跑。跑。
    • 第四步:向量入库
    • 第五步:查询检索
  • 四、完整代码汇总
  • 五、实战避坑清单
  • 六、进阶方向:从原型Chroma 跑通后,可以根据需求进一步升级:一步升级:
  • 七、写这篇文章带你从零跑通了 Chroma + BGE 的 RAG 检索系统。检索系统。核心流程就五步:

前言

上篇文章我们把向量数据、嵌入模型、向量数据库这三件套的理论讲透了。但理论再好,不动手等于白学。

这篇文章就带你真刀真枪地干一场——用轻量级向量数据库Chroma+ 本地嵌入模型BGE,搭建一个属于自己的 RAG 知识库。全程代码可跑,附带避坑指南,跟着做就能让大模型“记住”你的专属知识库。

实战目标:上传你的学习笔记/技术文档 → 输入问题 → 向量数据库检索出最相关的片段 → 大模型基于这些片段生成精准回答。


一、为什么选Chroma?

上篇文章对比了6款主流向量数据库,实战选型我选Chroma,原因很简单:

维度Chroma的优势
上手难度3行代码启动,5分钟跑通原型
部署成本无需独立服务,直接pip install
Python生态与LangChain、LlamaIndex深度绑定
持久化支持本地SQLite存储,数据不丢
适用规模百万级以内够用,个人/小团队首选

💡一句话Chroma 是“向量数据库里的 SQLite”——轻量、够用、不用折腾运维。等你的数据量冲到百万级以后,再考虑迁移到 Qdrant 或 Milvus 不迟。。


二、准备工作(5分钟搞定)

2.1 环境要求

  • Python 3.8+
    -4GB 以上内存(8GB 更佳))
  • 无需GPU

2.2 安装依赖

# 创建虚拟环境(推荐,避免依赖冲突)python-mvenv vecdb_envsourcevecdb_env/bin/activate# Windows用 vecdb_env\Scripts\activate# 安装核心库pipinstallchromadb sentence-transformers

每个库的作用

  • chromadb:向量数据库本身
  • sentence-transformers:加载嵌入模型,把文本转成向量

三、实战五步走

第一步:初始化 Chroma 数据库库

importchromadbfromchromadb.configimportSettings# 创建持久化客户端(重要:指定路径,否则数据只存在内存里)client=chromadb.PersistentClient(path="./chroma_db",# 数据存到本地目录settings=Settings(anonymized_telemetry=False)# 关闭匿名数据上报)# 创建或获取 Collection(相当于传统数据库的“表”))collection=client.get_or_create_collection(name="my_knowledge_base",metadata={"hnsw:space":"cosine"}# 使用余弦相似度)print(f"✅ 数据库已就绪,Collection 名:{collection.name}"))

⚠️避坑 1:一定要用PersistentClient并指定path,否则重启后数据全丢。。


第二步:准备知识库数据

把你要用的文档整理成纯文本。这里以一段技术文档为例:

# 模拟你的知识库文档(实际可从txt/md文件读取)documents=[{"id":"doc_1","text":Chroma 是一个轻量级开源向量数据库,专为 AI 应用设计,支持 HNSW 索引和余弦相似度检索。。"},{"id":"doc_2","text":"向量嵌入模型将文本转换为高维向量,语义相近的文本在向量空间中距离也更近。"},{"id":"doc_3","text":"RAG(检索增强生成)通过先检索相关知识库,再将检索结果作为上下文输入大模型,有效解决模型知识过期和幻觉问题。"},{"id":"doc_4","text":相似度阈值推荐设置为0.7,返回 Top-K 条最相似的结果,过滤低相关度内容。。"}]

💡数据质量决定检索质量:单篇文档建议控制在500-2000字,主题集中。太长的文档先拆分,否则向量会“稀释”语义。


第三步:加载嵌入模型,文本转向量这里选用BGE-small模型——384 维,兼顾精度和速度,对中文友好,普通电脑就能跑。跑。

fromsentence_transformersimportSentenceTransformer# 加载模型(首次运行会自动下载,约400MB)model=SentenceTransformer('BAAI/bge-small-zh-v1.5')# 将文档列表转成向量texts=[doc["text"]fordocindocuments]embeddings=model.encode(texts)print(f"✅ 已生成{len(embeddings)}条向量")print(f"向量维度:{embeddings[0].shape}")# 输出 (384,)print(f"第一条向量前10个值:{embeddings[0][:10].round(4)}")

输出示例:

✅ 已生成 4 条向量 向量维度: (384,) 第一条向量前10个值: [ 0.0234 -0.4567 0.7890 -0.1234 0.5678 -0.9012 0.3456 -0.6789 0.2345 -0.7891]

第四步:向量入库

把向量、原始文本、元数据(如来源、分一起存入 Chroma:a:

# 准备入库数据ids=[doc["id"]fordocindocuments]metadatas=[{"source":"tech_docs"}for_indocuments]# 可自定义元数据# 批量入库collection.add(ids=ids,embeddings=embeddings.tolist(),# numpy数组转listdocuments=texts,# 存原文,方便展示metadatas=metadatas# 存元数据,方便过滤)print(f"✅ 已入库{collection.count()}条数据")

⚠️避坑2:批量入库建议每次不超过1000条,否则可能内存溢出。


第五步:查询检索

输入一个问题 → 转成向量 在 Chroma 里找最相似的 Top-K 个文档文档:

# 用户提问query="向量数据库怎么做相似度检索?"# 问题转向量query_embedding=model.encode(query)# 执行检索results=collection.query(query_embeddings=[query_embedding.tolist()],n_results=3,# 返回Top-3include=["documents","distances","metadatas"]# 要哪些字段)# 打印结果print(f"🔍 问题:{query}\n")fori,(doc,dist)inenumerate(zip(results['documents'][0],results['distances'][0])):print(f"结果{i+1}: 相似度得分{1-dist:.4f}")# Chroma默认余弦距离,转成相似度print(f"内容:{doc}\n")

输出示例:

🔍 问题: 向量数据库怎么做相似度检索? 结果1: 相似度得分 0.8934 内容: Chroma是一个轻量级开源向量数据库,专为AI应用设计,支持HNSW索引和余弦相似度检索。 结果2: 相似度得分 0.7821 内容: RAG(检索增强生成)通过先检索相关知识库,再将检索结果作为上下文输入大模型... 结果3: 相似度得分 0.6543 内容: 相似度阈值推荐设置为0.7,返回Top-K条最相似的结果...

四、完整代码汇总

把上面所有代码合并成一个完整脚本,复制就能跑:

importchromadbfromchromadb.configimportSettingsfromsentence_transformersimportSentenceTransformer# 1. 初始化Chromaclient=chromadb.PersistentClient(path="./chroma_db",settings=Settings(anonymized_telemetry=False))collection=client.get_or_create_collection(name="my_knowledge_base",metadata={"hnsw:space":"cosine"})# 2. 准备数据documents=[{"id":"doc_1","text":"Chroma是一个轻量级开源向量数据库,专为AI应用设计,支持HNSW索引和余弦相似度检索。"},{"id":"doc_2","text":"向量嵌入模型将文本转换为高维向量,语义相近的文本在向量空间中距离也更近。"},{"id":"doc_3","text":"RAG通过检索增强生成,先检索知识库再将结果输入大模型,解决知识过期和幻觉问题。"},{"id":"doc_4","text":"相似度阈值推荐设置为0.7,返回Top-K条最相似的结果,过滤低相关度内容。"}]# 3. 文本转向量model=SentenceTransformer('BAAI/bge-small-zh-v1.5')texts=[doc["text"]fordocindocuments]embeddings=model.encode(texts)# 4. 入库collection.add(ids=[doc["id"]fordocindocuments],embeddings=embeddings.tolist(),documents=texts,metadatas=[{"source":"tech_docs"}for_indocuments])# 5. 检索query="向量数据库怎么检索相似内容?"query_embedding=model.encode(query)results=collection.query(query_embeddings=[query_embedding.tolist()],n_results=3,include=["documents","distances"])print(f"🔍 问题:{query}\n")fori,(doc,dist)inenumerate(zip(results['documents'][0],results['distances'][0])):print(f"结果{i+1}: 相似度{1-dist:.4f}")print(f"内容:{doc}\n")

五、实战避坑清单

常见问题原因解决方案
向量维度不一致报错查询时用了不同模型确保入库和查询用同一个嵌入模型
重启后数据丢失没用持久化模式PersistentClient(path="...")
检索结果不相关相似度阈值太高/文档质量差降低阈值到0.6,或补充更多相关文档
内存溢出单次入库数据量太大分批入库,每批≤100

六、进阶方向:从原型Chroma 跑通后,可以根据需求进一步升级:一步升级:

| 场景 | 推荐方案 |
|------|------|数据量突破 100 万| 迁移到 Qdrant 或 Milvus |v|需要混合搜索(语义 + 关键词)| Weaviate 原生支持 |生|检索精度不够| 换高维模型如bge-large-zh(1024 维)|2|需要部署为 API 服务| 用 FastAPI 封装检索逻辑 |索逻辑 |
|Java/Spring Boot项目| 用LangChain4j集成Chroma/Qdrant |


七、写这篇文章带你从零跑通了 Chroma + BGE 的 RAG 检索系统。检索系统。核心流程就五步:

**准备数据 → 文本转向量 → 向量入库 → 问题转向量 → 相似度检这不仅是向量数据库的“Hello World”,更是后续搭建企业知识库、智能客服、个人 AI 助手的基础。手的基础。把这一步跑通,你就真正迈入了向量数据库实战的大门。

下一篇我会深入**「高并发检索架构与索引调聊聊当数据量突破百万时,如何通过 HNSW 参数调优、分片策略和集群部署来保持毫秒级响应,欢迎关注。欢迎关注。


📌 **参本文实战流程参考了 Chroma 官方文档及阿里云、百度开发者中心等平台的技术实践,嵌入模型选用 BGE 系列,代码经个人验证可运行。验证可运行。

如需获取更多关于向量数据库选型对比、嵌入模型调优、高并发检索架构、混合搜索策略、向量索引算法详解(HNSW/IVF)、百万级数据性能压测、多模态向量检索实战等内容,请持续关注本专栏《向量数据库从入门到精通》系列文章。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询