
Coze&Dify中Agent的设计与实现
1、Agent是什么?
代理(Agent)这个词来源于拉丁语“agere”,意为“行动”。现在可以表示在各个领域能够独立思考和行动的人或事物的概念。它强调自主性和主动性。
智能代理/智能体是以智能方式行事的代理,智能体感知环境,自主采取行动以实现目标,并可以通过学习或获取知识来提高其性能。

一个精简的Agent决策流程:
Agent:P(感知)→P(规划)→A(行动)
感知(Perception)是指Agent从环境中收集信息并从中提取相关知识的能力。
规划(Planning)是指Agent为了某一目标而作出的决策过程。
行动(Action)是指基于环境和规划做出的动作。
其中,Policy是Agent做出Action的核心决策,而行动又通过观察(Observation)成为进一步Perception的前提和基础,形成自主地闭环学习过程。
2、基于LLM的Agent
代理(Agent)指能自主感知环境并采取行动实现目标的智能体。
基于大语言模型(LLM)的 AI Agent 利用 LLM 进行记忆检索、决策推理和行动顺序选择等,把Agent的智能程度提升到了新的高度。
在 LLM 支持的自主Agent系统中,LLM 充当Agents的大脑,并辅以几个关键组成部分:
- 规划
- 子目标和分解:Agents将大型任务分解为更小的、可管理的子目标,从而能够有效处理复杂的任务。
- 反思和完善:Agents可以对过去的行为进行自我批评和自我反思,从错误中吸取教训,并针对未来的步骤进行完善,从而提高最终结果的质量。
- 记忆
- 短期记忆:所有的上下文学习(参见提示工程)是利用模型的短期记忆来学习。
- 长期记忆:这为Agents提供了长时间保留和回忆(无限)信息的能力,通常是通过利用外部向量存储和快速检索来实现。
- 工具使用
- Agents学习调用外部 API 来获取模型权重中缺失的额外信息(通常在预训练后很难更改),包括当前信息、代码执行能力、对专有信息源的访问等。

3、LLM Agent目前主流实现方式
Agent目前主要有两种实现方式:Function Call 和 ReAct
这两种方式的相同点:
- 利用大语言模型识别用户输入,判断输入意图
- 根据意图识别结果,判断是否结束或者调用工具
- 如果调用工具,就把调用结果和原始输入作为新一轮的输入再次进行意图识别。以此循环,将复杂问题逐步拆解为简单问题依次解决。
不同点:
- Function Call 是大语言模型微调后支持的能力
- ReAct需要用户精心设计Prompt实现意图识别和参数提取


4、Coze
4.1、Coze模块
Coze目前的模块主要分4大类:Bots、插件、工作流、知识库

Bots和知识库是九问平台当前具备的能力,下面会快速介绍。
插件和workflow是实现Agent的核心模块,也是九问接下来的重点工作方向。
4.2、Bots模块
Bots模块和九问应用机器人配置大同小异,主要分为prompt撰写、特性配置和预览三个区域。
Bots模块的特点是部分模块支持自动配置,自动优化等能力。
比如prompt区域,允许通过LLM优化用户撰写的prompt,输出符合云雀大模型的标准格式化的prompt。
其它特性配置区域的插件、开场白、数据库等还支持根据prompt自动化创建。
这些自动化的能力极大降低了用户构建Bots的门槛,方便用户快速体验。

4.3、知识库
Coze的知识库目前还处于九问的早期阶段,仅支持文本形式的检索与召回。但支持的数据来源较多。
九问经过多个版本的迭代后,同时支持文件与图片的检索与召回。同时还允许用户手动编排分段结果,避免自动分段带来的准确性问题。

4.4、插件
4.4.1、插件介绍

插件是一个工具集,一个插件内可以包含一个或多个工具(API)。
目前,扣子集成了超过 60 种类型的插件,包括资讯阅读、旅游出行、效率办公、图片理解等 API 及多模态模型。使用这些插件,可以帮助你拓展 Bot 能力边界。
例如,在你的 Bot 内添加新闻搜索插件,那么你的 Bot 将拥有搜索新闻资讯的能力。
如果扣子集成的插件不满足你的使用需求,你还可以创建自定义插件来集成需要使用的 API。
4.4.2、插件定义与使用
自定义插件:查询地区油价信息的
\\

\\
查询使用

4.4.3、插件工作原理(基于function call实现)
Bot首先会分析用户输入,然后根据插件描述、参数等信息推理是否应该调用该插件。
决定调用插件后,会从input输入中提取相关内容作为插件参数发起调用。
然后结合返回结果输出最终目标。
这就是function call的基本流程。
coze 插件的缺点:当前插件仅会调用一次,不会根据函数返回继续进行推理。

4.5、workflow(基于ReAct)
工作流支持通过可视化的方式,对插件、大语言模型、代码块等功能进行组合,从而实现复杂、稳定的业务流程编排,例如旅行规划、报告分析等。
当目标任务场景包含较多的步骤,且对输出结果的准确性、格式有严格要求时,适合配置工作流来实现。
基础节点
扣子提供了以下基础节点,除此之外,你还可以添加插件节点或其他工作流。
| 节点名称 | 描述 |
|---|---|
| LLM | 大语言模型节点。使用输入参数和提示词生成处理结果。 |
| Code | 代码节点。通过 IDE 编写代码处理输入参数,并返回输出值。 |
| Knowledge | 知识库节点。根据输入参数从关联知识库中召回数据,并返回。 |
| Condition | if-else 逻辑节点。用于设计工作流内的分支流程,满足设置条件则运行如果分支,否则运行否则分支。 |
识别用户意图,并针对性处理

workflow的缺点和插件类似,无法循环进行 planning 和 action。
但 workflow 灵活之处在于,我们可以使用更多的选择器节点,将原本需要循环处理的流程,拉直为线性流程处理。
举个例子,原本需要循环3次planning和action的流程,我们可以拉直为如下的线性处理流程:

当我们需要循环更多次时,整个工作流就会非常非常复杂。
显然,coze也想到了这个问题,因此coze提供了一个工作流节点,让我们更加方便的嵌套复杂工作流。
上面的复杂流程也可以等价下面的流程。

5、Dify
除了工具模块,Dify的其它模块和九问差不多,这里就不做过多介绍了。
dify目前仅通过工具实现了Agent能力,workflow能力目前正在迭代中,预计3\~4月能上线。
5.1、Dify插件市场与插件的定义
5.1.1、插件市场
内置的常用插件

5.1.2、插件的定义
dify插件定义更多面向的是开发人员,通过schema(也就是代码)的方式定义插件,这还是有一定的学习成本的。
而coze插件的定义更加具有引导性,仅需要填写部分内容就可以定义好一个插件,学习成本更低,也是我们后面主要参考的方式。

5.1.3、插件的使用
dify支持众多模型基座,对于微调过的模型来说,使用function call实现Agent能力;对于没有微调过的模型基座,使用ReAct实现Agent能力。
dify的agent比coze实现的更加完整,支持循环planning 和 action,并设置循环迭代轮数。这主要是为了防止大语言模型无限循环无法结束对话。
启用了两个插件:维基百科搜索和图表绘制插件,希望bot能够先帮我从维基百科搜索具体数据,然后根据搜索到的数据绘制柱状图。
