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

相关推荐
我想说一句几秒前
当 map 遇上 parseInt:JS 中一场参数引发的“血案”
前端·javascript·面试
库森学长5 分钟前
Kafka为什么这么快?
后端·面试·kafka
执卿12 分钟前
使用Hilt重构项目
架构
SimonKing14 分钟前
吊打面试官系列:Spring为什么不推荐使用字段依赖注入?
java·后端·架构
Dignity_呱27 分钟前
vue3对组件通信做了哪些升级?
前端·vue.js·面试
就是我30 分钟前
开发“业务组件库”,该从哪里入手?
前端·javascript·面试
寻月隐君1 小时前
探索Web3新速度:Sonic高性能Layer-1上的BlindAuction智能合约实践
后端·web3·github
油泼辣子多加1 小时前
2025年06月07日Github流行趋势
github
Moment1 小时前
给大家推荐一个超好用的 Marsview 低代码平台 🤩🤩🤩
前端·javascript·github
season_zhu1 小时前
Swift:优雅又强大的语法糖——Then库
ios·架构·swift