一文白话RAG在大语言模型里做什么

太长不看版

RAG是Retrieval Augmented Generation的缩写,主要是帮助大语言模型利用外部文档提升生成结果质量的一个技术。

正文引子

今天咱们要好好唠唠嗑,讲讲这个叫RAG的AI技术。它能让那些人工智能大聪明变得更机灵!有了RAG的加持,大模型可以实时搜索跟问题相关的资料,再把这些信息用起来给出靠谱的回答。以前呢,大模型容易答得颠三倒四,还爱瞎掰知识,有了RAG,总算治好了它们胡说八道的毛病。

RAG工作起来分三步:资料导入、搜索筛选、整合输出。

  • 第一步是把资料分成小块儿,然后再变成一串串代码,方便储存检索。

  • 第二步,一接到问题,就赶紧在数据库里搜索最匹配的资料。

  • 第三步,大模型把搜集的资料跟自己肚里的知识“揉”到一起,琢磨出精准又到位的回答。

咱们还会聊聊 RAG 是咋发展起来的,重点解析它的每个零部件。什么数据导入啊,信息检索啊,模型整合啊等等,这些技术都有啥窍门咱全给抖落出来!当然,RAG 还没修炼到家,也有不少难啃的骨头,什么数据处理太复杂,编码效率不够高啦,模型不够全面啦,这些挑战咱们一个个击破,给RAG点儿升级的秘籍!

回顾

RAG 就像给大模型装上了个“外挂”,让它们能在网上冲浪找资料,随时随地“充电”升级,从此告别知识荒!有了这个技术,大模型再也不能乱扯淡了,说啥都有理有据。RAG 干活分两步:第一步,上网搜索最相关的资料;第二步,大模型把搜到的资料跟脑瓜子里的知识一对比,吭哧吭哧琢磨出个靠谱的答案。这么一来,不仅回答更精准了,咱还能随时查查资料出处,再也不用担心被人工智能忽悠啦!最重要的是,有了 RAG,再也不用天天逼着大模型回炉再造,省时又省力!

上头这张图把 RAG 的工作流程都给画出来了,总共分三大块:

  • 第一块:资料消化 把资料大卸八块,再把每一块儿变成一串串代码,整整齐齐地存起来。为啥要这么费劲?因为问问题的时候,得靠这些小块儿资料精准定位答案,跟平时上网搜东西有点像。

  • 第二块:资料搜索 一有啥问题,系统就根据代码的相似程度,赶紧把最靠谱的那几个资料找出来。

  • 第三块:答案合成 大模型把搜来的资料当“课外书”,结合它脑子里已有的知识,琢磨出个像模像样的答案。

划重点啦!RAG 最牛的地方是,不需要天天训练大模型就能随时适应新的资料,换了新领域的数据直接就能上岗,太省事儿了!

历史

RAG,全称检索增强生成,是Meta公司在一篇论文(见参考文献1)中提出的新技术。为啥要搞出这个RAG呢?因为科学家们发现,那些牛哄哄的大型语言模型虽然记性好,干活也麻利,但是一碰到需要深度思考和知识运用的活儿就容易露怯了。

说白了,RAG 的出现就是为了给大模型补脑的。以前的大模型光是死记硬背还行,一让它们灵活运用知识就抓瞎。尤其遇到那些需要大量专业知识的任务,更是被其他特长型选手按在地上摩擦。科学家们也发现了这些大模型的短板,什么解释不了为啥这么回答,一遇到新鲜事儿就懵圈等等。不过,在 RAG 出现之前,也有一些结合参数和非参数记忆的混合型模型取得了不错的成绩。像是 REALM 和 ORQA 这种,就把语言模型和搜索引擎搭配起来,也算是在这个方向上迈出了成功的一步。

然后,RAG 就带着它的锦囊妙计闪亮登场啦!它提供了一种灵活的微调方法,专门帮大模型接入外挂。RAG 把预训练好的参数记忆(比如 seq2seq 模型)和从维基百科建立的非参数记忆给它连了起来,而且找资料这活儿还专门有个预训练好的神经检索器负责(就是 DPR)。RAG 的目标很明确,就是用微调的方法,让带参数记忆的生成模型学会利用上非参数记忆。RAG 里的 seq2seq 模型使用神经检索器找来的资料,两边一组合,模型就能接受完整的训练啦。训练的时候,它会微调任何 seq2seq 任务,同时搞定生成器和检索器的学习。至于找来的资料怎么用,RAG 会用 top-K 近似算法,可以针对每个输出,也可以针对每个词来调整。

RAG 最牛的地方在于,它不走寻常路,以前的办法都是想着给系统加点儿非参数记忆,但 RAG 采用了新的思路,把参数和非参数两块儿都提前训练好,知识库塞得满满当当。实验结果也证明了 RAG 的实力,开放域问答轻松搞定,事实核查和知识密集型生成任务更是把以前的模型甩在了身后。RAG 还能实时更新资料,让模型的知识库也能跟上世界的变化,简直太贴心了!

关键组件

之前咱提过,RAG 最重要的三步就是:资料消化、搜集资料,还有整合输出。下面,咱就来好好扒一扒这三步里都有啥玄机。

第一步:资料消化

在 RAG 里,资料消化指的是把资料梳理准备好的过程,让大模型能直接拿来生成回答。

这一步要分三小步走:

  • 资料切块儿:把一大坨资料切成小块小块的,方便消化。打个比方,介绍文艺复兴的长文就可以根据段落,或者按照历史时期(比如早期文艺复兴、鼎盛时期)来切块儿。切得越细,大模型理解起来越轻松。

  • 数字编码:把文字资料变成一串串向量,也就是用数字来代表资料的内容,这样大模型处理起来才效率高。还是刚才那个例子,介绍鼎盛时期的资料,就能变成一串专门总结艺术、文化、历史特点的数字编码。有了这些向量,大模型对每个小块资料的精髓就能了如指掌。

  • 建立资料库:把这些用向量表示的资料,整整齐齐码放好,方便以后快速搜索。这就跟建立一个向量数据库差不多,里面存储的都是每个资料块对应的“数字编码”。还是文艺复兴那个例子,每个时期对应的资料块都被“编码”后放进数据库,用户一搜啥问题,系统就能火速找到最匹配的资料,精准出答案!

第二步:搜集资料

这一步包括以下几个小动作:

  • 用户提问:用户用正常语言提个问题,比如说:“讲讲文艺复兴时期的那些事儿呗?”

  • 问题变身:问题会被送去"变身",变成一串数字向量,就是把文字换种方式表达出来,方便大模型计算。

  • 比对编码 :问题变出来的向量编码,会跟之前存好的资料向量编码进行比对,看看谁最匹配(一般用余弦相似度来比较)。

  • 选出前几名:系统会在资料库里挑出跟问题最相似的几个资料块,也就是最匹配前几名。这些资料可能从不同角度介绍了文艺复兴时期的方方面面。

  • 资料提取:系统把挑出来的那几个资料的实际内容取出来,这些内容都是能正常阅读的文字,跟用户的问题息息相关。所以,完成资料搜集的这一步之后,大模型就晓得,刚才在资料库里定位到的那几个片段是对回答问题最有帮助的。在这个例子中,通过搜索,大模型就能确保给用户提供的答案都是关于文艺复兴的,而且还会从资料库里引用历史文献,让回答有理有据,内容更丰富。

第三步:整合输出

这一步其实跟大模型平时生成答案差不多,但是现在大模型手里多了从资料库里淘出来的宝贝!最后,大模型会把自己的语言能力和搜集到的资料给揉到一起,生成最终的答案呈现给用户。这个答案里可能会直接引用某些文献或历史资料,显得倍儿有文化!

RAG挑战

虽然 RAG 看起来是个给大模型开外挂的简单方法,但实际操作起来还是有不少难题的,科学家和工程师们还在使劲攻克这些难关:

  • 资料消化太复杂:要把海量的知识库都塞进大模型的脑子里,这里面的工程难题可不少。比方说,咋样高效地同时处理多条请求,出问题了咋样自动重试,服务器能不能顶得住等等问题,都要考虑清楚。想象一下,把各种科学论文数据一股脑儿塞进去,还得保证后续搜索和生成都不卡壳,这里面的优化工作量想想都头疼。

  • 编码不容易:把大批资料变成向量编码也是个挑战,限速、自动重试、管理自建的模型… 处处都有坑。想想看,要是让 AI 系统把一大堆新闻报道都变成向量编码,就得想办法解决数据变化、同步问题,还得把编码的成本给降下来。

  • 向量数据库有讲究:把资料都存进向量数据库,那这数据库咋调计算资源、咋监控、咋分片,处处都得费心。想想看,要维护一个资料内容复杂,重要性还各不相同的向量数据库,里头有多少坑没准儿连工程师们自己都数不清。

  • 微调和泛化能力的挑战:RAG 模型的微调也是个不小的难题,既要保证它在特定任务上表现得好,又得保证它在不同类型的知识任务都能派上用场。比方说,要在问答任务上表现良好,微调的方法可能跟要求创造性语言生成的情况不一样,这里头的平衡可不好把握。

  • 混合存储的难题:在 RAG 这样的模型里,把参数记忆和非参数记忆整合到一起,在更新知识、保证解释性、避免瞎编等方面都有挑战。想想看,要让大模型把原有的知识和新搜集到的信息结合起来,还不能出错、不能乱扯,这里面的难度可想而知。

  • 知识更新太麻烦:现实世界里的知识在不断变化,怎么更新 RAG 里的非参数记忆就成了个头疼的问题。想象一下,要是医疗领域的 RAG 模型得适应新的研究发现和治疗方法,那它的知识库可得及时更新,才能保证回答的准确性。

提升之资料消化

资料切块儿要更好

要让 RAG 的资料消化环节更顺畅,切块儿的方法得讲究。最简单的办法就是按固定字数或字符数来划分,但处理起大规模数据集就不灵光了。下面这些新招数最近比较流行:

  • 按内容切分:这种方法会根据文章的意思、句子的结构等等来划分,像什么词性标注啦,语法分析啦,都可以派上用场。优点是能保证切出来的资料块儿都有完整的意义,但缺点也很明显,需要更多的计算资源,整个过程也更复杂。

  • 按句子切分:这个方法就是把文章按照标点符号拆分成完整的句子,简单粗暴。优点是能保证每一个资料块都是个语法正确的句子,缺点是切出来的块儿大小会不一样,不够整齐划一。

  • 递归切分:有点像搭积木,这种方法会把资料一层一层地切分,形成一个有层次感的树形结构。优点是能切出不同大小的资料块儿,灵活性强,但是管理和索引这些块儿又是个麻烦事儿。

资料索引要更好

想要资料搜得又快又准,建立索引的水平得跟上。要是资料块儿都分类整理得整整齐齐,需要啥信息的时候直接就能找着。下面这些新招数值得了解:

  • 精细索引:把资料块再细分成小部分(比如句子),每个小部分都用位置和内容特征来标记。优点是可以精确到具体语境,但缺点是占内存,处理起来也更费时。

  • 按问题索引:把资料按照知识领域(比如主题)来分类整理,每个资料块都用类别和相关性特征来标记。这种方法很贴近用户的搜索习惯,效率高,但缺点是可能会丢失部分信息,准确性也会打折扣。

  • 带摘要的索引优化: 用抽取或压缩的方式给每个资料块都生成个摘要,再用摘要的内容来标记。优点是可以概括性更强,但缺点是生成和比较摘要的过程都挺复杂的。

提升之资料检索

假设问题和 HyDE

这部分有点儿烧脑,简单概括就是:先针对每个资料块编出一个假设问题,把这些问题都变成向量,然后用用户的问题去这个“问题库”里搜索。这样做的好处是,假设问题跟用户问题之间在意思上会更接近,比起直接跟资料块儿比对,搜索的质量就上去了。另外,HyDE(就是假设答案提取)的思路是,先针对用户的问题生成一个假设答案,通过利用用户问题和假设答案的向量表示来提高搜索质量。

丰富语境

这一招的目的是缩小资料检索的范围,让搜索结果更精准,同时还要把相关语境也考虑进去,方便语言模型进行推理。有两种思路可以试试:

  • 句子窗口搜索:这个办法是把一篇文章中的每个句子单独变成向量,这样一来就能保证用户问题和语境之间的余弦距离搜索更准确。等找到了最匹配的那个句子以后,再把这个句子前后几句也包含进来,形成一个语境窗口。把这个窗口里的内容都送给语言模型,让它对用户的问题进行推理。这样做的目的是让语言模型更好地理解检索出来的那个句子的前后语境,给出的回答能够更加准确到位。

  • 自动合并搜索:这个方法先把文章分成很多小块儿,每个小块儿都对应着一个大块儿。先去搜小块儿,假如搜出来的小块儿中,大部分块儿都属于同一个大块儿,那就直接把这个大块儿送去给语言模型处理。这个过程就像是在自动把好几个搜出来的资料块儿都合并在了一起,所以叫“自动合并搜索”。这种方法想兼顾检索的精细程度和语境范围,让语言模型产出的回答更加全面、连贯。

混合搜索

这个办法就是把传统的关键词搜索和现在流行的语义搜索技术结合起来,有点像强强联手的意思。除了向量搜索以外,还可以用 tf-idf(词频-逆向文件频率)或者 BM25 这种算法,这样就能兼顾语义相关性和关键词匹配,让搜索结果更加全面准确。

再精筛,再排序

资料搜回来以后,还可以再来一波精挑细选,包括过滤、重排或者做个转换啥的。LlamaIndex 就提供了不少好用的后处理工具,可以根据相似度分数、关键词、元数据啥的来过滤结果,还能用语言模型或者句子转换交叉编码器之类的方式来重排序。经过这一步,才能把最终选定的资料交给语言模型去生成答案。

问题变形和智能路由

问题变形的方法就是在搜索之前先把复杂的问题拆成几个小问题(扩展),或者把提问不准确的问题重新措辞。而动态问题路由主要是在多个资料库里搜资料的时候用的,下面列出了几种常用的方法:

  • 问题扩展:把用户的问题分解成几个小问题,每个小问题都能更精准地在资料库里搜索。比如,一个关于物理学的问题先得回退到基本物理原理才能有效找到答案。

  • 问题重写:这部分主要解决用户提问不够清晰的问题,通过改写问题的方式提高搜索效率。论文里专门提到了 Rewrite-Retrieve-Read 这个方法。

  • 问题压缩:有时候用户的问题其实是跟之前的一些聊天记录有关的,那为了准确回答,就得把之前的对话都考虑进去。问题压缩就是把这些聊天记录浓缩成最终问题,这样在搜索的时候才能有的放矢。

  • 动态问题路由:RAG 要是放在生产环境里用,那资料来源就多了去了,这个时候就得知道去哪儿找资料。这个动态问题路由就是让语言模型来判断,把问题自动发到最合适的资料库里。这个路由功能还能根据不同的资料来源自动调整,让搜索过程更顺畅。

提升之生成答案

最简单粗暴的生成法子就是:把搜出来的资料凡是跟问题沾边的都一股脑儿塞给语言模型,让它去琢磨答案。不过,现在科学家们又研究出了更高级的办法,需要分几次把资料送给语言模型,反复精筛细选,最后才能得到一个更靠谱的答案。下面列出了几种常见的方法:

组合答案大法

这种思路分三步走:

  • 反复精炼:把搜出来的资料分批送给语言模型,让它反复琢磨提炼出答案。

  • 先来个摘要:把搜出来的资料先浓缩成一个摘要,然后再让语言模型生成一个简洁明了的答案。

  • 多个答案大集合:根据不同的资料分别生成好几个答案,最后再把这些答案合并在一起,或者总结出重点。

编码器和语言模型的双向微调

这个办法主要是在 RAG 的架构上动刀子,微调里面的语言模型。

  • 微调编码器:对 Transformer 编码器进行微调,让它生成的向量编码质量更高,这样资料搜得更准。

  • 微调排序器:用交叉编码器对检索结果重新排序,这个办法主要用在基础编码器不太靠谱的情况。

  • RA-DIT 技术:用 RA-DIT 这种技术把语言模型和搜索器都给调教了,训练的时候用的就是问题、语境和答案组成的三元组。

总结

全文完,希望大家能在读完这篇文章后了解RAG是干啥的。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员二飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值