第16章 Agent 的生命周期 —— 从 Prompt 到执行完成

上一篇我们深入了 Skills 的按需加载机制。本章我们看 Agent 的完整生命周期——从用户 prompt 到任务完成。

Agent 生命周期是什么

一句话定义:Agent 从启动到完成的完整流程——初始化→循环→完成→清理。

Agent Lifecycle = prompt → Loop → completion → cleanup 定位:理解 Agent 从开始到结束的完整过程

图表 代码
graph LR
    Init[初始化
prompt → messages] --> Loop[Agent Loop
持续循环] Loop --> Complete[完成
end_turn → 返回结果] Complete --> Cleanup[清理
保存状态 → 结束]
graph LR
    Init[初始化
prompt → messages] --> Loop[Agent Loop
持续循环] Loop --> Complete[完成
end_turn → 返回结果] Complete --> Cleanup[清理
保存状态 → 结束]
graph LR
    Init[初始化
prompt → messages] --> Loop[Agent Loop
持续循环] Loop --> Complete[完成
end_turn → 返回结果] Complete --> Cleanup[清理
保存状态 → 结束]
graph LR
    Init[初始化<br/>prompt → messages] --> Loop[Agent Loop<br/>持续循环]
    Loop --> Complete[完成<br/>end_turn → 返回结果]
    Complete --> Cleanup[清理<br/>保存状态 → 结束]

核心阶段:

  • 初始化:接收用户 prompt,构建 messages 数组
  • Agent Loop:持续循环,执行任务
  • 完成:Model 返回 end_turn,返回最终结果
  • 清理:保存状态、释放资源、结束会话

Agent 生命周期完整流程

流程详解

图表 代码
flowchart TB
    subgraph Init["初始化阶段"]
        I1[接收用户 prompt]
        I2[构建 messages 数组
System + User] I3[注入 System Prompt
工具定义 + 约束] I4[注入 CLAUDE.md
项目约定] end subgraph Loop["Agent Loop 阶段"] L1[observe
接收 messages] L2[think
Model 推理] L3{stop_reason?} L4[tool_use
调用工具] L5[act
执行工具] L6[feedback
追加结果] L7[end_turn
结束对话] L1 --> L2 --> L3 L3 -->|tool_use| L4 --> L5 --> L6 --> L1 L3 -->|end_turn| L7 end subgraph Complete["完成阶段"] C1[Model 返回最终响应] C2[构建结果
文本 + 执行记录] C3[返回用户] end subgraph Cleanup["清理阶段"] U1[保存状态
任务系统持久化] U2[释放资源
关闭 MCP 连接] U3[记录日志
执行记录] U4[结束会话] end Init --> Loop --> Complete --> Cleanup
flowchart TB
    subgraph Init["初始化阶段"]
        I1[接收用户 prompt]
        I2[构建 messages 数组
System + User] I3[注入 System Prompt
工具定义 + 约束] I4[注入 CLAUDE.md
项目约定] end subgraph Loop["Agent Loop 阶段"] L1[observe
接收 messages] L2[think
Model 推理] L3{stop_reason?} L4[tool_use
调用工具] L5[act
执行工具] L6[feedback
追加结果] L7[end_turn
结束对话] L1 --> L2 --> L3 L3 -->|tool_use| L4 --> L5 --> L6 --> L1 L3 -->|end_turn| L7 end subgraph Complete["完成阶段"] C1[Model 返回最终响应] C2[构建结果
文本 + 执行记录] C3[返回用户] end subgraph Cleanup["清理阶段"] U1[保存状态
任务系统持久化] U2[释放资源
关闭 MCP 连接] U3[记录日志
执行记录] U4[结束会话] end Init --> Loop --> Complete --> Cleanup
flowchart TB
    subgraph Init["初始化阶段"]
        I1[接收用户 prompt]
        I2[构建 messages 数组
System + User] I3[注入 System Prompt
工具定义 + 约束] I4[注入 CLAUDE.md
项目约定] end subgraph Loop["Agent Loop 阶段"] L1[observe
接收 messages] L2[think
Model 推理] L3{stop_reason?} L4[tool_use
调用工具] L5[act
执行工具] L6[feedback
追加结果] L7[end_turn
结束对话] L1 --> L2 --> L3 L3 -->|tool_use| L4 --> L5 --> L6 --> L1 L3 -->|end_turn| L7 end subgraph Complete["完成阶段"] C1[Model 返回最终响应] C2[构建结果
文本 + 执行记录] C3[返回用户] end subgraph Cleanup["清理阶段"] U1[保存状态
任务系统持久化] U2[释放资源
关闭 MCP 连接] U3[记录日志
执行记录] U4[结束会话] end Init --> Loop --> Complete --> Cleanup
flowchart TB
    subgraph Init["初始化阶段"]
        I1[接收用户 prompt]
        I2[构建 messages 数组<br/>System + User]
        I3[注入 System Prompt<br/>工具定义 + 约束]
        I4[注入 CLAUDE.md<br/>项目约定]
    end
    
    subgraph Loop["Agent Loop 阶段"]
        L1[observe<br/>接收 messages]
        L2[think<br/>Model 推理]
        L3{stop_reason?}
        L4[tool_use<br/>调用工具]
        L5[act<br/>执行工具]
        L6[feedback<br/>追加结果]
        L7[end_turn<br/>结束对话]
        
        L1 --> L2 --> L3
        L3 -->|tool_use| L4 --> L5 --> L6 --> L1
        L3 -->|end_turn| L7
    end
    
    subgraph Complete["完成阶段"]
        C1[Model 返回最终响应]
        C2[构建结果<br/>文本 + 执行记录]
        C3[返回用户]
    end
    
    subgraph Cleanup["清理阶段"]
        U1[保存状态<br/>任务系统持久化]
        U2[释放资源<br/>关闭 MCP 连接]
        U3[记录日志<br/>执行记录]
        U4[结束会话]
    end
    
    Init --> Loop --> Complete --> Cleanup

初始化阶段

初始化步骤

步骤动作内容
1接收用户 prompt用户输入的任务描述
2构建 messages 数组[{"role": "user", "content": prompt}]
3注入 System Prompt工具定义 + 约束规则 + 格式要求
4注入 CLAUDE.md项目约定 + 架构 + 注意事项
图表 代码
graph LR
    Prompt[用户 prompt] --> Build[构建 messages]
    Build --> InjectSystem[注入 System Prompt]
    InjectSystem --> InjectCLAUDE[注入 CLAUDE.md]
    InjectCLAUDE --> Ready[初始化完成
准备进入 Loop]
graph LR
    Prompt[用户 prompt] --> Build[构建 messages]
    Build --> InjectSystem[注入 System Prompt]
    InjectSystem --> InjectCLAUDE[注入 CLAUDE.md]
    InjectCLAUDE --> Ready[初始化完成
准备进入 Loop]
graph LR
    Prompt[用户 prompt] --> Build[构建 messages]
    Build --> InjectSystem[注入 System Prompt]
    InjectSystem --> InjectCLAUDE[注入 CLAUDE.md]
    InjectCLAUDE --> Ready[初始化完成
准备进入 Loop]
graph LR
    Prompt[用户 prompt] --> Build[构建 messages]
    Build --> InjectSystem[注入 System Prompt]
    InjectSystem --> InjectCLAUDE[注入 CLAUDE.md]
    InjectCLAUDE --> Ready[初始化完成<br/>准备进入 Loop]

初始化实现

# 初始化阶段实现
def initialize_agent(user_prompt, system_prompt, claude_md):
    # 构建初始 messages 数组
    messages = [
        {"role": "system", "content": system_prompt + claude_md},
        {"role": "user", "content": user_prompt}
    ]
    
    # 初始化任务系统
    tasks = []
    
    # 初始化状态
    state = {
        "messages": messages,
        "tasks": tasks,
        "tool_calls": 0,
        "loops": 0
    }
    
    return state

System Prompt 组成

组成部分内容Token 数量
工具定义 Schema所有工具的参数定义2000-5000 tokens
约束规则安全约束、格式要求500-1000 tokens
Skills 列表可用 Skills 目录200-500 tokens
格式要求输出格式、响应格式200-500 tokens

Agent Loop 阶段

Loop 循环详解

每次循环包含:

图表 代码
graph LR
    Observe[observe
接收 messages] --> Think[think
Model 推理] Think --> Decide{决策} Decide -->|tool_use| Act[act
执行工具] Act --> Feedback[feedback
追加结果] Feedback --> Observe Decide -->|end_turn| End[end_turn
结束对话]
graph LR
    Observe[observe
接收 messages] --> Think[think
Model 推理] Think --> Decide{决策} Decide -->|tool_use| Act[act
执行工具] Act --> Feedback[feedback
追加结果] Feedback --> Observe Decide -->|end_turn| End[end_turn
结束对话]
graph LR
    Observe[observe
接收 messages] --> Think[think
Model 推理] Think --> Decide{决策} Decide -->|tool_use| Act[act
执行工具] Act --> Feedback[feedback
追加结果] Feedback --> Observe Decide -->|end_turn| End[end_turn
结束对话]
graph LR
    Observe[observe<br/>接收 messages] --> Think[think<br/>Model 推理]
    Think --> Decide{决策}
    Decide -->|tool_use| Act[act<br/>执行工具]
    Act --> Feedback[feedback<br/>追加结果]
    Feedback --> Observe
    
    Decide -->|end_turn| End[end_turn<br/>结束对话]
循环步骤动作说明
observe接收 messages 数组包含历史 + 工具输出
thinkModel 推理根据上下文推理下一步
decideModel 决策返回 stop_reason(tool_use/end_turn)
act执行工具根据 tool_use 执行具体工具
feedback追加结果工具输出追加到 messages

Loop 计数

问题:一个任务需要多少次循环?

任务复杂度循环次数工具调用次数总 Token
简单任务2-5 次1-3 次5K-10K
中等任务5-10 次3-8 次10K-20K
复杂任务10-20 次8-15 次20K-50K
大型任务20-50 次15-40 次50K-100K
图表 代码
graph TB
    subgraph LoopCount["循环次数分布"]
        L1[简单任务
2-5 次
单文件操作] L2[中等任务
5-10 次
多文件修改] L3[复杂任务
10-20 次
模块重构] L4[大型任务
20-50 次
完整项目] end
graph TB
    subgraph LoopCount["循环次数分布"]
        L1[简单任务
2-5 次
单文件操作] L2[中等任务
5-10 次
多文件修改] L3[复杂任务
10-20 次
模块重构] L4[大型任务
20-50 次
完整项目] end
graph TB
    subgraph LoopCount["循环次数分布"]
        L1[简单任务
2-5 次
单文件操作] L2[中等任务
5-10 次
多文件修改] L3[复杂任务
10-20 次
模块重构] L4[大型任务
20-50 次
完整项目] end
graph TB
    subgraph LoopCount["循环次数分布"]
        L1[简单任务<br/>2-5 次<br/>单文件操作]
        L2[中等任务<br/>5-10 次<br/>多文件修改]
        L3[复杂任务<br/>10-20 次<br/>模块重构]
        L4[大型任务<br/>20-50 次<br/>完整项目]
    end

Loop 内的扩展机制

管理层插入 Loop:

图表 代码
graph LR
    LoopStart[Loop 开始] --> PermCheck[权限检查
deny/ask/allow] PermCheck --> PreHook[PreToolUse Hook
参数验证] PreHook --> ToolExec[工具执行] ToolExec --> PostHook[PostToolUse Hook
结果处理] PostHook --> CompressCheck[上下文检查
触发压缩?] CompressCheck --> LoopEnd[Loop 结束]
graph LR
    LoopStart[Loop 开始] --> PermCheck[权限检查
deny/ask/allow] PermCheck --> PreHook[PreToolUse Hook
参数验证] PreHook --> ToolExec[工具执行] ToolExec --> PostHook[PostToolUse Hook
结果处理] PostHook --> CompressCheck[上下文检查
触发压缩?] CompressCheck --> LoopEnd[Loop 结束]
graph LR
    LoopStart[Loop 开始] --> PermCheck[权限检查
deny/ask/allow] PermCheck --> PreHook[PreToolUse Hook
参数验证] PreHook --> ToolExec[工具执行] ToolExec --> PostHook[PostToolUse Hook
结果处理] PostHook --> CompressCheck[上下文检查
触发压缩?] CompressCheck --> LoopEnd[Loop 结束]
graph LR
    LoopStart[Loop 开始] --> PermCheck[权限检查<br/>deny/ask/allow]
    PermCheck --> PreHook[PreToolUse Hook<br/>参数验证]
    PreHook --> ToolExec[工具执行]
    ToolExec --> PostHook[PostToolUse Hook<br/>结果处理]
    PostHook --> CompressCheck[上下文检查<br/>触发压缩?]
    CompressCheck --> LoopEnd[Loop 结束]

插入顺序:

  1. 权限检查(deny/ask/allow)
  2. PreToolUse Hook(参数验证)
  3. 工具执行(调用具体工具)
  4. PostToolUse Hook(结果处理)
  5. 上下文检查(是否触发压缩)

完成阶段

end_turn 处理

触发条件:Model 返回 stop_reason == “end_turn”。

处理步骤:

图表 代码
graph LR
    EndTurn[end_turn] --> BuildResult[构建结果
文本 + 执行记录] BuildResult --> Format[格式化输出] Format --> Return[返回用户]
graph LR
    EndTurn[end_turn] --> BuildResult[构建结果
文本 + 执行记录] BuildResult --> Format[格式化输出] Format --> Return[返回用户]
graph LR
    EndTurn[end_turn] --> BuildResult[构建结果
文本 + 执行记录] BuildResult --> Format[格式化输出] Format --> Return[返回用户]
graph LR
    EndTurn[end_turn] --> BuildResult[构建结果<br/>文本 + 执行记录]
    BuildResult --> Format[格式化输出]
    Format --> Return[返回用户]
步骤动作说明
1Model 返回 end_turn任务完成信号
2构建结果最终响应 + 执行记录
3格式化输出优化可读性
4返回用户显示结果

执行记录

记录内容:

记录维度内容用途
工具调用次数调用了哪些工具性能分析
循环次数总循环次数效率评估
Token 消耗输入/输出 Token成本分析
权限决策deny/ask/allow 记录安全审计
错误记录工具执行错误问题排查
// 执行记录示例
{
  "execution_record": {
    "loops": 10,
    "tool_calls": 8,
    "input_tokens": 15000,
    "output_tokens": 3000,
    "permissions": {
      "allow": 5,
      "ask": 3,
      "deny": 0
    },
    "errors": [],
    "duration": "45 seconds"
  }
}

清理阶段

清理步骤

步骤动作说明
1保存状态任务系统持久化
2释放资源关闭 MCP 连接、清理临时文件
3记录日志执行记录写入日志
4结束会话会话结束
图表 代码
graph LR
    Complete[完成阶段] --> SaveState[保存状态
任务持久化] SaveState --> ReleaseResource[释放资源
关闭 MCP] ReleaseResource --> LogRecord[记录日志
执行记录] LogRecord --> EndSession[结束会话]
graph LR
    Complete[完成阶段] --> SaveState[保存状态
任务持久化] SaveState --> ReleaseResource[释放资源
关闭 MCP] ReleaseResource --> LogRecord[记录日志
执行记录] LogRecord --> EndSession[结束会话]
graph LR
    Complete[完成阶段] --> SaveState[保存状态
任务持久化] SaveState --> ReleaseResource[释放资源
关闭 MCP] ReleaseResource --> LogRecord[记录日志
执行记录] LogRecord --> EndSession[结束会话]
graph LR
    Complete[完成阶段] --> SaveState[保存状态<br/>任务持久化]
    SaveState --> ReleaseResource[释放资源<br/>关闭 MCP]
    ReleaseResource --> LogRecord[记录日志<br/>执行记录]
    LogRecord --> EndSession[结束会话]

状态保存

保存内容:

内容说明存储位置
任务列表未完成任务任务系统
messages 数组对话历史会话存储
执行记录工具调用记录日志系统
# 状态保存实现
def save_state(state):
    # 保存任务列表
    save_tasks(state["tasks"])
    
    # 保存 messages(可选)
    if need_save_session:
        save_session(state["messages"])
    
    # 记录执行日志
    log_execution(state["execution_record"])

资源释放

释放内容:

资源说明释放动作
MCP 连接MCP 服务器连接关闭连接
临时文件工具执行产生的临时文件删除文件
后台任务后台执行的任务终止或保存
# 资源释放实现
def release_resources():
    # 关闭 MCP 连接
    for mcp_client in mcp_clients:
        mcp_client.close()
    
    # 清理临时文件
    cleanup_temp_files()
    
    # 处理后台任务
    handle_background_tasks()

Agent 生命周期的状态管理

状态流转

图表 代码
stateDiagram-v2
    [*] --> Initializing: 接收 prompt
    Initializing --> Looping: 初始化完成
    Looping --> ToolCalling: tool_use
    ToolCalling --> Looping: 工具执行完成
    Looping --> Completing: end_turn
    Completing --> Cleanuping: 返回结果
    Cleanuping --> [*]: 会话结束
    
    Looping --> ErrorHandling: 错误发生
    ErrorHandling --> Looping: 重试成功
    ErrorHandling --> Completing: 重试失败
stateDiagram-v2
    [*] --> Initializing: 接收 prompt
    Initializing --> Looping: 初始化完成
    Looping --> ToolCalling: tool_use
    ToolCalling --> Looping: 工具执行完成
    Looping --> Completing: end_turn
    Completing --> Cleanuping: 返回结果
    Cleanuping --> [*]: 会话结束
    
    Looping --> ErrorHandling: 错误发生
    ErrorHandling --> Looping: 重试成功
    ErrorHandling --> Completing: 重试失败
stateDiagram-v2
    [*] --> Initializing: 接收 prompt
    Initializing --> Looping: 初始化完成
    Looping --> ToolCalling: tool_use
    ToolCalling --> Looping: 工具执行完成
    Looping --> Completing: end_turn
    Completing --> Cleanuping: 返回结果
    Cleanuping --> [*]: 会话结束
    
    Looping --> ErrorHandling: 错误发生
    ErrorHandling --> Looping: 重试成功
    ErrorHandling --> Completing: 重试失败
stateDiagram-v2
    [*] --> Initializing: 接收 prompt
    Initializing --> Looping: 初始化完成
    Looping --> ToolCalling: tool_use
    ToolCalling --> Looping: 工具执行完成
    Looping --> Completing: end_turn
    Completing --> Cleanuping: 返回结果
    Cleanuping --> [*]: 会话结束
    
    Looping --> ErrorHandling: 错误发生
    ErrorHandling --> Looping: 重试成功
    ErrorHandling --> Completing: 重试失败

状态定义

状态说明转换条件
Initializing初始化阶段接收 prompt
LoopingAgent Loop 循环初始化完成
ToolCalling工具调用tool_use
Completing完成阶段end_turn
Cleanuping清理阶段返回结果
ErrorHandling错误处理工具执行错误

Agent 生命周期的异常处理

错误处理流程

图表 代码
graph LR
    Error[错误发生] --> Type{错误类型}
    Type -->|工具错误| ToolRetry[工具重试
最多 3 次] Type -->|上下文溢出| Compress[上下文压缩] Type -->|Model 错误| ModelRetry[Model 重试] Type -->|系统错误| Abort[终止任务] ToolRetry --> Success{成功?} Success -->|是| Continue[继续 Loop] Success -->|否| Abort Compress --> Continue ModelRetry --> Success
graph LR
    Error[错误发生] --> Type{错误类型}
    Type -->|工具错误| ToolRetry[工具重试
最多 3 次] Type -->|上下文溢出| Compress[上下文压缩] Type -->|Model 错误| ModelRetry[Model 重试] Type -->|系统错误| Abort[终止任务] ToolRetry --> Success{成功?} Success -->|是| Continue[继续 Loop] Success -->|否| Abort Compress --> Continue ModelRetry --> Success
graph LR
    Error[错误发生] --> Type{错误类型}
    Type -->|工具错误| ToolRetry[工具重试
最多 3 次] Type -->|上下文溢出| Compress[上下文压缩] Type -->|Model 错误| ModelRetry[Model 重试] Type -->|系统错误| Abort[终止任务] ToolRetry --> Success{成功?} Success -->|是| Continue[继续 Loop] Success -->|否| Abort Compress --> Continue ModelRetry --> Success
graph LR
    Error[错误发生] --> Type{错误类型}
    Type -->|工具错误| ToolRetry[工具重试<br/>最多 3 次]
    Type -->|上下文溢出| Compress[上下文压缩]
    Type -->|Model 错误| ModelRetry[Model 重试]
    Type -->|系统错误| Abort[终止任务]
    
    ToolRetry --> Success{成功?}
    Success -->|是| Continue[继续 Loop]
    Success -->|否| Abort
    
    Compress --> Continue
    ModelRetry --> Success

错误类型

错误类型原因处理方式
工具执行错误工具调用失败重试 3 次
上下文溢出messages 超过窗口压缩上下文
Model API 错误Model 调用失败重试 Model
权限拒绝用户拒绝操作Model 调整策略
系统错误系统异常终止任务

设计格言:

“错误不是终点, 是重试的起点” —— 出错时会重试、腾空间、换路子

Agent 生命周期的性能考量

时间消耗分析

阶段时间消耗占比
初始化0.1-0.5 秒1-5%
Agent Loop10-60 秒90-95%
完成0.1-0.2 秒1-2%
清理0.1-0.5 秒1-3%
图表 代码
graph TB
    subgraph TimeDist["时间消耗分布"]
        T1[初始化
1-5%] T2[Agent Loop
90-95%] T3[完成
1-2%] T4[清理
1-3%] end T2[Agent Loop 占绝大部分]
graph TB
    subgraph TimeDist["时间消耗分布"]
        T1[初始化
1-5%] T2[Agent Loop
90-95%] T3[完成
1-2%] T4[清理
1-3%] end T2[Agent Loop 占绝大部分]
graph TB
    subgraph TimeDist["时间消耗分布"]
        T1[初始化
1-5%] T2[Agent Loop
90-95%] T3[完成
1-2%] T4[清理
1-3%] end T2[Agent Loop 占绝大部分]
graph TB
    subgraph TimeDist["时间消耗分布"]
        T1[初始化<br/>1-5%]
        T2[Agent Loop<br/>90-95%]
        T3[完成<br/>1-2%]
        T4[清理<br/>1-3%]
    end
    
    T2[Agent Loop 占绝大部分]

性能优化点

优化点方法效果
Loop 循环并发工具执行减少 50% 循环时间
上下文压缩提前触发压缩减少 Model 延迟
后台执行慢操作后台执行用户感知延迟降低

本章小结

  • Agent 生命周期定义:prompt → Loop → completion → cleanup
  • 初始化阶段:接收 prompt → 构建 messages → 注入 System Prompt + CLAUDE.md
  • Agent Loop 阶段:observe → think → decide → act → feedback 的持续循环
  • 完成阶段:end_turn → 构建结果 → 格式化 → 返回用户
  • 清理阶段:保存状态 → 释放资源 → 记录日志 → 结束会话
  • 状态流转:Initializing → Looping → ToolCalling → Completing → Cleanuping
  • 错误处理:工具错误重试、上下文溢出压缩、Model 错误重试、系统错误终止
  • 时间消耗:初始化 1-5%、Agent Loop 90-95%、完成 1-2%、清理 1-3%
  • 性能优化:并发执行、提前压缩、后台执行

预告:下一篇我们深入理解"Harness 是 Agent 的操作系统"这个类比。



相关内容

如果这篇文章对你有帮助,欢迎请我喝杯咖啡 ☕
Cygnus Yang 支付宝支付宝
Cygnus Yang 微信微信