1. 项目背景与需求分析
最近在开发基于LangChain的智能体系统时,发现一个痛点:LangChain原生并不支持AgentSkills功能。这让我在构建需要特定技能组合的智能体时遇到了不少麻烦。经过调研发现,虽然DeepAgent等框架提供了相关能力,但如果我们想要一个更轻量、更可控的解决方案,从零开始实现可能是更好的选择。
AgentSkills本质上是一组可组合、可复用的能力模块,它允许智能体根据任务需求动态加载不同的技能组合。想象一下,你的智能体就像一个工具箱,而各种技能就是不同的工具——螺丝刀、锤子、扳手等。当需要修理家具时,拿出锤子和螺丝刀;当需要修理水管时,拿出扳手和密封胶。这种模块化设计让智能体更加灵活和可扩展。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路
2.1 技能定义规范
首先我们需要定义技能的标准化格式。参考行业实践,一个技能至少包含以下几个部分:
yaml复制# SKILL.md 示例
---
name: weather-query
description: 查询指定城市的天气情况
parameters:
city: 城市名称,如"北京"
output:
format: json
fields:
temperature: 当前温度(℃)
condition: 天气状况
humidity: 湿度(%)
---
这个YAML头定义了技能的基本元信息。接下来是技能的详细说明和使用示例:
markdown复制## 使用说明
1. 用户需提供有效的城市名称
2. 系统将返回当前天气数据
3. 示例请求: "查询北京的天气"
4. 示例响应:
```json
{
"temperature": 25,
"condition": "晴",
"humidity": 60
}
2.2 技能目录结构
合理的目录结构能让技能管理更清晰:
code复制skills/
├── weather/
│ ├── SKILL.md
│ ├── scripts/
│ │ └── query_weather.py
│ └── assets/
│ └── city_codes.json
└── translation/
├── SKILL.md
└── scripts/
└── translate_text.py
这种结构将技能描述、执行脚本和辅助资源分开存放,便于维护和扩展。
3. 实现细节
3.1 技能加载器实现
技能加载器是核心组件,负责发现和加载可用技能。以下是Python实现示例:
python复制import os
import yaml
from pathlib import Path
from typing import Dict, Any
class SkillLoader:
def __init__(self, skills_dir: str = "skills"):
self.skills_dir = Path(skills_dir)
self.skills = {}
def load_skills(self):
"""加载所有技能"""
for skill_dir in self.skills_dir.iterdir():
if skill_dir.is_dir():
skill_file = skill_dir / "SKILL.md"
if skill_file.exists():
with open(skill_file, 'r', encoding='utf-8') as f:
content = f.read()
# 分离YAML和Markdown
parts = content.split('---', 2)
if len(parts) >= 3:
meta = yaml.safe_load(parts[1])
meta['description'] = parts[2].strip()
self.skills[meta['name']] = meta
self.skills[meta['name']]['path'] = skill_dir
return self.skills
def get_skill(self, name: str) -> Dict[str, Any]:
"""获取特定技能"""
return self.skills.get(name)
3.2 技能执行引擎
技能执行需要处理不同类型的操作,这里我们实现一个基础版本:
python复制import subprocess
import json
from typing import Optional
class SkillExecutor:
@staticmethod
def execute_python_script(script_path: str, args: dict) -> Optional[dict]:
"""执行Python脚本形式的技能"""
try:
result = subprocess.run(
['python', script_path, json.dumps(ar
