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

如何解决Langchain调用已有ChromaDB集合时的EmbedQuery属性错误

问题解决:ChromaDB + Langchain 中 AttributeError: 'OpenAIEmbeddingFunction' object has no attribute 'embed_query'

问题场景

已创建包含文档和元数据的ChromaDB集合,通过Langchain构建LLM并将该集合作为知识库使用,代码如下:

langchain_chroma = Chroma(
client=persistent_client,
collection_name=collection.name,
embedding_function=openai_ef,
)

llm_model = "gtp35turbo-latest"

llm = AzureChatOpenAI(
   api_key=openai_api_key,
   api_version=openai_api_version,
   azure_endpoint=openai_api_base,
   model=llm_model)

qa_chain = RetrievalQA.from_chain_type(
   llm,
   retriever=langchain_chroma.as_retriever(),
   chain_type="refine"
)

运行查询代码 qa_chain.run("How many datascientist do I need for a Object detection problem") 时,出现错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-81-3cdb65aeb43e> in <cell line: 1>()
----> 1 qa.run("How many datascientist do I need for a Object detection problem")

9 frames
/usr/local/lib/python3.10/dist-packages/langchain/vectorstores/chroma.py in similarity_search_with_score(self, query, k, filter, where_document, **kwargs)
    430             )
    431         else:
--> 432             query_embedding = self._embedding_function.embed_query(query)
    433             results = self.__query_collection(
    434                 query_embeddings=[query_embedding],

AttributeError: 'OpenAIEmbeddingFunction' object has no attribute 'embed_query'

错误原因

OpenAIEmbeddingFunction 是Chroma原生的嵌入函数实现,而Langchain的Chroma类要求传入的嵌入函数必须符合Langchain的标准接口(需包含embed_query方法),两者接口不兼容导致报错。

解决方案

替换为Langchain官方提供的适配Azure OpenAI的嵌入类AzureOpenAIEmbeddings,该类实现了Langchain所需的标准接口。

修改步骤

  • 导入Langchain的AzureOpenAIEmbeddings类
  • 创建AzureOpenAIEmbeddings实例替代原有的openai_ef
  • 将该实例传入Langchain的Chroma类中

修改后的完整代码

from langchain.embeddings import AzureOpenAIEmbeddings

# 创建Langchain兼容的嵌入实例
openai_ef = AzureOpenAIEmbeddings(
    api_key=openai_api_key,
    api_version=openai_api_version,
    azure_endpoint=openai_api_base,
    model="text-embedding-ada-002"  # 根据你的Azure部署的嵌入模型名称调整
)

langchain_chroma = Chroma(
    client=persistent_client,
    collection_name=collection.name,
    embedding_function=openai_ef,
)

llm_model = "gpt-35-turbo-latest"  # 修正拼写错误:原gtp35turbo-latest改为正确的gpt-35-turbo-latest

llm = AzureChatOpenAI(
    api_key=openai_api_key,
    api_version=openai_api_version,
    azure_endpoint=openai_api_base,
    model=llm_model
)

qa_chain = RetrievalQA.from_chain_type(
    llm,
    retriever=langchain_chroma.as_retriever(),
    chain_type="refine"
)

额外注意点

  • 确保Azure账号已部署对应的嵌入模型(如text-embedding-ada-002),并在代码中填写正确的模型名称
  • 修正了原代码中LLM模型名称的拼写错误:gtp35turbo-latest应为gpt-35-turbo-latest,避免后续调用出错

内容的提问来源于stack exchange,提问作者Juan Cruz Alric Cortabarria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:23