【学习笔记】Harness | 意动唤神通,Skills Loading on Demand —— -Claude-Code实战(6/13)
到现在,我们的 Agent 已经能够:
但接下来我们遇到另一个问题:不同任务需要的领域知识不一样。
比如说
如果把这些知识包全部塞进 system prompt,就会导致token浪费,prompt臃肿。
这一节我们要学习的就是:如何按需加载知识。
解决方案就是:【先列目录,再按需加载】
核心逻辑很简单,就是【列目录】+【按需加载】。
1. 把每个 skill 放成一个目录
2. 从 SKILL.md 里读取最小元信息
3. 把 skill 目录放进 system prompt
4. 提供一个 load_skill 工具
5. 让 skill 正文只在需要时加进上下文
我们来看一下 agents/s05_skill_loading.py 中的逻辑。
核心逻辑是:system prompt 中仅包含简短的 skill 元数据,当 Agent 发现需要特定专业知识时,再通过 load_skill 工具按需加载详细内容。
@dataclassclass SkillManifest: name: str # 技能名称 description: str # 技能简短描述 path: Path # 对应文件路径@dataclassclass SkillDocument: manifest: SkillManifest # 元数据 body: str # 技能的具体详细内容
Skill 注册类。从本地文件系统加载所有技能文档,并解析其元数据和正文class SkillRegistry: def _load_all(self) -> None: ... # 遍历目录,将每个 SKILL.md 解析为 SkillDocument def _parse_frontmatter(self, text: str) -> tuple[dict, str]: ... # 解析文档头部的 YAML 元数据 def describe_available(self) -> str: ... # 生成一份给 AI 看的简短技能“菜单” def load_full_text(self, name: str) -> str: ... # 根据名称调取完整的技能指令
系统指令与环境配置。在系统提示词中注入技能菜单,告知模型可以通过 load_skill 获取详细指导# 初始化注册中心并构建系统提示词SKILL_REGISTRY = SkillRegistry(SKILLS_DIR)SYSTEM = f"""... Skills available: {SKILL_REGISTRY.describe_available()}""" # 仅注入菜单
核心工具集定义。提供了文件操作、命令执行以及最重要的“load_skill”工具供模型调用TOOL_HANDLERS = { "bash": ..., "read_file": ..., "write_file": ..., "edit_file": ..., "load_skill": lambda **kw: SKILL_REGISTRY.load_full_text(kw["name"]), # 动态补全上下文的关键}TOOLS = [...] # 定义这些工具的 JSON Schema,让 AI 知道如何调用它们
核心循环。当 Agent 发现自己缺乏某项技能时,会主动调用 load_skilldef agent_loop(messages: list) -> None: while True: response = client.messages.create(...) # AI 根据当前信息做出判断 messages.append(...) if response.stop_reason != "tool_use": return # AI 完成任务或需要回答,退出循环 # 处理工具调用(如 load_skill),并将结果(技能正文)反馈回对话上下文 for block in response.content: if block.type == "tool_use": output = TOOL_HANDLERS[block.name](**block.input) results.append({"type": "tool_result", "tool_use_id": block.id, "content": str(output)}) messages.append({"role": "user", "content": results}) # 技能内容现在进入了对话历史
我们测试一下
进入 learn-claude-code 项目目录并启动示例代码
cd learn-claude-codepython agents/s05_skill_loading.py
简单测试一下,【有哪些可用的skills】
这里可以看到给我们列出了四个skills:
我们让它【加载一下做代码审查的skill】
加载成功了。
我们接着让它【审查一下test_s03.py这个文件】
成功按照要求进行了处理。
这一节课我们学习了什么是Skill,怎么按需加载Skill。
考虑另一个问题,当对话进行几十轮后会出现什么?
很有可能对话太长了,甚至超出上下文长度。
针对这样的问题我们要如何处理呢?
我们将在下一节【s06 - Context Compact】学习:将冗长的对话压缩到要点,以便Agent可以继续工作而不会达到token限制。。