代码讲解.md 2.1 KB

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. 技能文件结构

每个技能目录大概长这样:

skills/
  code-review/
    SKILL.md
  pdf/
    SKILL.md

SKILL.md 里通常有 frontmatter:

---
name: code-review
description: 代码审查技能
---

这里是完整技能说明……

3. SKILL_REGISTRY

SKILL_REGISTRY 是一个字典:

SKILL_REGISTRY: dict[str, dict]

结构大概是:

{
    "code-review": {
        "name": "code-review",
        "description": "代码审查技能",
        "content": "完整 SKILL.md 内容"
    }
}

4. 两级加载

第一级:System Prompt 里只放技能目录。

可用技能:
- code-review: 代码审查技能
- pdf: PDF 处理技能

这样很省上下文。

第二级:模型需要某个技能时,调用:

load_skill("code-review")

程序再把完整 SKILL.md 内容作为 tool_result 返回给模型。


5. load_skill(name)

源码逻辑:

skill = SKILL_REGISTRY.get(name)
if not skill:
    return f"未找到技能:{name}"
return skill["content"]

它没有直接拼路径读取文件,而是从注册表里查。

这样可以避免模型传入奇怪路径,比如:

../../secret.txt

6. 本节课堂重点

Skill Loading 解决的是上下文成本问题。

不要把所有知识都塞进 System Prompt。

更好的结构是:

System Prompt 放目录
真正需要时再 load_skill

这就是“按需知识注入”。