# S07 Skill Loading 代码讲解 这一节只讲相对 S06 新增的内容: **技能不是一次性全塞进上下文,而是先放目录,真正需要时再加载完整内容。** --- ## 1. 本节新增内容 - `SKILLS_DIR`:技能目录。 - `_parse_frontmatter()`:解析 `SKILL.md` 顶部元数据。 - `SKILL_REGISTRY`:技能注册表。 - `_scan_skills()`:启动时扫描所有技能。 - `list_skills()`:列出技能名称和一句话描述。 - `build_system()`:把技能目录放进 System Prompt。 - `load_skill(name)`:按需读取完整 `SKILL.md`。 --- ## 2. 技能文件结构 每个技能目录大概长这样: ```text skills/ code-review/ SKILL.md pdf/ SKILL.md ``` `SKILL.md` 里通常有 frontmatter: ```markdown --- name: code-review description: 代码审查技能 --- 这里是完整技能说明…… ``` --- ## 3. `SKILL_REGISTRY` `SKILL_REGISTRY` 是一个字典: ```python SKILL_REGISTRY: dict[str, dict] ``` 结构大概是: ```python { "code-review": { "name": "code-review", "description": "代码审查技能", "content": "完整 SKILL.md 内容" } } ``` --- ## 4. 两级加载 第一级:System Prompt 里只放技能目录。 ```python 可用技能: - code-review: 代码审查技能 - pdf: PDF 处理技能 ``` 这样很省上下文。 第二级:模型需要某个技能时,调用: ```python load_skill("code-review") ``` 程序再把完整 `SKILL.md` 内容作为 `tool_result` 返回给模型。 --- ## 5. `load_skill(name)` 源码逻辑: ```python skill = SKILL_REGISTRY.get(name) if not skill: return f"未找到技能:{name}" return skill["content"] ``` 它没有直接拼路径读取文件,而是从注册表里查。 这样可以避免模型传入奇怪路径,比如: ```text ../../secret.txt ``` --- ## 6. 本节课堂重点 Skill Loading 解决的是上下文成本问题。 不要把所有知识都塞进 System Prompt。 更好的结构是: ```python System Prompt 放目录 真正需要时再 load_skill ``` 这就是“按需知识注入”。