【自然语言处理与大模型】向量数据库:Chroma使用指南

发布于:2025-05-19 ⋅ 阅读:(215) ⋅ 点赞:(0)

        Chroma是一款功能强大的开源 AI 应用数据库,专为高效数据存储与检索而设计。它不仅支持 Embedding 和 Metadata 的存储,还集成了多项核心功能,包括向量搜索、全文搜索、Document 存储、Metadata 过滤以及多模态检索。此外,Chroma 还提供了便捷的客户端-服务器(CS)模式,满足多样化的应用场景需求。

安装

# 在服务器上安装
pip install chromadb

# 在客户端上安装,仅支持 HTTP 的客户端
pip install chromadb-client

使用

# 导入chromadb
import chromadb

# 导入embedding_functions,它可以自定义嵌入模型
from chromadb.utils import embedding_functions

my_embedding_func = embedding_functions.OpenAIEmbeddingFunction(
    api_key="YOUR_API_KEY",
    model_name="<嵌入模型的名称>"
)

# 下面三选一就行
# 创建一个临时客户端,存在内存中
chroma_client = chromadb.EphemeralClient()
chroma_client = chromadb.Client()  # 默认使用内存存储模式(非持久化)

# 创建一个持久客户端,若不指定则存默认路径为 .chroma
chroma_client = chromadb.PersistantClient(path="<本地存储路径>")


# 创建一个集合
"""
集合是您存储嵌入、文档和任何附加元数据的地方。集合索引您的嵌入和文档,并实现高效的检索和过滤。您可以使用名称创建一个集合。
"""
collection = chroma_client.create_collection(
    name="my_collection",
    "embedding_function": my_embedding_func  # 指定向量模型

)
collection = chroma_client.get_or_create_collection(name="my_collection")  # 该方法可以避免重复创建集合

# collection的几个属性
print(collection.peek())  # 返回集合中前10项的列表
print(collection.count())  # 返回集合中项目的数量


# 增:向集合中添加一些文本文件
"""
Chroma 将存储您的文本并自动处理嵌入和索引。您还可以自定义嵌入模型。您必须为您的文档提供唯一的字符串 ID
"""
collection.add(
    documents=[
        "This is a document about pineapple",
        "This is a document about oranges"
    ],
    metadatas=[{"source": "pineapple"}, {"source": "oranges"}]
    ids=["id1", "id2"]
)

# 查:查询集合
"""
您可以使用查询文本列表查询集合,Chroma 将返回 n 个最相似的结果。就是这么简单!如果未提供 n_results,Chroma 默认将返回 10 个结果。默认情况下,Chroma 使用 DefaultEmbeddingFunction,它是基于 Sentence Transformers 的 MiniLM-L6-v2 模型
"""
results = collection.query(
    query_texts=["This is a query document about hawaii"],  # Chroma会自动嵌入
    n_results=2  # 返回多少结果
    # where = {"source": "hawaii"}, # 按元数据过滤
    # where_document = {"$contains": "about hawaii"} # 按文档内容过滤
)

# 改:如果重复执行,相同 ID 的文档会被更新
collection.upsert(
    documents=[
        "This is a document about pineapple",
        "This is a document about oranges"
    ],
    ids=["id1", "id2"]
)

# 删:删除某个文档,删除整个集合
collection.delete(ids=["id2"])  # 删除某个文档
client.delete_collection(name="my_collection")  # 删除整个集合

CS模式

服务器上运行这个命令:

# 运行chroma服务器
chroma run --path <本地持久化数据库的路径>

# 单独设置地址和端口
chroma run --path /db_path --host localhost --port 8000

客户端上运行这个代码:

import chromadb

# 下面二选一就行
# 同步客户端连接方式(阻塞式)
client = chromadb.HttpClient(host='localhost', port=8000)

# 异步客户端连接方式(非阻塞式)
async def main():
    client = await chromadb.AsyncHttpClient(host='localhost', port=8000)


# 运行异步主函数
asyncio.run(main())

网站公告

今日签到

点亮在社区的每一天
去签到