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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:00:06