查询 · 2023

查询改写

先把用户的原话改写成更适合检索的查询,再去查。

常用 · 提示或小模型训练

要解决的问题

对话里的「它」「上面那个方案」,以及和文档用词不同的提问,直接拿去检索会偏。

相对前一代的变化

朴素 RAG 把原问题同时送给检索器和生成器。改写在检索之前多了一步,检索看到的是改写后的查询。

做法

Ma 等人的 Rewrite-Retrieve-Read 在检索前把原问题改成搜索查询。可以用提示完成,也可以训练一个小改写模型,让它迎合后面冻结的检索器和阅读器。面对元数据、图或关系表时,原话还要整理成对应来源能执行的过滤条件、图查询或 SQL。一次变出多个问法见「多查询」,用假想答案做向量见「HyDE」。

局限

改写可能弄丢原问题里的限制条件,或添上文档里没有的说法。一次问题变出多次查询,检索次数会成倍增加。

在链路中的位置

在检索之前。混合检索和重排序拿到的,已经是改写后的查询结果。

详解

「详解」根据 Datawhale《All-in-RAG》 的 查询构建、查询重构与分发 改写,有删节和重组,未包含原教程的代码、图片和练习。原教程与本节详解均按 CC BY-NC-SA 4.0 许可提供:使用时需署名并标明修改,不得用于商业目的,再次改编须以相同许可共享。

原话不一定是检索器能执行的查询

用户说“去年评分最高的科幻片”,向量检索看到的是一整句自然语言。真正能缩小范围的是年份、类型和排序字段。查询构建把这句话拆成语义查询和结构化条件:语义部分继续做向量搜索,条件部分变成元数据过滤。

自查询检索器需要预先描述每个字段的名称、类型和含义。描述含糊时,模型会把条件放错字段。图数据库也是同样的问题。Cypher 用节点和关系表达路径,模型只有看到图的标签、属性和关系类型,才能写出可执行的 MATCH 语句。

同一问题可以先变成多个问法

多查询让模型从原问题写出若干互补问法,分别检索后再合并结果。它能补上一种问法没覆盖的用词,也会使检索次数成倍增加。退步提示则先把问题抬高一层,例如把“这种合金为什么适合叶片”先改写成“叶片材料需要承受什么”,用更一般的概念去召回原理,再回到原问题作答。

HyDE 不直接编码原问题,而是先让模型写一段假设性答案,用这段答案的向量去检索。假设答案的用词往往更接近文档。假设如果方向就错了,检索也会跟着走偏,所以它适合词汇不匹配明显、并且允许多一次生成的场景。

不同资料源需要先路由

问题可能属于不同知识库、不同语言或不同工具。基于模型的路由把候选目的地和适用说明写进提示,让模型输出一个目的地。基于嵌入的路由先为每个目的地准备若干示例,查询向量靠近哪组示例,就走哪条链。

模型路由能处理措辞变化,但多一次调用。嵌入路由快且稳定,示例却必须覆盖真实问法。两条路由都要保留一个兜底:无法判断时走通用检索,而不是勉强分到错误的数据源。