State Machine 深度技术博客:从有限状态机到 AI Agent 的状态驱动架构
State Machine 深度技术博客:从有限状态机到 AI Agent 的状态驱动架构
摘要 State Machine(状态机)并不是一个只存在于编译原理、游戏开发或传统工作流系统中的老技术。随着 AI Agent 从“单轮问答”走向“长任务、自主决策、多 Agent 协作、工具调用和可恢复执行”,State Machine 正重新成为 Agent Runtime 的核心抽象之一。
本文从有限状态机(FSM)的数学模型出发,深入分析 State、Event、Transition、Guard、Action、Context、Persistence、Recovery 等核心概念,并进一步讨论 State Machine 如何与 LLM、Tool Calling、Workflow、Agent Loop、Memory、Human-in-the-loop 结合,最终构建一个可观测、可恢复、可验证的生产级 AI Agent Runtime。
1. 为什么 AI Agent 时代重新需要 State Machine?
很多人第一次接触 Agent 时,会认为 Agent 的核心结构非常简单:
User
↓
LLM
↓
Tool
↓
LLM
↓
Tool
↓
Final Answer
于是最简单的 Agent Loop 通常被实现成:
while (!finished) {
response = llm.chat(context);
if (response.hasToolCall()) {
executeTool(response);
} else {
finished = true;
}
}
这个模型对于 Demo 足够,但进入生产环境后,很快会遇到问题:
- Agent 当前到底处于什么阶段?
- Tool 调用失败后应该怎么办?
- 网络超时应该重试还是终止?
- 用户中途修改需求怎么办?
- 一个任务执行到 70% 后服务重启怎么办?
- Agent 如何从上一次执行位置恢复?
- 哪些状态允许调用支付、删除、发布等危险工具?
- 多个 Agent 如何协作?
- 如何保证状态不会非法跳转?
- 如何审计 Agent 为什么做出了某个动作?
- 如何测试 Agent 的所有执行路径?
这些问题本质上已经不是单纯的 LLM 问题。
它们属于:
State Management + Workflow Orchestration + Control Flow
也就是状态管理和流程控制问题。
因此,一个生产级 Agent 往往不能只是:
LLM → Tool → LLM → Tool
而应该逐渐演化成:
┌──────────────┐
│ LLM │
└──────┬───────┘
│ Decision
▼
┌──────────┐ ┌──────────────┐
│ Event │───────▶│ State Machine│
└──────────┘ └──────┬───────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
Tool Call Memory Human
│ │ │
└────────────┼────────────┘
▼
Context
这里最重要的思想是:
LLM 负责“智能决策”,State Machine 负责“确定性控制”。
这两者不是竞争关系,而是互补关系。
2. 什么是 State Machine?
State Machine 的核心思想非常简单:
一个系统在任意时刻处于某个 State,当 Event 发生时,根据 Transition Rules 决定是否进入另一个 State。
最基本的数学定义可以表示为:
[ M = (S, E, \delta, s_0, F) ]
其中:
- (S):State 集合
- (E):Event 集合
- (\delta):状态转移函数
- (s_0):Initial State
- (F):Final States
例如一个订单系统:
CREATED
│
│ PAY
▼
PAID
│
│ SHIP
▼
SHIPPED
│
│ RECEIVE
▼
COMPLETED
状态集合:
CREATED
PAID
SHIPPED
COMPLETED
CANCELLED
事件集合:
PAY
SHIP
RECEIVE
CANCEL
状态转移可以定义为:
CREATED + PAY
→ PAID
PAID + SHIP
→ SHIPPED
SHIPPED + RECEIVE
→ COMPLETED
状态机真正重要的地方不是“状态”。
而是:
系统只能通过合法 Transition 改变状态。
例如:
CREATED → COMPLETED
可能就是非法的。
State Machine 因此天然提供了一种:
对系统行为进行约束的机制。
3. State Machine 的六个核心元素
一个真正可用于生产系统的 State Machine,至少需要理解六个概念:
State
Event
Transition
Guard
Action
Context
3.1 State
State 表示系统当前处于什么阶段。
例如 AI Agent:
IDLE
PLANNING
EXECUTING
WAITING_TOOL
WAITING_HUMAN
RETRYING
COMPLETED
FAILED
State 不应该只是一个字符串。
它实际上代表:
系统当前允许做什么,以及禁止做什么。
例如:
WAITING_HUMAN
意味着:
允许:
接收用户输入
恢复任务
禁止:
自动调用高风险 Tool
自动修改核心业务数据
所以 State 实际上可以理解成:
[ State = Current\ Capability\ Boundary ]
即:
当前状态决定系统的能力边界。
4. Event
Event 是导致状态发生变化的输入。
例如:
USER_REQUEST
PLAN_CREATED
TOOL_CALL
TOOL_SUCCESS
TOOL_FAILURE
TIMEOUT
USER_APPROVED
USER_REJECTED
CANCEL
RETRY
例如:
PLANNING
│
│ PLAN_CREATED
▼
EXECUTING
或者:
WAITING_HUMAN
│
│ USER_APPROVED
▼
EXECUTING
在 Agent 系统中,Event 通常比传统业务系统更加复杂,因为 Event 可能来自:
- User
- LLM
- Tool
- Message Queue
- Timer
- External API
- Another Agent
- Human Approval
因此生产级 Agent State Machine 通常实际上是一个:
Event-driven State Machine
5. Transition
Transition 是:
State + Event → New State
例如:
EXECUTING + TOOL_SUCCESS
↓
EXECUTING
也可能:
EXECUTING + TOOL_FAILURE
↓
RETRYING
或者:
EXECUTING + TASK_COMPLETED
↓
COMPLETED
可以抽象成:
record Transition(
State from,
Event event,
State to
) {}
例如:
new Transition(
State.EXECUTING,
Event.TOOL_FAILURE,
State.RETRYING
);
6. Guard:状态机真正强大的地方
仅仅有 State + Event 还不够。
现实系统经常存在:
同一个 Event,在不同条件下进入不同状态。
这就是 Guard。
例如:
EXECUTING
│
│ TOOL_FAILURE
│
├── retryCount < 3 ───────▶ RETRYING
│
└── retryCount >= 3 ──────▶ FAILED
形式化表达:
[ Transition = (State, Event, Guard) \rightarrow State' ]
Java:
if (event == TOOL_FAILURE) {
if (retryCount < 3) {
state = RETRYING;
} else {
state = FAILED;
}
}
Guard 的重要意义在于:
把“什么时候允许发生某个行为”从业务代码中显式抽取出来。
7. Action
Transition 发生之后,通常需要执行 Action。
例如:
EXECUTING
│
│ TOOL_SUCCESS
▼
COMPLETED
│
▼
sendNotification()
Action 可以包括:
调用 API
发送消息
保存数据库
更新 Memory
写 Audit Log
触发 Event
启动 Timer
调用 Tool
因此完整模型变成:
State
+
Event
+
Guard
↓
Transition
↓
Action
↓
New State
8. Context:State 和 Data 必须分离
一个常见设计错误是:
把所有业务数据都塞进 State。
例如:
class AgentState {
String state;
String userName;
String task;
String toolResult;
String conversation;
String plan;
int retryCount;
}
这里混合了两种完全不同的数据:
State
Context
更好的设计:
enum AgentState {
IDLE,
PLANNING,
EXECUTING,
WAITING_HUMAN,
COMPLETED,
FAILED
}
Context:
class AgentContext {
String taskId;
String userRequest;
List<String> plan;
Map<String, Object> variables;
List<ToolResult> toolResults;
int retryCount;
}
即:
State
= 系统处于什么阶段
Context
= 系统拥有的业务数据
这是非常重要的架构原则。
9. AI Agent 的 State Machine
现在把 State Machine 放入 Agent。
一个比较典型的 Agent 状态机:
┌─────────────┐
│ IDLE │
└──────┬──────┘
│ USER_REQUEST
▼
┌─────────────┐
│ PLANNING │
└──────┬──────┘
│ PLAN_CREATED
▼
┌─────────────┐
│ EXECUTING │◀──────────┐
└──────┬──────┘ │
│ │
┌─────────┴─────────┐ │
│ │ │
TOOL_CALL COMPLETE │
│ │ │
▼ ▼ │
┌─────────────┐ ┌───────────┐ │
│WAITING_TOOL │ │ COMPLETED │ │
└──────┬──────┘ └───────────┘ │
│ │
TOOL_SUCCESS │
│ │
└────────────────────────────┘
如果 Tool 失败:
WAITING_TOOL
│
│ TOOL_FAILURE
▼
RETRYING
│
├── retry < 3 ─────▶ WAITING_TOOL
│
└── retry >= 3 ────▶ FAILED
这时候 Agent 已经不再是一个简单 Loop。
它变成了:
一个由事件驱动的状态转换系统。
10. LLM 在 State Machine 中到底负责什么?
这是 Agent Architecture 中非常关键的问题。
很多系统让 LLM 决定一切:
LLM:
现在我要调用 Tool A
调用 Tool A
然后调用 Tool B
然后直接完成
这种方式的问题是:
LLM 是概率模型,不应该成为整个系统的确定性控制器。
更合理的架构是:
┌──────────────┐
│ LLM │
│ Reasoning │
└──────┬───────┘
│
│ Decision
▼
┌──────────────┐
│State Machine │
│ Control │
└──────┬───────┘
│
┌────────┼────────┐
▼ ▼ ▼
Tool Memory Human
LLM 负责:
理解
推理
规划
选择
生成
State Machine 负责:
约束
验证
执行
恢复
重试
生命周期
权限边界
一句话总结:
LLM 决定“想做什么”,State Machine 决定“现在允许做什么”。
11. LLM 不应该直接修改 State
一个更加成熟的 Agent Runtime,不应该允许:
LLM → state = COMPLETED
而应该:
LLM
↓
Decision
↓
Event
↓
State Machine
↓
Transition Validation
↓
State Change
例如 LLM 输出:
{
"action": "CALL_TOOL",
"tool": "search_customer"
}
Runtime 将其转换成:
AGENT_DECISION
然后:
EXECUTING
+
AGENT_DECISION
+
Guard
↓
CALL_TOOL
如果当前状态不允许调用这个 Tool:
TransitionRejected
而不是让 LLM 直接执行。
这就是:
LLM-generated intent + deterministic execution
12. State Machine 可以成为 Agent 的安全边界
这是 State Machine 在 AI 系统中的一个重要价值。
假设 Agent 有:
search()
createOrder()
cancelOrder()
refund()
deleteAccount()
我们不希望 Agent 在任意状态都可以执行这些 Tool。
可以定义:
PLANNING
allowed:
search
EXECUTING
allowed:
search
createOrder
WAITING_HUMAN
allowed:
none
APPROVED
allowed:
createOrder
refund
于是:
State → Capability
可以形成:
State
│
▼
Capability
│
▼
Tools
因此 State Machine 可以承担部分:
Agent Authorization Boundary
13. State Machine + Human-in-the-loop
企业级 Agent 经常不能完全自动执行。
例如:
Agent
↓
分析贷款申请
↓
生成审批建议
↓
Human Approval
↓
执行
状态可以设计成:
ANALYZING
↓
WAITING_APPROVAL
↓
APPROVED
↓
EXECUTING
↓
COMPLETED
或者:
WAITING_APPROVAL
│
├── APPROVED ──▶ EXECUTING
│
├── REJECTED ──▶ FAILED
│
└── EXPIRED ───▶ CANCELLED
这比在代码中写:
Thread.sleep(...)
等待用户审批要健壮得多。
14. State Machine + Persistence
如果 State Machine 只存在 JVM Memory:
State
↓
JVM Memory
那么:
Application Restart
↓
State Lost
↓
Agent Lost
生产环境必须持久化:
Agent Runtime
│
├── State
├── Context
├── Event
└── Transition
│
▼
Persistent Store
例如:
PostgreSQL
Redis
DynamoDB
MongoDB
Event Store
一个简单的数据结构:
CREATE TABLE agent_execution (
task_id VARCHAR(128) PRIMARY KEY,
state VARCHAR(64),
version BIGINT,
context JSONB,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
其中:
version
非常重要。
15. Optimistic Locking:防止状态覆盖
假设两个 Worker 同时处理:
Worker A
state = EXECUTING
version = 10
Worker B
state = EXECUTING
version = 10
A:
EXECUTING → COMPLETED
version = 11
B:
EXECUTING → FAILED
如果没有并发控制:
A 写入 COMPLETED
B 写入 FAILED
最终:
FAILED
A 的状态被覆盖。
可以使用:
UPDATE agent_execution
SET state = 'COMPLETED',
version = version + 1
WHERE task_id = ?
AND version = 10;
如果:
affectedRows = 0
说明发生并发冲突。
因此:
State Machine + Versioning 是分布式 Agent Runtime 的基础能力。
16. State Transition 应该具有原子性
一个完整 Transition 通常包含:
读取 State
↓
验证 Event
↓
验证 Guard
↓
执行 Transition
↓
更新 State
↓
记录 Event
↓
触发 Action
如果这些操作不是原子的,就可能出现:
State 更新成功
Action 执行失败
或者:
Action 执行成功
State 更新失败
这会导致系统进入不一致状态。
因此可以采用:
Transaction
+
Outbox Pattern
架构:
┌─────────────────────────────┐
│ Database TX │
│ │
│ State Update │
│ Event Record │
│ Outbox Record │
│ │
└──────────────┬──────────────┘
│
▼
Kafka
│
▼
Action Worker
这样可以避免:
State 已经变化,但是 Event 没有可靠发布。
17. State Machine + Event Sourcing
进一步可以使用 Event Sourcing。
传统模式:
Current State
Event Sourcing:
Event 1
Event 2
Event 3
Event 4
↓
Rebuild State
例如 Agent:
USER_REQUEST
PLAN_CREATED
TOOL_CALLED
TOOL_SUCCESS
USER_APPROVED
TASK_COMPLETED
State 可以通过 Event Replay 得到:
IDLE
↓
PLANNING
↓
EXECUTING
↓
WAITING_HUMAN
↓
EXECUTING
↓
COMPLETED
这带来非常强的审计能力。
你可以回答:
Agent 为什么最终进入 COMPLETED?
因为:
USER_REQUEST
→ PLAN_CREATED
→ TOOL_SUCCESS
→ USER_APPROVED
→ TASK_COMPLETED
对于金融、医疗、企业审批等场景,这种能力非常重要。
18. State Machine 与 Event Sourcing 的关系
两者并不是同一个东西。
State Machine:
描述“允许如何变化”。
Event Sourcing:
描述“变化历史如何保存”。
可以组合:
Events
│
▼
┌──────────────┐
│State Machine │
└──────┬───────┘
│
▼
Current State
或者:
Event Store
│
▼
Replay
│
▼
State Machine
│
▼
Current State
因此:
State Machine = Behavior Model
Event Sourcing = Persistence Model
19. FSM 的局限性
传统 FSM 很适合:
状态数量较少
状态关系清晰
流程比较扁平
但是复杂 Agent 很快会产生:
10 states
20 events
50 transitions
甚至:
100+ states
这时会出现经典问题:
State Explosion
例如:
LOGIN
LOGIN_FAILED
LOGIN_RETRY
PASSWORD_EXPIRED
MFA_REQUIRED
MFA_FAILED
MFA_RETRY
ACCOUNT_LOCKED
...
状态数量迅速膨胀。
因此复杂系统需要更高级的状态模型。
20. Hierarchical State Machine
Hierarchical State Machine(HSM)允许状态嵌套。
例如:
AGENT
│
├── PLANNING
│
├── EXECUTION
│ ├── TOOL_SELECTION
│ ├── TOOL_CALLING
│ ├── TOOL_RESULT
│ └── RETRYING
│
├── HUMAN_INTERACTION
│ ├── WAITING
│ └── APPROVED
│
└── TERMINATED
├── COMPLETED
└── FAILED
这里:
EXECUTION
本身就是一个 State Group。
这样可以减少大量重复 Transition。
21. Statechart:比 FSM 更适合复杂 Agent
Statechart 在传统 FSM 上进一步增加:
- Hierarchy
- Parallel States
- History
- Guard
- Action
- Event
例如一个 Agent 可以同时:
EXECUTION
├── Tool Execution
├── Memory Update
└── Observability
三个子系统并行运行。
抽象成:
EXECUTION
/ | \
/ | \
TOOL MEMORY TRACE
│ │ │
▼ ▼ ▼
Running Updating Recording
这种模型非常适合:
复杂 Agent Runtime 和多步骤 Workflow。
22. Parallel State:Multi-Agent 的基础
假设一个任务:
“分析一家公司的投资价值。”
可以拆成:
Research Agent
Financial Agent
News Agent
Risk Agent
它们可以并行执行:
MASTER
│
┌────────┼────────┐
▼ ▼ ▼
Research Financial Risk
│ │ │
└────────┼────────┘
▼
Synthesis
│
▼
COMPLETED
这里实际上已经出现:
Parallel State Machine
Master Agent 维护:
research = COMPLETED
financial = COMPLETED
risk = RUNNING
只有:
ALL_COMPLETED
才允许进入:
SYNTHESIS
23. State Machine + Multi-Agent Collaboration
在 Multi-Agent 系统中,可以把每一个 Agent 看成一个 State Machine。
例如:
Orchestrator
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Research Coding Review
Agent Agent Agent
│ │ │
State State State
Machine Machine Machine
Agent 之间通过 Event 通信:
RESEARCH_COMPLETED
↓
CODE_AGENT_START
↓
CODE_COMPLETED
↓
REVIEW_START
这时候:
Agent Communication 本质上可以建立在 Event-driven State Transition 之上。
这比 Agent 之间直接共享大量自然语言 Context 更容易控制。
24. State Machine + LLM Memory
Agent Memory 也可以通过 State 驱动。
例如:
PLANNING
↓
读取 Long-term Memory
↓
EXECUTING
↓
生成新的事实
↓
MEMORY_UPDATE
↓
COMPLETED
但是需要注意:
Memory 不等于 State。
Memory:
我上周已经分析过这个客户。
State:
当前任务正在等待审批。
前者是知识。
后者是生命周期。
所以:
Memory ≠ State
Context ≠ State
History ≠ State
它们应该被明确分离。
25. State Machine 与 Agent Loop 的区别
传统 Agent Loop:
while(true) {
think();
act();
observe();
}
State Machine:
State
↓
Event
↓
Guard
↓
Transition
↓
Action
↓
State
两者可以结合:
┌──────────────┐
│ State Machine│
└───────┬──────┘
│
▼
EXECUTING
│
▼
LLM
│
┌─────┴─────┐
▼ ▼
Tool Call Final
│
▼
Event
│
▼
State Machine
因此:
Agent Loop 是执行机制,State Machine 是控制模型。
26. 一个生产级 Agent Runtime 的架构
一个成熟的 Agent Runtime 可以设计成:
┌──────────────────────────────────────────┐
│ API Layer │
└─────────────────────┬────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ Agent Runtime │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ State Machine│ │ Policy Engine│ │
│ └──────┬───────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Agent Engine │ │
│ └──────┬───────┘ │
│ │ │
│ ┌────┼────┬────────┐ │
│ ▼ ▼ ▼ ▼ │
│ LLM Tool Memory Human │
│ │
└─────────────────────┬────────────────────┘
│
┌───────────┼─────────────┐
▼ ▼ ▼
PostgreSQL Redis Kafka
│
▼
Event Store
其中:
State Machine
是控制核心。
27. Java 实现一个简单 State Machine
可以定义:
public enum AgentState {
IDLE,
PLANNING,
EXECUTING,
WAITING_HUMAN,
COMPLETED,
FAILED
}
Event:
public enum AgentEvent {
USER_REQUEST,
PLAN_CREATED,
TOOL_SUCCESS,
TOOL_FAILURE,
USER_APPROVED,
USER_REJECTED,
TASK_COMPLETED
}
Transition:
public record Transition(
AgentState from,
AgentEvent event,
AgentState to) {
}
然后建立 Transition Table:
Map<String, AgentState> transitions = Map.of(
"IDLE:USER_REQUEST", AgentState.PLANNING,
"PLANNING:PLAN_CREATED", AgentState.EXECUTING,
"EXECUTING:TOOL_FAILURE", AgentState.FAILED,
"EXECUTING:TASK_COMPLETED", AgentState.COMPLETED
);
执行:
public AgentState transition(
AgentState current,
AgentEvent event) {
String key = current + ":" + event;
AgentState next = transitions.get(key);
if (next == null) {
throw new IllegalStateException(
"Illegal state transition: " + key
);
}
return next;
}
核心原则就是:
非法 Transition 必须被拒绝。
28. 不要把 State Machine 写成巨型 if-else
最初可能写成:
if (state == IDLE) {
if (event == USER_REQUEST) {
state = PLANNING;
}
} else if (state == PLANNING) {
if (event == PLAN_CREATED) {
state = EXECUTING;
}
}
当系统扩大之后:
1000+ lines
会非常难维护。
更好的方式是:
Transition Table
或者:
State Pattern
甚至直接使用:
State Machine Framework
核心思想是:
让状态转移成为数据,而不是散落在业务代码里的控制流。
29. State Pattern 与 State Machine 的区别
两者经常被混淆。
State Pattern
主要解决:
当前对象在不同 State 下具有不同的行为。
例如:
interface State {
void handle(Context context);
}
不同 State:
PendingState
RunningState
CompletedState
State Machine
关注的是:
State 之间如何按照 Event 进行合法转换。
State
↓
Event
↓
Guard
↓
Transition
↓
State
所以:
State Pattern
= 行为封装
State Machine
= 状态转换模型
两者完全可以组合。
30. Agent State Machine 的错误恢复
真正生产环境中,最重要的能力之一是:
Failure Recovery。
例如:
EXECUTING
│
│ Tool Timeout
▼
RETRYING
│
├── retry < 3
│ ↓
│ EXECUTING
│
└── retry >= 3
↓
FAILED
但是简单 Retry 仍然不够。
还需要:
Exponential Backoff
Circuit Breaker
Timeout
Idempotency
Dead Letter Queue
Compensation
例如:
[ delay = min(cap,\ base \times 2^{retry}) ]
第一次:
1s
第二次:
2s
第三次:
4s
31. Compensation State
如果 Agent 执行了:
Create Order
Charge Payment
Reserve Inventory
然后最后一步失败:
Order Created
Payment Charged
Inventory Failed
不能简单:
FAILED
因为系统可能已经产生副作用。
需要:
EXECUTING
↓
PARTIAL_FAILURE
↓
COMPENSATING
↓
ROLLBACK_PAYMENT
↓
RELEASE_ORDER
↓
FAILED
这实际上是:
Saga + State Machine
非常适合长事务 Agent。
32. State Machine + Saga
可以设计:
PROCESSING
│
├── Step A
├── Step B
├── Step C
│
▼
SUCCESS
失败:
PROCESSING
↓
STEP_C_FAILED
↓
COMPENSATING
↓
UNDO_B
↓
UNDO_A
↓
FAILED
因此复杂 Agent 的状态机不仅可以描述:
“任务执行到哪里了”
还可以描述:
“失败之后如何恢复系统一致性”。
33. Timeout 也是一种 Event
不要把 Timeout 当作特殊代码。
应该把它建模成 Event:
EXECUTING
│
│ TIMEOUT
▼
RETRYING
或者:
WAITING_HUMAN
│
│ APPROVAL_TIMEOUT
▼
EXPIRED
这样 Timer 只是 Event Producer:
Timer
↓
TIMEOUT Event
↓
State Machine
整个系统就更加统一。
34. State Machine 的可观测性
Agent 系统必须回答:
Current State?
Previous State?
Why transitioned?
Which Event?
Which Agent?
Which Tool?
How long?
How many retries?
因此建议记录:
task_id
agent_id
from_state
event
to_state
reason
timestamp
duration
trace_id
span_id
例如:
{
"taskId": "task-1001",
"from": "EXECUTING",
"event": "TOOL_FAILURE",
"to": "RETRYING",
"reason": "TIMEOUT",
"retry": 2,
"traceId": "abc123"
}
这样可以把:
State Machine
+
OpenTelemetry
结合起来。
35. State Machine 与 Distributed Tracing
一个 Agent Task 可能执行:
API
↓
Orchestrator
↓
Planner Agent
↓
Search Tool
↓
Database
↓
LLM
↓
Reviewer Agent
可以建立:
Trace
├── State Transition
├── LLM Call
├── Tool Call
├── DB Query
└── Agent Communication
例如:
Trace: task-1001
SPAN: STATE PLANNING
SPAN: LLM CALL
SPAN: STATE EXECUTING
SPAN: TOOL search
SPAN: STATE RETRYING
SPAN: TOOL search
SPAN: STATE COMPLETED
这对于 Debug Agent 非常重要。
36. State Machine 的可测试性
这是传统 LLM Agent 很难做到,而 State Machine 非常擅长的地方。
可以测试:
IDLE
+ USER_REQUEST
= PLANNING
PLANNING
+ PLAN_CREATED
= EXECUTING
EXECUTING
+ TOOL_FAILURE
= RETRYING
RETRYING
+ RETRY_EXHAUSTED
= FAILED
更进一步可以做:
State Transition Coverage
测试所有:
State × Event
组合。
例如:
Event
A B C D
State A ✓ ✓ X X
State B X ✓ ✓ X
State C X X ✓ ✓
这比单纯测试 LLM 输出可靠得多。
37. Property-based Testing
State Machine 还非常适合 Property-based Testing。
例如定义:
Property 1
COMPLETED
不能再进入:
EXECUTING
Property 2
FAILED
不能调用支付 Tool。
Property 3
WAITING_HUMAN
不能自动执行高风险 Action。
Property 4
retryCount <= maxRetry
通过随机生成 Event Sequence:
A → B → C → A → D → ...
检查:
State Machine 是否始终满足约束。
这是一种非常强的工程能力。
38. LLM + State Machine 的最佳分工
可以总结成一个表:
| 能力 | LLM | State Machine |
|---|---|---|
| 自然语言理解 | ✓ | |
| 推理 | ✓ | |
| 任务规划 | ✓ | |
| Tool 选择建议 | ✓ | |
| 状态约束 | ✓ | |
| Transition 验证 | ✓ | |
| 权限边界 | ✓ | |
| Retry | ✓ | |
| Timeout | ✓ | |
| Recovery | ✓ | |
| 审计 | ✓ | |
| Deterministic Execution | ✓ | |
| Context Generation | ✓ | |
| Workflow Control | ✓ |
因此一个优秀的 Agent Runtime 应该遵循:
Probabilistic Intelligence
+
Deterministic Control
39. State Machine 不是 Agent 的“大脑”
这是理解 AI Agent Architecture 的关键。
可以把 Agent 类比成人:
LLM
= Reasoning
Memory
= Knowledge
Tools
= Hands
State Machine
= Nervous System / Control System
Policy Engine
= Rules
Event Bus
= Communication
Observability
= Monitoring
LLM 很聪明。
但:
聪明不等于可靠。
生产系统需要的是:
Intelligence
+
Control
+
Safety
+
Persistence
+
Recovery
+
Observability
State Machine 正是其中的 Control Layer。
40. 从 FSM 到 Agent Runtime 的演进路线
可以把整个技术演进理解成:
FSM
│
▼
State Pattern
│
▼
State Machine
│
▼
Hierarchical State Machine
│
▼
Statechart
│
▼
Workflow Engine
│
▼
Event-driven Workflow
│
▼
Agent Runtime
│
▼
Multi-Agent Runtime
而 AI Agent 并没有抛弃传统状态机。
相反:
AI Agent 把 State Machine 从传统业务流程控制带到了概率计算和自主决策系统。
41. 一个值得采用的 Agent State Machine 模型
如果设计一个生产级 Agent,我比较推荐:
┌──────────────┐
│ IDLE │
└──────┬───────┘
│
▼
┌──────────────┐
│ PLANNING │
└──────┬───────┘
│
▼
┌──────────────┐
│ VALIDATE │
└──────┬───────┘
│
┌──────┴──────┐
│ │
▼ ▼
APPROVED REJECTED
│ │
▼ ▼
EXECUTING FAILED
│
┌─────────┼─────────┐
│ │ │
▼ ▼ ▼
TOOL_CALL HUMAN MEMORY
│
▼
OBSERVE
│
▼
┌───┴────┐
│ │
SUCCESS FAILURE
│ │
▼ ▼
NEXT RETRY
│ │
└────┬───┘
▼
COMPLETED
这个模型已经可以支撑很多企业级 Agent 场景。
42. 最重要的架构原则
如果只记住本文几个核心原则,我建议记住下面十条。
原则 1:State 和 Context 分离
State ≠ Data
原则 2:LLM 不应该直接控制系统状态
应该:
LLM
↓
Intent / Event
↓
State Machine
原则 3:非法 Transition 必须拒绝
Unknown Event
↓
Reject
而不是:
Best Effort
原则 4:状态变化必须持久化
State + Version + Context
原则 5:Event 应该是一等公民
User Event
Tool Event
Timer Event
Agent Event
System Event
统一进入 State Machine。
原则 6:失败必须建模
不要:
catch(Exception)
然后:
FAILED
应该明确:
TIMEOUT
RETRYING
PARTIAL_FAILURE
COMPENSATING
FAILED
原则 7:副作用必须考虑幂等
Agent 可能重复执行:
createOrder()
因此必须考虑:
Idempotency Key
原则 8:状态变化必须可观测
至少记录:
from
event
to
reason
duration
traceId
原则 9:复杂 Agent 使用 Hierarchical State Machine
避免:
100+ flat states
原则 10:State Machine 是 Deterministic Layer
最理想的架构不是:
LLM Everything
而是:
LLM
│
Intelligence
│
▼
State Machine
│
Deterministic Control
│
┌──────────┼──────────┐
▼ ▼ ▼
Tools Memory Human
43. 最终思考:State Machine 是 Agent Engineering 的“骨架”
AI Agent 的核心竞争力并不只是:
Prompt
+
LLM
真正进入生产环境后,你需要面对:
Lifecycle
State
Event
Transition
Persistence
Concurrency
Retry
Timeout
Recovery
Compensation
Security
Observability
Audit
Human-in-the-loop
Multi-Agent
而这些问题最终都会汇聚到一个核心问题:
Agent 当前处于什么状态?发生了什么事件?下一步允许做什么?
这正是 State Machine 所解决的问题。
因此可以把现代 Agent 架构概括成:
┌─────────────────┐
│ LLM │
│ Intelligence │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Decision Layer │
└────────┬────────┘
│
▼
┌─────────────────┐
│ State Machine │
│ Control Layer │
└────────┬────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Tool Layer Memory Layer Human Layer
│ │ │
└─────────────┼─────────────┘
▼
┌─────────────────┐
│ Event / Message │
│ Bus │
└────────┬────────┘
▼
┌─────────────────┐
│ Persistence & │
│ Observability │
└─────────────────┘
最终可以得到一个非常重要的结论:
LLM 让 Agent 具备了“思考能力”,而 State Machine 让 Agent 具备了“可控的行为边界”。
如果说传统软件工程追求:
Deterministic Software
那么 Agent Engineering 真正需要解决的问题是:
如何让 Probabilistic Intelligence 运行在 Deterministic Control 之上。
而 State Machine,正是连接这两个世界的重要架构抽象。
44. 进一步的技术方向
如果继续深入 State Machine + AI Agent,可以进一步研究以下几个方向:
State Machine
│
├── Hierarchical State Machine
│
├── Statechart
│
├── Event Sourcing
│
├── Saga / Compensation
│
├── Workflow Engine
│
├── Durable Execution
│
├── Agent Runtime
│
├── Multi-Agent Orchestration
│
├── Policy / Guard Engine
│
└── Formal Verification
其中一个非常值得深入研究的方向是:
LLM
↓
Agent Decision
↓
State Machine
↓
Policy / Guard
↓
Tool
↓
Event
↓
State Transition
↓
Durable Execution
这已经逐渐接近下一代:
Production-grade Agent Runtime Architecture
而不是简单的:
LLM + Prompt + Tool Calling
总结
State Machine 表面上是一种经典的软件设计技术,但它在 AI Agent 时代获得了新的生命力。
它解决的不是“如何让 LLM 更聪明”,而是更加工程化的问题:
Agent 到底在哪里?
为什么到了这里?
接下来允许做什么?
什么时候应该停止?
失败后怎么办?
重启之后怎么恢复?
多个 Agent 如何协调?
如何证明 Agent 没有越权?
如何审计 Agent 的行为?
这些问题决定了一个 Agent 是:
Demo
还是:
Production System
因此,对于准备深入 AI Agent Architecture / Agent Runtime / Multi-Agent System 的工程师而言,State Machine 不应该被看成传统技术栈中的一个普通设计模式,而应该被看成:
构建可靠 Agent Runtime 的核心控制抽象之一。