一、Skills概述
Skills(技能)是AI智能体的能力模块,定义了智能体可以执行的具体操作。
核心概念:
二、Skills的作用
能力扩展
智能体通过Skills获得具体能力:
- 搜索信息
- 执行代码
- 操作文件
- 调用API
- 访问数据库
标准化
Skills提供统一的接口规范:
可复用
Skills可以跨智能体共享:
三、Skills结构
基本组成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| name: search_skill description: 搜索互联网信息 parameters: - name: query type: string description: 搜索关键词 required: true - name: limit type: integer description: 返回结果数量 required: false default: 5 returns: type: array description: 搜索结果列表
|
执行逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def search_skill(query: str, limit: int = 5) -> list: """ 搜索互联网信息 Args: query: 搜索关键词 limit: 返回结果数量 Returns: 搜索结果列表 """ results = search_engine.search(query, limit) return results
|
四、Skills类型
信息获取类
搜索:
查询:
操作执行类
文件操作:
系统操作:
数据处理类
转换:
分析:
交互类
通信:
集成:
五、Skills开发
定义接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from pydantic import BaseModel
class SearchInput(BaseModel): query: str limit: int = 5
class SearchResult(BaseModel): title: str url: str snippet: str
class SearchSkill: name = "search" description = "搜索互联网信息" input_schema = SearchInput output_schema = SearchResult def execute(self, input: SearchInput) -> list[SearchResult]: pass
|
实现逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class SearchSkill: def execute(self, input: SearchInput) -> list[SearchResult]: if not input.query: raise ValueError("query不能为空") response = requests.get( "https://api.search.com/search", params={"q": input.query, "limit": input.limit} ) results = [] for item in response.json()["results"]: results.append(SearchResult( title=item["title"], url=item["url"], snippet=item["snippet"] )) return results
|
错误处理
1 2 3 4 5 6 7 8 9
| class SearchSkill: def execute(self, input: SearchInput) -> list[SearchResult]: try: pass except requests.Timeout: raise SkillError("搜索超时") except requests.RequestException as e: raise SkillError(f"搜索失败: {str(e)}")
|
六、Skills注册
注册到智能体
1 2 3 4 5 6 7 8
| agent = Agent( name="assistant", skills=[ SearchSkill(), CodeSkill(), FileSkill() ] )
|
动态加载
1 2 3 4 5 6
| def load_skill(skill_name: str): module = importlib.import_module(f"skills.{skill_name}") skill_class = getattr(module, f"{skill_name.capitalize()}Skill") return skill_class()
agent.add_skill(load_skill("search"))
|
七、Skills调用
智能体决策
智能体根据用户请求选择合适的Skill:
1 2
| 用户: 帮我搜索Python教程 智能体: 调用search_skill(query="Python教程")
|
参数提取
智能体从用户请求中提取参数:
1 2
| 用户: 搜索最近5篇关于AI的新闻 智能体: 调用search_skill(query="AI新闻", limit=5)
|
结果处理
智能体处理Skill返回的结果:
1 2
| Skill返回: [{title: "...", url: "..."}, ...] 智能体: 整理后返回给用户
|
八、Skills管理
版本控制
1 2 3 4 5
| skill: name: search version: 1.2.0 dependencies: - requests>=2.28.0
|
权限控制
1 2 3 4 5 6
| class SearchSkill: permissions = ["internet_access"] def check_permission(self, context): if "internet_access" not in context.permissions: raise PermissionError("无网络访问权限")
|
监控和日志
1 2 3 4 5 6 7 8 9 10 11
| class SearchSkill: def execute(self, input: SearchInput): logger.info(f"执行搜索: {input.query}") start_time = time.time() result = self._do_search(input) duration = time.time() - start_time logger.info(f"搜索完成, 耗时: {duration}s") return result
|
九、Skills最佳实践
单一职责
每个Skill只做一件事:
- search_skill只负责搜索
- file_skill只负责文件操作
清晰描述
提供详细的描述和示例:
1 2 3 4 5 6
| description: | 搜索互联网信息 示例: - 搜索Python教程 - 搜索最新的AI新闻
|
参数验证
使用Pydantic等工具验证参数:
1 2 3
| class SearchInput(BaseModel): query: str = Field(min_length=1, max_length=100) limit: int = Field(ge=1, le=20)
|
错误处理
提供清晰的错误信息:
1
| raise SkillError("搜索关键词不能为空,请提供有效的搜索词")
|
十、总结
Skills核心要点:
- 封装智能体的具体能力
- 标准化接口定义
- 可复用和可组合
- 清晰的参数和返回值定义
- 完善的错误处理和权限控制
Skills是构建AI智能体的基础模块,合理设计和开发Skills可以提升智能体的能力和可靠性。