微信扫码
与创始人交个朋友
我要投稿
RAG是Retrieval Augmented Generation的缩写,主要是帮助大语言模型利用外部文档提升生成结果质量的一个技术。
今天咱们要好好唠唠嗑,讲讲这个叫RAG的AI技术。它能让那些人工智能大聪明变得更机灵!有了RAG的加持,大模型可以实时搜索跟问题相关的资料,再把这些信息用起来给出靠谱的回答。以前呢,大模型容易答得颠三倒四,还爱瞎掰知识,有了RAG,总算治好了它们胡说八道的毛病。
RAG工作起来分三步:资料导入、搜索筛选、整合输出。
咱们还会聊聊 RAG 是咋发展起来的,重点解析它的每个零部件。什么数据导入啊,信息检索啊,模型整合啊等等,这些技术都有啥窍门咱全给抖落出来!当然,RAG 还没修炼到家,也有不少难啃的骨头,什么数据处理太复杂,编码效率不够高啦,模型不够全面啦,这些挑战咱们一个个击破,给RAG点儿升级的秘籍!
RAG 就像给大模型装上了个“外挂”,让它们能在网上冲浪找资料,随时随地“充电”升级,从此告别知识荒!有了这个技术,大模型再也不能乱扯淡了,说啥都有理有据。RAG 干活分两步:第一步,上网搜索最相关的资料;第二步,大模型把搜到的资料跟脑瓜子里的知识一对比,吭哧吭哧琢磨出个靠谱的答案。这么一来,不仅回答更精准了,咱还能随时查查资料出处,再也不用担心被人工智能忽悠啦!最重要的是,有了 RAG,再也不用天天逼着大模型回炉再造,省时又省力!
上头这张图把 RAG 的工作流程都给画出来了,总共分三大块:
划重点啦!RAG 最牛的地方是,不需要天天训练大模型就能随时适应新的资料,换了新领域的数据直接就能上岗,太省事儿了!
RAG,全称检索增强生成,是Meta公司在一篇论文(见参考文献1)中提出的新技术。为啥要搞出这个RAG呢?因为科学家们发现,那些牛哄哄的大型语言模型虽然记性好,干活也麻利,但是一碰到需要深度思考和知识运用的活儿就容易露怯了。
然后,RAG 就带着它的锦囊妙计闪亮登场啦!它提供了一种灵活的微调方法,专门帮大模型接入外挂。RAG 把预训练好的参数记忆(比如 seq2seq 模型)和从维基百科建立的非参数记忆给它连了起来,而且找资料这活儿还专门有个预训练好的神经检索器负责(就是 DPR)。RAG 的目标很明确,就是用微调的方法,让带参数记忆的生成模型学会利用上非参数记忆。RAG 里的 seq2seq 模型使用神经检索器找来的资料,两边一组合,模型就能接受完整的训练啦。训练的时候,它会微调任何 seq2seq 任务,同时搞定生成器和检索器的学习。至于找来的资料怎么用,RAG 会用 top-K 近似算法,可以针对每个输出,也可以针对每个词来调整。
RAG 最牛的地方在于,它不走寻常路,以前的办法都是想着给系统加点儿非参数记忆,但 RAG 采用了新的思路,把参数和非参数两块儿都提前训练好,知识库塞得满满当当。实验结果也证明了 RAG 的实力,开放域问答轻松搞定,事实核查和知识密集型生成任务更是把以前的模型甩在了身后。RAG 还能实时更新资料,让模型的知识库也能跟上世界的变化,简直太贴心了!
之前咱提过,RAG 最重要的三步就是:资料消化、搜集资料,还有整合输出。下面,咱就来好好扒一扒这三步里都有啥玄机。
在 RAG 里,资料消化指的是把资料梳理准备好的过程,让大模型能直接拿来生成回答。
这一步要分三小步走:
这一步包括以下几个小动作:
这一步其实跟大模型平时生成答案差不多,但是现在大模型手里多了从资料库里淘出来的宝贝!最后,大模型会把自己的语言能力和搜集到的资料给揉到一起,生成最终的答案呈现给用户。这个答案里可能会直接引用某些文献或历史资料,显得倍儿有文化!
虽然 RAG 看起来是个给大模型开外挂的简单方法,但实际操作起来还是有不少难题的,科学家和工程师们还在使劲攻克这些难关:
资料消化太复杂:要把海量的知识库都塞进大模型的脑子里,这里面的工程难题可不少。比方说,咋样高效地同时处理多条请求,出问题了咋样自动重试,服务器能不能顶得住等等问题,都要考虑清楚。想象一下,把各种科学论文数据一股脑儿塞进去,还得保证后续搜索和生成都不卡壳,这里面的优化工作量想想都头疼。
编码不容易:把大批资料变成向量编码也是个挑战,限速、自动重试、管理自建的模型... 处处都有坑。想想看,要是让 AI 系统把一大堆新闻报道都变成向量编码,就得想办法解决数据变化、同步问题,还得把编码的成本给降下来。
向量数据库有讲究:把资料都存进向量数据库,那这数据库咋调计算资源、咋监控、咋分片,处处都得费心。想想看,要维护一个资料内容复杂,重要性还各不相同的向量数据库,里头有多少坑没准儿连工程师们自己都数不清。
微调和泛化能力的挑战:RAG 模型的微调也是个不小的难题,既要保证它在特定任务上表现得好,又得保证它在不同类型的知识任务都能派上用场。比方说,要在问答任务上表现良好,微调的方法可能跟要求创造性语言生成的情况不一样,这里头的平衡可不好把握。
混合存储的难题:在 RAG 这样的模型里,把参数记忆和非参数记忆整合到一起,在更新知识、保证解释性、避免瞎编等方面都有挑战。想想看,要让大模型把原有的知识和新搜集到的信息结合起来,还不能出错、不能乱扯,这里面的难度可想而知。
知识更新太麻烦:现实世界里的知识在不断变化,怎么更新 RAG 里的非参数记忆就成了个头疼的问题。想象一下,要是医疗领域的 RAG 模型得适应新的研究发现和治疗方法,那它的知识库可得及时更新,才能保证回答的准确性。
要让 RAG 的资料消化环节更顺畅,切块儿的方法得讲究。最简单的办法就是按固定字数或字符数来划分,但处理起大规模数据集就不灵光了。下面这些新招数最近比较流行:
按内容切分:这种方法会根据文章的意思、句子的结构等等来划分,像什么词性标注啦,语法分析啦,都可以派上用场。优点是能保证切出来的资料块儿都有完整的意义,但缺点也很明显,需要更多的计算资源,整个过程也更复杂。
按句子切分:这个方法就是把文章按照标点符号拆分成完整的句子,简单粗暴。优点是能保证每一个资料块都是个语法正确的句子,缺点是切出来的块儿大小会不一样,不够整齐划一。
递归切分:有点像搭积木,这种方法会把资料一层一层地切分,形成一个有层次感的树形结构。优点是能切出不同大小的资料块儿,灵活性强,但是管理和索引这些块儿又是个麻烦事儿。
想要资料搜得又快又准,建立索引的水平得跟上。要是资料块儿都分类整理得整整齐齐,需要啥信息的时候直接就能找着。下面这些新招数值得了解:
精细索引:把资料块再细分成小部分(比如句子),每个小部分都用位置和内容特征来标记。优点是可以精确到具体语境,但缺点是占内存,处理起来也更费时。
按问题索引:把资料按照知识领域(比如主题)来分类整理,每个资料块都用类别和相关性特征来标记。这种方法很贴近用户的搜索习惯,效率高,但缺点是可能会丢失部分信息,准确性也会打折扣。
带摘要的索引优化: 用抽取或压缩的方式给每个资料块都生成个摘要,再用摘要的内容来标记。优点是可以概括性更强,但缺点是生成和比较摘要的过程都挺复杂的。
这部分有点儿烧脑,简单概括就是:先针对每个资料块编出一个假设问题,把这些问题都变成向量,然后用用户的问题去这个“问题库”里搜索。这样做的好处是,假设问题跟用户问题之间在意思上会更接近,比起直接跟资料块儿比对,搜索的质量就上去了。另外,HyDE(就是假设答案提取)的思路是,先针对用户的问题生成一个假设答案,通过利用用户问题和假设答案的向量表示来提高搜索质量。
这一招的目的是缩小资料检索的范围,让搜索结果更精准,同时还要把相关语境也考虑进去,方便语言模型进行推理。有两种思路可以试试:
这个办法就是把传统的关键词搜索和现在流行的语义搜索技术结合起来,有点像强强联手的意思。除了向量搜索以外,还可以用 tf-idf(词频-逆向文件频率)或者 BM25 这种算法,这样就能兼顾语义相关性和关键词匹配,让搜索结果更加全面准确。
资料搜回来以后,还可以再来一波精挑细选,包括过滤、重排或者做个转换啥的。LlamaIndex 就提供了不少好用的后处理工具,可以根据相似度分数、关键词、元数据啥的来过滤结果,还能用语言模型或者句子转换交叉编码器之类的方式来重排序。经过这一步,才能把最终选定的资料交给语言模型去生成答案。
问题变形的方法就是在搜索之前先把复杂的问题拆成几个小问题(扩展),或者把提问不准确的问题重新措辞。而动态问题路由主要是在多个资料库里搜资料的时候用的,下面列出了几种常用的方法:
最简单粗暴的生成法子就是:把搜出来的资料凡是跟问题沾边的都一股脑儿塞给语言模型,让它去琢磨答案。不过,现在科学家们又研究出了更高级的办法,需要分几次把资料送给语言模型,反复精筛细选,最后才能得到一个更靠谱的答案。下面列出了几种常见的方法:
这种思路分三步走:
这个办法主要是在 RAG 的架构上动刀子,微调里面的语言模型。
全文完,希望大家能在读完这篇文章后了解RAG是干啥的。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-04-25
2024-05-14
2024-07-18
2024-04-26
2024-08-13