如何手动将预生成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
相关产品推荐
相关产品推荐

