智能体,从 ReAct 到多智能体

This post was created with 2% of AI.

Agent (代理)具有非常“广泛”的概念,在深度学习领域,Agent 指的是一个能够推理、规划和与其环境交互的人工智能实体(模型)

Agent 的概念最初来源于哲学,是具有行动能力的实体。

Marvin Minsky 老爷子的 Society of Mind 理论中,定义 Agent 为一个自主、独立运行的计算或认知实体,它具备感知、决策和执行任务的能力。每个Agent 都有自己的目标、行为和策略,并能与其他 Agent 交互和协作。

想象一下未来,你的智能管家 Alfred 收到一个指令:帮我买一杯咖啡。Alfred 收到指令,然后规划出一系列行动:

  1. 走到厨房
  2. 使用咖啡机煮咖啡
  3. 把煮好的咖啡端回来

接着,它必须执行这些动作。如果它发现厨房没有咖啡机,还可能会主动前往仓库寻找或者在购物网站上购买。最终,无论采取怎样的措施,它给你端来了一杯咖啡。

你的智能管家就是一个 Agent。

基于大语言模型的 Agent#

在大语言模型兴起之前,Agent 有很多实现思路

  • 基于符号逻辑
  • 基于 RL (强化学习)
  • 基于迁移学习
  • ...

随着大预言模型能力的提升,大家发现大语言模型有强大的学习、推理和规划能力,能够处理更加复杂、抽象的任务,似乎让大家看到了大语言模型在 AGI(通用人工智能)中的巨大潜力。

在基于大语言模型的 Agent 架构中,大语言模型通常作为 Agent 的大脑。把它想象成人类关键,它具有:

  • 大脑 LLM 作为 Agent 的大脑,负责处理信息、做出决策和规划行动。

  • 身体 Agent 的功能模块专门处理特定类型的信息或执行特定任务;还包括“身体的其他感知器官”,比如文本、语音、听觉等都依赖外部的能力或工具,通过它们来执行决策(动作)、提交执行反馈。

当前 Agent 的流行架构#

LLM Powered Autonomous Agents 这篇内容中,将 Agent System 的设计更具体地拆分为三个构件:

Planning#

规划(Planning)的任务主要是子目标拆解(Task Decomposition)、反思和优化(Reflection and Refinement)。

Task Decomposition 将任务拆解成更小、更容易管理的子目标,从而实现复杂任务的高效处理。

Reflection and Refinement 让 Agent 改进过去的决策和错误,从错误中学习来优化未来的步骤。

Memory#

记忆模块(Memory)可被定义为上一步获取、存储随后被提取的过程。参考人的记忆模式,Agent 的记忆可分为:

  • 感官记忆:多模态输入(文本、音频、视频)的嵌入表示。
  • 短期记忆:上下文学习
  • 长期记忆:外部向量存储结构,Agent 可随时快速召回

Tool Use#

使用工具增强的大语言模型(Tool Augmented Language Model),使其能够使用外部工具。ChatGPT 的 Plugins 和 function calling 就是 LLM 增强工具使用能力的例子。

Agent 可以通过工具(Tools)来执行规划的动作,并进一步将工作反馈提交给大语言模型。

Anthropic 推出的 MCP 协议 提供了一套规范的接口定义,让外部工具能够方便地和大语言模型交互。

Agent 的基本实现原理#

ReAct(Reason + Act))是一种流行的通用 Agent 架构,它要求大语言模型以交错的方式进行推理和特定任务的行动,实现推理和行动的协同。

用一个简单的公式来表达:

agent ≈ model + tools, within a for-loop + environment

或者一个更形象的图形化表达:

当使用工具增强的大语言模型作为 Agent 大脑,它的流程如下:

(1)LLMs 接收用户指令 用户指令可以是直接文本输入,还可以是图片、音频、或者通过 @ 等方式引用的外部资料。这些内容会直接作为提示词输入到 LLM 中。

(2)LLMs 在内部进行推理和规划,生成要执行的具体步骤 LLM 推理用户指令,生成下一步具体的操作。根据具体指令,这一阶段可以是单纯的文本输出(类似问答)或者工具使用,更智能的 Agent,还会对用户进一步询问。

这一阶段,LLM 自行推理,自主规划下一步操作

(3)使用工具完成要执行的具体步骤 对于 ChatGPT,LLMs 会通过 Function Calling API 返回下一步操作要使用到的工具,比如网页搜索、阅读文件等等。

此时 LLMs 会等待执行操作的返回结果。

(4)LLMs 重新规划 根据上一步的返回结果,LLMs 进行重新任务规划。如果 LLMs 认为任务可以结束,则终止这一循环过程。

这一过程通过伪代码,大致可以如下实现:

// 1. 让 LLMs 知道可使用的工具,可以使用 Function Callling 的 Tool Use 定义
const tools = [...];

// 2. 提交用户指令给 LLMs
let completion = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    store: true,
    tools: tools,
    messages: [
    { role: 'system', content: 'You are an agent called Alfred'},
    { role: 'user', content: 'Bring me a cup of coffee.'}],
});

// 3. LLMs 进行指令推理(内部进行),返回 Tool Use,
let feedBack: string = '';
completion.choices.map(content => {
	if (content.type === 'tool_use') {
		// 4. 执行操作,并获取反馈
		const feedBack = await findCoffeeMachine();
	}
})

// 5. 将反馈提交给 LLMs 进行后续推理规划
let completion = await openai.chat.completions.create({
    model: 'gpt-4o-mini',
    store: true,
    tools: tools,
    messages: [
    { role: 'system', content: 'You are an agent called Alfred'},
    { role: 'user', content: 'Bring me a cup of coffee.'}, 
    { role: 'assistant', content: 'I need xxxx'},
    { role: 'assistant', content: feedBack }
    ],
});

在基础的 ReAct 架构下,社区还有一些增强的架构

Plan-And-Execute#

这个方案核心主要引入了 Plan(ToDo List,规划列表),将整个任务划分成更小的任务。子任务可以循环调用多次工具来完成,这样可以避免每次工具调用都跟 LLMs 进行交互。

一旦子任务完成,任务反馈结果会提交给 LLMs 进行重新规划。

BabyAGI 就是这个架构的一个典型 Case。

任务依赖的增强架构#

将复杂任务划分为多个子任务,多个子任务之间存在相互依赖关系是无法避免的。

ReWOO 架构通过串行工作流的方式减少工具与 LLMs 的交互,大致的逻辑是 LLMs 在分解依赖任务之后,通过一个单独的 Worker 节点串行处理任务(上一个任务的输出变成下一个任务的输入),最后把最终结果提交给 LLMs。

LLMCompiler 是通过是试图通过依赖图谱的方式,并行处理子任务,以提高 Agent 执行的速度。

Agent Case Studies#

从开源的一些项目,我们一窥端倪 Agent 具体是怎么实现的。

Coding Agent - Cline#

Cline 是一个非常典型的 ReAct 架构的 Coding Agent。它的大致实现流程如下图所示:

在编程任务启动时,Cline 会收集系统提示词、用户自定义规则、用户输入和环境信息作为上下文(Memory)提交给 LLMs。Cline 要求 LLMs 通过 <thinking> 进行推理规划,然后输出 Tool Use 指令。Cline 有两类工具,一类是内置工具,比如执行命令行指令、阅读代码文件、搜索文件等等,另一类则是通过 MCP 由用户自定义扩展。

工具执行的结果会作为上下文再次提交个 LLMs 进行下一步推理,如此往复,直至 LLMs 认为任务处理完毕。

在 Cline 的实现中,上下文作为 Agent 的短期记忆而存在。Plan 过程则是要求 LLMs 在支持任务前使用 CoT 进行推理。

RL 增强的 Agent#

除了在应用层通过增强工具的能力来提升 Agent,LLMs 厂商(比如 ChatGPT/Cluade 3.7)试图通过强化学习(RL)和推理增强特定领域的 Agent。

比如,相比于通用 LLMs + 工具的 DeepResearch 实现,ChatGPT 的 DeepResearchOperator 针对特定的数据集进行了进一步的训练。

尤其是通用 LLMs 在工具调用的失败率很高,为解决这一问题,RL 增强的 Agent 也会变成一个很行的方案。

多智能体#

多智能体(Multi-Agent)主要是为复杂任务而设计的,如果将单个 Agent 比喻成一种角色,那么多智能体就是能力不同的多种角色。多智能体系统就是模拟分工合作的复杂现实环境,多个自主智能体共同参与规划、讨论和决策。多智能体可以提高系统的模块化能力、可扩展和鲁棒性。

MetaGPT 就是一个可参考的多智能体的设计,它模拟真实的软件开发过程,涉及的角色包括产品经理、架构师、项目经理、开发和测试。

Agent 和工作流#

Agency 是 Agent 的内在特质

Agent 和 workflow(工作流)一定程度上都具有“代理”的特征,在 Cluade 中,这两者可统称为 Agentic System,但存在具体区分:

  • Workflow - LLM 和工具通过预先定义的路径进行编排
  • Agent - LLM 自主设计流程和使用工具的系统

一个典型的基于 Prompt Chaining 的工作流:

工作流通常基于自动化系统,LLM 作为 Play 中的一环参与到流程中。而 Agent 是一个将 LLM 作为大脑的自动系统,LLM 主动参与推理和规划。

当我们说 Agency 是 Agent 的内在特质,是说采取主动、做出决定以及控制其行为和环境的能力,积极主动而非被动。强大自主的 Agent 会设定目标并充满信心地追求目标,即使面对障碍也是如此。

我从这些文章中得到很多收获#