RAG(检索增强生成)
让 LLM 先查资料再回答,大幅降低幻觉并支持知识实时更新的核心架构。
轻量级开源向量数据库,pip 一装即用,专为 AI 应用的语义搜索和 RAG 场景设计。
内容摘要
Chroma(也叫 ChromaDB)是一款开源的**向量数据库(Vector Database)**,专门用来存储和检索「向量」——也就是把文本、图片等内容用一串数字表示后的形式。传统数据库靠关键词匹配查东西,向量数据库靠**语义相似度(Semantic Similarity)**查东西:即使你搜的词和文档里的词完全不同,只要意思接近就能找到。
Chroma(也叫 ChromaDB)是一款开源的向量数据库(Vector Database),专门用来存储和检索「向量」——也就是把文本、图片等内容用一串数字表示后的形式。传统数据库靠关键词匹配查东西,向量数据库靠**语义相似度(Semantic Similarity)**查东西:即使你搜的词和文档里的词完全不同,只要意思接近就能找到。
Chroma 的核心卖点是极简上手:pip install chromadb 一行命令装好,几行 Python 就能跑起来,不需要装 Docker、不需要配服务器。它是原型验证、教学演示、个人项目和中小规模 RAG(检索增强生成)应用的首选。
| 要素 | 作用 |
|---|---|
| Collection(集合) | 存放文档和向量的容器,相当于传统数据库里的「表」 |
| Embedding Function(嵌入函数) | 把文本自动转换成向量的工具,Chroma 内置了多种选择 |
| Metadata Filter(元数据过滤) | 给文档打标签,查询时可以按标签精确筛选,再配合语义搜索 |
Collection 是 Chroma 组织数据的基本单位。一个 Collection 里存放四样东西:文档原文、对应的向量、元数据(标签信息)和唯一 ID。你可以创建多个 Collection 来隔离不同业务——比如一个存技术文档,一个存产品 FAQ。
import chromadb
# 创建持久化客户端(数据存到磁盘,重启不丢失)
client = chromadb.PersistentClient(path="./my_chroma_db")
# 创建集合,指定距离度量为余弦相似度(Cosine Similarity)
collection = client.get_or_create_collection(
name="my_docs",
metadata={"hnsw:space": "cosine"}
)
嵌入函数负责把人类可读的文本变成机器可计算的向量。Chroma 内置了多种嵌入函数:OpenAI(质量高,需 API Key)、Sentence Transformers(开源免费,本地运行)等。如果你添加文档时只传文本不传向量,Chroma 会自动调用嵌入函数帮你转换。
每条文档可以附带一组键值对(元数据),查询时通过 where 参数按条件筛选。这样做的好处是:先按标签缩小范围,再在小范围内做语义搜索,既快又准。
安装依赖:
# 安装 Chroma(核心包,零配置即可运行)
pip install chromadb
# 可选:使用开源嵌入模型(无需 API Key)
pip install sentence-transformers
最小可运行示例(基于 chromadb==0.6.3 验证,截至 2026-03):
import chromadb
# 1. 创建客户端(内存模式,适合快速体验)
client = chromadb.EphemeralClient()
# 2. 创建集合
collection = client.create_collection(name="demo")
# 3. 添加文档(Chroma 自动调用默认嵌入函数将文本转为向量)
collection.add(
documents=[
"Python 是最流行的 AI 编程语言",
"JavaScript 主要用于前端开发",
"向量数据库用于语义搜索",
"机器学习需要大量训练数据",
],
metadatas=[
{"topic": "programming"},
{"topic": "programming"},
{"topic": "database"},
{"topic": "ai"},
],
ids=["doc1", "doc2", "doc3", "doc4"],
)
# 4. 语义搜索:找和「AI 开发用什么语言」最相似的 2 条文档
results = collection.query(
query_texts=["AI 开发用什么语言"],
n_results=2,
)
for doc, dist in zip(results["documents"][0], results["distances"][0]):
print(f" {doc}(距离: {dist:.3f})")
# 5. 带元数据过滤:只在 programming 类别里搜索
results2 = collection.query(
query_texts=["AI 开发"],
where={"topic": "programming"},
n_results=2,
)
print("\n仅 programming 类别:")
for doc in results2["documents"][0]:
print(f" {doc}")
预期输出:
Python 是最流行的 AI 编程语言(距离: 0.751)
机器学习需要大量训练数据(距离: 1.022)
仅 programming 类别:
Python 是最流行的 AI 编程语言
JavaScript 主要用于前端开发
持久化模式(数据保存到磁盘)只需把客户端换一行:
# 把 EphemeralClient() 换成 PersistentClient(path=...)
client = chromadb.PersistentClient(path="./chroma_data")
使用 Sentence Transformers 嵌入函数(无需 API Key):
from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction
ef = SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")
collection = client.create_collection(name="my_kb", embedding_function=ef)
| 维度 | Chroma | Milvus | Pinecone |
|---|---|---|---|
| 核心定位 | 轻量本地向量库,极简 API | 开源分布式向量库,支撑亿级数据 | SaaS 托管向量服务,免运维 |
| 部署方式 | pip 安装即用,无需 Docker | 需要 Docker/K8s 集群部署 | 云端托管,注册即用 |
| 数据规模 | 百万级以内 | 十亿级 | 十亿级 |
| 学习成本 | 极低,5 分钟上手 | 较高,需理解分布式概念 | 低,但受限于 API |
| 费用 | 完全免费(Apache 2.0) | 免费开源 / 商业版 | 按用量付费 |
核心区别:
| 误区 | 准确理解 |
|---|---|
| Chroma 只能用于开发测试,不能上生产 | Chroma 可用于中小规模生产环境(百万级文档以内)。限制在于单机架构,不支持水平扩展 |
| 嵌入向量维度越高效果越好 | 高维向量增加存储和计算成本,256-512 维通常已足够。选模型应综合考虑精度、速度和成本 |
| 向量搜索可以替代关键词搜索 | 两者互补。向量搜索擅长找「意思相近」的内容,关键词搜索擅长找「精确匹配」的内容。融合使用效果最好 |
| 优势 | 劣势 |
|---|---|
安装零配置,pip install 即刻可用 | 单机架构,不支持分布式水平扩展 |
| API 极简,学习成本极低 | 数据量超百万后性能明显下降 |
| 内置多种嵌入函数,自动处理向量化 | 生态成熟度不及 Milvus 等老牌方案 |
| 与 LangChain、LlamaIndex 无缝集成 | 多进程并发访问同一数据库时容易锁表 |
参考答案:
Collection 是容器,类似数据库里的表。Document 是存入 Collection 的原始文本。Embedding 是 Document 经过嵌入函数转换后的向量表示。三者关系:一个 Collection 包含多条 Document,每条 Document 对应一个 Embedding 向量,查询时通过比较 Embedding 之间的距离来找到最相似的 Document。
参考答案:
切换时注意:两者的 API 完全一致,只需改一行初始化代码。但 EphemeralClient 的数据无法迁移到 PersistentClient,需要重新添加文档。
参考答案:
三个方向:
hnsw:M 和 hnsw:ef 提升查询准确率,但会增加内存消耗和查询延迟,需根据实际场景权衡。优先展示同分类且标签更接近的内容,方便继续串联学习。
让 LLM 先查资料再回答,大幅降低幻觉并支持知识实时更新的核心架构。
开源 AI 原生向量数据库,内置向量化模块和生成模块,支持多模态搜索与混合检索。
开源云原生向量数据库,专为 AI 应用设计,支持 PB 级向量相似度搜索。