Agent--多agent的重要性

单agent的局限性

在日常与大模型的对话过程中,能够很明显地感觉到,模型的回答和任务完成质量不仅仅和其参数和skill有关,还和任务复杂度以及其擅长方向有关,不同的大模型其实擅长的领域也各不相同。 这其实就能映射出一个问题:任务越复杂,要达到相同的任务完成质量就需要模型的能力越强,并且同样难度的问题,交给通用大模型和专门为了该类问题微调的大模型,给出的回答和完成质量是不一样的。而单agent的问题同样,主要是有三个缺点:

  1. 认知负担过重:单独一个agent面对问题,需要同时做到理解任务,设计算法与执行步骤并检查自己是否出错,这三种领域的任务要集合到一个agent来完成,会给agent的认知造成极大的负担,甚至有可能agent为了保证任务的完成度,而出现三个任务都做不好的情况;

  2. 稳定性不足:agent在处理任务时,难以保持持续专注,跨领域任务处理得比较吃力,严格的逻辑链条非常脆弱,容易断裂。也就是说,往往任务做着做着,在对话里提到之前提到的某个细节时大模型可能会"忘"掉或者曲解其意义,进而出现幻觉,这样的问题一旦在处理的过程中的某一个环节出现,都会造成很大的问题;并且跨领域任务就意味着要切换不同领域,那模型的注意力不一定能保证集中;

  3. 专注力不足:涉及多阶段的任务不能一直持续做,复杂的推理路径很不稳定,容易出现逻辑问题;并且容易在复杂任务中迷失,变得有时说着说着就去处理其他的问题去了,也就是我们常发现的,一旦跟大模型对话了很多轮次后,很有可能出现前期讨论的重点方向在后期变得不认同 这其实是涉及到一个认知问题:我们本身希望agent能够处理任何问题,但是复杂问题本身就是糅合了许多领域的知识,在没经过对应微调的情况下,让其去处理这样的问题,期望其给出高质量的回答和结果本身就是不合理的。就像小组报告论文和课程论文一样,后者只需要自己调研,搜集某个领域的知识去完成,而前者需要分工、讨论、结合各自的研究成果才能形成这样的一篇报告论文,高复杂度的任务,交给多个agent来完成才是合理的,而不是一味地强调模型数量越多越好。

"冗余"校验

我们之前提到过ReAct框架可以让agent在输出结果前自行校验一下,但是这需要我们去调整其架构。而多agent的架构,天然就具备了这样的校验能力,每个agent的输出都会被下一个阶段的agent阅读并质疑,达到这样的效果只需要我们在其提示词里加一句检查输入,就能达到每个agent互相监督输出的效果。 比如分配任务输出了每个agent的任务,agent领取了各自的任务时会在执行前先检查一下任务是否合理,细节是否严谨,角度是否全面;代码agent输出的结果会被验证agent去逐行检查,这里的关键是,每个agent的底层逻辑不一样,思考角度不一样,可能就能看到一些隐藏的问题。

对话式协作方式

多agent之间沟通交流的信息流是以对话方式进行的,这听起来或许会有点困惑,难道说给出写好的代码文件,成果不是更好的吗。其实不然,从模型的理解出发,要知道,最好让模型能理解的方式,就是以语言的方式告诉模型,给出文件模型理解是省略了一个中间模型思考文件的过程。而这种用自然语言的交流方式,可以看做是,一个抽象、目的模糊的任务,经过每个agent的努力,让其不断地变清晰,最后呈现出一个直接、成熟、质量好的回答,就像是开抢前,要调整准度,不仅仅是考虑视野里的清晰度,还要考虑风速,阻力等各个要素,多agent就是通过各自的方式把这些细节都做好,最后狙击手只需要扣动扳机(也就是输出)就能完成任务。 更重要的是,这种方式这种协作方式,就代表面对更复杂的任务,不需要重新起一个新的结构,而是针对性地增加agent,或者微调某个步骤对应负责的agent的细节就可以让其能承受这个任务的难度。 所以多agent的重点是有序分工,根据任务会涉及到的领域分配对应的agent,做好协作就能完成很多复杂度高的任务。