22-检索增强生成(RAG) 优化策略篇¶
来源 PDF:
200页AI大模型面试高频必刷题(附详解)/22-检索增强生成(RAG) 优化策略篇.pdf
主题:RAG / 文档问答
页数:14
字符数:13739
索引片段数:34
摘要¶
检索增强生成(RAG) 优化策略篇 来自: AiGC面试宝典 宁静致远 2024年01月28日 10:12 • 检索增强生成(RAG) 优化策略篇 • 一、RAG基础功能篇 • 1.1 RAG 工作流程 • 二、RAG 各模块有哪些优化策略? • 三、RAG 架构优化有哪些优化策略? • 3.1 如何利用 知识图谱(KG)进行上下文增强? • 3.1.1 典型RAG架构中,向量数据库进行上下文增强 存在哪些问题? • 3.1.2 如何利用 知识图谱(KG)进行上下文增强? • 3.2 Self-RAG:如何让 大模
代表性原文片段¶
片段 1¶
检索增强生成(RAG) 优化策略篇 来自: AiGC面试宝典 宁静致远 2024年01月28日 10:12 • 检索增强生成(RAG) 优化策略篇 • 一、RAG基础功能篇 • 1.1 RAG 工作流程 • 二、RAG 各模块有哪些优化策略? • 三、RAG 架构优化有哪些优化策略? • 3.1 如何利用 知识图谱(KG)进行上下文增强? • 3.1.1 典型RAG架构中,向量数据库进行上下文增强 存在哪些问题? • 3.1.2 如何利用 知识图谱(KG)进行上下文增强? • 3.2 Self-RAG:如何让 大模型 对 召回结果 进行筛选? • 3.2.1 典型RAG架构中,向量数据库 存在哪些问题? • 3.2.2 Self-RAG:如何让 大模型 对 召回结果 进行筛选? • 3.2.3 Self-RAG 的 创新点是什么? • 3.2.4 Self-RAG 的 训练过程? • 3.2.5 Self-RAG 的 推理过程? • 3.2.6 Self-RAG 的 代码实战? • 3.3 多向量检索器多模态RAG篇 • 3.3.1 如何让 RAG 支持 多模态数据格式?
片段 2¶
Self-RAG 的 推理过程? • 3.2.6 Self-RAG 的 代码实战? • 3.3 多向量检索器多模态RAG篇 • 3.3.1 如何让 RAG 支持 多模态数据格式? • 3.3.1.1 如何让 RAG 支持 半结构化RAG(文本+表格)? • 3.3.1.2 如何让 RAG 支持 多模态RAG(文本+表格+图片)? • 3.3.1.3 如何让 RAG 支持 私有化多模态RAG(文本+表格+图片)? • 3.4 RAG Fusion 优化策略 • 3.5 模块化 RAG 优化策略 • 3.6 RAG 新模式 优化策略 • 3.7 RAG 结合 SFT • 3.8 查询转换(Query Transformations) • 3.9 bert在RAG中具体是起到了一个什么作用,我刚搜了下nsp的内容,但有点没法将这几者 联系起来 • 四、RAG 索引优化有哪些优化策略? • 4.1 嵌入 优化策略 • 4.2 RAG检索召回率低,一般都有哪些解决方案呀。尝试过不同大小的chunk,和混合检索。 效果都不太好,然后优化? • 4.3 RAG 如何 优化索引结构? • 4.4 如何通过 混合检索 提升 RAG 效果?
片段 3¶
有哪些解决方案呀。尝试过不同大小的chunk,和混合检索。 效果都不太好,然后优化? • 4.3 RAG 如何 优化索引结构? • 4.4 如何通过 混合检索 提升 RAG 效果? • 4.5 如何通过 重新排名 提升 RAG 效果? • 五、RAG 索引数据优化有哪些优化策略? • 5.1 RAG 如何 提升索引数据的质量? • 5.2 如何通过添加元数据 提升 RAG 效果? • 5.3 如何通过 输入查询与文档对齐 提升 RAG 效果? • 5.4 如何通过 提示压缩 提升 RAG 效果? 查看更多
一、RAG基础功能篇 1.1 RAG 工作流程 图1 RAG工作流程(with memory) 从RAG的工作流程看,RAG 模块有:文档块切分、文本嵌入模型、提示工程、大模型生成。 二、RAG 各模块有哪些优化策略? 此外,还可对query召回的文档块集合进行处理,比如:元数据过滤[7]、重排序减少文档块数量[2]。 三、RAG 架构优化有哪些优化策略? 3.1 如何利用 知识图谱(KG)进行上下文增强? 3.1.1 典型RAG架构中,向量数据库进行上下文增强 存在哪些问题?
片段 4¶
文档块数量[2]。 三、RAG 架构优化有哪些优化策略? 3.1 如何利用 知识图谱(KG)进行上下文增强? 3.1.1 典型RAG架构中,向量数据库进行上下文增强 存在哪些问题? 向量数据库进行上下文增强 存在问题: 3.1.2 如何利用 知识图谱(KG)进行上下文增强? • 5.5 如何通过 查询重写和扩展 提升 RAG 效果? • RAG 未来发展方向 • Rag 的垂直优化 • RAG 的水平扩展 • RAG 生态系统 • 参考 • 文档块切分:设置适当的块间重叠、多粒度文档块切分、基于语义的文档切分、文档块摘要。 • 文本嵌入模型:基于新语料微调嵌入模型、动态表征。 • 提示工程优化:优化模板增加提示词约束、提示词改写。 • 大模型迭代:基于正反馈微调模型、量化感知训练、提供大context window的推理模型。 1. 无法获取长程关联知识 2. 信息密度低(尤其当LLM context window较小时不友好) • 策略:增加一路与向量库平行的KG(知识图谱)上下文增强策略。
图2 基于KG+VS进行上下文增强
片段 5¶
M context window较小时不友好) • 策略:增加一路与向量库平行的KG(知识图谱)上下文增强策略。
图2 基于KG+VS进行上下文增强 3.2 Self-RAG:如何让 大模型 对 召回结果 进行筛选? 3.2.1 典型RAG架构中,向量数据库 存在哪些问题? 经典的RAG架构中(包括KG进行上下文增强),对召回的上下文无差别地与query进行合并,然后访问大模型输 出应答。但有时召回的上下文可能与query无关或者矛盾,此时就应舍弃这个上下文,尤其当大模型上下文窗口 较小时非常必要(目前4k的窗口比较常见)。 3.2.2 Self-RAG:如何让 大模型 对 召回结果 进行筛选? • 具体方式:对于 用户 query,通过 利用 NL2Cypher 进行 KG 增强; • 优化策略:常用 图采样技术来进行KG上下文增强 • 处理方式:根据query抽取实体,然后把实体作为种子节点对图进行采样(必要时,可把KG中节点和query中 实体先向量化,通过向量相似度设置种子节点),然后把获取的子图转换成文本片段,从而达到上下文增强 的效果。
片段 6¶
采样(必要时,可把KG中节点和query中 实体先向量化,通过向量相似度设置种子节点),然后把获取的子图转换成文本片段,从而达到上下文增强 的效果。
图3 RAG vs Self-RAG Self-RAG 则是更加主动和智能的实现方式,主要步骤概括如下: 3.2.3 Self-RAG 的 创新点是什么? 1. 判断是否需要额外检索事实性信息(retrieve on demand),仅当有需要时才召回; 2. 平行处理每个片段:生产prompt + 一个片段的生成结果; 3. 使用反思字段,检查输出是否相关,选择最符合需要的片段; 4. 再重复检索; 5. 生成结果会引用相关片段,以及输出结果是否符合该片段,便于查证事实。
Self-RAG 的重要创新:Reflection tokens (反思字符)。通过生成反思字符这一特殊标记来检查输出。这些字符 会分为 Retrieve 和 Critique 两种类型,会标示:检查是否有检索的必要,完成检索后检查输出的相关性、完整 性、检索片段是否支持输出的观点。模型会基于原有词库和反思字段来生成下一个 token。
片段 7¶
Critique 两种类型,会标示:检查是否有检索的必要,完成检索后检查输出的相关性、完整 性、检索片段是否支持输出的观点。模型会基于原有词库和反思字段来生成下一个 token。 3.2.4 Self-RAG 的 训练过程? 对于训练,模型通过将反思字符集成到其词汇表中来学习生成带有反思字符的文本。 它是在一个语料库上进行训 练的,其中包含由 Critic 模型预测的检索到的段落和反思字符。 该 Critic 模型评估检索到的段落和任务输出的质 量。 使用反思字符更新训练语料库,并训练最终模型以在推理过程中独立生成这些字符。 为了训练 Critic 模型,手动标记反思字符的成本很高,于是作者使用 GPT-4 生成反思字符,然后将这些知识提炼 到内部 Critic 模型中。 不同的反思字符会通过少量演示来提示具体说明。 例如,检索令牌会被提示判断外部文 档是否会改善结果。 为了训练生成模型,使用检索和 Critic 模型来增强原始输出以模拟推理过程。 对于每个片段,Critic 模型都会确 定额外的段落是否会改善生成。 如果是,则添加 Retrieve=Yes 标记,并检索前 K 个段落。 然后 Critic 评估每段
片段 8¶
理过程。 对于每个片段,Critic 模型都会确 定额外的段落是否会改善生成。 如果是,则添加 Retrieve=Yes 标记,并检索前 K 个段落。 然后 Critic 评估每段 文章的相关性和支持性,并相应地附加标记。 最终通过输出反思字符进行增强。 然后使用标准的 next token 目标在此增强语料库上训练生成模型,预测目标输出和反思字符。 在训练期间,检 索到的文本块被屏蔽,并通过反思字符 Critique 和 Retrieve 扩展词汇量。 这种方法比 PPO 等依赖单独奖励模型 的其他方法更具成本效益。 Self-RAG 模型还包含特殊令牌来控制和评估其自身的预测,从而实现更精细的输出 生成。 3.2.5 Self-RAG 的 推理过程? Self-RAG 使用反思字符来自我评估输出,使其在推理过程中具有适应性。 根据任务的不同,可以定制模型,通 过检索更多段落来优先考虑事实准确性,或强调开放式任务的创造力。 该模型可以决定何时检索段落或使用设定 的阈值来触发检索。 当需要检索时,生成器同时处理多个段落,产生不同的候选。 进行片段级 beam search 以获得最佳序列。 每个
片段 9¶
造力。 该模型可以决定何时检索段落或使用设定 的阈值来触发检索。 当需要检索时,生成器同时处理多个段落,产生不同的候选。 进行片段级 beam search 以获得最佳序列。 每个 细分的分数使用 Critic 分数进行更新,该分数是每个批评标记类型的归一化概率的加权和。 可以在推理过程中调 整这些权重以定制模型的行为。 与其他需要额外训练才能改变行为的方法不同,Self-RAG 无需额外训练即可适 应。
3.2.6 Self-RAG 的 代码实战? 下面对开源的 Self-RAG 进行推理测试,可在这里下载模型 selfrag_llama2_13b ,按照官方指导使用 vllm 进行 推理服务 输出结果如下,其中第一段结果不需要检索,第二段结果出现[Retrieval] 字段,因为这个问题需要更细粒度的事 实依据。 我们还可以在输入中增加补充信息: from vllm import LLM, SamplingParams model = LLM("selfrag/selfrag_llama2_7b",
片段 10¶
以在输入中增加补充信息:
from vllm import LLM, SamplingParams
model = LLM("selfrag/selfrag_llama2_7b",
download_dir="/gscratch/h2lab/akari/model_cache", dtype="half")
sampling_params = SamplingParams(temperature=0.0, top_p=1.0, max_tokens=100,
skip_special_tokens=False)
def format_prompt(input, paragraph=None):
prompt = "### Instruction:\n{0}\n\n### Response:\n".format(input)
if paragraph is not None:
prompt += "[Retrieval]
片段 11¶
ot None:
prompt += "[Retrieval]
for a query that doesn't require retrieval¶
preds = model.generate([format_prompt(query) for query in queries], sampling_params) for pred in preds: print("Model prediction: {0}".format(pred.outputs[0].text)) Model prediction: Twitter:[Utility:5]
片段 12¶
l prediction: {0}".format(pred.outputs[0].text))
Model prediction: Twitter:[Utility:5]
Model prediction: China is a country located in East Asia.[Retrieval]
使用建议¶
- 这些内容来自授权公开 PDF 的文本抽取结果,网页端会基于同一份静态索引做关键词检索。
- 面试复习时建议先用网页 PDF 原文检索定位题目,再回到主 notes 学系统化答案。
- 如果片段出现排版噪声,以原 PDF 语义为准,并优先整理成自己的回答模板。