升级Chroma后传递OpenAIEmbeddings到LangChain遇ValueError如何解决?
解决方案:Chroma 0.4.22与LangChain OpenAIEmbeddings兼容问题
问题原因
Chroma 0.4.16版本后对EmbeddingFunction.__call__的签名做了强制要求,必须显式包含self和input参数,而LangChain的OpenAIEmbeddings类的__call__方法使用的是*args和**kwargs可变参数,导致签名不匹配抛出错误。
适配方案
方案1:使用LangChain官方Chroma集成(推荐)
直接通过LangChain的Chroma向量库类创建集合,内部已处理好Chroma的接口适配,无需手动操作chromadb客户端:
from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings # 初始化嵌入模型 embeddings = OpenAIEmbeddings() # 创建/获取Chroma集合(自动处理持久化) db = Chroma( collection_name="chroma", embedding_function=embeddings, persist_directory="./chroma_db" # 指定持久化存储路径,对应chromadb.PersistentClient的默认路径 )
方案2:自定义适配器类(直接操作chromadb客户端时使用)
如果必须直接使用chromadb的PersistentClient,可以写一个适配器类,将LangChain的嵌入函数转换为符合Chroma要求的签名:
import chromadb from langchain_openai import OpenAIEmbeddings class LangChainEmbeddingAdapter: def __init__(self, langchain_embedding): self.langchain_embedding = langchain_embedding def __call__(self, input): # 适配Chroma的输入格式:支持单文本或文本列表 if isinstance(input, str): return self.langchain_embedding.embed_query(input) elif isinstance(input, list): return self.langchain_embedding.embed_documents(input) else: raise ValueError("输入必须是字符串或字符串列表") # 初始化客户端和适配器 client = chromadb.PersistentClient() embedding_adapter = LangChainEmbeddingAdapter(OpenAIEmbeddings()) # 创建/获取集合 collection = client.get_or_create_collection( name='chroma', embedding_function=embedding_adapter )
内容的提问来源于stack exchange,提问作者cottontail
相关产品推荐
相关产品推荐

