大模型LLM最近一年比较火,但是可能由于数据量较大,存在一些矛盾的数据或者质量差的数据,就会导致大模型存在幻视情况,即存在严重不符合事实的情况。随着之而来,RAG(Retrieval Augmented Generation),作为补充缓解LLM的幻视的情况。更加高效的检索尤为重要,Query2doc一种通过LLM改写Query,提高检索的能力。
论文:
Query2doc: Query Expansion with Large Language Models
概述:
本文介绍了一种简单但有效的查询扩展方法,称为 query2doc,旨在提升稀疏(如BM25)和密集检索(如E5,bge-m3等 )系统的性能。该方法首先通过少量样本提示大型语言模型(LLMs)生成伪文档,然后使用生成的伪文档来扩展查询。LLMs 是训练于网络规模的文本语料库,并擅长于知识记忆。来自 LLMs 的伪文档通常包含高度相关的信息,有助于查询消歧并引导检索器。实验结果表明,query2doc 在 MS MARCO 和 TREC DL 等信息检索 数据集上,将 BM25 的性能提升了 3% 至 15%,且无需对模型进行微调。此外,我们的方法无论是在领域内还是领域外的结果上,都对最先进的密集检索器有所裨益。
为什么需要改写或者需要query2doc?
搜索查询往往简短、模糊或缺乏必要的背景信息,LLMs 能够提供相关信息来引导检索系统,因为它们通过预训练在万亿量级的标记上,记住了大量的知识和语言模式。
方法:
简单理解,就是用LLM根绝Query,生成回答doc,然后利用Query融合doc进行检索。
如何生成答案?
Prompt为:Write a passage that answers the given query:
论文结合k=4个样例作为few-shot使LLM能够参考样例,生成我们需要的回答,其中样例源于训练集,进行随机采样获取。
生成的回答展示:
如何利用生成的结果doc?
稀疏检索:BM25
由于查询q通常比生成的文档(doc即伪文档)短得多,为了平衡查询和doc伪文档之间的相对权重,我们在与伪文档doc连接之前,将查询重复n次,以提高查询词的权重。
q u e r y = c o n c a t ( { q } × n + doc ) query=concat( \{q\} \times n + \text{doc}) query=concat({q}×n+doc)
其中n设置5效果比较好,并且不需要进行微调。
密集检索
对于密集检索,其结果仅仅需要通过[SEP]拼接,LLM生成的doc。我理解,模型应该需要重新进行训练。
q u e r y = c o n c a t ( q + [ S E P ] + doc ) query =concat( q+ [SEP]+\text{doc}) query=concat(q+[SEP]+doc)
实验结果
分析
模型规模的影响
随着从13亿参数的模型过渡到1750亿参数的模型,性能稳步提升。由较小的语言模型生成的文本往往更短,并且包含更多的事实性错误。此外,使用更好的训练数据和改进后的指令调优,“davinci-003”模型的表现超过了其早期版本“davinci-001”。最近发布的GPT-4(OpenAI,2023)取得了最佳结果。
怎么使用query 和生成的doc
二者一起使用效果更好,如下图所示:
局限性
一个明显的局限是检索的效率。我们的方法需要在大型语言模型(LLMs)上运行推理,但由于逐个符号的自回归解码,这可能会显著降低速度。此外,在使用query2doc时,随着扩展后查询术语数量的增加,搜索倒排索引的速度也会变慢。