智能体的Agent到底是多 Agent还是单 Agent多 Session?

Image

前几天和他人讨论单Agent和多Agent架构,一时迷失了方向。难道单Agent就不能多session吗? 反正大模型是无状态的,他不关心你几个agent几个会话。 会话和agent完全是在 Agent harness 负责的。

讨论来讨论去,发现单Agent 和 多Agent本身就是一个名词陷阱。 只要我们认为有了 Agent循环,有了context上下文隔离,有了工具候选隔离,有了这些系统提示词的隔离。 那么我就认为是一个Agent。至于是通过单Agent多 Session 还是 多Agent 的实现方式,其实都是 名词陷阱罢了。

所以核心还是看 Agent的 智能体的核心功能和工作空间是否互相隔离。 只要隔离就认为是一个新的Agent。

学习也是一样,名词一大堆,到最后变成了哲学问题。 定义首先就把人困在了房子里。

重新理解 Agent 的运行边界随着Agent框架(不管是什么框架)越来越成熟,Agent、Session、Thread、Run、Sub-Agent、Multi-Agent 等概念层出不穷。

很多讨论一看到“Multi-Agent”(又有称 sub-Agent) ,就开始讨论多个 Agent 如何协作;一看到“Session”,又认为多个 Session 就等于多个 Agent。

但真正深入到实现层面,会发现一个更基础的问题:

到底什么东西才算一个 Agent?

Multi-Agent 和 Multi-Session,到底有什么本质区别?

这并不是一个简单的名词问题,而是 Agent 软件架构中的一个核心问题。


一、先从 LLM 说起:模型本身并没有 Agent

首先需要明确一个事实:

LLM 本身是无状态的计算模型。

你向模型发送:

messages
    ↓
   LLM
    ↓
response

模型完成一次计算。

下一次请求:

messages
    ↓
   LLM
    ↓
response

模型并不会天然知道上一次发生了什么。

所谓“记忆”“上下文”“角色”“工具”“任务状态”,实际上都是模型之外的软件系统提供的。

因此:

LLM=无状态计算能力

而:

Agent
=LLM+Context+Goal+Tools+Policy+Agent Loop+State+Runtime

换句话说:

Agent 不是模型内部的一个实体,而是围绕 LLM 构建出来的一个运行时控制实体。

这也是理解 Single-Agent 和 Multi-Agent 的起点。


二、什么是 Agent?

如果把 Agent 简化到最核心的部分,可以认为 Agent 最重要的东西不是 Session,而是:

Agent Loop。

一个典型 Agent:

用户任务
   ↓
Agent
   ↓
理解目标
   ↓
思考 / 规划
   ↓
选择 Action
   ↓
调用 Tool
   ↓
观察结果
   ↓
重新判断
   ↓
继续 Action
   ↓
直到任务完成

也就是:

Think
  ↓
Act
  ↓
Observe
  ↓
Decide
  ↓
Loop

所以,一个 Agent 最核心的定义可以简化为:

一个能够围绕目标持续进行“观察—决策—行动”的独立控制循环。

因此,一个 Agent 可以拥有:

Agent
├── Goal
├── System Prompt
├── Agent Loop
├── Context
├── Memory
├── Tools
├── Policy
├── Runtime
└── Session

这里要特别注意:

Session 不是 Agent。

Session 更接近于 Agent 的“状态容器”。


三、Session 到底是什么?

Session 可以理解为:

Session
=
Context
+
History
+
State
+
Metadata

例如:

Session #001

用户:
帮我检查这个 Java 类

Agent:
发现数据库查询没有事务保护……

用户:
继续检查 Redis

Agent:
发现这里存在缓存击穿风险……

这些历史消息、上下文以及运行状态,都可以保存在 Session 中。

所以 Session 主要解决的是:

“我现在记住了什么?”

而 Agent 主要解决:

“我下一步应该做什么?”

二者属于不同维度。

可以简单概括为:

Session → 状态问题

Agent   → 决策问题

四、那么 Single-Agent + Multi-Session 是什么?

假设我们只有一个 QA Agent:

QA Agent
    │
    └── Agent Loop

但是它管理三个 Session:

QA Agent
    │
    ├── Session A:Java 代码审查
    ├── Session B:API 自动化测试
    └── Session C:线上日志分析

此时:

               QA Agent
                   │
               Agent Loop
                   │
        ┌──────────┼──────────┐
        ↓          ↓          ↓
    Session A  Session B  Session C

这仍然可以称为:

Single-Agent + Multi-Session

因为真正的控制循环还是一个 Agent 在管理。

它可能在不同 Session 之间切换:

Agent Loop
    ↓
Session A
    ↓
分析代码
    ↓
Session B
    ↓
执行测试
    ↓
Session C
    ↓
分析日志

此时多个 Session 的核心价值是:

上下文隔离。

而不是产生多个真正独立的决策主体。


五、那么 Multi-Agent 又是什么?

Multi-Agent 的关键不是“有几个 Session”,而是:

存在多个相互独立的 Agent Control Loop。

例如:

                    Orchestrator
                         │
          ┌──────────────┼──────────────┐
          ↓              ↓              ↓
     Architect         Coder         Tester
       Agent            Agent          Agent
         │                │              │
      Loop A            Loop B         Loop C
         │                │              │
      Session A         Session B      Session C

这里:

  • Architect 有自己的决策循环
  • Coder 有自己的决策循环
  • Tester 有自己的决策循环

它们甚至可以使用完全相同的模型:

Architect ─┐
Coder ─────┼──→ Qwen
Tester ────┘

因此:

Multi-Agent 不等于 Multi-Model。

三个 Agent 可以全部使用同一个 Claude、Qwen 或 DeepSeek 模型。

真正的“多”,发生在模型之外。


六、问题开始变得有意思:如果每个 Session 都有自己的 Loop 呢?

这正是 Multi-Agent 和 Multi-Session 最容易混淆的地方。

假设我们设计:

Session A
├── 独立 Context
├── 独立 Prompt
├── 独立 Tools
└── 独立 Agent Loop

Session B
├── 独立 Context
├── 独立 Prompt
├── 独立 Tools
└── 独立 Agent Loop

那么问题来了:

这和两个 Agent 有什么区别?

从软件架构上说:

已经基本没有本质区别。

因为:

Agent A
=
Loop A
+
Context A
+
Tools A
+
Policy A

Agent B
=
Loop B
+
Context B
+
Tools B
+
Policy B

你把它叫:

Session A
Session B

还是:

Agent A
Agent B

已经更多是抽象层次和命名问题。

因此,一个很重要的判断标准出现了:

不要问“有几个 Session”,应该问“有几个独立的 Agent Control Loop”。


七、因此,Multi-Session 不是 Multi-Agent

可以把两者定义得更加严格:

Multi-Session

一个 Agent
    │
    └── 一个 Agent Loop
          │
          ├── Session A
          ├── Session B
          └── Session C

核心是:

状态隔离。


Multi-Agent

Orchestrator
    │
    ├── Agent A
    │    └── Loop A
    │         └── Session A
    │
    ├── Agent B
    │    └── Loop B
    │         └── Session B
    │
    └── Agent C
         └── Loop C
              └── Session C

核心是:

决策与控制循环隔离。

因此:

Multi-Session
=Context / State Isolation


Multi-Agent
=Decision / Control Isolation

这比简单地说:

Multi-Agent = Multi-Session

要准确得多。


八、那么一个 Agent 能不能有多个 Session?

当然可以。

甚至很多场景下非常合理。

例如一个用户同时有三个任务:

User
 │
 └── General Agent
       │
       ├── Session A:项目 A
       ├── Session B:项目 B
       └── Session C:个人任务

如果这些任务只是需要不同的上下文,那么没有必要创建三个 Agent。

此时:

一个 Agent+多个 Context

非常自然。


九、但我并不建议为了“架构完整”而设计 Agent 与 Session 的 N:N 关系

理论上完全可以设计成:

Agent A ─── Session 1
         └─ Session 2

Agent B ─── Session 2
         └─ Session 3

甚至:

多个 Agent
      ↕
多个 Session

形成 N:N。

理论上灵活。

但问题是:

这种灵活性到底解决了什么实际问题?

如果没有非常明确的业务需求,N:N 很容易把 Agent 生命周期、Session 生命周期、Context 管理、状态恢复、权限控制和调试复杂度全部带进来。

最终可能出现:

谁创建 Session?
谁拥有 Session?
Session 当前属于哪个 Agent?
两个 Agent 是否可以同时修改?
Session 的 Tool 权限听谁的?
Prompt 由谁决定?
Memory 属于 Agent 还是 Session?
Session 销毁以后 Agent 是否继续存在?
Agent 销毁以后 Session 是否保留?

于是原本简单的:

Agent → Session

变成:

Agent ↔ Session

软件复杂度迅速增加。


十、工程上更简单的模型:一个 Agent,一个 Session

如果没有特殊需求,我更倾向于:

Agent
  │
  └── Session

也就是:

一个 Agent Instance 对应一个主要 Session。

例如:

Agent 
#001
├── Goal
├── Prompt
├── Tools
├── Policy
├── Agent Loop
└── Session 
#001

需要另外一个独立上下文?

直接创建:

Agent 
#002
├── Goal
├── Prompt
├── Tools
├── Policy
├── Agent Loop
└── Session 
#002

如果 Agent #002 是 Agent #001 为完成任务而创建的,那么:

Agent 
#001
      │
      └── Sub-Agent 
#002
              │
              └── Session 
#002

这样整个生命周期非常清楚。


十一、Sub-Agent 其实就是解决“需要新的独立控制循环”的问题

例如:

用户:
帮我分析这个还款接口,
修改代码,然后执行 TestNG 回归。

主 Agent:

Main Agent
    │
    ├── 分析需求
    │
    ├── 创建 Code Review Sub-Agent
    │
    └── 创建 Test Sub-Agent

于是:

                 Main Agent
                    │
          ┌─────────┴─────────┐
          ↓                   ↓
   Code Review Agent      Test Agent
          │                   │
       Session A           Session B
          │                   │
       Loop A              Loop B

每个 Sub-Agent 都有:

Goal
Prompt
Context
Tools
Policy
Loop
Session

这样是不是比:

一个 Agent
    ↓
Session A
Session B
Session C
Session D
Session E

再额外定义复杂的 Session-Agent 映射关系更加容易管理?

在大多数工程场景下,是的。


十二、那么 Multi-Session 到底什么时候有价值?

这并不是说 Multi-Session 没有价值。

恰恰相反,它解决的是一个非常明确的问题:

同一个 Agent,需要维护多个相互隔离的上下文。

例如:

场景一:同一个 Agent 服务多个用户

QA Agent
 │
 ├── User A → Session A
 ├── User B → Session B
 └── User C → Session C

这里当然需要多个 Session。

但并不意味着需要创建:

Agent A
Agent B
Agent C

否则 Agent 本身的定义和配置会被大量重复。


场景二:同一个 Agent 同时处理多个任务

General Agent
 │
 ├── Project A Session
 ├── Project B Session
 └── Project C Session

每个任务上下文独立,但能力模型相同。

此时 Multi-Session 很合理。


场景三:需要保存长期会话

例如:

用户
 ↓
Agent
 ↓
Session
 ↓
持续几天 / 几周

Session 本质上承担的是:

持久化上下文和任务状态。

这也是 Session 最重要的价值之一。


十三、什么时候应该直接创建 Sub-Agent?

当需求从“上下文隔离”升级为“决策主体隔离”时,就应该考虑Sub-Agent。

例如:

① 不同目标

Code Agent
目标:修改代码

Test Agent
目标:验证代码

② 不同 Tools

Code Agent
Tools:
Git
FileSystem
Compiler

Test Agent
Tools:
TestNG
JDBC
Redis
MQ

③ 不同权限

Code Agent
允许:
读写代码

Deploy Agent
允许:
部署

但必须:
人工审批

④ 并行执行

                Main Agent
               /          \
              ↓            ↓
       Code Review       API Test
          Agent            Agent
             \             /
              ↓           ↓
                汇总结果

⑤ 不同生命周期

例如:

主 Agent
持续存在

Test Sub-Agent
创建
 ↓
执行测试
 ↓
返回结果
 ↓
销毁

这就是非常典型的 Sub-Agent。


十四、因此可以建立一个非常简单的判断规则

当你设计 Agent 系统时,可以问自己三个问题:

第一问:只是上下文不同吗?

如果只是:

Context A ≠ Context B

那么:

Multi-Session 足够。


第二问:是否需要独立决策循环?

如果:

Loop A ≠ Loop B

那么:

应该考虑 Multi-Agent。


第三问:是否还需要独立权限、工具、生命周期和运行环境?

如果:

Policy A ≠ Policy B
Tools A ≠ Tools B
Runtime A ≠ Runtime B
Lifecycle A ≠ Lifecycle B

那么:

使用 Sub-Agent 会更加清晰。


十五、最终可以形成一个非常简单的架构原则

我认为工程实现上可以遵循:

Context 隔离
    ↓
Session

Decision 隔离
    ↓
Agent

Execution 隔离
    ↓
Runtime / Sandbox

Permission 隔离
    ↓
Policy

Lifecycle 隔离
    ↓
Agent Instance / Sub-Agent

于是:

             ┌──────────────┐
             │     Agent    │
             │              │
             │ Goal         │
             │ Loop         │
             │ Policy       │
             │ Tools        │
             └──────┬───────┘
                    │
                 Session
                    │
                 Runtime
                    │
                Sandbox

需要新的决策主体:

             Main Agent
                  │
             spawn
                  ↓
             Sub-Agent
                  │
               Session
                  │
               Runtime
                  │
              Sandbox

结构非常清楚。


十六、结论:不要为了 Multi-Agent 而 Multi-Agent

“Multi-Agent”并不是 Agent 架构的终点。

同样,“Multi-Session”也不是 Multi-Agent 的低级版本。

两者解决的问题本来就不同:

维度 Multi-Session Multi-Agent
核心目的 上下文隔离 决策主体隔离
Context 独立 独立
History 独立 独立
Prompt 可以不同 通常独立
Tools 可以不同 通常独立
Agent Loop 通常共享 独立
Goal 通常由主 Agent 统一管理 可以独立
Policy 可以复用 可以独立
Lifecycle 通常由 Agent 管理 Agent 自己管理
Runtime 可以共享 可以隔离
并行 可以实现 更自然
Sub-Agent 不需要 天然适合

因此,真正值得关注的不是:

“我的系统到底算 Single-Agent 还是 Multi-Agent?”

而是:

“我到底需要隔离什么?”

如果只是上下文不同,就使用 Session。

如果需要独立的决策循环,就创建 Agent。

如果还需要独立权限、工具、运行环境和生命周期,就创建 Sub-Agent。

而对于 Agent 与 Session 的 N:N 关系,理论上当然可以实现,但如果没有明确的业务价值,我倾向于避免它。

因为软件架构的目标不是:

把所有可能性都抽象出来。

而是:

在满足需求的前提下,让状态、控制权和生命周期尽可能清晰。

所以对于一个实际的 General Agent,我更倾向于:

General Agent
     │
     └── Session

需要新的独立任务:

General Agent
     │
     └── Sub-Agent
             │
             └── Session

而不是:

Agent
  ↕
Session
  ↕
Agent
  ↕
Session

简单、清晰、可管理,本身就是一种架构能力。

最终可以用一句话概括:

Session 管上下文,Agent 管决策,Runtime 管执行;上下文隔离用 Session,决策隔离用 Agent,执行隔离用 Runtime。没有明确收益,就不要为了“Multi”而增加架构复杂度。

此篇文章已被阅读4 次