Skill 的典型生命周期是怎样的?从注册、触发到销毁会经历哪些阶段?
面试官:“一个 Skill 从注册到被 Agent 使用,再到最后销毁,它的典型生命周期是怎样的?”
候选人:
“Skill 的生命周期我把它分成六个核心阶段,就像给 Agent 装配一个可以随时调用的专业能力,从安装、激活到退役,每个阶段都有明确的状态转换。我按时间线逐个说清楚。
阶段一:注册与发现 ——‘能力入库’
Skill 首先要被 Agent 系统感知到。注册方式通常有两种:
-
显式注册:开发者通过配置文件、注解或 SDK 将 Skill 声明到系统中。比如在 Python 里用
@skill(name="book_flight")装饰一个 Skill 类。 -
自动发现:系统扫描指定的 Skill 目录,自动加载符合条件的 Skill 模块。
注册时系统会提取 Skill 的元信息:名称、描述、触发条件、所需参数 schema、依赖的其他 Skill 或 API。这些信息存入 Skill 注册中心,供后续 Agent 做意图匹配和调度。
阶段二:初始化与预热 ——‘整装待发’
Skill 注册后通常不会立即加载全部资源,而是懒加载。当第一次被触发,或者系统预判即将被调用时,进入初始化:
-
加载 Skill 内部依赖的工具、API 客户端、模型等。
-
读取配置,比如连接哪个数据库、调用哪个外部服务。
-
执行自检(health check),确保依赖的外部服务可达。
-
建立与 Agent 上下文总线的连接,准备接收任务。
初始化完成后,Skill 进入 Ready 状态,等待被激活。
阶段三:匹配与触发 ——‘接到任务’
当用户输入一个目标(比如“帮我订明天去上海的机票”),Agent 的规划器会做两件事:
-
意图匹配:将用户意图与 Skill 注册中心的元信息做语义比对,找到最合适的 Skill。
-
参数提取与澄清:从用户输入和对话历史中提取参数,如果缺少关键参数(比如日期不明),Skill 可以通过 Agent 反问用户澄清。
匹配成功后,Agent 会生成一个执行指令,携带提取的参数,正式触发这个 Skill。
阶段四:执行与推理 ——‘干活’
这是 Skill 生命周期中最复杂的阶段。Skill 按照内部定义的执行逻辑,可能进行:
-
工具调用:调用一个或多个 API 或内部函数。
-
多步推理:根据中间结果动态调整下一步行动,比如价格超出预期时选择另外的舱位。
-
子 Skill 编排:调用其他 Skill 完成子任务(比如“支付”Skill)。
-
状态管理:在多个执行步骤间保持上下文,记录已完成的进度。
-
错误恢复:遇到 API 超时时重试、降级,或者在信息不足时暂停并反问用户。
整个执行过程,Agent 主控线程会监控 Skill 的状态(执行中、等待用户确认、已完成),并随时处理中断或取消指令。
阶段五:完成与回馈 ——‘交差’
Skill 执行完毕后,会向 Agent 返回一个结构化结果。通常包含:
-
状态:成功、失败、部分完成、需要用户确认。
-
数据:如订单详情、航班列表。
-
副作用记录:已调用的外部服务、已修改的数据、需要回滚的预备信息。
Agent 收到结果后,把最终答案或下一步选项渲染给用户。同时,如果需要跨 Skill 协作,这个结果也会被写入对话上下文供后续 Skill 读取。
阶段六:休眠与销毁 ——‘退场’
Skill 并不总是常驻内存。典型的回收策略有:
-
惰性休眠:执行完成后不立即销毁,而是保持 Idle 状态一段时间,下次调用可直接复用。
-
超时回收:一段时间未被调用,释放资源(如断开数据库连接),回到未初始化状态。
-
主动销毁:系统升级、内存压力大或 Skill 本身有状态泄漏时,主动终止实例,等待下次调用重新初始化。
-
注销:当 Skill 被从注册中心移除时,销毁所有实例,清空元信息。
生命周期全景图¶
注册(Register)
│
▼
待初始化(Registered)
│ 首次触发 / 系统预热
▼
初始化中(Initializing)
│
▼
就绪(Ready) ←──────────┐
│ 匹配触发 │
▼ │
执行中(Running) │
│ │
├── 等待用户确认 ──────┤ (用户回复后继续)
│ │
▼ │
已完成(Completed) ───────┘ 可再次触发
│
├──→ 超时/主动释放 → 休眠(Idle)→ 超时回收 → 未初始化
│
└──→ 注销 → 已销毁(Destroyed)