在RAG系统中,用户的查询是丰富多样的,可能存在措辞不准确和缺乏语义信息的问题。这导致使用原始的查询可能无法有效检索到目标文档。
因此,将用户查询的语义空间与文档的语义空间对齐至关重要,目前主要有查询改写和嵌入转换两种方法。
- 查询改写(Query Rewriting)通过修改原始用户查询,使其更加精确或更能反映用户的意图,从而提高检索结果的相关性和质量。
- 嵌入转换(Embedding Transformation)通过应用一个或多个转换模型(例如神经网络)来调整查询嵌入,使其更接近与目标文档的嵌入。
查询改写的方法包括Query2Doc,Doc2Query,HyDE,Step-Back Prompting,Rewrite-Retrieve-Read,ITER-RETGEN,Multi-query。下面依次介绍:
Query2Doc和Doc2Query
双向改写。
Query2Doc:使用LLM的一些提示生成伪文档,然后将它们与原始查询组合以创建新的查询,提高检索命中。
Doc2Query:与上面的相反,为每篇文档生成若干条query,使用这些关联的query来代替文档被检索。有点类似于为每篇文档做语义摘要,用摘要代替文档来做检索。
HyDE
Hypothetical Document Embeddings,通过LLM对用户的query生成一篇假设性的文档,然后根据这个文档的向量去查找相似的N个向量。 核心的原理就是,生成的假设性文档要比query更接近于文档的embedding 空间。
Query2doc认为,HyDE隐含地假设groundtruth文档和伪文档用不同的单词表达相同的语义,这可能不适用于某些查询。(二者的区别)
实现:1.https://docs.llamaindex.ai/en/stable/examples/query_transformations/HyDEQueryTransformDemo/
2.https://blog.csdn.net/hy592070616/article/details/132544684
Step-Back Prompting
这种方法基于首先提出一个更简单、更广泛的问题,该问题有助于理解和检索回答原始更复杂查询所需的基础信息。该过程分为两个基本步骤:抽象和推理。
详细步骤
-
抽象:不是直接回应查询,而是提示大型语言模型(LLM)生成一个关于与原始问题相关的更高级概念或原则的问题。这一抽象步骤将焦点从具体细节转移到更广泛的视角,有助于检索支撑复杂查询的一般性但相关的信息。
-
推理:在检索到有关高级概念或原则的基础事实后,LLM 应用抽象推理为原始查询推导出答案。此步骤利用从抽象信息中获得的上下文和概念洞察,以制定全面准确的响应。
实现:https://github.com/langchain-ai/langchain/blob/master/cookbook/stepback-qa.ipynb?ref=blog.langchain.dev
Rewrite-Retrieve-Read
该文章首先使用LLM对query进行改写,再进行检索和回答生成,而不是直接对原始的query进行内容检索和答案生成。
实现:https://github.com/langchain-ai/langchain/blob/master/cookbook/rewrite.ipynb?ref=blog.langchain.dev
ITER-RETGEN
先走正常流程进行检索增强生成,然后将前一次生成的结果+问题拼接,再去检索相关文档,继续生成新的结果;这个过程重复多次之后得到最终结果。
Multi-query
Multi-query 是一种查询改写(Query Rewrite)的进阶版技术,其核心在于同时生成多个与用户原始查询(query)类似的查询。通过这种方式,可以并行执行多个查询,从而大幅增加检索系统召回与原始查询相关内容的可能性。
参考:
1.https://arxiv.org/html/2404.01037v1
2.https://blog.csdn.net/wshzd/article/details/136564062
3.https://zhuanlan.zhihu.com/p/680232507
4.https://zhuanlan.zhihu.com/p/677540243