什么是自查询(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 = 2023
- rating > 4.5
- language = "English"
自查询的工作流程
用户查询
↓
【查询解析器】
↓
├─→ 语义内容 → 向量嵌入 → 向量检索
│
└─→ 元数据过滤器 → 结构化过滤
↓
【结果合并】
↓
最终检索结果
实际代码示例(使用 LangChain)
from langchain.chains import RetrievalQA
from langchain.retrievers import SelfQueryRetriever
from langchain.llms import OpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# 定义文档的元数据结构
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 系统中的重要技术,它通过将自然语言查询分解为语义内容和元数据过滤器,显著提高了检索的准确性和相关性。特别是在处理包含结构化元数据的文档集合时,自查询能够提供比纯向量搜索更精确、更符合用户预期的结果。



