按需加载的领域知识
「Don't put everything in the system prompt. Load on demand.」
"全塞 system prompt" 的坑
你有 20 个 skill,每个写得挺详细:pdf-processing(怎么读 PDF)、code-review(review 的 checklist)、git-workflow(常用 git 套路)…… 直觉做法:全部拼进 system prompt,让模型随时查阅。
结果:
- 每次调用都烧掉 15-30K 输入 token(即使问题根本用不上任何 skill)。
- 模型注意力被稀释——长 system prompt 里提及的规则,服从度会下降。
- 改一个 skill,所有历史对话的缓存全作废。
s05 的做法是把它拆成两层。
两层架构
Layer 1 · 便宜:system prompt 里只放 skill 的名字和一句话描述(每个约 100 token)。20 个 skill = 2K token,可接受。
# 系统提示里的 skill 清单
Skills available:
- pdf: Process PDF files. Extract text, tables, metadata.
- code-review: Systematic code review checklist.
- git-workflow: Common git branching and rebase patterns.
Layer 2 · 按需:模型要用某个 skill 时,调 load_skill(name="pdf"),完整 skill body(可能 5-10K token)通过 tool_result 塞进上下文。没用到的 skill 一个 token 都不加载。
# tool_result 里返回完整 skill
<skill name="pdf">
Step 1: Use pdfplumber for extraction...
Step 2: Handle OCR fallback when needed...
Step 3: Structure output as Markdown table...
</skill>
对比 token 成本
真实场景测一下。假设你有 20 个 skill,每个 body 平均 3000 token。用户问一个问题(比如「改一下登录接口的 bug」)——这个问题大概用不上任何 skill。
SKILL.md 的格式
skill 文件用 YAML frontmatter + 正文:
--- name: pdf description: Process PDF files. Extract text, tables, metadata. tags: document,parsing --- Step 1: Use pdfplumber for extraction. Handle multi-column layouts... Step 2: For scanned PDFs, fall back to OCR via tesseract...
frontmatter 给 Layer 1 用(name/description/tags),正文给 Layer 2 用。这种写法灵感来自静态博客(Jekyll、Hugo),熟悉的人一看就懂。