You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动将预生成Embedding值与文本导入Chroma DB?

手动导入预生成Embedding到Chroma DB的方法

核心思路

Chroma支持直接导入预计算好的Embedding值,只需确保文本、Embedding、元数据(可选)的顺序严格对应,再通过LangChain的Chroma API完成导入即可。


步骤1:准备数据

你需要准备三组对应的数据(顺序必须完全一致):

  • 文本内容:需包装为LangChain的Document对象(包含page_content和可选的metadata)
  • 预生成的Embedding数组:从独立服务器获取,格式为numpy数组或Python列表
  • 元数据(可选):每个文本对应的字典类型元数据

示例代码:

from langchain_core.documents import Document

# 你的原始文本
sentences = ["This is an example sentence", "Each sentence is converted"]
# 从独立服务器获取的预生成Embedding(替换成你的实际获取逻辑)
precomputed_embeddings = model.encode(sentences)  # 这里用你之前的SentenceTransformer示例代码生成的Embedding
# 可选元数据,每个元素对应一个文本
metadatas = [{"source": "example_1"}, {"source": "example_2"}]

# 转换为Document对象
documents = [
    Document(page_content=text, metadata=meta) 
    for text, meta in zip(sentences, metadatas)
]

步骤2:导入到Chroma DB

有两种方式可以完成导入:

方式一:一次性创建并导入(适合新DB)

使用Chroma.from_embeddings直接创建数据库并导入数据:

from langchain_chroma import Chroma

# 创建并导入数据
db = Chroma.from_embeddings(
    embeddings=precomputed_embeddings,
    documents=documents,
    persist_directory="./my_chroma_db",  # 可选,指定持久化存储路径
    collection_name="my_collection"      # 可选,指定集合名称
)

# 若需要持久化(避免重启后数据丢失),手动调用persist(部分新版本LangChain会自动处理)
db.persist()

方式二:向已有DB添加数据

如果已经存在Chroma数据库,使用add_embeddings方法追加数据:

from langchain_chroma import Chroma

# 初始化已有DB(embedding_function设为None,因为手动传入Embedding)
db = Chroma(
    collection_name="my_collection",
    persist_directory="./my_chroma_db",
    embedding_function=None
)

# 追加预生成的Embedding和文本
db.add_embeddings(
    texts=[doc.page_content for doc in documents],
    embeddings=precomputed_embeddings,
    metadatas=[doc.metadata for doc in documents],
    ids=None  # 可选,手动指定每个文档的ID,不指定则自动生成
)

步骤3:查询数据(注意事项)

如果初始化Chroma时未指定embedding_function,查询时需要手动传入查询文本的Embedding(从你的独立服务器获取),使用similarity_search_by_vector方法:

# 获取查询文本的Embedding(替换成你的服务器调用逻辑)
query = "example sentence"
query_embedding = model.encode([query])[0]

# 执行相似性查询
results = db.similarity_search_by_vector(query_embedding)
print(results[0].page_content)  # 输出匹配的文本

如果希望查询时自动调用独立服务器生成Embedding,可以自定义一个Embedding类:

from langchain_core.embeddings import Embeddings
import requests

class RemoteEmbeddings(Embeddings):
    def __init__(self, api_url):
        self.api_url = api_url

    def embed_documents(self, texts):
        # 调用你的服务器API批量生成Embedding
        response = requests.post(self.api_url, json={"texts": texts})
        return response.json()["embeddings"]

    def embed_query(self, text):
        # 单文本生成Embedding
        return self.embed_documents([text])[0]

# 初始化DB时传入自定义Embedding类
embeddings = RemoteEmbeddings(api_url="http://your-server-address/api/embed")
db = Chroma.from_embeddings(
    embeddings=precomputed_embeddings,
    documents=documents,
    embedding_function=embeddings,
    persist_directory="./my_chroma_db"
)

# 此时可以直接使用普通查询方法
results = db.similarity_search("example sentence")
print(results[0].page_content)

关键注意事项

  • 维度一致:预生成的Embedding维度必须与后续查询时使用的模型维度完全一致,否则会报错
  • 顺序对应:文本、Embedding、元数据的顺序必须严格匹配,否则会出现文本与Embedding不对应的问题
  • 数据格式:Embedding需为numpy数组或Python列表,Chroma可直接处理这两种格式

内容的提问来源于stack exchange,提问作者SG-01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:42:12