多跳问题的查询分解

多跳问题的查询分解

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

多跳问题需串联多个事实,单次检索无法获取未出现在候选集中的证据。本文介绍查询分解方法:先检索原问题,由LLM阅读结果并生成下一个子问题,再次检索,循环至信息齐全或达到跳数上限。随后用倒数排名融合(RRF)合并各跳结果,避免丢失串联证据。文中给出Python实现,并讨论k值影响及交错、最高分等替代融合方式,建议仅对多事实问题使用。

🔎

延伸解读

为什么单次检索不够

多跳问题需要串联多个事实,例如先找导演再找出生地。单次检索只能返回与原始问题相似的片段,而出生地所在的片段可能完全不提及原问题中的电影名,因此不会出现在候选集中。重排序和融合只能调整已有候选的顺序,无法找回从未检索到的证据。查询分解通过生成子问题并再次检索,能够获取这些缺失的串联证据。

RRF融合的k值权衡

倒数排名融合(RRF)将各跳结果按排名打分并求和,k值控制重复出现的片段被提升的程度。较小的k值更强调每跳的顶部结果;较大的k值则让被多个子问题检索到的片段,即使排名较低,也可能超过只被一跳检索到的顶部片段。这有助于纠正某一跳的偏差,但也可能让模糊匹配多个子问题的片段挤掉真正答案。需要根据数据调整k值。

替代融合方式与适用场景

除了RRF,还可以交错合并各跳结果、按最高相似度分数排序,或保留所有跳的片段交给答案步骤。交错法简单但可能忽略跨跳证据;最高分法可能因不同查询的分数不可比而导致某一跳占据全部顶部位置;保留所有片段则会使答案提示随跳数增长。查询分解会增加LLM调用和检索次数,仅建议用于多事实问题,单事实问题用单次检索更快且通常同样准确。

❓

Q&A

什么是多跳问题?为什么单次检索无法回答?

多跳问题需要串联两个事实,第二个事实依赖于第一个的答案。例如“电影《盗梦空间》的导演出生在哪里?”需要先找到导演,再找其出生地。单次查询只能检索到关于电影的片段,而出生地所在的片段可能从未提及电影名,因此单次检索无法获取未出现在候选集中的证据。

查询分解方法是如何工作的?

查询分解先检索原问题,让LLM阅读结果并生成下一个子问题,再次检索,循环直到信息齐全或达到跳数上限。然后使用倒数排名融合(RRF)合并各跳结果,避免丢失串联证据。

在查询分解中,如何合并各跳的检索结果?

可以使用倒数排名融合(RRF),它根据每个片段在各跳中的排名计算得分(1/(k+rank))并求和,使在多跳中排名高的片段得分更高。也可以采用交错、最高分或保留所有结果等替代融合方式。

RRF中的k值有什么影响?

k值控制多跳共同发现的片段被提升的程度。较小的k值更倾向于每跳的顶级结果;较大的k值允许被两跳发现的片段超越仅被一跳发现的顶级片段,即使来自较低排名。k值可能有助于纠正偏离的后续问题,但也可能让模糊片段排名过高。

查询分解适用于哪些场景?

查询分解适用于需要串联多个事实的问题。对于单事实问题,单次查询更快且通常同样准确。建议仅对多事实问题使用,并通过比较单次检索和分解在小型多跳问题集上的recall@k来确认其有效性。

查询分解的实现需要哪些前提条件?

需要已填充的Qdrant集合、用于编码查询的嵌入模型,以及安装qdrant-client和openai的Python环境。

🏷️

标签

➡️

继续阅读