Skill Library Evolution

Nikola Balic (@nibzard)· established

问题

Agent常常在不同会话或工作流中处理相似问题。若缺少保存并复用可运行代码的机制,Agent每次都必须重新探索解决方案,这会浪费tokens与时间。企业期望Agent能够随时间逐步积累能力,而非每次会话都从零开始。

方案

Agent会将可运行的代码实现以可复用函数的形式持久化存储在skills/目录中。随着时间推移,这些实现会逐步演变为文档完善、经过测试的「技能」,成为Agent可以调用的高阶能力。

演进路径:

graph LR
    A[临时代码] --> B[保存可行解决方案]
    B --> C[可复用函数]
    C --> D[带文档的技能]
    D --> E[Agent能力]

基础模式:

# 会话1:Agent编写代码解决问题
def analyze_sentiment(text):
    # 经实验验证的实现方案
    response = llm.complete(f"Analyze sentiment: {text}")
    return parse_sentiment(response)

# Agent保存可行解决方案
with open("skills/analyze_sentiment.py", "w") as f:
    f.write(inspect.getsource(analyze_sentiment))

后续会话:Agent发现并调用已有技能

# Agent遍历skills目录
skills = os.listdir("skills/")
# 找到:['analyze_sentiment.py', 'extract_entities.py', ...]

# 导入并调用已有技能
from skills.analyze_sentiment import analyze_sentiment

result = analyze_sentiment("此处为客户反馈...")

带文档的演进版技能:

# skills/analyze_sentiment.py
"""
技能:情感分析

通过LLM补全和结构化解析分析文本情感。

参数:
    text (str):待分析的文本
    granularity (str):可选值为'binary'(二元)或'fine-grained'(细粒度),默认值:'binary'

返回值:
    dict:{'sentiment': str, 'confidence': float, 'aspects': list}

示例:
    >>> analyze_sentiment("产品很棒,发货速度快!")
    {'sentiment': 'positive', 'confidence': 0.92, 'aspects': ['product', 'shipping']}

测试时间:2024-01-15
验证集成功率:94%
"""
def analyze_sentiment(text, granularity='binary'):
    # 优化后的实现方案
    pass

按需加载的渐进式披露(Imprint方案):

无需将所有技能加载到context中,而是将技能描述注入系统prompt,并提供load_skills工具来获取完整内容:

# skills/pdf-processing/SKILL.md
---
name: pdf-processing
description: 从PDF文档中提取文本和表格
metadata:
  author: example-org
  version: "1.0"
---
# 注入系统prompt
AVAILABLE_SKILLS = """
可用技能(使用load_skills工具查看完整内容):

- pdf-processing:从PDF文档中提取文本和表格
- slack-formatting:为Slack消息添加正确的mrkdwn格式
- large-file-handling:处理超出context窗口的大文件
"""

# 按需加载工具
def load_skills(skill_names):
    """将完整技能内容加载到context中。"""
    for name in skill_names:
        path = f"skills/{name}/SKILL.md"
        # 读取并注入完整内容

渐进式披露的优势:

  • 减少冲突或冗余的context内容
  • 降低格式不一致问题(例如Markdown与Slack mrkdwn格式冲突)
  • 上下文学习示例更聚焦于相关工具

通过技能懒加载MCP工具(Amp方案):

MCP服务器通常会暴露大量工具,这些工具会占用大量context资源。通过选择性工具加载,将MCP服务器与技能绑定:

// skills/chrome-automation/mcp.json
{
  "chrome-devtools": {
    "command": "npx",
    "args": ["-y", "chrome-devtools-mcp@latest"],
    "includeTools": [
      "navigate_page",
      "take_screenshot",
      "new_page",
      "list_pages"
    ]
  }
}

Token节省示例:

  • chrome-devtools MCP:26个工具 = 17k Token
  • 懒加载子集:4个工具 = 1.5k Token(减少91%)

Agent最初只能看到技能描述,当调用技能时,仅会将指定的工具加载到context中。

如何使用


实现阶段:

  1. 临时编写 → 保存入库

    • Agent编写代码解决即时问题
    • 若解决方案验证可行,将其保存至skills/目录
    • 使用描述性文件名:例如skills/pdf_to_markdown.py
  2. 已保存 → 可复用

    • 重构代码以实现通用化(将硬编码值参数化)
    • 添加基础错误处理逻辑
    • 定义简洁清晰的函数签名
  3. 可复用 → 已文档化

    • 添加包含功能用途、参数说明、返回值说明及使用示例的文档字符串(docstring)
    • 列明所有前置条件或依赖项
    • 记录最后一次测试或验证的时间
  4. 已文档化 → 核心能力

    • Agent可通过目录遍历自动发现技能
    • 技能纳入Agent的有效能力集合
    • 技能可组合构建为更高级别的工作流

技能组织结构:

skills/
├── README.md                 # 可用技能索引目录
├── data_processing/          # 数据处理
│   ├── csv_to_json.py
│   └── filter_outliers.py
├── api_integration/          # API集成
│   ├── github_pr_summary.py
│   └── slack_notify.py
├── text_analysis/            # 文本分析
│   ├── sentiment.py
│   └── extract_entities.py
└── tests/                    # 测试用例
    └── test_sentiment.py     # 技能验证测试用例

发现模式:

# Agent探索可用技能
def discover_skills():
    """列出所有可用技能及其描述。"""
    skills = []
    for root, dirs, files in os.walk("skills/"):
        for file in files:
            if file.endswith(".py") and file != "__init__.py":
                path = os.path.join(root, file)
                # 提取文档字符串(docstring)
                with open(path) as f:
                    content = f.read()
                    docstring = extract_docstring(content)
                skills.append({
                    'path': path,
                    'name': file[:-3],
                    'description': docstring.split('\n')[0] if docstring else ''
                })
    return skills

权衡

优势:

  • 随时间逐步提升Agent能力
  • 减少跨会话的重复问题解决工作
  • 以代码形式构建组织级知识库
  • 技能可被测试、版本化并持续改进
  • 支持组合出更高级的能力
  • 降低Token消耗(复用而非重写)

劣势:

  • 需要遵循规范来保存和整理技能
  • 技能可能会过时失效
  • 需要配套的维护和测试基础设施
  • 当技能数量增多时可能出现命名空间冲突
  • 必须通过Prompt引导Agent在编写新代码前先检查已有技能
  • 质量参差不齐(并非所有保存的代码都是优质代码)

维护要求:

  • 定期审核技能的质量与相关性
  • 搭建用于技能验证的测试框架
  • 制定过时技能的淘汰政策
  • 确立新技能的文档规范
  • 通过版本控制追踪技能的演进过程

成功因素:

  • 清晰的命名规范
  • 从项目初期就做好优质文档
  • 通过Prompt鼓励技能复用
  • 定期对技能库进行审核与整理
  • 为每个技能配备示例和测试用例

参考文献

关键词

聚焦MCP技术相关工程实践,涵盖基于MCP的代码执行、内部智能体技能构建、高效MCP工具加载三类核心方向,关联复合工程模式、CLI优先技能设计等相关理念。

直译
  • 《Anthropic工程:基于MCP的代码执行》(2024)
  • 《构建内部智能体:添加智能体技能支持》(链接:https://lethain.com/agents-skills/)——威尔·拉尔森(Imprint,2025)
  • 《高效MCP工具加载》(链接:https://ampcode.com/news/lazy-load-mcp-with-skills)——Amp(尼科莱,2025)
  • 相关内容:复合工程模式、CLI优先技能设计

来源摘要

正在获取来源并生成中文摘要…

来源: https://www.anthropic.com/engineering/code-execution-with-mcp

← 返回社区