SelfQueryRetriever对接ChromaDB服务器集合返回空结果求助
问题描述
我目前使用SelfQueryRetriever,数据存储在ChromaDB服务器的集合中。简单相似度检索可正常返回结果,但对同一集合和查询使用SelfQueryRetriever却返回空结果。已正确初始化SelfQueryRetriever及其参数,它能识别目标集合,且依赖库均为最新版本。在本地持久化ChromaDB实例中测试代码可正常返回预期结果,问题仅出在ChromaDB服务器的集合上,恳请提供解决思路。
代码示例
def get_chroma_instance(): chroma_client = chromadb.HttpClient( host=config("CHROMA_HOST"), port=config("CHROMA_PORT") ) try: chroma_client.heartbeat() except: raise Exception("Chroma server is not running") return chroma_client def retrieve_documents(query, top_data=20): try: embedding_function = OpenAIEmbeddings(openai_api_key=open_api_key) llm = ChatOpenAI(temperature=0, openai_api_key=open_api_key) document_content_description = ("Search judgements based on metadata") metadata_field_info=define_metadata_fields() # vectorstore=Chroma("test", OpenAIEmbeddings()) vectorstore = Chroma( client=get_chroma_instance(), collection_name="test", embedding_function=embedding_function, ) print("-----------------------------><--------------------------") # vectorstore = vectorstore._collection print("\n\n\nvectorstore = ", vectorstore._collection) print("-----------------------------><--------------------------") print("\n\n\nvectorstore = ", vectorstore) retriever = SelfQueryRetriever.from_llm( llm, # You might need to replace with your LLM implementation vectorstore, document_content_description, metadata_field_info, search_kwargs={"k": top_data}, ) # Invoke retriever with the query docs = retriever.invoke(query) # Extract document URLs and IDs (modify based on your metadata structure) complete_docs = [] for doc in docs: meta = doc.metadata # Assuming "source" field holds the document URL document_url = meta.get("source") if document_url: complete_docs.append({"source": document_url}) return complete_docs except Exception as e: print("---------------------------------------------\nError in self query: ", e)
解决思路
- 检查元数据字段一致性:本地与服务器集合的元数据字段可能存在差异(如字段名大小写、数据类型不匹配)。SelfQueryRetriever生成的过滤条件会因字段不匹配导致无结果。可通过
vectorstore._collection.get(include=["metadatas"])查看服务器集合的元数据结构,与define_metadata_fields()定义的字段逐一对比。 - 开启调试日志排查过滤逻辑:初始化SelfQueryRetriever时添加
verbose=True参数,查看LLM生成的过滤条件和最终查询语句,确认是否存在字段名错误、值类型不匹配等问题。 - 验证服务器版本兼容性:确认ChromaDB服务器版本与本地依赖库版本一致,部分旧版本服务器对复杂过滤条件的支持可能存在缺陷,导致带过滤的向量查询无结果。
- 手动测试过滤查询:使用
vectorstore.similarity_search(query, filter={"your_metadata_field": "target_value"}, k=top_data)手动构造过滤条件,测试是否能返回结果,以此排除LLM生成过滤条件的问题,或验证服务器是否支持该过滤语法。 - 确认嵌入函数一致性:确保服务器集合使用的嵌入函数与代码中
OpenAIEmbeddings的参数完全一致(如模型、维度、API密钥对应的账号),虽然简单检索正常,但嵌入维度或模型不匹配时,结合过滤条件可能导致无结果。
内容的提问来源于stack exchange,提问作者Arsh
相关产品推荐
相关产品推荐

