Skip to content

Day 6 — Skills 设计文档

设计目标:用 Markdown 文件定义可复用的 Agent 行为模式(技能),支持关键词触发匹配和动态激活,将 system_prompt 注入与工具需求声明解耦。


一、核心接口设计

1.1 Skill 数据结构

字段类型说明
namestr技能唯一标识
descriptionstr技能描述
triggersList[str]触发关键词列表
required_toolsList[str]依赖的工具名列表
system_promptstr注入的提示词(Markdown 正文)

1.2 SkillLoader

方法签名说明
load_fileload_file(path: str) -> Skill从单个 Markdown 文件加载技能
load_directoryload_directory(dir: str) -> List[Skill]从目录批量加载所有 .md 文件

1.3 SkillManager

方法签名说明
registerregister(skill: Skill)注册技能
matchmatch(text: str) -> Optional[Skill]匹配文本中的触发词
activateactivate(name: str)激活指定技能
deactivatedeactivate(name: str)取消激活
get_active_promptsget_active_prompts() -> List[str]获取所有激活技能的提示词
get_required_toolsget_required_tools() -> List[str]获取所有激活技能需要的工具名

二、关键流程图

技能加载流程

技能匹配与激活流程


三、设计决策与权衡

决策 1:Markdown + Front Matter 格式

方案优点缺点
Markdown + Front Matter(选择)正文即提示词,所见即所得;非技术人员也能编辑不适合复杂逻辑定义
Python 类定义灵活,可以内嵌逻辑改提示词要改代码
JSON/YAML 文件结构清晰长文本提示词编写体验差
数据库存储适合大量技能、动态管理需要管理后台、额外基础设施

选择理由:技能的核心价值是 system_prompt(长文本),Markdown 是编写长文本最友好的格式。Front Matter 补充结构化元信息,两者结合完美。

决策 2:关键词匹配 vs 语义匹配

方案优点缺点
关键词包含匹配(选择)简单直观,零延迟不够智能("请转化成英文"匹配不到"翻译")
LLM 语义匹配最智能,理解同义词每次匹配都要调 LLM,成本高
向量相似度比关键词智能,比 LLM 便宜需要向量模型和索引

选择理由:教学阶段用关键词匹配足够理解概念。理解了机制后,替换为语义匹配只需改 match() 方法内部实现。

决策 3:支持多技能同时激活

方案优点缺点
多技能激活(选择)灵活,可以叠加能力("翻译 + 正式语气")多个 prompt 可能冲突
单技能激活简单,不会冲突无法组合能力

权衡:多技能激活更灵活,但需要注意 prompt 拼接顺序和冲突处理。当前实现按注册顺序拼接。

决策 4:技能提示词是"叠加"而非"替换"

技能的 system_prompt 追加到基础 system_prompt 后面,而不是替换:

最终 system_prompt = 基础人设 + "\n\n" + 技能1提示词 + "\n\n" + 技能2提示词

理由:基础人设(如安全规则、回复格式)应该始终生效,技能只是额外增强。


四、与前序章节的集成点

  • 依赖 Day 5required_tools 引用 ToolRegistry 中的工具名
  • 被 Day 4 依赖get_active_prompts() 的结果注入到 AgentRuntime 的消息构建中
  • 被 Day 7 依赖:SystemPromptBuilder 将 Skill prompts 作为组装层之一

五、与真实生产系统的对比

维度miniOpenClaw生产级实现
技能定义本地 Markdown 文件数据库 + 管理后台
匹配方式关键词包含LLM 意图识别 + 向量召回
版本管理文件级(Git)技能版本控制 + A/B 测试
冲突处理无(按顺序拼接)优先级排序 + 冲突检测
权限按用户/团队分配可用技能
动态更新重启加载热更新(不重启生效)