查询扩展

查询扩展为同一个信息需求补充其他表达方式,帮助检索找到使用不同术语的资料。扩展词汇时仍需保留原来的对象、时间和范围。

返回概念图谱 →

理解与应用

查询扩展是在原查询之外加入相关词语或新的查询表达,以找到原本可能漏掉的资料。用户说法和文档术语往往不同,例如“报销被打回”在制度中写作“报销退回”或“审批驳回”。搜索这些相关表达,可以为同一个问题增加入口;扩展也可以利用术语表、缩写表或模型生成的候选。

假设用户要查青禾项目在 2026 年使用的报销退回规则。原查询只搜索“打回”,可能没有结果;补上“退回”“审批驳回”后,能够找到制度条款。但项目与年份仍然是限制条件,不能因为某篇旧文档措辞更相近就把它当成有效结果。“退款”虽然也带一个“退”字,描述的却是另一类业务,不宜机械加入。

扩展增加的是候选,不是已经确认的答案。合并多条查询的结果时需要去重,也值得保留哪些资料是原查询命中、哪些由扩展带来。这样才能发现新增结果到底补上了关键证据,还是只增加了阅读量。对于含糊缩写,先利用上下文确定含义通常比同时搜索所有解释更有效;真正有歧义时仍可能需要询问用户。

关系速览
查询扩展应用于 →向量检索

查询扩展可以增加候选覆盖,但会带入偏离原意的检索结果。

查询扩展包含 →HyDE 假设文档检索

在以生成内容扩展检索表示的方法中,HyDE 是一种具体方案;其假设文档不能直接作为答案证据。

动手试一试:补充相关术语,项目和年份保持不变

人工词表补充了 B,但没有改变项目或年度条件。代码使用精确字段匹配来展示范围控制;真实全文检索还需要确认新增结果中的“审批驳回”确实讨论报销规则。

将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。

Python 代码

query = {"term": "打回", "project": "青禾", "year": 2026}
terms = {"打回", "退回", "审批驳回"}
documents = [
    {"id": "A", "term": "打回", "project": "青禾", "year": 2026},
    {"id": "B", "term": "审批驳回", "project": "青禾", "year": 2026},
    {"id": "C", "term": "退回", "project": "青禾", "year": 2024},
    {"id": "D", "term": "退回", "project": "其他项目", "year": 2026},
]

def search(allowed_terms):
    return [doc["id"] for doc in documents
            if doc["term"] in allowed_terms
            and doc["project"] == query["project"]
            and doc["year"] == query["year"]]

print("原查询:", ",".join(search({query["term"]})))
print("扩展后:", ",".join(search(terms)))

运行结果

原查询: A
扩展后: A,B

常见误区

  • 扩展时顺手加入“免费”“最新”或另一个产品名,会在用户未要求的情况下改变检索目标。
  • 生成大量相关词却不评估新增结果,容易同时增加噪声、延迟和后续阅读成本。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。