大家觉得做一个大模型检索增强生成(RAG)系统,最难搞定的是那部分工作?
根据我的实战经验,文档的处理、短文本的语义挖掘是最难搞定的。而向量模型部分,用哪一个,实际上影响不是很大,因为单靠向量检索根本没法很好的完成任务。
文档处理
我的观点是,明确能解决的问题,有的问题,目前确实不好解决,成本太高,需要看是否划得来。另外,依赖大模型本身的能力,用好提示词工程,可以减少很多数据处理上的代码和逻辑。
这里首先要明确的就是,我们需要处理的知识或者是做问答的数据大致是什么类型,根据回答这个问题所依赖的信息在文档中的分布情况,具体可以大致分为下面三种情况:
(L1)相关信息可以出现在不超过一个固定上下文长度(512)限制的 block 以内
(L2)相关信息出现在多个 block 里,出现的总数不超过 5-10 个,最好是能在大模型支持的有效长度内。
(L3)需要考虑多个片段,并综合结合上下文信息甚至全部内容才能得到结果
从我的经验来看,现在L1类问题,用户的输入比较明确的情况下,不需要太多的策略就可以满足。而L2类问题,在增加诸如query改写、父子索引,重排序等常见的策略后,也可以得到不错的结果。而L3类问题,很难完成,特别是全部知识点,直接超出了大模型的上限。
对于L3类问题,尝试过将文档分段,使用语义分割模型去切分,以及分段进行总结摘要的情况,只能勉强达到可用的程度。
因此,这种问题,我更倾向于使用一个能支持更长上下文的大模型(比如kimi这种支持20万字中文的)去尝试解决这种问题。但目前kimi还没有申请到API,百川或许也行,有机会可以试试。不过这种样子,放入大模型的内容就会多很多,导致费用爆炸,也是需要考虑的情况。
结构化数据处理
我在使用Langchain的API去对表格的数据进行操作,研究了一些源码,其核心还是利用提示词工程去实现,屏蔽了复杂的数据处理过程。遇到过的问题有,Langchain版本更新的问题,导致有一些依赖的方法没法使用,需要自己绕过去,耗时比较长。
另外,国产的大模型目前还不具备比较高的Agent能力,尝试了智普4.0的模型,完全接入不了Langchain的框架,因此,现在没法用Agent的提示词模板去处理数据,这个只能等大模型的更新。
向量模型
印象中听过一个观点,就是向量模型本身就和你训练的数据不在一个空间,因此还需要进行微调才能使用。这个观点,我不确定是否正确,但经过我自己验证,bge的效果确实要高于m3e,但是微调后bge的效果会下降,目前没有发现是什么问题导致。
尝试过网易的bce,还有bge-m3,从整体来说,确实在召回上有所差距,但是输入到大模型之后的回答,几乎没有明显差异。
但有一点提升非常明显,就是使用重排序的策略,现在比较常见的就是cohere以及bge的rerank模型。
短文本处理
用户输入的内容越短,越难处理。这个时候基本就转换成了搜索问题,去做意图分析,实体识别等措施,导致整个链路会特别长。另外一个方向就是利用agent的思想,让大模型去分析用户的输入,然后路由到指定的数据集,或者调用工具。这个方法的优势很明显,就省去了不少意图分析,识别的步骤,但缺点就是非常依赖大模型本身效果。
而且用户一旦进行多轮对话,效果就更差了,比如用户输入”长方形的面积怎么计算?“,第二次输入”那正方形呢?“
该怎么做召回,确实是一个很难的问题。想到的一个可能方向,就是在产品应用的时候明确是多轮还是单轮对话,然后尝试对用户的多次输入进行合并,再做检索。或者每一次都做检索,然后将不同结果进行拼接输入给大模型。