
关于RAG系统在生成阶段的优化方案 原创
“ 增强生成的处理会直接影响到模型生成质量,如果做不好,哪怕你文档处理的再好,召回的质量再高,也没什么用。”
最近也写了很多关于RAG系统的内容,大部分都是在讲述文档处理和文档检索两部分内容;而RAG既然被称为检索增强,那么我们今天就从增强的角度讲一下怎么进行增强,有哪些注意点和问题。
在RAG中大部分人的关注点可能都在文档处理和文档召回上,也会用大量的时间来优化这两部分内容;因此,往往忽视了增强这一块功能。
RAG全称是——检索增强生成,检索在前,增强生成在后;因此,RAG的原理其实很简单,检索到问题相关文档,然后把这部分文档交给大模型进行生成。
所以,前面讲的文档处理和文档检索就属于RAG的检索部分,文档处理的质量会影响到文档检索的效果;而增强生成部分就是怎么把召回的文档丢给大模型,使用什么格式,存在哪些问题。
RAG增强生成
可能在很多人看来,把检索到的内容直接拼接到提示词中,然后丢给模型就可以了;但事实上这一步并没有大家想象中的那么简单,其存在好几个注意点。
首先一点,提示词作为用户与大模型交互的一个唯一途径,其是有上下文窗口限制的;因此,如果你召回的内容太长有可能会超出提示词窗口限制,导致数据丢失,因而影响到最终内容生成。
特别是在前期文档处理和召回做的不好的情况下,会导致文档太长相关度低,存在大量噪音;最后再加上超长引起的数据丢失,那生成效果就不能保证了。
其次,在提示词中召回的文档只占提示词的一部分;其中还要有系统提示词,角色提示词,以及历史记录;特别是历史记录会占很大一部分提示词的空间;而这些内容都会直接或间接的影响模型最终的生成效果。
再有,有些在召回文档之后,就直接把检索到的文档列表丢给模型,而不会去做任何处理;但类似于我们请教别人问题,是别人直接把一堆乱七八糟的资料丢给你让你自己研究好呢,还是别人把资料分门别类做好标注再给你比较好呢?我想肯定是后者。
那么面对以上的问题,我们都应该怎么解决呢?
首先一点就是为了保证模型的生成质量,我们丢给模型的文档一定是高度相关的,并且要控制文档的数量,防止超长。
其次,在历史记录中我们也要控制历史记录的数量或长度;比如只记录十轮对话,或者对历史记录进行压缩。比如说,我们一般情况下会把历史对话的所有内容全都记录下来,但事实上在历史记录中我们只需要记录大概对话内容即可;并不一定要把完整对话记录下来;因为历史记录的目的是为了实现记忆功能,而记忆功能只需要知道大概发生了什么即可;而不是把发生的事情记录得一清二楚。这样也可以减少记忆的超度,提升质量。
最后,我们在把文档丢给大模型之前,最好能把文档进行一些格式化处理;比如说告诉模型我这里有个参考文档列表,然后这是第一段,第二段,第三段等等;这样也有助于提升模型的生成质量。
总之,增强生成虽然理论上很简单,但事实上会存在很多坑和优化点,只不过我们很多人很难注意到它们。其次,以上只是一些通用的优化手段,在真实的业务场景中需要根据不同的情况进行多轮测试才能达到最好的效果。
比如说,使用不同的模型由于其能力不同,窗口大小不同,对提示词长度的要求也不同;因此,如果我们要想做到高质量的生成,就需要去不断地测试和优化才能达到最优的参数值。
本文转载自AI探索时代 作者:DFires
