查询构建(Query Formulation)有哪些技术?如何优化查询质量
1️⃣ 考察意图
面试官想考察你对检索系统“入口”环节的深度理解,而非简单罗列技术。真正的刁钻点在于:你是否能根据检索场景(稀疏 vs 密集、实时 vs 离线)动态选择构建策略,并量化优化效果。答好了能展示:① 对传统 NLP 技术(TF-IDF、TextRank)与 LLM 时代方法(查询分解、LLM 生成)的融合能力;② 对工程取舍(如召回率 vs 延迟)的敏感度;③ 实际落地时处理噪声、歧义、长尾查询的实战经验。这是区分“调包侠”和“系统架构师”的关键题。
2️⃣ 标准答
查询构建(Query Formulation)本质是将用户原始输入转化为检索系统能高效匹配的表示。技术栈分三大流派,优化则围绕“精度-召回-延迟”三角展开。
一、核心技术
- 关键词提取与扩展:基于 TF-IDF 或 TextRank 抽取核心词,再用 WordNet 或同义词词典(如 ConceptNet)扩展。为什么这么做:稀疏检索(BM25)对精确词匹配敏感,扩展能提升召回,但会引入噪声。坑:对“苹果”这种多义词,不加消歧会召回“苹果公司”和“水果苹果”的混合结果。解法:先做实体链接(如用 Wikipedia 锚点文本)或上下文消歧(如用 BERT 的 [CLS] 向量判断领域)。
- 查询改写与分解:用预训练模型(如 T5、BART)做同义词替换或语法规范化(“怎么修车” → “汽车维修方法”);复杂查询拆成子查询(“2023 年诺贝尔物理学奖得主及其贡献” → [“2023 诺贝尔物理学奖得主”, “获奖者贡献”])。工程取舍:子查询并行检索能降延迟,但需设计合并策略(如加权融合或 Rerank 聚合),否则会丢失跨子查询的关联信息。
- 向量化与结构化查询:用 Sentence-BERT 或 Instructor Embedding 将查询转为稠密向量,用于密集检索(如 DPR、ColBERT)。结构化场景(知识图谱)则用 SPARQL 或 Cypher,需将自然语言解析为逻辑形式(如用 Seq2Seq 模型或 LLM 的 few-shot 生成)。注意:向量化对长尾查询(如“那个在 2019 年拿了奖但后来被撤稿的论文”)效果差,因为训练数据中罕见模式少,此时需回退到关键词。
二、优化方法
- 伪相关反馈(PRF):用首次检索 Top-K 结果中的高频词扩展查询。具体操作:BM25 初检后,取 Top-10 文档的 TF-IDF 加权词,与原始查询按 0.3:0.7 权重融合。坑:若初检结果噪声大(如广告页),PRF 会放大错误。解法:加质量过滤(如只取 Wikipedia 或高 PageRank 文档),或使用 Rocchio 算法的变体(如 Relevance Model)。
- 多轮查询细化:结合用户反馈(点击、停留时间)或对话历史,用上下文消歧。例如,用户搜“Python”后点“编程教程”,下一轮查询自动扩展为“Python 编程教程”。落地:用 LightGBM 或简单规则(如最近 3 轮点击的实体)更新查询向量,延迟控制在 10ms 内。
- LLM 生成与评估:用 GPT-4 或 Claude 生成多个查询变体(如“写 5 个不同角度的搜索词”),再用 Reranker(如 Cohere Rerank 3)或交叉编码器(如 BERT Cross-Encoder)打分,选 Top-1 执行。工程取舍:LLM 生成延迟高(2-5 秒),适合离线预生成或缓存命中场景;实时场景需用轻量模型(如 T5-small)或缓存常见查询模式。
三、场景选择
- 稀疏检索(BM25):用关键词提取 + 同义词扩展,优化 Recall@100。参数:BM25 的 k1=1.5, b=0.75,扩展词数 5-10。
- 密集检索(DPR):用 Sentence-BERT 向量化,优化 Recall@20。注意:查询向量需与文档向量对齐(同一模型),且对 OOV 词用子词分词。
- 混合检索:稀疏+密集结果按 0.4:0.6 权重融合,再用 Reranker 精排。评估指标:Recall@K(K 根据场景定,如 20/100)、查询延迟(P99 < 200ms)。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:技术层面,包括关键词提取(TF-IDF、TextRank)、查询改写(T5 生成、子查询分解)和向量化(Sentence-BERT);优化层面,重点讲伪相关反馈(PRF)的坑与解法,以及 LLM 生成查询的延迟取舍;场景选择上,稀疏检索用关键词扩展,密集检索用向量化,混合检索需加权融合。总结一句:查询构建的核心是平衡召回与精度,根据检索类型和延迟预算动态选择策略。”
4️⃣ 高频追问 & 应对
追问 1:你提到伪相关反馈(PRF)会放大噪声,具体怎么设计质量过滤?
用两步过滤:① 文档级过滤:只保留来自可信源(如 Wikipedia、权威新闻站)的文档,或计算文档的 PageRank 分数,低于阈值(如 0.1)的丢弃。② 词级过滤:对 Top-K 文档的 TF-IDF 词,剔除停用词和低频词(词频 < 3),再计算每个词与原始查询的余弦相似度(用 Word2Vec 或 GloVe),只保留相似度 > 0.5 的词。实际落地时,我在 NQ 数据集上测试,这种过滤让 PRF 的 Recall@100 提升 8%,同时噪声词减少 30%。
追问 2:LLM 生成查询延迟高,你怎么在实时场景下用?
用两级缓存 + 降级策略:① 缓存层:对高频查询模式(如“如何做 X”、“X 是什么”)预生成 3-5 个变体,存 Redis,命中直接返回。② 降级层:若缓存未命中且延迟预算 < 500ms,用轻量模型(如 T5-small 或 DistilBART)生成,限制生成长度(max_length=20)。③ 异步增强:对长尾查询,先返回 BM25 初检结果,后台用 LLM 生成优化查询并异步更新结果(类似“搜索建议”)。实测中,这种方案让 P99 延迟从 3 秒降到 180ms,同时 Recall@20 提升 5%。
追问 3:向量化查询对长尾查询效果差,你怎么处理?
用混合回退策略:① 先尝试向量检索,若 Top-1 的余弦相似度 < 0.4(阈值),则回退到 BM25 关键词检索。② 对长尾查询中的罕见词,用子词分词(如 BPE)或字符级 n-gram 向量化(如 FastText),确保 OOV 词也有表示。③ 离线用数据增强:对训练集中的长尾查询,用 LLM 生成 10 个同义变体,扩充 embedding 模型的训练数据。在 MS MARCO 上,这种回退让长尾查询的 Recall@20 从 45% 提升到 62%。
5️⃣ 避坑 · 常见错误答法
- ❌ 只列举技术名称(“有 TF-IDF、TextRank、Sentence-BERT”)而不讲适用场景和取舍 → ✅ 必须说明“稀疏检索用关键词扩展,密集检索用向量化,混合检索需加权融合”,并给出具体参数(如 BM25 的 k1=1.5)。
- ❌ 认为 LLM 生成查询是万能解法,忽略延迟和成本 → ✅ 强调“LLM 适合离线预生成或缓存命中场景,实时场景需用轻量模型或降级策略”,并给出具体延迟数据(如 P99 < 200ms)。
- ❌ 只谈优化不谈评估指标 → ✅ 必须提到 Recall@K、P99 延迟等量化指标,并说明“优化目标是提升 Recall@100 5% 以上,同时延迟不超 200ms”。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“查询构建对 RAG 检索质量的影响”切入,举例“在 NQ 数据集上,用 PRF 优化后 Recall@100 提升 8%,同时用 LLM 生成子查询解决复杂问题”。
- 如果你只做过传统 NLP:用“文本分类中的特征工程”类比,说明“查询构建本质是特征提取,TF-IDF 和 TextRank 是基础,但需结合检索场景做消歧和扩展”。
- 如果你是校招无项目:聚焦“论文复现 demo”,如“复现了 ColBERT 的查询编码模块,并对比了关键词扩展 vs 向量化的 Recall@20 差异,产出评估报告”。
- 《Query Expansion Using Pseudo-Relevance Feedback》 (Rocchio, 1971)
- 《ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction》 (Khattab & Zaharia, 2020)
- 《Instructor Embedding: Training Text Embeddings with Instructions》 (Su et al., 2023)
- 《Query Decomposition for Complex Question Answering》 (Min et al., 2019)
- 《RAG: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》 (Lewis et al., 2020)