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

前几天和他人讨论单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 次