什么是自查询(Self-Query)?
自查询(Self-Query)是一种检索增强生成(RAG)技术,它允许系统在执行向量检索之前,先对用户的查询进行自我分析和结构化处理。简单来说,就是让系统"理解"查询的语义,并将其转换为更精确的检索条件。
核心思想
自查询将用户的自然语言查询分解为两个部分:
- 查询的语义内容(用于向量相似度搜索)
- 查询的元数据过滤器(用于精确过滤)
为什么在 RAG 中需要自查询?
1.提高检索精度
问题场景:
用户查询:"查找2023年发布的关于人工智能的论文"传统 RAG:
- 直接将整个查询转换为向量
- 可能检索到2022年或2024年的论文
- 检索结果不够精确
自查询 RAG:
- 语义内容:“关于人工智能的论文” → 向量搜索
- 元数据过滤:
year = 2023→ 精确过滤 - 结果:只返回2023年的AI论文
2.处理结构化数据
很多文档包含结构化元数据:
- 发布日期
- 作者
- 文档类型
- 类别
- 语言
- 价格
- 评分等
自查询可以利用这些元数据进行精确过滤。
3.减少无关结果
示例:
用户查询:"价格低于100元的Python编程书籍"自查询会提取:
- 语义内容:“Python编程书籍”
- 过滤条件:
price < 100
这样可以避免检索到高价书籍,提高结果相关性。
4.支持复杂查询
自查询可以处理包含多个条件的复杂查询:
"查找2023年发布、评分高于4.5、关于机器学习的英文论文"分解为:
- 语义:“机器学习论文”
- 过滤器:
year = 2023rating > 4.5language = "English"
自查询的工作流程
用户查询 ↓ 【查询解析器】 ↓ ├─→ 语义内容 → 向量嵌入 → 向量检索 │ └─→ 元数据过滤器 → 结构化过滤 ↓ 【结果合并】 ↓ 最终检索结果实际代码示例(使用 LangChain)
fromlangchain.chainsimportRetrievalQAfromlangchain.retrieversimportSelfQueryRetrieverfromlangchain.llmsimportOpenAIfromlangchain.vectorstoresimportChromafromlangchain.embeddingsimportOpenAIEmbeddings# 定义文档的元数据结构metadata_field_info=[{"name":"year","type":"integer","description":"文档发布的年份"},{"name":"author","type":"string","description":"文档的作者"},{"name":"category","type":"string","description":"文档的类别"},{"name":"rating","type":"float","description":"文档的评分(0-5)"}]# 创建自查询检索器llm=OpenAI(temperature=0)vectorstore=Chroma(embedding_function=OpenAIEmbeddings())retriever=SelfQueryRetriever.from_llm(llm,vectorstore,document_contents="技术文档和论文",metadata_field_info=metadata_field_info,verbose=True)# 使用自查询检索query="查找2023年发布的关于机器学习的论文,评分要高于4.0"results=retriever.get_relevant_documents(query)自查询的优势
| 优势 | 说明 |
|---|---|
| 更精确 | 结合语义搜索和结构化过滤 |
| 更灵活 | 支持复杂的查询条件 |
| 更智能 | 自动理解用户意图 |
| 更高效 | 减少无关结果的干扰 |
| 更自然 | 用户可以用自然语言表达复杂需求 |
适用场景
- 电商搜索:按价格、品牌、评分等筛选商品
- 文档管理:按日期、作者、类型等筛选文档
- 学术论文:按年份、领域、期刊等筛选论文
- 新闻检索:按时间、来源、地区等筛选新闻
- 代码搜索:按语言、框架、版本等筛选代码
总结
自查询是 RAG 系统中的重要技术,它通过将自然语言查询分解为语义内容和元数据过滤器,显著提高了检索的准确性和相关性。特别是在处理包含结构化元数据的文档集合时,自查询能够提供比纯向量搜索更精确、更符合用户预期的结果。