【LLM】Advanced rag techniques: an illustrated overview

news2024/9/28 19:16:41

note

文章目录

  • note
  • Advanced rag techniques: an illustrated overview
    • 基础RAG
    • 高级RAG
    • 分块和向量化(Chunking & Vectorisation)
    • 搜索索引(Search Index)
      • 1. 向量存储索引(Vector Store Index)
      • 2. 多层索引(Hierarchical Indices)
      • 3. 假设问题和HyDE(Hypothetical Questions and HyDE)
      • 4. 上下文增强(Context Enrichment)
        • (1)句子窗口检索(Sentence Window Retrieval)
        • (2)自动合并检索器(Auto-merging Retriever,又称父文档检索器 Parent Document Retriever)
      • 5. 融合检索或混合搜索(Fusion Retrieval or Hybrid Search)
    • 重新排序和过滤(Reranking & Filtering)
    • 查询转换(Query Transformations)
    • 聊天引擎(chat engine)
    • 查询路由(Query Routing)
    • RAG中的智能体(Agents in RAG)
    • 响应合成器(Response Synthesiser)
    • 编码器和LLM微调(Encoder and LLM Fine-Tuning)
    • 评估(Evaluation)
    • 总结
  • Reference

Advanced rag techniques: an illustrated overview

《Advanced RAG Techniques: an Illustrated Overview》一篇技术博客
简介:文章主要探讨了RAG技术的高级应用和算法,系统化地整理了各种方法,附带了作者知识库中引用的各种实现和研究的链接。文章的目标是概览和解释可用的RAG算法和技术,并不深入代码实现细节。

原文:https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6

文章的引言部分提到两个最著名的开源库用于基于LLM的管道和应用是LangChain和LlamaIndex,分别在2022年10月和11月成立,并chatGPT大热的带动下在2023年被大量采用。本文中系统化整理的高级RAG技术,以及提供对它们的实现的参考,也主要在LlamaIndex中进行。

基础RAG

基础RAG:将文本切片并emb后,将所有emb放入索引中,对query进行emb后,根据query emb找到top-k个切片emb,最后query结合top-k个切片一起送入LLM得到结果。

注:除了openai,还可以选择Anthropic 的 Claude,Mistral 的小型但功能强大的模型Mixtral,Microsoft 的Phi-2,以及如Llama2,OpenLLaMA,Falcon等模型。
在这里插入图片描述

高级RAG

在这里插入图片描述

分块和向量化(Chunking & Vectorisation)

  • 块的大小:Sentence Transformers最多处理512个token;OpenAI的ada-002能够处理更长的序列(如8191个token);在 LlamaIndex 中,NodeParser 类很好支持解决这个问题,其中包含一些高级选项,例如定义自己的文本拆分器、元数据、节点/块关系等。
  • 向量化:bge-large 或 E5 嵌入系列向量模型(参考MTEB 排行榜)

搜索索引(Search Index)

在这里插入图片描述

1. 向量存储索引(Vector Store Index)

(1)向量存储索引(Vector Store Index):

  • 比如 faiss、nmslib 以及 annoy等是基于最近邻检索的方法,如聚类、树结构或HNSW算法
  • 一些托管解决方案:如 OpenSearch、ElasticSearch 以及向量数据库,它们自动处理上面提到的数据摄取流程,例如Pinecone、Weaviate和Chroma
  • LlamaIndex支持许多向量存储索引,但也支持其他更简单的索引实现,如列表索引、树索引和关键词表索引

2. 多层索引(Hierarchical Indices)

(2)多层索引(Hierarchical Indices)

如果要从很多文档中检索,可以创建两个索引(一个由摘要组成,另一个由文档块组成),即两步搜索(先通过摘要筛选出满足相关的文档,然后在这些文档中继续搜索)。
在这里插入图片描述

3. 假设问题和HyDE(Hypothetical Questions and HyDE)

  • 抽q:让LLM给每个块生成问题,将问题emb,实际中query emb和前者每个块对应的问题emb进行求相似度,检索后路由到原始文本块。
  • 假设向量文档(Hypothetical Document Embeddings, HyDE)——用户可以让LLM为给定的查询生成一个假设性答案,然后该答案的向量和query向量作相似度匹配。

4. 上下文增强(Context Enrichment)

  • 检索较小的块以提高搜索质量:
    • 一是利用在较小检索块附件的句子来扩展上下文
    • 二是递归地将文档分割成包含更小子块的更大父块
(1)句子窗口检索(Sentence Window Retrieval)

思想:以句子为颗粒度进行emb,从而query emb和所有的句子emb求cos余弦距离,检索到query相关的句子后,将对应句子前后各扩展k个句子来扩展上下文窗口,将拓展后的这坨上下文给LLM。

在这里插入图片描述

(2)自动合并检索器(Auto-merging Retriever,又称父文档检索器 Parent Document Retriever)

思想:也是搜索颗粒度更细的信息,检索上下文后,文章会被递归地分割为更大父块中更小的字块(子块和较大的父块有引用关系)。

具体:在检索中获得较小的块,如果前k个检索到的块中有超过n个块链接到同一个父节(大块),则将该父节点(大块)替换成给LLM的上下文。

在这里插入图片描述

5. 融合检索或混合搜索(Fusion Retrieval or Hybrid Search)

传统思路:结合传统的基于关键字的搜索(稀疏检索算法如tf-idf或者搜索标准BM25)和现代语义或向量搜索,并将其结果组合在一个检索结果中。

关键:

  • 如何组合不同相似度分数的检索结果,一般可以通过Reciprocal Rank Fusion算法解决,对检索结果进行重排序。
  • 在langchain中:通过Ensemble Retriever实现,可以将我们定义的多个检索器组合,比如一个基于faiss的向量索引和一个基于BM25的检索器,并利用RRF算法进行重排操作。
  • 在llamaindex中:和上面类似。

在这里插入图片描述

重新排序和过滤(Reranking & Filtering)

在llamaindex中,有各种可用的后处理器,根据相似性分数、关键字、元数据过滤掉结果,或使用其他模型(如 LLM)、sentence-transformer 交叉编码器,Cohere 重新排名接口或者基于元数据重排它们。

查询转换(Query Transformations)

  • 比如复杂的query,可以将其拆为多个子query,比如“在 Github 上,Langchain 和 LlamaIndex 这两个框架哪个更受欢迎?”拆分为:“Langchain 在 Github 上有多少星?”和“Llamaindex 在 Github 上有多少星?”,并且两个子query并行执行,检索得到的信息被汇总到一个prompt。
  • 这两个功能分别在 Langchain 中以多查询检索器的形式和在 Llamaindex 中以子问题查询引擎的形式实现。
    • Step-back prompting 使用 LLM 生成一个更通用的查询,以此检索到更通用或高层次的上下文,用于为我们的原始查询提供答案。同时执行原始查询的检索,并在最终答案生成步骤中将两个上下文发送到 LLM。
    • 查询重写使用 LLM 来重新表述初始查询,以改进检索。LangChain 和 LlamaIndex 都有实现。

在这里插入图片描述

聊天引擎(chat engine)

  • 核心是加入上下文,比如ContextChatEngine,首先检索与用户查询相关的上下文,然后将其与内存缓冲区中的聊天记录一起发送到 LLM,以便 LLM 在生成下一个答案时了解上一个上下文。
  • 更复杂的情况是 CondensePlusContextMode——在每次交互中,聊天记录和最后一条消息被压缩到一个新的查询中,然后这个查询进入索引,检索到的上下文与原始用户消息一起传递给 LLM 以生成答案。

在这里插入图片描述

查询路由(Query Routing)

查询路由是 LLM 驱动的决策步骤,决定在给定用户查询的情况下下一步该做什么——选项通常是总结、对某些数据索引执行搜索或尝试许多不同的路由,然后将它们的输出综合到一个答案中。

  • 查询路由还用于选择数据存储位置来处理用户查询。这些数据存储位置可能是多样的,比如传统的向量存储、图形数据库或关系型数据库,或者是不同层级的索引系统。
  • 在处理多文档存储时,通常会用到摘要索引和文档块向量索引这两种不同的索引。

RAG中的智能体(Agents in RAG)

  • OpenAI 助手基本上整合了开源 LLM 周边工具——聊天记录、知识存储、文档上传界面。最重要的能力还是function call。
  • 在 LlamaIndex 中,有一个 OpenAIAgent 类将这种高级逻辑与 ChatEngine 和 QueryEngine 类结合在一起,提供基于知识和上下文感知的聊天,以及在一个对话轮次中调用多个 OpenAI 函数的能力,这真正实现了智能代理行为。

【栗子】多文档智能体

  • 在每个文档上初始化一个Agent(OpenAIAgent),该智能体能进行文档摘要制作和传统问答机制的操作,还有一个顶层智能体,负责将查询分配到各个文档智能体,并综合形成最终的答案。
  • 每个文档智能体都有两个工具:向量存储索引和摘要索引,它根据路由查询决定使用哪一个。对于顶级智能体来说,所有文档智能体都是其工具。

优缺点:

  • 优点:方案中每个智能体都做路由许多决策。这种方法的好处是能够比较不同的解决方案或实体在不同的文档及其摘要中描述,以及经典的单个文档摘要和 QA 机制。
  • 缺点:由于需要在智能体内部的大语言模型之间进行多次往返迭代,其运行速度较慢。LLM 调用通常是 RAG 管道中耗时最长的操作,而搜索则是出于设计考虑而优化了速度。

在这里插入图片描述

响应合成器(Response Synthesiser)

  • 一般就将检索到的上下文和query拼接
  • 也可以先优化(如概括等)检索到的上下文,再和query拼接

编码器和LLM微调(Encoder and LLM Fine-Tuning)

  • 微调LLM
  • 微调emb模型:如bge-large-en-v1.5等
  • 微调rank模型:可以使用交叉编码器进行重排操作,如下操作
    • 把查询和每个前 k 个检索到的文本块一起送入交叉编码器,中间用 SEP (分隔符) Token 分隔,并对它进行微调,使其对相关的文本块输出 1,对不相关的输出 0。

评估(Evaluation)

  • RAG一般指标:例如总体答案相关性、答案基础性、忠实度和检索到的上下文相关性。
  • 常见的如Ragas,使用真实性和答案相关性来评价生成答案的质量,并使用经典的上下文精准度和召回率来评估 RAG 方案的检索性能。
  • LlamaIndex 的评估框架Truelens,他们提出了RAG 三元组评估模式 — 分别是对问题的检索内容相关性、答案的基于性(即大语言模型的答案在多大程度上被提供的上下文的支持)和答案对问题的相关性
  • 考虑命中率,还包括了常用的搜索引擎评估指标平均倒数排名 (Mean Reciprocal Rank),以及生成答案的质量指标,如真实性和相关性
  • 评估框架:LangChain使用的评估框架 LangSmith可以实现自定义的评估器,还能监控 RAG 管道内的运行,进而增强系统的透明度。如果是LlamaIndex可以使用rag_evaluator llama pack

总结

  • rag的难点:响应速度
  • 未来:小参数的LLM

Reference

[1] 【AI论文学习笔记】链式验证减少了大型语言模型中的幻觉
[2] 学习检索增强生成(RAG)技术,看这篇就够了——热门RAG文章摘译(9篇)
[3] Advanced RAG Techniques: an Illustrated Overview.科学之眼
[4] 再看大模型幻觉问题如何缓解 :Chain-of-Verification-一种基于链式验证思想的自我修正工作解读
[5] MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象
[6] 《高级 RAG 技术:图解概述》精华摘译
[7] https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6
[8] RA-DIT:Retrieval Augmented Dual Instruction Tuning
[9] 使用Llama index构建多代理 RAG
[10] 前沿重器[40] | 高级RAG技术——博客阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1506707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【笔记】全国大学生GIS应用技能大赛练习总结

该总结笔记为小组成员在练习完毕了历届题目后自我总结的结果,如有不足之处可以在评论区提出,排版较乱往谅解 绘制带空洞的面要素: 法一: 1、矢量化整个区域。2、矢量化空洞区域。3、将矢量化空洞区域进行合并(编辑器…

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体(subject)目标(object)策略(policy)(多个规则的集合)安全上下文(security context) 文…

【数理统计实验(四)】方差分析

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

美洲狮优化算法(Puma Optimizar Algorithm ,POA)求解机器人栅格地图最短路径规划(提供MATLAB代码)

一、美洲狮优化算法 美洲狮优化算法(Puma Optimizar Algorithm ,POA)由Benyamin Abdollahzadeh等人于2024年提出,其灵感来自美洲狮的智慧和生活。在该算法中,在探索和开发的每个阶段都提出了独特而强大的机制&#xf…

java继承,接口,抽象类

目录 目录 1 继承的含义 2 继承的好处 3使类与类之间产生了关系。 看这里继承-------我的理解 代码部分 接口 代码 抽象类 代码 各位友友们大家好呀😊! 今天让我们继续回顾java,看看java中的抽象类以及接口继承是什么&#x1f914…

【动态规划】代码随想录算法训练营第三十九天 |62.不同路径,63.不同路径II(待补充)

62.不同路径 1、题目链接:. - 力扣(LeetCode) 2、文章讲解:代码随想录 3、题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右…

%xxx%的环境变量全部失效问题

现象 配置nvm环境变量时候, 我做了如下配置 home配置 NVM_HOMED:\nvm NVM_SYMLINKD:\nvm\nodejs然后配置了path 看上去没有任何毛病, 可是发现nvm -v总是提示命名不存在, 居然发现java -version命令也不存在了, 不过怎么关机重启都是无效, 后面发现直接把D:\nvm配置到path里…

[力扣 Hot100]Day49 二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…

通过Forms+Automate+Lists+审批,实现用车申请流程

因为Sham公司目前用的用车申请流程是使用的K2系统,用户申请后,我们还需要单独另行输入Excel来汇总申请记录,当然K2也能导出,但是需要每次导出也是很麻烦的,而且不灵活。 刚好最近发现Forms与Automate能联通&#xff0…

开源流程图表库(03):mxGrap-绘制图形的利器

hello,我是贝格前端工场,本期分享基于JavaScript的图形库——mxGraph,这个工具绘制的图表可以导出html使用,欢迎老铁们持续关注、点赞,有需求可以私信我们。 mxGraph是一款功能强大的JavaScript图形库,用于…

上手OpenMMLab——从零开始通过mmagic上手AIGC

上手OpenMMLab——从零开始通过mmagic上手AIGC 目录 上手OpenMMLab——从零开始通过mmagic上手AIGC**写在前面****MMagic简介与特性****环境搭建与初步探索****文本生成与编辑****图像生成与风格迁移****音频生成与语音合成****高级应用与案例分享** **总结****附录&#xff1a…

同时上内网和外网(笔记本自带的无线网卡和另外购置无线网卡)

同时上内网和外网 两无线网卡连接内外网插入新网卡后,重命名网卡名字信息收集IPv4属性设置永久路由 两无线网卡连接内外网 插入新网卡后,重命名网卡名字 两网卡同时连接网络,使用ipconfig /all 获取信息,整理如下: 下…

VB语言回忆录——到了是该放弃VB语言的时候了么

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB语言回忆录——到了是该放弃VB语言的时候了么 前言初次接触编程开始学习VB开始发挥作用版本变迁有感而发 前言 4年前(2020年),微软 NET…

leetcode必刷题 96.不同的二叉搜索树

一、问题描述: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 二、解题思路: 二叉树是由根节点,左右子树组成的,二叉搜索树要…

Angular基础---HelloWorld---Day3

文章目录 0.ng-model 的几种不同的class属性1.ng-model 的引用与属性的调用2.表单验证: (模版引用变量、ngModel 、ngif一起使用)3.根据class属性的值ng-invalid ,设置动态变化的样式 0.ng-model 的几种不同的class属性 引用ng-model 元素的c…

C++:类和对象(三)——拷贝构造函数和运算符重载

目录 一、拷贝构造函数 1.概念 2.特性 二、赋值运算符重载 1.运算符重载 2.赋值运算符重载 (1)注意的点: (2)赋值运算符不允许被重载为全局函数,只能重载为类的成员函数 (3)…

YOLO语义分割标注文件txt还原到图像中

最近做图像分割任务过程中,使用labelme对图像进行标注,得到的数据文件是json,转换为YOLO训练所需的txt格式后,想对标注文件进行检验,即将txt标注文件还原到原图像中,下面是代码: import cv2 im…

工资低适合下班做的6大副业,每一个都值得尝试!

2024年是最适合发展个人副业的时候!无论你是否有全职工作,如果你的主业还不能满足你的成就感,还不能满足你的生活需求,这6个下班可以做的副业都很值得尝试! 千金宝库做简单的网络任务 近年来,随着互联网技…

【异常 - 错误的更优解决方案】

目录: 前言异常(一) c语言原有的错误处理方式(二) 异常的概念(三)异常的使用1.异常的抛出与捕捉2.函数调用链中异常栈的展开原则 (四)5组测试及对应结论1.常规测试2.异常…

牛客周赛 Round 36

赛况 C题可惜,比赛时模拟没有想明白,只对了一半,赛后看了大佬们的题解后恍然大悟,而F题是压根没思路,况且F题部分分也比较难拿。 题目列表 A-小红的数位删除 思路 将读入的数字整除10做三次后输出即可 参考代码 #inc…