文章目录
- 前言
- 一、为什么选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)、百万级数据性能压测、多模态向量检索实战等内容,请持续关注本专栏《向量数据库从入门到精通》系列文章。