跳转到内容

RAG中的Query改写(扩展资料)

  • 理解query改写的意义
  • 掌握qeury改写的实现方法

在RAG(检索增强生成)流程中,第一步通常是对用户的提问(query)进行改写。这是因为用户提问的方式与他们期望的答案之间可能存在差距。由于每个用户的提问方式可能千差万别,因此对问题进行改写可以帮助系统更好地理解问题并返回更相关的答案,从而提升RAG系统的鲁棒性和扩展性。

用户提出的问题通常存在两类问题:

  • 信息不完整:用户的提问没有表达清楚所有的关键信息
  • 噪声问题:提问中可能包含了与答案无关的内容。

在对话中,前后文是相互关联的。如果仅凭当前的query进行检索,可能会导致召回精度大幅下降,因为query中往往缺少重要的上下文信息。以下是一个具体的例子:

用户: 华为meta70手机的性能怎么样?
系统: 华为meta70手机搭载了强大的处理器和先进的摄像系统,性能表现非常优秀。
用户: 与上一代相比,它有哪些改进?
系统: 华为meta70相较于meta60在处理器性能、摄像头优化和电池续航方面都有显著提升。
用户: 摄像头方面具体改进了什么?
--改写前: 摄像头方面具体改进了什么?
--改写后: 华为meta70手机的摄像头相比meta60有哪些具体改进?

用户在搜索时常常输入的关键词较为简短,并且缺乏足够的上下文信息,这会影响语义检索(向量检索)的效果,导致召回的相关性较低。因此,需要对用户的原始关键词进行扩展和丰富。

用户输入: “机器学习 实践”
改写后的 Query: “机器学习在实际应用中的案例有哪些?哪些工具和方法适用于机器学习实践?”

伪答案改写通过在原始查询中加入一种假设性答案,来增强查询的语义丰富性,从而提高检索或回应的精准度。伪答案并非真实的答案,而是一个设想的内容,用于帮助系统更好地理解并检索相关信息。

用户输入: “如何提高企业的市场竞争力?”
改写后的 Query: “如何提高企业的市场竞争力?比如通过创新产品、优化营销策略或提升客户服务等手段。”
伪答案目的--> 通过提供假设性的提升方式,丰富查询的语义信息,从而增强系统在应对复杂问题时的检索能力

2.4 缩写词改写 用户在查询时常常使用缩写,而许多相关文档通常会使用完整的术语,因此需要对缩写进行扩展,以便更好地匹配相关内容。

用户输入: “VR 技术在教育中的应用”
改写后的 Query: “虚拟现实(Virtual Reality)技术在教育中的应用有哪些?可以举一些实际的应用案例吗?”

通过去除查询中的无关成分(如多余的修饰语、模糊表达或不相关的背景信息),简化并优化查询,使其更加精确和可操作。这种方法有助于提高检索的准确性和效率。

用户输入: “我最近在准备面试,但对于算法的理解还不太够,能推荐一些有效的学习资源吗?”
改写后的 Query: “有哪些有效的学习资源可以帮助提高算法理解?”
分析:去除与问题无关的背景信息 “我最近在准备面试,但对于算法的理解还不太够”。 直接提取核心意图 “帮助提高算法理解”。

这是一种专注于提取核心关键词并去除噪声的查询重写方法。通过识别查询中的关键内容,并排除冗余信息(如停用词、语气词和多余的描述),使查询更加简洁明了,从而提高检索效率和准确性。该方法特别适用于关键词检索召回,如 BM25 检索算法。

用户输入: “关于 Java 中的线程池,常见的实现方式有哪些?”
改写后: “Java 线程池 常见实现方式”

当查询涉及对比多个实体时,可能会产生相互干扰的情况。对比类查询通常包含多个元素,这些元素如果直接放在一个查询中,可能会导致信息重叠,影响检索的准确性。为了避免干扰,可以将对比类查询拆分成多个独立的查询,每个查询聚焦于其中一个实体,这样可以减少信息混淆,获得更准确的结果。

用户输入: “C++ 和 Go 哪个更适合做系统编程?”
拆分后的查询:“C++ 适合做系统编程的优点有哪些?”;“Go 适合做系统编程的优点有哪些?”
拆分原因: • 直接对比 C++ 和 Go 的优劣,可能使得系统无法有效地提取每种语言的特点。拆分后,系统可以分别检索 C++ 和 Go 在系统编程中的优点,避免信息混乱

以下是一个开源rag系统,问题改写的示例,仅供参考:

您是查询扩展方面的专家,能够生成问题的释义。
我无法直接使用用户的问题从知识库中检索相关信息。
您需要通过多种方式扩展或释义用户的问题,例如使用同义词/短语、完整地写出缩写、添加一些额外的描述或解释、改变表达方式、将原始问题翻译成另一种语言(英语/中文)等。
并返回 5 个版本的问题,其中一个来自翻译。
只需列出问题。不需要其他单词。

改写后的query质量在很大程度上依赖于提示(prompt)和大模型的能力。通常,查询改写可以提高召回的准确性,但有时仍可能发生改写失败的情况。因此,建议进行多次改写,或者将查询拆分为多个独立的查询,之后将召回结果输入到重排序(reranking)模型进行精确排序,再由大模型生成最终的答案。