Chroma是一个专门用来存储和搜索"向量"的开源数据库。向量是机器学习模型把文字、图片等信息转换成的一串数字,代表它们的"意思"或"特征"。Chroma让我们可以用自然语言快速找到和查询内容相似的文档、图片等,特别适合做语义搜索、智能问答、推荐系统等AI应用。
什么是向量数据库?
-
向量是什么?
向量是机器学习模型把文本或图片等信息转换成的数字列表,比如一句话"我喜欢苹果"会变成一个长度为768的数字数组。这个数组捕捉了这句话的语义信息。
-
向量数据库的作用
传统数据库是通过关键词匹配来找数据,而向量数据库是通过"向量距离"来找相似内容。距离越小,内容越相似。
-
Chroma的特点
- 开源免费,支持Python和JavaScript
- API简单,只有4个核心接口,方便快速开发
- 支持多种向量生成模型,如Sentence Transformers、OpenAI Embeddings等
- 支持持久化存储和内存模式,适合开发和生产环境
- 可以和主流AI框架如LangChain、LlamaIndex无缝集成
Chroma适合用在哪些场景?
- 语义搜索:用自然语言查询,快速找到相关文档或图片
- 知识库问答:把文档转成向量,结合大语言模型实现智能问答
- 推荐系统:存储用户和物品的向量,实时计算相似度,推荐个性化内容
- 图像检索:通过图像特征向量实现内容搜索
- 异常检测:分析向量数据找异常,应用于安全和反欺诈
- 医疗数据分析:辅助预测和决策
Chroma解决了什么问题?
- 高效存储和检索高维向量
传统数据库难处理高维向量,Chroma专为此设计,支持快速的近邻搜索,性能大幅提升。 - 简化开发流程
自动处理文本分词、向量生成和索引,开发者专注业务逻辑。 - 统一API,方便开发和部署
同一套API支持内存和持久化模式,开发测试到生产无缝切换。 - 多语言多模型支持
Python、JavaScript SDK都支持,兼容多种embedding模型,灵活适配需求。
Chroma快速入门示例(Python)
下面是一个简单的Python示例,展示如何用Chroma创建一个向量库,添加文档,进行相似度查询。
python
import chromadb
# 创建客户端(内存模式,方便测试)
client = chromadb.Client()
# 创建一个集合(相当于数据库中的表)
collection = client.create_collection(name="my_collection")
# 添加文档,Chroma会自动生成向量
collection.add(
documents=["这是一个关于工程师的文档", "这是一个关于牛排的文档"],
metadatas=[{"source": "doc1"}, {"source": "doc2"}],
ids=["id1", "id2"]
)
# 查询与"哪种食物最好?"语义最接近的两个文档
results = collection.query(
query_texts=["哪种食物最好?"],
n_results=2
)
print(results)
运行结果会返回与查询语义最接近的文档及相关信息。
使用自定义中文向量模型示例
如果你想用自己喜欢的中文模型生成向量,比如text2vec-base-chinese,可以这样做:
python
import chromadb
from text2vec import SentenceModel
from chromadb import Documents, EmbeddingFunction, Embeddings
# 自定义embedding函数
class MyEmbeddingFunction(EmbeddingFunction):
def __call__(self, texts: Documents) -> Embeddings:
model = SentenceModel(model_name_or_path='text2vec-base-chinese')
embeddings = [list(model.encode(text, normalize_embeddings=True).astype(float)) for text in texts]
return embeddings
client = chromadb.Client()
# 创建集合时传入自定义embedding函数
collection = client.create_collection(name="my_collection", embedding_function=MyEmbeddingFunction())
collection.add(
documents=["这是第一篇文档", "这是第二篇文档"],
metadatas=[{"source": "source1"}, {"source": "source2"}],
ids=["id1", "id2"]
)
results = collection.query(
query_texts=["查询文档内容"],
n_results=2
)
print(results)
结合LangChain构建知识库问答示例
下面是一个使用LangChain和Chroma构建本地中文知识库的示例:
python
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
# 加载中文embedding模型
embedding_function = HuggingFaceEmbeddings(model_name="shibing624/text2vec-base-chinese")
# 加载文档
loader = TextLoader("your_document.txt")
documents = loader.load()
# 文档切分,避免太长
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
# 创建Chroma向量数据库并保存到本地
db = Chroma.from_documents(docs, embedding_function, persist_directory="./chroma_db")
db.persist()
# 查询示例
query = "什么是人工智能?"
results = db.similarity_search(query, k=3)
for doc in results:
print(doc.page_content)
print("-----")
重要指标和性能
- 向量维度通常为128、256、512、768或更高,取决于embedding模型。
- 查询速度:Chroma支持近似最近邻搜索(ANN),查询延迟通常在毫秒级,适合实时应用。
- 存储容量:支持百万级别向量存储,且支持持久化到磁盘。
- API简单,核心功能仅4个接口,快速上手。
总结
Chroma是一个为AI应用设计的开源向量数据库,专注存储和检索高维向量,支持中文和多种embedding模型。它简化了语义搜索、知识问答、推荐系统等场景的开发流程,性能优异且易于集成。通过简单的Python或JavaScript代码,就能快速搭建智能的带记忆功能的AI系统。
如果你想快速开始,推荐先用Chroma内置的embedding功能,熟悉API后,再尝试接入你喜欢的中文embedding模型,实现更精准的语义理解和搜索。