如何解决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
相关产品推荐
相关产品推荐

