大模型(LLMs)RAG 优化策略 —— RAG-Fusion篇
来源:AiGC面试宝典 作者:宁静致远 发布时间:2024年03月19日 22:30
一、RAG 有哪些优点?
- 向量搜索融合:RAG 通过将向量搜索功能与生成模型相结合,引入了一种新颖的范式。这种融合使大型语言模型(LLM)能够生成更丰富、更具上下文意识的输出。
- 减少幻觉现象:RAG 显著降低了 LLM 产生幻觉的倾向,使生成的文本更加基于数据。
- 个人和专业效用:从个人应用(如浏览笔记)到更专业的集成,RAG 在提高生产力和内容质量方面展示了其多功能性,同时基于可信的数据来源。
📝通俗解释:RAG 就像给大模型配备了一个"实时资料库"。以前大模型回答问题全靠"记忆"(训练数据),容易胡说八道;现在它可以先查资料再回答,就像学生考试时允许翻书一样,答案更靠谱。
二、RAG 存在哪些局限性?
- 当前搜索技术的限制:RAG 受限于我们的检索式基于词汇和向量的搜索技术。
- 人类搜索效率低下:人类在向搜索系统输入他们想要的内容时并不擅长,如打字错误、含糊的查询或词汇有限,这常常导致错过那些超出显而易见的顶部搜索结果的大量信息。虽然 RAG 有所帮助,但它并没有完全解决这个问题。
- 搜索的过度简化:我们普遍的搜索范式是将查询线性映射到答案,缺乏理解人类查询的多维性。这种线性模型通常无法捕捉更复杂用户查询的细微差别和上下文,导致结果相关性较低。
📝通俗解释:传统搜索就像"问一答一",但用户心里想的问题往往表达不清楚。比如你想找"苹果公司最近发布了什么手机",可能只搜"苹果手机",结果漏掉了很多相关信息。RAG 虽然好用,但这个问题依然存在。
三、为什么需要 RAG-Fusion?
它解决了 RAG 固有的限制,通过生成多个用户查询并重新排序结果,利用逆向排名融合和自定义向量评分加权进行综合、准确的搜索。
RAG-Fusion 旨在弥合用户明确询问的内容与他们实际意图询问的内容之间的差距,更接近于发现通常隐藏的变革性知识。
📝通俗解释:RAG-Fusion 相当于一个"超级搜索助手"。当你问一个问题时,它会主动帮你从多个角度重新描述问题,去不同的地方查找资料,然后把所有结果综合起来,给你一个更全面、更准确的答案。
四、RAG-Fusion 核心技术
RAG-Fusion 的基础架构与 RAG 相似,核心技术包括:
- 通用编程语言:通常是 Python
- 专用向量搜索数据库:如 Elasticsearch 或 Pinecone,用于驱动文档检索
- 大型语言模型:如 ChatGPT,用于生成文本
RAG-Fusion 架构流程图:
┌─────────────┐
│ User Query │ (用户查询)
└──────┬──────┘
│
├──────────────────────────┐
│ │
▼ ▼
┌──────────────────┐ ┌─────────────────────┐
│ Vector Search │ │ Generate Similar │
│ Original Query │ │ Queries │
│ (原始查询向量搜索)│ │ (生成相似查询) │
└──────────────────┘ └──────────┬──────────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│Vector Search│ │Vector Search│ │Vector Search│
│ Query 1 │ │ Query 2 │ │ Query 3 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└──────────────┼──────────────┘
│
▼
┌─────────────────────┐
│ Reciprocal Rank │
│ Fusion │
│ (逆向排名融合) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Re-ranked Results │
│ (重排序结果) │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Generative Output │
│ (生成式输出) │
└─────────────────────┘📝通俗解释:RAG-Fusion 和 RAG 的区别在于多了两步:第一步"生成相似查询"——把你的问题换多种方式重新问一遍;第二步"逆向排名融合"——把所有的搜索结果综合起来,重新排序。这样就不容易漏掉重要信息。
五、RAG-Fusion 工作流程
5.1 多查询生成
为什么要生成多个查询?
在传统的搜索系统中,用户通常输入一个查询来查找信息。虽然这种方法直接简单,但它有局限性。
单一查询可能无法完全捕捉用户感兴趣的全部范围,或者可能过于狭窄而无法产生全面的结果。 因此,从不同角度生成多个查询就显得尤为重要。
📝通俗解释:就像你问"这部电影好看吗",朋友可能需要从"剧情"、"演技"、"特效"、"配乐"等多个角度来回答,才能让你全面了解。RAG-Fusion 就是用这种方式来处理搜索的。
5.2 多查询生成技术实现(提示工程)
利用提示工程和大型语言模型拓宽搜索视野,提升结果质量。利用提示工程生成多个查询至关重要,这些查询不仅与原始查询相似,还提供不同的视角或角度。
多查询生成流程图:
┌─────────────────────────┐
│ User Inputs Single │ (用户输入单个查询)
│ Query │
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ Language Model (ChatGPT)│ (语言模型)
│ + System Message │ (系统消息指导)
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ Natural Language │ (生成自然语言查询)
│ Queries Generated │
└───────────┬─────────────┘
│
┌───────┼───────┐
│ │ │
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│Query 1│ │Query 2│ │Query 3│
│ Direct│ │Economic│ │Public │
│ │ │Perspective│ │Health │
│ │ │ │ │Perspective│
└───────┘ └───────┘ └───────┘
│ │ │
└───────┼───────┘
│
▼
┌─────────────────────────┐
│ Search Results │ (搜索结果)
└───────────┬─────────────┘
│
▼
┌─────────────────────────┐
│ Generated Summary │ (生成的摘要)
└─────────────────────────┘5.3 多查询生成工作原理
调用语言模型:该函数调用一个语言模型(在本例中为 ChatGPT)。该方法期望一个特定的指令集,通常描述为"系统消息",以指导模型。
- 例如,系统消息指导模型充当"AI 助手"
自然语言查询:模型接着基于原始查询生成多个查询
多样性和覆盖范围:这些查询不是随机变化。它们是经过精心生成的,以提供原始问题的不同视角。
- 例如,如果原始查询是关于"气候变化的影响",那么生成的查询可能包括像"气候变化的经济后果"、"气候变化与公共健康"等角度
📝通俗解释:比如你搜索"如何学习编程",RAG-Fusion 会自动生成多个查询:"编程入门教程"、"学编程要学什么语言"、"零基础学编程的正确顺序"等,然后去搜这些不同的查询,最后把结果综合起来。
这种方法确保了搜索过程考虑了更广泛的信息范围,从而提高生成总结的质量和深度。
5.4 逆向排名融合(RRF)
5.4.1 为什么选择 RRF?
逆向排名融合(RRF) 是一种将多个搜索结果列表的排名结合起来产生单一统一排名的技术。该技术由滑铁卢大学(加拿大)和谷歌合作开发,根据其作者的说法,"产生的结果比任何单个系统更好,也比标准重新排名方法更好"。
RRF 算法公式:
$$RRFscore(d \in D) = \sum_{r \in R} \frac{1}{k + r(d)}$$
其中:
- $d$ 表示文档
- $D$ 表示文档集合
- $r(d)$ 表示文档 $d$ 在某个排名列表中的排名位置
- $k$ 是一个常数参数(通常设为 60)
📝通俗解释:RRF 的核心思想是"如果一个文档在多个搜索结果里都排得比较靠前,那它大概率是真正重要的"。它不关心具体的分数高低,只看排名位置。就像选餐厅时,三个朋友都推荐了的店,肯定比只有一个朋友推荐的要可靠。
通过结合不同查询的排名,我们增加了最相关文档出现在最终列表顶部的机会。RRF 特别有效,因为它不依赖于搜索引擎分配的绝对分数,而是依赖于相对排名,使其非常适合结合可能具有不同规模或分数分布的查询结果。
可以将 RRF 看作是那种坚持在做决定前听取每个人意见的人。只不过在这种情况下,它不仅不烦人,而且有帮助。众多观点越多,结果越准确。
5.4.2 RRF 技术实现
RRF 算法计算流程图:
┌─────────────────────────────────────────────────────────┐
│ 获取排名 (Retrieve Rankings) │
├─────────────────────────────────────────────────────────┤
│ Retrieval System 1 Retrieval System 2 Retrieval 3 │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────┐ │
│ │ Ranking: A,C,D│ │ Ranking: B,A │ │Ranking:D,B│ │
│ │ D,B │ │ C,D │ │ A,C │ │
│ └───────┬───────┘ └───────┬───────┘ └─────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 1/1,1/2,1/3,1/4 1/4,1/2,1/3,1 1,1/3,1/4,1/2 │
└──────────┼──────────────────────────────────┼──────────┘
│ │
└──────────────┬───────────────────┘
▼
┌─────────────────────────┐
│ 融合排名 (Fuse) │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 求和 (Sum) │
│ A = 1 + 1/2 + 1/4 │
│ B = 1/4 + 1 + 1/3 │
│ C = 1/2 + 1/3 + 1/2 │
│ D = 1/3 + 1/4 + 1 │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 排序 (Sort by Sum) │
│ D(2.25) > A(1.79) > │
│ B(1.46) > C(1.16) │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 统一排名 (Unified) │
│ D → A → B → C │
└─────────────────────────┘RRF 伪代码实现:
def reciprocal_rank_fusion(search_results: dict) -> list:
"""
逆向排名融合算法
参数:
search_results: 字典,每个键是查询,值是按相关性排序的文档ID列表
返回:
重新排序后的文档列表
"""
# 存储每个文档的融合分数
doc_scores = {}
k = 60 # RRF 常数参数
# 遍历每个查询的搜索结果
for query, doc_list in search_results.items():
for rank, doc_id in enumerate(doc_list, start=1):
# 计算 RRF 分数:1/(k + rank)
if doc_id not in doc_scores:
doc_scores[doc_id] = 0
doc_scores[doc_id] += 1 / (k + rank)
# 按分数降序排序
ranked_docs = sorted(doc_scores.items(), key=lambda x: x[1], reverse=True)
# 返回排序后的文档ID列表
return [doc_id for doc_id, score in ranked_docs]📝通俗解释:看流程图,假设有三个搜索系统分别给出了不同的排名。RRF 算法会给每个文档计算一个"倒数排名分数"——排名越靠前,分数越高。然后把所有分数加起来排序。比如文档 A 在系统1排第1、系统2排第2、系统3排第3,它的分数就是 1/61 + 1/61 + 1/63,分数越高说明越重要。
5.4.3 生成性输出——用户意图保留
使用多个查询的一个挑战是可能稀释用户的原始意图。为了缓解这一点,我们指示模型在提示工程中更重视原始查询。
📝通俗解释:就像老师改论文时,会特别关注学生的"核心论点"。RAG-Fusion 在生成最终答案时,会告诉大模型:"用户的原始问题是这个,其他生成的查询只是辅助参考,要以原问题为主。"
5.4.4 生成性输出——用户意图保留技术实现
最后,将重新排名的文档和所有查询输入到 LLM 提示中,以生成典型的 RAG 方式的生成性输出,如请求回应或摘要。
通过将这些技术和技巧层叠起来,RAG-Fusion 提供了一种强大而细腻的文本生成方法。它利用搜索技术和生成性人工智能的最佳特性,产生高质量、可靠的输出。
六、RAG-Fusion 的优势和不足
6.1 RAG-Fusion 优势
更优质的源材料:使用 RAG-Fusion 时,搜索深度不仅仅是"增强",而是被放大。重新排名的相关文档列表意味着不只是在信息表面刮刮而已,而是潜入观点的海洋。结构化输出易于阅读,让人直觉上可信赖,这在对人工智能生成内容持怀疑态度的世界中至关重要。
增强用户意图:对齐 RAG-Fusion 的核心设计是作为一个富有同情心的人工智能,揭示用户努力表达但可能无法清晰表述的内容。采用多查询策略捕捉用户信息需求的多面性表现,因此提供全面的输出,并与用户意图产生共鸣。
结构化、富有洞见的输出:通过汲取多样化的信息源,模型制作出组织良好且富有洞见的答案,预测后续问题并主动解答。
自动纠正用户查询:该系统不仅解释,还优化用户查询。通过生成多个查询变体,RAG-Fusion 执行隐含的拼写和语法检查,从而提高搜索结果的准确性。
处理复杂查询:人类语言在表达复杂或专业思想时常常出现障碍。该系统作为语言催化剂,生成可能包含所需专业术语或术语的变体,用于更集中和相关的搜索结果。它还可以将更长、更复杂的查询分解成向量搜索可以处理的更小、更易管理的部分。
搜索中的意外发现:考虑"未知的未知"——直到遇到你才知道需要的信息。通过采用更广泛的查询范围,系统促进了发现意外信息的可能性。虽然这些信息并非明确寻求,但对用户来说却可能是一个尤里卡时刻(即灵感突现的时刻)。这使 RAG-Fusion 区别于其他传统搜索模型。
📝通俗解释:RAG-Fusion 的优势可以总结为六点:
- 搜得更深更全,不停留在表面
- 更懂用户真正想问什么
- 答案组织有序,还能预判你接下来可能想问什么
- 自动帮你纠正拼写错误和表达不清的地方
- 能处理专业术语和复杂问题
- 有时候能发现你自己都没想到的有用信息(意外惊喜)
6.2 RAG-Fusion 挑战
过于冗长的风险:RAG-Fusion 的深度有时可能导致信息泛滥。输出可能过于详细,令人不堪重负。可以将 RAG-Fusion 比作那个解释过多的朋友——信息丰富,但有时你可能需要他们直接了当一些。
平衡上下文窗口:多查询输入和多样化文档集的引入可能会使语言模型的上下文窗口受到压力。想象一个舞台上挤满了演员,使得剧情难以跟进。对于上下文限制较紧的模型,这可能导致输出不连贯甚至被截断。
伦理和用户体验考虑:拥有巨大力量的同时也伴随着巨大的责任。对于 RAG-Fusion 来说,操作用户查询以改善结果的能力似乎正踏入某种道德灰区。在改善搜索结果的同时平衡用户意图的完整性至关重要。
📝通俗解释:RAG-Fusion 的问题就像一把双刃剑:
- 信息太多——像那个话痨的朋友,啰嗦得让人头疼
- 上下文太长——大模型有"记忆容量"限制,放太多资料可能让它"记混"或"断片"
- 伦理问题——擅自修改用户的问题来"帮"用户搜索,这算不算越权?
伦理和用户体验注意事项
1. 伦理顾虑:
- 用户自主性:操作用户查询有时可能偏离原始意图。考虑我们向人工智能让渡多少控制权以及代价是什么非常重要。
- 透明度:不仅仅是关于更好的结果;如果用户的查询被调整,他们应当意识到这一点。这种透明度对于维护信任和尊重用户意图至关重要。
2. 用户体验(UX)增强:
- 保留原始查询:RAG-Fusion 优先考虑初始用户查询,确保其在生成过程中的重要性。这作为防止误解的保障。
- 过程可见性:展示生成的查询以及最终结果,为用户提供搜索范围和深度的透明视图。这有助于建立信任和理解。
3. UX/UI 实施建议:
- 用户控制:提供用户切换 RAG-Fusion 的选项,允许他们在手动控制和增强的人工智能辅助之间选择。
- 指导和清晰度:关于 RAG-Fusion 工作方式的工具提示或简要说明可以帮助设定明确的用户期望。
致谢
感谢 AiGC 面试宝典提供的优质内容
📝通俗解释:总的来说,RAG-Fusion 是一个强大的搜索增强技术,但它不是完美的。使用时要权衡:
- 给用户选择权(可以开关这个功能)
- 保持透明(让用户知道查询被优化了)
- 注意不要给出太多信息(适当精简)
- 考虑模型的处理能力(不要超出上下文限制)