Chroma向量数据库:简单易懂的基础介绍与实战示例

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模型,实现更精准的语义理解和搜索。

相关推荐
tk10333118 分钟前
大模型探秘–AI 感知世界:从对话到掌控的交互革命
架构
小华同学ai32 分钟前
82.9K star!NextChat全平台AI助手神器,一键部署轻松搞定!
github
旺仔不是汪39 分钟前
搞定 Promise 输出类面试题|以 BFE.dev 五道题为例全面解析
前端·面试
DKPT39 分钟前
重构之去除多余的if-else
java·开发语言·笔记·学习·面试
掘金安东尼1 小时前
以一敌百:没有 Infra 团队,那就打造自己的技术雷达
人工智能·github
阳火锅1 小时前
都2025年了,你还在提交按钮上面用防抖函数?
前端·vue.js·面试
大鹏dapeng1 小时前
Gone 框架的服务注册与发现:打造高效微服务架构
后端·go·github
LemonDu1 小时前
线上救急-AWS限频
后端·算法·架构
京东云开发者1 小时前
循序渐进搭建复杂B端系统整洁架构
架构
AronTing1 小时前
适配器模式:化解接口不兼容的桥梁设计
后端·设计模式·面试