ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek-Agent-Harness-2026终极指南-第11章第54节-上下文工程进阶-Skills机制:SKILL.md与按需加载

DeepSeek-Agent-Harness-2026终极指南-第11章第54节-上下文工程进阶-Skills机制:SKILL.md与按需加载 DeepSeek Agent Harness 2026终极指南 - 第11章第54节 Skills机制SKILL.md与按需加载第53节的系统提示词把所有能力塞在一个提示词里——太长太杂。有些能力写单元测试、代码审查、Git 提交规范不是每次都要但需要时又得有。这节讲Skills 机制借鉴 Claude Code 的 SKILL.md 设计把能力做成技能包按需加载。Agent 平时轻装上阵需要时才调用对应技能。本文导航为什么需要 Skills 机制SKILL.md 格式规范按需加载的触发机制给 DeepPilot 写三个实用技能完整实现skills_loader.py实测技能按需触发小结为什么需要 Skills 机制系统提示词的问题所有能力都常驻导致又长又杂。比如 DeepPilot 可能需要这些能力写单元测试pytest 规范做代码审查review 规范写 Git 提交信息commit 规范写 API 文档文档规范做性能优化优化套路如果全塞进 system prompt提示词会膨胀到几千字每个能力都只有三言两语反而都不精。Skills 机制解决这个问题把每个能力封装成一个 SKILL.md 文件按需加载。用户问帮我写单元测试技能匹配器检测到 test 关键词加载 skills/testing/SKILL.md把技能内容注入上下文Agent 带着测试技能完成测试编写SKILL.md 格式规范借鉴 Claude Code 的设计SKILL.md 用front matter markdown 正文--- name: testing description: 编写单元测试。当用户要求写测试、跑 pytest、验证代码正确性时使用。 --- # 单元测试技能 ## 使用 pytest 框架 - 测试文件命名test_*.py - 测试函数命名test_* - 使用 assert 断言 ## 测试用例设计 - 正常情况输入正常值验证正确输出 - 边界情况输入边界值空、0、最大值 - 异常情况输入非法值验证抛出异常 ## 示例 python def test_add(): assert add(1, 2) 3 assert add(0, 0) 0front matter 里的两个关键字段 - **name**技能唯一标识 - **description**技能描述触发条件当用户要求写测试时使用 ## 按需加载的触发机制 核心问题**怎么判断该加载哪个技能** 方案**关键词匹配**。用 description 里的触发条件做匹配 python # deep_pilot/skills_loader.py —— Skills 按需加载 v0.6 from __future__ import annotations import re from pathlib import Path from deep_pilot.logger import get_logger logger get_logger(__name__) class Skill: 单个技能 def __init__(self, name: str, description: str, content: str, path: Path): self.name name self.description description self.content content self.path path def matches(self, query: str) - bool: 判断技能的 description 是否匹配用户问题 # 提取 description 里的关键词做匹配 # 简化检查 description 里的关键短语是否出现在 query 里 desc_lower self.description.lower() query_lower query.lower() # 提取触发词description 里当...时或使用前的词 triggers [ 测试, pytest, test, 审查, review, 提交, commit, git, 文档, doc, 优化, 性能, ] for trigger in triggers: if trigger in desc_lower and trigger in query_lower: return True return False class SkillLoader: 技能加载器——扫描 skills 目录按需加载 def __init__(self, skills_dir: str | Path skills): self.skills_dir Path(skills_dir) self._skills: dict[str, Skill] {} self._load_all() def _load_all(self) - None: 扫描 skills 目录加载所有 SKILL.md if not self.skills_dir.exists(): logger.warning(f技能目录不存在: {self.skills_dir}) return for skill_dir in self.skills_dir.iterdir(): if not skill_dir.is_dir(): continue skill_md skill_dir / SKILL.md if not skill_md.exists(): continue skill self._parse_skill_md(skill_md) if skill: self._skills[skill.name] skill logger.info(f加载技能: {skill.name}) def _parse_skill_md(self, path: Path) - Skill | None: 解析 SKILL.md 文件 content path.read_text(encodingutf-8) # 解析 front matterYAML 格式的 name/description name description m re.match(r^---\s*\n(.*?)\n---\s*\n(.*)$, content, re.DOTALL) if m: front_matter m.group(1) body m.group(2) # 解析 name 和 description for line in front_matter.split(\n): line line.strip() if line.startswith(name:): name line.split(:, 1)[1].strip() elif line.startswith(description:): description line.split(:, 1)[1].strip() else: # 没有 front matter用文件名当 name name path.parent.name body content if not name: return None return Skill(namename, descriptiondescription, contentbody, pathpath) def find_skill(self, query: str) - Skill | None: 根据用户问题找到匹配的技能 for skill in self._skills.values(): if skill.matches(query): return skill return None def list_skills(self) - list[str]: 列出所有已加载技能名 return list(self._skills.keys())给 DeepPilot 写三个实用技能创建三个技能目录1. skills/testing/SKILL.md单元测试--- name: testing description: 编写单元测试。当用户要求写测试、跑 pytest、验证代码正确性时使用。 --- # 单元测试技能 ## 框架pytest 测试文件命名 test_*.py函数命名 test_*用 assert 断言。 ## 用例设计三要素 - 正常情况正常输入 → 正确输出 - 边界情况空、0、最大值、负值 - 异常情况非法输入 → 抛出异常 ## 示例 python def test_add(): assert add(1, 2) 3 assert add(0, 0) 0 assert add(-1, 1) 0**2. skills/git/SKILL.md**Git 提交规范 markdown --- name: git-commit description: 生成 Git 提交信息。当用户要求提交代码、写 commit message、git 操作时使用。 --- # Git 提交规范 ## 提交信息格式 type(scope): subject type 类型 - feat: 新功能 - fix: 修复 bug - refactor: 重构 - docs: 文档 - test: 测试 ## 示例 - feat(tools): 新增 web_search 联网工具 - fix(agent): 修复多轮对话上下文丢失3. skills/review/SKILL.md代码审查--- name: code-review description: 代码审查。当用户要求 review、审查代码、检查代码质量时使用。 --- # 代码审查技能 ## 审查维度 - 正确性逻辑是否正确边界是否处理 - 可读性命名是否清晰结构是否合理 - 安全性是否有注入、越权、泄露风险 - 性能是否有明显性能问题 ## 审查输出格式 每个问题[严重程度] 位置 - 问题描述 - 建议完整实现skills_loader.py上面已有完整实现。接入 Agent Loop# agent_loop.py 里处理用户 query 前先加载技能fromdeep_pilot.skills_loaderimportSkillLoader skill_loaderSkillLoader(skills)defrun(user_query:str)-str:# 按需加载技能skillskill_loader.find_skill(user_query)skill_contentifskill:logger.info(f触发技能:{skill.name})skill_contentf\n\n## 相关技能{skill.name}\n{skill.content}messages[{role:system,content:SYSTEM_PROMPTskill_content},{role:user,content:user_query},]# ... 后续 Agent Loop 逻辑 ...实测技能按需触发uv run python-c from deep_pilot.skills_loader import SkillLoader loader SkillLoader(skills) print(f已加载技能: {loader.list_skills()}) # 测试不同 query 触发不同技能 queries [ 帮我写单元测试, 帮我生成 git 提交信息, 帮我审查一下这段代码, 随便聊聊天气, ] for q in queries: skill loader.find_skill(q) name skill.name if skill else 无 print(f问题: {q:20s} - 触发技能: {name}) 控制台输出2026-09-13 16:00:01 | INFO | skills_loader | 加载技能: testing 2026-09-13 16:00:01 | INFO | skills_loader | 加载技能: git-commit 2026-09-13 16:00:01 | INFO | skills_loader | 加载技能: code-review 已加载技能: [testing, git-commit, code-review] 问题: 帮我写单元测试 - 触发技能: testing 问题: 帮我生成 git 提交信息 - 触发技能: git-commit 问题: 帮我审查一下这段代码 - 触发技能: code-review 问题: 随便聊聊天气 - 触发技能: 无四个 query 正确触发了对应技能“写单元测试” → testing“生成 git 提交” → git-commit“审查代码” → code-review“聊天气” → 无不需要特殊技能小结Skills 解决提示词太杂把能力封装成技能包按需加载Agent 轻装上阵。SKILL.md 格式front mattername/description markdown 正文name 唯一标识description 含触发条件。按需加载关键词匹配用户问题命中就加载对应技能不命中就不加载。技能即知识每个技能是一个完整的方法论测试规范、提交规范、审查维度。可扩展加新技能只需新建一个目录 SKILL.md不改代码。三个实用技能testing / git-commit / code-review覆盖开发高频场景。DeepPilot v0.6 Skills 机制完成——Agent 有了技能树能力按需加载不再臃肿。下节预告第11章上下文工程进阶收官了。Agent 现在是单兵作战——所有任务都自己扛。但有些大任务单兵效率低。下一节进入第12章子Agent与编排先做 agent-as-tool把整个 Agent 包装成一个工具让父 Agent 能派子 Agent 去干活。这是从单人到团队的关键一跃。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~
返回列表