Agent在多工具时代自主搭配计算器与时间工具
Agent新增计算器与时间工具,工具数量增至四个。工具选择依赖描述质量而非魔法,清晰的描述能够提高选择准确率。扩展新工具仅需两步操作(编写描述及注册),无需修改核心代码,体现开放封闭原则。
Day 3:多工具时代,Agent 自主选择工具——实战加入计算器与时间工具
昨天我们的Agent还只拥有两个工具,今天直接将工具数量翻倍至四个。
但今天真正值得关注的并非工具数量的增长,而是一个更核心的挑战:
面对多个工具,AI 如何正确选择?它是否会选错工具?
实践证明,大多数情况下AI能够准确选择,但偶尔也会出现失误。而我们可以通过精心打磨工具的描述,逐步提升选择的准确率。
本章将彻底摸清这个关键问题。
两个新增工具
工具1:计算器(Calculator)
# tools/calculator.py
def calculate(expression: str) -> str:
"""计算数学表达式。只允许数字和基本运算符,防止代码注入。"""
allowed_chars = set("0123456789+-*/()., ")
if not all(c in allowed_chars for c in expression):
return f"表达式包含不允许的字符:{expression!r}"
try:
result = eval(expression)
return f"{expression} = {result}"
except ZeroDivisionError:
return "错误:除数不能为零"
except SyntaxError:
return f"表达式语法错误:{expression!r}"
except Exception as e:
return f"计算出错:{e}"
关于 eval:很多人看到 eval 会担心安全性——没错,eval 确实能执行任意 Python 代码。但这里通过字符白名单过滤,只允许数字和 +-*/()., 这几个字符,像 import、os 这类危险关键词都会被拦截。
这是教学项目的合理实现。生产环境可以换成 sympy 或 numexpr 等更安全的方案。
工具2:获取当前时间(Current Time)
# tools/datetime_tool.py
from datetime import datetime
import pytz
def get_current_time(timezone: str = "Asia/Shanghai") -> str:
"""获取当前时间,默认北京时间。"""
try:
tz = pytz.timezone(timezone)
except pytz.exceptions.UnknownTimeZoneError:
# 时区名写错了,回退到北京时间
tz = pytz.timezone("Asia/Shanghai")
timezone = "Asia/Shanghai(时区名无效,已回退)"
now = datetime.now(tz)
return now.strftime(f"%Y年%m月%d日 %H:%M:%S({timezone})")
更新工具注册表
在 tool_registry.py 中添加两条新工具记录:
from tools.search import web_search
from tools.weather import get_weather
from tools.calculator import calculate
from tools.datetime_tool import get_current_time
TOOLS: dict[str, dict] = {
"web_search": {
"function": web_search,
"description": "搜索互联网上的信息。适合查找新闻、事实、最新资讯。不适合计算。",
"parameters": {
"query": "搜索关键词,字符串"
},
},
"get_weather": {
"function": get_weather,
"description": "查询某个城市的天气情况。",
"parameters": {
"city": "城市名称,字符串,例如:北京"
},
},
"calculate": {
"function": calculate,
"description": "计算数学表达式,支持加减乘除和括号。只用于数学计算,不用于其他问题。",
"parameters": {
"expression": "数学表达式字符串,例如:(3+5)*2"
},
},
"get_current_time": {
"function": get_current_time,
"description": "获取当前日期和时间。",
"parameters": {
"timezone": "时区名称,默认 Asia/Shanghai"
},
},
}
请注意 calculate 的描述中强调了“只用于数学计算,不用于其他问题。”这句话极其关键。如果不加,AI 可能会将“帮我计算一下这件事的影响”这类模糊请求也交给计算器,但那根本不是数学表达式。
描述越清晰,工具选择的准确率就越高。
运行效果
你:现在几点了?
[AI 决策]: {"action": "use_tool", "tool": "get_current_time", "params": {"timezone": "Asia/Shanghai"}}
Agent:2024年03月15日 14:30:22(Asia/Shanghai)
你:(123 + 456) * 2 等于多少?
[AI 决策]: {"action": "use_tool", "tool": "calculate", "params": {"expression": "(123 + 456) * 2"}}
Agent:(123 + 456) * 2 = 1158
你:上海今天天气怎么样,适合出门吗?
[AI 决策]: {"action": "use_tool", "tool": "get_weather", "params": {"city": "上海"}}
Agent:多云,18°C,南风2级
你:Python 是什么时候发布的?
[AI 决策]: {"action": "use_tool", "tool": "web_search", "params": {"query": "Python 编程语言发布时间"}}
Agent:摘要:Python 于1991年由...
对于四种不同类型的问题,AI 全部正确选择了对应的工具,说明默认的描述已经足够良好。
工具选错了怎么办
偶尔 AI 也会选错,例如把“帮我计算一下北京到上海的距离”交给计算器(实际上应该执行搜索)。
两种调试方法:
方法1:优化工具描述
在出问题的工具描述里增加明确的限制:
"calculate": {
"description": "计算纯数学表达式,如 '2+3' 或 '(100*5)/2'。"
"不适合地理、文字、概念类问题。"
...
}
方法2:打印 AI 决策日志,分析选错原因
print(f"[AI 决策]: {ai_response}")
观察 AI 的 thought(如果在 prompt 中要求它输出推理过程)或直接分析选错模式,然后针对性调整描述。
这就像调参一样,工具描述就是 Agent 的“超参数”。
如何自己添加一个新工具
步骤:
- 在
tools/目录下新建tools/my_tool.py,编写一个函数
# tools/my_tool.py
def my_tool(param1: str) -> str:
# 做些什么
return "结果"
- 在
tool_registry.py中注册新工具:
from tools.my_tool import my_tool
TOOLS = {
# ... 已有的工具 ...
"my_tool": {
"function": my_tool,
"description": "这个工具用来做什么,什么时候用它。",
"parameters": {
"param1": "参数说明"
},
},
}
- 运行。完成。
无需修改 agent.py、main.py 或其他任何文件,真正实现了零侵入扩展。
今天的项目结构
my_agent/
├── .env
├── llm.py
├── agent.py
├── tool_registry.py # 新增了两条工具记录
├── tools/
│ ├── __init__.py
│ ├── search.py
│ ├── weather.py
│ ├── calculator.py # 新增
│ └── datetime_tool.py # 新增
└── main.py
小结
今天完成的工作,其意义远超代码量本身:
- 工具数量增加了,但工具注册表的结构保持稳定
- 工具选择的效果依赖于描述质量,而非魔法
- 添加新工具只需两步操作,不涉及核心代码改动
这正是“开放-封闭原则”在 Agent 系统中的经典体现:对扩展开放,对修改封闭。
明天,Day 4:《让 Agent 记住你——短期记忆实现》
今天的 Agent 还有一个重大缺陷:它不记得你说过什么,每次对话都是全新的。
明天我们将彻底解决这个问题。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
AI如何从聊天能力进化到做事能力 Skill的实践之路
让AI从“会聊天”转向“会做事”的关键在于Skill(技能包)。Skill由可执行代码、精确的说明书(如JSONSchema描述)及结果翻译器构成。通过精细定义参数与边界,AI能稳定调用接口完成重启服务、查询数据等操作,从而从空谈顾问变为可靠的数字员工。
零基础看懂Agent Skill MCP三层关系解读
智能体是自主执行任务的实体,技能是被封装的原子能力,MCP协议是智能体与技能间的标准化通信协议。智能体通过MCP协议发现并调用技能,灵活组合完成复杂任务。三者解耦,实现即插即用,降低了系统集成复杂度。
AI编码时代UI自动化测试智能化演进之路—中国平安人寿蔡雪
AI编码时代,UI自动化测试面临效率断层。平安人寿蔡雪基于自研“女娲”平台,分享从可视化录制到AI智能录制、基于EventDOM的智能感知与自愈机制的演进路径,实现用例创建降本、维护减负、执行提稳,推动测试工具从自动化向智能化升级。
一文讲清Agent、Skill、MCP到底什么关系:零基础小白三层拆解
Agent是自主执行任务的数字打工人,Skill为原子化能力函数,MCP是标准协议接口。Agent通过MCP发现并调用Skill,实现即插即用,解耦技能与智能体,让大模型能力安全、统一、可扩展地集成。
文生图同一提示词为何每次不同?随机性与可复现解析
文生图每次结果不同源于从随机噪声开始去噪。固定种子(seed)可锁定初始噪声,但还需采样步数、引导强度、采样器、尺寸、提示词、模型等参数一致才能复现。通过控制变量法调参,先固定种子再逐一调整其他参数,可精确归因差异。
- 热门数据榜
相关攻略
2026-07-10 11:09
2026-07-10 11:09
2026-07-10 11:09
2026-07-10 11:09
2026-07-10 11:09
2026-07-10 11:08
2026-07-10 11:08
2026-07-10 11:08
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

