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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:43:09