如何为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时,给目标字段指定允许使用的比较器:
导入Comparator枚举
首先需要从langchain的self_query模块导入Comparator:from langchain.retrievers.self_query.base import Comparator修改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比较器 ) ]重新初始化检索器
用修改后的metadata_field_info重新创建SelfQueryRetriever实例,此时LLM会根据问题场景选择合适的比较器,当匹配到需要检查关键词是否存在的场景时,会生成IN类型的过滤器。
如果需要更强制地让LLM优先使用IN比较器,可以自定义查询构造器的prompt模板,在prompt中明确提示优先使用IN来匹配逗号分隔的关键词字段。
内容的提问来源于stack exchange,提问作者Christian01

