前言
如果你用过openai的chatgpt服务,你肯定知道一个叫做GPTs的智能体商店,里面提供了大量的来自官方和个人制作的专门针对某个领域的gpt助手。比如,你想让gpt帮忙写文章,并且要能够写得好,你就可以在商店中搜索相关的助手并应用到聊天窗口,同理,还有网页搜索助手,PDF阅读助手,等等。
你要先搜索,寻找能解决你问题领域的专家助手,再和它交流。
不觉得这样很繁琐吗?
我们来想象一个这样的场景,你是一所豪宅的主人,豪宅里配备了一个家政团队,有管家和负责不同工作的仆人。当你想要预定午餐吃什么,你不需要去找厨师,而是找管家说一声;你想让人去打扫客厅,你也不需要去找负责打扫卫生的仆人,而是找管家说一声。
所以,GPTs实际上是提供了一个庞大的专业执行团队,但是,却没有一个管家。
对于我们提出的一个需求或请求,实际上能分成两个重要环节——“做什么?”和“怎么做?”
因此,我们可以考虑一个这样的ai系统设计,它分为两个层面——调度层(管家)和执行层(专家角色),分别用于解决两个重要环节的问题。
调度层
对于一个管家来说,他的职责其实可以概括为:理解、分解、分配。
-
理解
根据与用户的交流内容(可能是一条指令或是一段对话的上下文),理解并总结出需要的事情。这一步是调度层的第一步,也是最关键的一步。
-
分解
当用户的请求包含有多个需要做的事情时,应当把它们拆解成独立的小任务。例如,”帮我把卧室的地板打扫一下,顺便开下客厅的灯“,就应当拆分成”打扫卧室的地板“和”打开客厅的灯“这样的两个任务。
-
分配
把一个任务分配给对应的执行层角色。这个操作可以依靠让大模型做选择题来实现。把执行层角色的能力作为一个带序号列表放入提示词中,让大模型根据任务描述输出对应角色的序号。后面就是传统程序化的工作了。
对于理解这个环节,对大模型的考验比较大。例如,“把‘帮我订一张火车票’翻译成英文”与“帮我订一张火车票”就是完全不同的意图,对于前者,甚至管家自己就能回答。再比如,“今天天气好像不错啊,帮我把窗户打开吧”,这样的用户请求,管家应当要能正确理解和归纳出要做的事情是”打开窗户“,而不需要去查天气的情况。
对于上下文理解就更加考验大模型能力了。
重新回到现实情境,如果豪宅的主人只告诉管家”中午我想吃点好吃的“,那么管家理论上是只需要转达给厨师,但是,今天来的可能是个新厨师,不知道屋主人的用餐喜好,那他可能就会先提供一份菜单,反问屋主人想吃哪个,等屋主人决定后才会执行做菜的任务。在这个过程中就有一个需要考虑的问题,是厨师亲自去找屋主人问,然后自己理解,还是把问题返回给管家,让管家问清楚后,由管家自己理解并生成一个新的任务?
我的想法是,仍然由管家进行汇总与理解。因为理解意图,本身就是管家的职责。
所以我们可以设想一个这样的对话:
user: 我中午想吃点好吃的
assistant: 您具体想吃什么呢?今天午餐可选的菜品有炸鸡、红烧肉、西兰花炒瘦肉、酱香面。
user: 酱香面吧
那管家收到这样一段对话后,就应当理解出一个新任务,”主人要求今天的午餐为酱香面“,然后直接把该任务交给厨师即可。
执行层
对于一个执行角色来说,他的职责会更加明确:规划、执行、反馈。
-
规划
规划这个步骤可以比较灵活。第一种方式是参考现在的一些ai-agent框架,直接让大模型生成一个行动规划,按照顺序步骤执行;第二种方式就是偏程序化的方式固定一系列行动规划,比如,对于IOT控制,通常就是根据用户请求查询可控制设备的列表,然后生成参数或者直接生成函数,运行代码,控制设备,这样具有固定流程的步骤。
-
执行
执行通常就是运行代码,或者让大模型生成内容(文字、图片、视频、音频等)。
-
反馈
反馈这一步可以做得比较灵活,根据任务类型场景,反馈可以是针对生成代码的运行测试审核,或者是对文字内容的审核,又或者是对内容的二次修改,总之,是利用LLM进行自我反馈,从而校准输出结果与目标结果的匹配度。
任务表
这里我提供另一种设计思路,将调度层的部分压力转移给执行层,这种设计理论上更简单点,但是会增加系统的开销和问题风险。
假设现在已经有了一个支持100种专家角色的ai服务系统,然后,我打算增加100种,那么,按照之前的思路,我不仅要在执行层新增100种角色,我还要在调度层的分配提示词中增加对应的100种角色的描述,一旦这些角色的职责有变动,我还要在分配提示词中相应更改,显然会比较繁琐。
于是,我们可以选择:将调度层的分配操作去掉,在执行层的每个角色都增加一个任务匹配检查,调度层不直接分发任务,而是把所有任务放到一个任务表中,执行层的角色自行扫描任务表,从中获取属于自身职责的任务。
总结
当然,你可能从一开始就意识到,这样的设计就是最基本的分治思想。事实上,也已经有不少ai-agent开源框架采用了分治方法,把大任务拆解为多个小任务,以此来提升ai回答内容的质量,不过,我个人认为这优化的是“怎么做”这个环节,而针对“做什么”这个环节,我个人提出的方案就是引入调度层这样的设计来进行优化。或许再大胆一点,这可能也是一种专用于AI的“操作系统”的雏形。
后记:这篇文章实际上写于24年4月份,但由于一些原因一直到7月才打算发布,此时我已经看到不少大公司的AI系统支持这种ALL IN ONE的功能,因此,这篇文章的参考价值或许不算太高了。