知识库问答答不好,很多时候不是模型的问题,而是检索没找到对的段落。在检索前加一步“查询改写”——补全对话中的指代、把复合问题拆开、生成几个不同角度的查询——往往能明显改善召回,而且改动成本低。 改写效果要用你自己的问题集评估。

为什么需要改写

  • 指代省略:多轮对话里用户问“那它支持退款吗?”,“它”是什么检索不到;
  • 复合问题:“年假怎么算,离职时没休完怎么办?”包含两个问题;
  • 用词不一致:用户说“报销单”,文档里写的是“费用申请表”。

四种改写方式

1. 结合对话历史补全

根据对话历史,把用户最新的问题改写成一个独立、完整的问题,补全所有指代。
只输出改写后的问题。
对话历史:【最近 3–5 轮】
最新问题:【】

2. 拆分复合问题

如果下面的问题包含多个子问题,请拆分为独立问题,每行一个;如果只有一个,原样输出。
问题:【】

每个子问题分别检索,再把结果合并交给生成模型。

3. 多查询生成

为下面的问题生成 3 个用于检索公司内部文档的查询:
1 个保持原意的完整问句,1 个关键词组合,1 个使用正式文档常见说法的版本。
问题:【】

多个查询的结果合并去重,可以弥补单一表述的盲区。

4. 术语映射

维护一份“口语 → 文档用语”的同义词表(例如“报销单 → 费用申请表”),在改写提示中附上,或在检索前直接替换。

实施建议

  • 先评估再上线:准备几十个真实问题和对应的正确文档,比较改写前后的命中情况;
  • 控制延迟:改写要多调用一次模型,可以用较小、较快的模型;
  • 保留原问题:原问题和改写查询一起检索,避免改写跑偏;
  • 记录日志:保存原问题、改写结果和命中文档,方便排查。

和切分参数一起调

查询改写解决“问得不好”,文档切分解决“存得不好”,两者通常要一起调。切分方法见 RAG 文档切分 和 切块大小与重叠调参;是否需要 RAG 本身,可以先看 RAG 与长上下文怎么选。