前言
上篇文章我们大致演示了一下 ai_agent 的食用方法。这里我们做一下核心模块 runtime 的设计和实现。
一个 agent 也好,workflow 也好,它们单个实现起来并不复杂,困难的是如何将它们有机地组合起来,能够按照一定的逻辑流转起来。并且能够层层嵌套,能力无限。
理解起来比较抽象,我们先看几个重点方向,和现实中的例子:
1. 简单的 workflow 场景
我们可以使用一个简单的 workflow 来处理一些场景,比如奶茶店的智能推荐,那么它的一个流程大致如下:
graph LR
User --用户画像+query+上下文+其他--> prompt
prompt --> llm
llm --> answer
answer --> 奶茶卡片
- 这个流程就能看到,我们将 LLM、Memory、Prompt 都当做一个节点,按照图中的顺序执行最终会得到一个推荐结果。
- 可以说这是一个 workflow 的基础功能。
2. Smartflow 场景
对于有些问题,我们是不能够将完全预测出执行流程,比如 Least-to-Most 和 smartflow 的场景,这些节点往往是在执行过程中慢慢生成出来的。
我们还是举个例子,假设有这样一个 agent:评阅大师,它的目标是评阅优化输入文案。那么它的工作流程可能是这样的。
graph TD
user -->|文案 | pf[评分 LLM]
pf -->|评分>80| 输出
pf -->|评分<80 \n 待优化方向 | yhp[追加上下文]
yhp --> yh[优化 LLM]
yh --> pf
- 工作方式一目了然,可以理解为一个评分 LLM,一个优化 LLM。对于一个文案,评分 LLM 不断给出需要优化的点,并追加到上下文中,优化 LLM 则根据要求不断优化,直到评分>80。
- 我们的流程设计肯定不能是 DAG,因为出现环了。
3. Multi-agent 场景
multi-agent 常用来解决复杂问题,对流程设计的要求也更高。比较典型的场景是狼人杀。它的流程可能长这样。
graph TD
xdyt[入夜] --> zcr
zcr[主持人] -->|第一轮 | lrfy[狼人开刀]
lrfy --> zcr
zcr[主持人 agent] -->|第二轮 | nwfy[女巫药]
nwfy --> zcr
zcr[主持人 agent] -->|第三轮 | yyjfy[预言家查人]
yyjfy --> zcr
zcr[主持人 agent] -->|第四轮 | syrfy[所有人发言]
syrfy --> gp[归票]
gp --> zcr
zcr -->|某个阵容胜利 | 结束
- 上图画的游戏规则并不严谨,但大体能感受到一个
multi-agent的工作方式。这里面的每个角色都可以理解为一个 agent,主持人可以是一个固定的脚本。 - 这个场景要求每个 agent 都有自己的 prompt,有独立的 memory 等,将一个 agent 放大,那么这个 agent 也应该是一个 workflow,由无数的节点拼接而来。也就要求我们流程设计能够层层嵌套,能力无限。
4. NL2Code 场景
保持开放是一个非常重要的能力,一来是能够让程序员直接写脚本。二是大模型有时候也会自己写脚本,也就是 NL2Code 场景。
我之前参与过一个专项,其中的一个能力是用户自由操作文档,比如文档归类,概要摘取等,结果通过 text2sql 存到数据库中。
这种场景下,仅仅提供有限功能的节点是不足够的。必须具备无限扩展的能力。
5. 开放域
在开放域中,agent 将具备更自由的意志。举几个典型的场景:聊天室 游戏 NPC 虚拟宠物。
在这种应用中,agent 更应该是一个完备的 AI,具备更长的生命周期,更强的主观能动性。
agent 从运行到结束,要像人一样,生下来就有意识,直到死亡。
简单的做法是先构建一个 single agent,并让它至少有个 memory+tool+设定这几个模块,最好是采用多模态大模型做基座模型。然后不断循环调用这个 agent,从而达到和我一样的牛马状态。当然成本肯定极高。

