第一次接触 Skill 时,可以先把 AI 模型想象成一个知识面很广、理解能力也不错的新同事。它能够回答许多问题,但面对一项具体任务时,未必知道团队希望它按照什么步骤处理,也不知道哪些资料可以读取、哪些操作不能执行。
Skill 就是交给这位新同事的一套可复用任务方法。它会告诉 AI:什么情况下应该使用这套方法,执行时要经过哪些步骤,可以读取哪些资料或调用哪些工具,最终应该得到什么结果,以及整个过程需要遵守哪些边界。
因此,Skill 不是一个新的 AI 模型,也不只是某一句 Prompt。简单的 Skill 可以是一组单轮处理指令,复杂的 Skill 还可以包含多轮状态、工作流、受控工具和后台任务。无论复杂程度如何,它解决的都是同一个问题:让 AI 在遇到某类任务时,不再临场随意发挥,而是按照已经定义好的方法稳定完成。
我们可以用一个具体场景来理解。用户对 Agent 说:
两个工作机会我都很喜欢,不知道应该怎么选。
如果没有 Skill,模型可能直接给出建议,也可能随意罗列优缺点,每次回答的思路都不太一样。有了决策澄清 Skill以后,系统会先判断这句话是否属于选择困难,再按照固定方法了解用户看重的目标、现实约束和不可接受项,帮助比较两个选项的取舍,最后把决定权留给用户。
这套方法可以拆成几个容易理解的部分:
| 组成 | 解决的问题 | 决策澄清示例 |
|---|---|---|
| 触发条件 | 什么时候应该使用 | 用户正在多个选项之间犹豫 |
| 执行步骤 | 应该按照什么方法处理 | 收集目标、约束、选项和取舍 |
| 资源与权限 | 可以读取或调用什么 | 只使用当前对话,不能擅自读取其他数据 |
| 输出与边界 | 最终提供什么、不能做什么 | 帮助澄清选择,但不替用户做决定 |
| 状态与版本 | 如何继续任务和复现结果 | 多轮任务保存进度,运行记录固定版本 |
如果继续使用工作场景来类比,Agent Persona 更像这位同事的性格与表达方式,Memory 是它记住的用户资料,Tool 是它可以使用的工具,而 Skill 则是完成某类任务时遵循的工作方法。后文讨论的 Skill 系统,就是负责管理这些方法如何定义、选择、授权、运行、记录和升级。
理解了 Skill 的基本含义以后,我们再来看 AI 电子伴侣为什么需要一套可扩展 Skill 系统。这里既要说明能力如何定义,也要考虑它怎样选择、运行、授权、记录和升级。我们先把面向完整产品生命周期的架构梳理清楚,确认 Skill 与现有聊天系统的边界,以及控制面和运行面分别承担什么职责。
从这个角度再看第一阶段就非常清晰了。它不是一套孤立的关键词功能,而是整个架构里风险最低、最适合先验证的一层。
通用聊天模型可以回答很多问题,但能回答不等于能够稳定地按照某种方法完成任务。AI 电子伴侣运行一段时间后,会不断遇到重复而又有明确处理方法的场景。用户倾诉时,我们希望它先接住情绪,而不是立即给解决方案;用户纠结时,它应该帮助梳理约束和取舍,而不是随意替用户做决定;用户有目标却无法开始时,它需要把目标拆成真正可以执行的步骤。
到了群聊场景,多个 Agent 还要提供互补观点,不能围着同一句话重复表达。再把时间拉长,复盘、习惯跟进、关系修复、活动策划和创意共创也会逐渐变成稳定需求。
如果把这些方法全部堆进一个越来越长的 System Prompt,每轮请求都会携带大量无关指令,上下文成本会持续增加。不同场景的规则也容易互相干扰,模型很难判断当前究竟应该优先采用哪一种方法。
更麻烦的是,能力无法单独版本化、启用、禁用、评测和回滚。Prompt、工具调用、多步工作流与后台任务混在一起以后,权限边界会变得模糊;每增加一种能力都要继续修改聊天流程,维护成本也会越来越高。
Skill 系统解决的正是这个问题。我们把可复用的领域方法整理成具有明确元数据、触发条件、权限和生命周期的能力单元,只在真正需要时加载和执行。
一个能力适合提炼成 Skill,通常应满足以下条件中的大部分:
边界同样重要。Agent 的名字、性格、语气和故事背景属于角色定义;用户姓名、偏好、经历和关系事实属于记忆系统;当前用户很难过这类一次性判断属于对话理解结果。单个 HTTP 请求或数据库操作只是 Tool 或基础设施能力,它们可能被 Skill 使用,但本身还不是一套完整方法。所有回复都必须遵守的安全要求则属于全局 Policy,其优先级必须高于 Skill。
我们可以用一句话记住这个判断标准:
Skill 是可复用的任务方法,不是人格、事实、瞬时判断或底层接口。
在讨论具体实现前,我们可以先把 Skill 与现有聊天模块的职责重新梳理一下。Skill 不应该吞掉其他模块已经承担的工作:
| 模块 | 负责什么 | 不负责什么 |
|---|---|---|
| Agent Persona | 身份、性格、语气、关系表达方式 | 具体任务的完整方法 |
| Memory | 用户事实、偏好、经历、长期关系信息 | 决定当前采用哪个处理流程 |
| Intent / Emotion | 理解当前消息的目的、情绪和关系信号 | 执行可复用任务流程 |
| Reply Policy | 控制本轮回复长度、温度、直接程度等 | 保存长期 Skill 状态 |
| Skill | 提供完成某类任务的过程、知识和资源 | 覆盖安全规则或改变人格 |
| Tool | 提供受控的外部读写能力 | 自己决定什么时候被调用 |
| Workflow | 编排多个步骤和状态转换 | 定义用户或 Agent 人格 |
| Safety Policy | 全局安全、隐私和权限边界 | 为普通任务选择表达方法 |
现有 LangGraph 仍然负责聊天理解、路由和 Agent 发言选择。Skill 只是图中可以按需接入的能力,不需要把整张聊天图复制到每个 Skill 中。
渐进加载
Skill 内容按三个层级加载:
经过这样的拆分,我们就不用在每轮聊天中塞入所有 Skill 的完整 Prompt 和资料。
定义与运行分离
Skill Definition 描述它是什么,Skill Runtime 决定这一轮能否运行、如何运行,以及运行结果如何记录。
静态定义不能直接获得数据库、网络或后台任务权限。所有执行都必须经过统一的权限策略和运行器。
安全与角色优先
我们可以把指令优先级固定为:
1全局安全与合规2> 用户和资源权限3> Agent 角色边界4> 用户当前明确要求5> 本轮回复策略6> Skill 过程指令7> 表达偏好与格式建议
Skill 只能补充过程,不能覆盖更高层约束。
默认确定性,必要时才使用模型路由
明确命令、场景限制、绑定状态和高置信规则都应该先通过确定性逻辑处理。只有候选 Skill 较多、表达又比较复杂,规则已经无法区分时,才让 LLM 在一个较小的候选集中做语义判定。
LLM 不应该直接从全部 Skill 中自由选择,更不应该通过输出任意名称获得未授权能力。
所有运行都绑定版本
Skill ID 表示稳定身份,Skill Version 表示一次不可变实现。会话和运行记录应保存确切版本,确保问题可以复现、旧会话可以继续、升级可以灰度和回滚。
状态与聊天记录分离
聊天记录描述说了什么,Skill Session 描述任务进行到哪里。例如旅行计划已经收集了日期但还缺预算,这是一种任务状态,不应该依赖重新解析全部聊天历史来恢复。
把前面的职责放在一起看,Skill 系统自然会分成控制面和运行面。
控制面负责管理能力,而不直接生成回复:
运行面在每次聊天或后台任务中工作:

重新梳理下来可以看到,Skill 系统解决的是可复用任务方法的管理和运行问题,它不能替代 Agent Persona、Memory、Intent、Reply Policy、Tool 或 Safety Policy。我们只有先把这些职责边界划分清楚,后面的选择、权限和状态设计才不会互相侵入。
控制面负责目录、版本、绑定、权限和评测,运行面负责候选解析、选择、策略检查、资源加载、执行与记录。有了这张架构图,下一篇再继续定义 Skill 类型、领域实体、Manifest 和选择器,彼此之间的关系就会更加清楚。