什么时候该用多智能体是不是一定要用多智能体?
现在智能体的概念很火,并且很多时候都需要多个智能体配合工作。但是,真的都需要用多个智能体吗?什么时候该用多智能体?
我们以大语言模型翻译为例。众所周知,现在大语言翻译,最佳实践是直译、反思和意译三个步骤,我以前有分享过 Prompt,可以在在一个 Prompt 中,让 ChatGPT 一次性完成这三个步骤。详细内容可以参考我以前写过的文章《直译、反思、意译:提升 GPT 翻译质量的一种新策略》https://baoyu.io/blog/prompt-engineering/translator-gpt-prompt-v2
吴恩达老师前不久也分享过一个项目,同样也是直译、反思和意译的思路,但是采用的多智能体,也就是不是整个过程不是在一个 Prompt 中完成,而是有三个智能体分别完成这三个步骤,每个智能体都有独立的 Prompt。
为了方便大家理解,我来举个例子,比如我要翻译一句话:“She was born with a silver spoon in her mouth.”
一个 Prompt 中的多步骤
如果是在一个 Prompt 中(具体 Prompt 可以参考我前面的文章链接),那么 LLM 的输出大概就是这样的:
输入
请按照直译、反思和意译的步骤,翻译下面这句话:She was born with a silver spoon in her mouth.
好的,以下是按照直译、反思和意译的步骤翻译这句话:1. **直译**:她出生时嘴里含着银勺子。2. **反思**:这句话在英语中是一个惯用表达,意思是她生在富贵之家。直译的结果在中文中可能会让人感到困惑,因为含着银勺子并不是中文中的常见表达方式。3. **意译**:她出生在富贵之家。
多个智能体
如果用多智能体来做,那么就是三个智能体分别完成这三个步骤,如果你想看吴恩达老师写的 Prompt 和程序,可以参考:https://github.com/andrewyng/translation-agent/blob/main/src/translation_agent/utils.py,这里我简化模拟一下:
直译智能体
直译智能体的输入:
请翻译这句话:She was born with a silver spoon in her mouth.
直译智能体的输出:
她出生时嘴里含着银勺子。
反思智能体
反思智能体的输入:
<SOURCE_TEXT>She was born with a silver spoon in her mouth.</SOURCE_TEXT><TRANSLATION>她出生时嘴里含着银勺子。</TRANSLATION>请检查上面的翻译,反思其中存在的问题,输出仅包含问题列表。
反思智能体的输出:
1. 翻译缺乏成语和习语的文化背景,未能传达原文中的隐含意义。2. 直译“银勺子”可能在中文中显得生硬,不自然。3. 翻译没有体现出“生来富裕”这一含义,仅描述了物理现象。
意译智能体
意译智能体的输入:
<SOURCE_TEXT>She was born with a silver spoon in her mouth.</SOURCE_TEXT><TRANSLATION>她出生时嘴里含着银勺子。</TRANSLATION><EXPERT_SUGGESTIONS>1. 翻译缺乏成语和习语的文化背景,未能传达原文中的隐含意义。2. 直译“银勺子”可能在中文中显得生硬,不自然。3. 翻译没有体现出“生来富裕”这一含义,仅描述了物理现象。</EXPERT_SUGGESTIONS>请根据直译和反思的结果,重新意译,并输出最终翻译结果,不包含任何其他信息。
意译智能体的输出:
她出生在富贵之家。
一个 Prompt 多个步骤 vs 多个智能体
从上面的例子可以看出,两者的原理类似,结果也差不多,那么他们的区别是什么呢?
一个 Prompt 多个步骤
先说优点:
一个 Prompt 多个步骤,可以最大化的节约 Token,充分利用 LLM 输出的内容作为上下文,不需要多次输入输出,节省了时间和资源。
使用简单,只需要一个 Prompt,不需要额外的代码来处理多个智能体之间的交互。
既可以在 ChatGPT 这类聊天应用中使用,也可以在 API 中使用,适用范围广。比如我的科技文章翻译 GPT(https://chatgpt.com/g/g-uBhKUJJTl-ke-ji-wen-zhang-fan-yi),就是使用一个 Prompt 多个步骤的方式。
再说缺点:
不能对中间输出结果进行修改,比如我希望对第一步直译的结果,人工替换一些关键字,然后再进行反思和意译,这是做不到的。
对输出的解析相对复杂,由于所有步骤的结果都在一个输出中,所以就需要输出结构化的数据,比如 XML、JSON 等,然后再解析。当然对输出解析也不是必须的,比如我的科技文章翻译 GPT,就是直接输出文本,手动把意译的结果复制出来。
对模型能力要求比较高,需要模型能有很强的理解指令的能力,像这这样的一个 Prompt 多个步骤翻译的 Prompt 在 GPT-3.5 中是做不到的。
多个智能体
优点:
可以对每一步的中间输出结果进行处理,比如我希望对直译的结果,人工替换一些关键字,然后再进行反思和意译,这是可以做到的。
每一个智能体专注于完成一件任务,Prompt 写起来容易。
可以多个模型混合使用,比如说直译的时候可以用便宜的模型,反思和意译的时候用贵的模型。(不是说这样效果会好,只是举个例子)
缺点:
需要额外的代码来处理多个智能体之间的交互,比如上面的例子,需要一个中间层来处理直译的结果,然后传递给反思智能体,再传递给意译智能体。(可能有些低代码无代码平台可以不写代码,但是也需要配置。)
时间成本和 Token 成本相对高,从上面的例子你可以看到,如果多个智能体之间不能并行处理,那么就需要等待上一个智能体的输出,然后再传递给下一个智能体,这样就会增加时间成本。另一就是 Token 成本也相对较高,因为每个智能体要独立输入输出,有很多重复输入输出在里面。
无法直接在 ChatGPT 这类聊天应用中使用多智能体,除非你愿意手动一个个复制粘贴。或者借助 ChatGPT 的 @
功能。
什么时候该用多智能体?是不是一定要用多智能体?
我的一个简单的原则: 先用多智能体把流程走通,然后再看看能不能优化成一个 Prompt 多个步骤。
这可能有点违法直觉,因为一个 Prompt 多个步骤看起来更简单更经济,但是 Prompt Engineer 是一个相对新的领域,有时候写提示词就像是玄学,对于复杂的任务,你很难一下子写出一个完美的 Prompt。
当你用多智能体,那么你首先要做的就是把你的复杂任务拆分成了多个简单的任务,这其实是相当重要的一步,这样你才能化繁为简,分而治之。
当你拆分成简单任务后,每一个任务相对就好去完成去写 Prompt 了。
等到整个流程跑通,再看看能不能把其中某几个智能体合并成一个智能体,本质上就是把多个 Prompt 合并成一个 Prompt。
记住这句话:“过早优化是万恶之源。”
另外并不是说一开始就要去写代码搭建一个智能体系统,完全可以现在 ChatGPT 这样的聊天应用中,手动写 Prompt,把中间结果手动复制粘贴一下,等到 Prompt 优化好了流程走通了,再去写代码搭建智能体系统也不迟。