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

如何为Langchain Self-Query Retriever设置IN过滤器?

如何将Langchain Self-Query Retriever的比较器设置为IN?

我使用Langchain库的Self-Query Retriever,因属性为逗号分隔的关键词字符串,希望将过滤器设置为“in”比较器。我创建检索器代码如下:

from langchain.retrievers.self_query.base import SelfQueryRetriever

SQretriever = SelfQueryRetriever.from_llm(
    llm,
    vectorstore,
    document_content_description,
    metadata_field_info,
    verbose = True,
    k=5,
)

调用SQretriever.get_relevant_documents("What color has the sky?")后,日志显示生成的过滤器为Comparison(comparator=<Comparator.EQ: 'eq'>, attribute='news_keywords', value='blue'),使用的是EQ比较器,请问如何将其设置为IN比较器?


解决方法

要让Self-Query Retriever生成IN比较器的过滤器,核心是在定义metadata_field_info时,给目标字段指定允许使用的比较器:

  1. 导入Comparator枚举
    首先需要从langchain的self_query模块导入Comparator:

    from langchain.retrievers.self_query.base import Comparator
    
  2. 修改metadata_field_info配置
    在定义对应字段的MetadataFieldInfo时,添加allowed_comparators参数,将Comparator.IN包含进去。比如针对news_keywords字段:

    from langchain.chains.query_constructor.base import MetadataFieldInfo
    
    metadata_field_info = [
        # 其他字段配置...
        MetadataFieldInfo(
            name="news_keywords",
            description="逗号分隔的关键词字符串,代表文档的核心关键词",
            type="string",
            allowed_comparators=[Comparator.EQ, Comparator.IN]  # 加入IN比较器
        )
    ]
    
  3. 重新初始化检索器
    用修改后的metadata_field_info重新创建SelfQueryRetriever实例,此时LLM会根据问题场景选择合适的比较器,当匹配到需要检查关键词是否存在的场景时,会生成IN类型的过滤器。

如果需要更强制地让LLM优先使用IN比较器,可以自定义查询构造器的prompt模板,在prompt中明确提示优先使用IN来匹配逗号分隔的关键词字段。


内容的提问来源于stack exchange,提问作者Christian01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:02