Chromadb 0.4.8+Langchain 0.0.276中SentenceTransformerEmbeddingFunction报错无embed_documents属性
问题解决:AttributeError: 'SentenceTransformerEmbeddingFunction' object has no attribute 'embed_documents'
问题原因
你使用的chromadb.utils.embedding_functions.SentenceTransformerEmbeddingFunction是ChromaDB原生客户端的嵌入函数,它的接口与LangChain要求的Embeddings抽象类不兼容——LangChain要求嵌入对象必须具备embed_documents和embed_query方法,而这个ChromaDB原生函数并未实现这些方法。
修复方案
改用LangChain自带的SentenceTransformerEmbeddings类,它完全符合LangChain的接口规范,修改后的代码如下:
from langchain.vectorstores import Chroma from langchain.embeddings import SentenceTransformerEmbeddings # 初始化符合LangChain规范的嵌入模型 embedding = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2") # 后续正常初始化Chroma向量库 db = Chroma(embedding_function=embedding, persist_directory="./chroma_db")
备选方案(原生函数适配)
如果一定要使用ChromaDB原生的嵌入函数,需要手动封装一层,实现LangChain要求的方法:
from langchain.vectorstores import Chroma from chromadb.utils import embedding_functions from langchain.embeddings.base import Embeddings from typing import List class ChromaEmbeddingAdapter(Embeddings): def __init__(self, chroma_embedding_fn): self.chroma_embedding_fn = chroma_embedding_fn def embed_documents(self, texts: List[str]) -> List[List[float]]: return self.chroma_embedding_fn(texts) def embed_query(self, text: str) -> List[float]: return self.chroma_embedding_fn([text])[0] # 使用适配器包装原生函数 chroma_embedding = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2") embedding = ChromaEmbeddingAdapter(chroma_embedding)
但更推荐直接使用LangChain自带的SentenceTransformerEmbeddings,代码更简洁且不易出错。
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

