共计 3180 个字符,预计需要花费 8 分钟才能阅读完成。
核心概念:Skill 与 Tool 的角色定位
在 DeepAgent 框架中,Skill和 Tool 是构建自动化流程的两大核心组件,它们的定位和功能有显著差异:

- Skill(技能):
- 封装特定领域的完整处理逻辑(如「邮件发送」「数据分析」)
- 可包含多个 Tool 的调用和逻辑编排
-
通过标准化接口(输入 / 输出)与其他 Skill 交互
-
Tool(工具):
- 实现单一原子化功能(如「调用 API」「数据清洗」)
- 通常不包含业务逻辑,仅完成基础操作
- 可被多个 Skill 复用
举个实际例子:开发「智能客服系统」时:
– 创建AnswerCustomerQuery Skill,内部组合:
– SearchKnowledgeBase Tool(知识库查询)
– GenerateNaturalResponse Tool(自然语言生成)
– LogInteraction Tool(交互日志记录)
配置指南:从零开始搭建
1. 环境准备
确保已安装 DeepAgent 最新版:
pip install deepagent --upgrade
2. 创建第一个 Tool
以下示例实现「字符串大写转换」工具:
from deepagent.tools import BaseTool
class UppercaseTool(BaseTool):
name = "uppercase_converter" # 工具唯一标识
description = "将输入字符串转为大写格式"
def execute(self, input_str: str) -> str:
"""
执行逻辑:字符串转大写
:param input_str: 原始字符串
:return: 大写字符串
"""
return input_str.upper()
3. 构建 Skill
组合多个 Tool 实现「文本标准化处理」技能:
from deepagent.skills import BaseSkill
class TextNormalizationSkill(BaseSkill):
name = "text_normalizer"
description = "对文本进行标准化处理"
def __init__(self):
# 初始化依赖的 Tool
self.uppercase_tool = UppercaseTool()
def execute(self, text: str) -> str:
"""
执行流程:1. 转换大写
2. 去除首尾空格(直接调用 Python 原生方法)"""
upper_text = self.uppercase_tool.execute(text)
return upper_text.strip()
4. 注册与调用
在 Agent 中注册并使用组件:
from deepagent.agents import Agent
# 初始化 Agent
my_agent = Agent(name="demo_agent")
# 注册组件
my_agent.register_skill(TextNormalizationSkill())
my_agent.register_tool(UppercaseTool())
# 调用 Skill
result = my_agent.execute_skill(
skill_name="text_normalizer",
inputs={"text": "hello DeepAgent"}
)
print(result) # 输出: "HELLO DEEPAGENT"
实战代码示例:天气预报查询系统
通过组合多个 Tool 实现复杂功能:
# 工具 1:地理位置解析
class LocationParserTool(BaseTool):
def execute(self, query: str) -> dict:
# 模拟解析城市名称(实际可接入第三方 API)return {"city": query.split("in")[-1].strip()}
# 工具 2:天气 API 调用
class WeatherAPITool(BaseTool):
def execute(self, location: dict) -> dict:
# 模拟 API 返回(实际需要网络请求)return {"temp": "25°C", "condition": "sunny"}
# 组合成天气查询 Skill
class WeatherQuerySkill(BaseSkill):
def __init__(self):
self.parser = LocationParserTool()
self.weather_api = WeatherAPITool()
def execute(self, query: str) -> str:
location = self.parser.execute(query)
weather = self.weather_api.execute(location)
return f"{location['city']}天气:{weather['condition']},温度{weather['temp']}"
# 使用示例
agent = Agent()
agent.register_skill(WeatherQuerySkill())
print(agent.execute_skill(
skill_name="weather_query",
inputs={"query": "今天上海的天气怎么样"}
))
# 输出: "上海天气:sunny,温度 25°C"
最佳实践与避坑指南
设计原则
- 单一职责:每个 Tool 只做一件事,Skill 专注流程编排
- 接口标准化 :所有 execute() 方法使用一致的参数 / 返回格式
- 依赖显式声明:在 Skill 的__init__中明确初始化所有依赖 Tool
性能优化
- Tool 复用:频繁使用的 Tool 实例化一次后重复调用
- 异步处理 :对 I / O 密集型 Tool 实现 async_execute() 方法
- 缓存机制:为耗时的 API 调用类 Tool 添加缓存层
调试技巧
# 查看 Agent 已加载的组件
print(my_agent.list_skills())
print(my_agent.list_tools())
# 直接测试单个 Tool
print(my_agent.execute_tool("uppercase_converter", "test"))
常见问题解答
Q1:Skill 和 Tool 的执行顺序如何控制?
– 在 Skill 的 execute()方法中通过代码顺序控制流程
– 需要并行时使用asyncio.gather()
Q2:如何共享数据 between Tools?
– 通过 Skill 的成员变量传递(不推荐)
– 更推荐通过 execute()方法的输入输出显式传递
Q3:出现 ”Component not found” 错误怎么办?
1. 检查组件名称拼写
2. 确认是否调用 register_skill/register_tool
3. 查看组件类是否正确定义 name 属性
Q4:如何实现动态 Tool 选择?
# 在 Skill 中根据输入选择不同 Tool
def execute(self, inputs):
if inputs["type"] == "A":
return self.tool_a.execute(inputs)
else:
return self.tool_b.execute(inputs)
动手实践任务
尝试完成以下练习来巩固知识:
1. 创建一个「时间格式化」Tool,能将时间戳转为 ”YYYY-MM-DD” 格式
2. 构建「文件处理」Skill,组合:
– 文件读取 Tool
– 内容过滤 Tool(如提取特定关键词)
– 结果保存 Tool
3. 为 WeatherQuerySkill 添加「温度单位转换」功能(℃转℉)
提示:遇到问题时可以查阅 DeepAgent 官方文档的 [Skill 开发指南] 和[Tool API 参考]。
通过本文的学习,你应该已经掌握了 DeepAgent 中 Skill 和 Tool 的核心使用方法。建议从简单场景开始实践,逐步构建复杂的自动化流程。记住良好的组件设计是高效开发的关键!
