游乐游手机版
首页/AI教程/文章详情

Agent在多工具时代自主搭配计算器与时间工具

时间:2026-06-16 15:49
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 代码。但这里通过字符白名单过滤,只允许数字和 +-*/()., 这几个字符,像 importos 这类危险关键词都会被拦截。

这是教学项目的合理实现。生产环境可以换成 sympynumexpr 等更安全的方案。

工具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 的“超参数”。

如何自己添加一个新工具

步骤:

  1. tools/ 目录下新建 tools/my_tool.py,编写一个函数
# tools/my_tool.py
def my_tool(param1: str) -> str:
    # 做些什么
    return "结果"
  1. tool_registry.py 中注册新工具:
from tools.my_tool import my_tool

TOOLS = {
    # ... 已有的工具 ...
    "my_tool": {
        "function": my_tool,
        "description": "这个工具用来做什么,什么时候用它。",
        "parameters": {
            "param1": "参数说明"
        },
    },
}
  1. 运行。完成。

无需修改 agent.pymain.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 还有一个重大缺陷:它不记得你说过什么,每次对话都是全新的。

明天我们将彻底解决这个问题。

来源:https://juejin.cn/post/7638898601737781284
上一篇SpringBoot架构下Redis主从集群部署与应用实践 下一篇CSDN AI数字营销实测:一键多平台同步
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Windows Docker Desktop RabbitMQ生产级部署完整指南
AI教程 · 2026-06-29

Windows Docker Desktop RabbitMQ生产级部署完整指南

前言 在 Windows 本地开发环境中,直接安装 RabbitMQ 确实颇为周折:需要单独配置 Erlang 运行环境、手动管理环境变量、服务启停全凭手工操作。更令人困扰的是,版本兼容冲突、端口占用、环境不一致等问题层出不穷。笔者见过不少开发者为搭建环境就得耗费整整半天时间。 相比之下,借助 Do

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践
AI教程 · 2026-06-29

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践

先分享一个切实感受。过去两年,我们与福建制造企业合作较为频繁,发现一个非常突出的现象:超过80%的企业官网,产品参数仍然存放在PDF或图片中。AI爬虫?根本无法抓取。这些企业技术实力不弱、资质证照齐全、应用案例也丰富,但在AI搜索这一全新战场上,它们几乎处于隐身状态。 一、一个正在发生的行业变化 A

阿里云Token Plan团队版功能价格与省钱购买指南
AI教程 · 2026-06-29

阿里云Token Plan团队版功能价格与省钱购买指南

阿里云百炼近期推出了名为“Token Plan 团队版”的全新服务,这一服务专为企业与开发者量身打造,定位为AI大模型订阅平台。通过引入Credits作为统一计量单位,将文本生成、图像生成等多模态AI能力纳入单一计费体系,同时无缝兼容主流AI编程工具及智能体(Agent)生态系统。其核心亮点包括:全

阿里云物联网.NET Core客户端位置信息上报
AI教程 · 2026-06-29

阿里云物联网.NET Core客户端位置信息上报

阿里云物联网平台的位置服务并非一个完全独立的功能模块。位置信息可包含二维坐标与三维坐标,而位置数据的来源本质上是借助设备属性进行上传。换言之,若要让设备上报位置,您需先将其视为一个普通属性进行处理。 1)添加二维位置数据 操作过程十分简洁。进入数据分析 → 空间数据可视化 → 二维数据,点击添加,将

年阿里云服务器选型配置与网站部署全攻略
AI教程 · 2026-06-29

年阿里云服务器选型配置与网站部署全攻略

2026年,阿里云服务器生态已高度成熟,形成了清晰的轻量应用服务器与ECS云服务器两大产品阵营。无论你是计划搭建个人博客、企业官网,还是运营电商平台、进行应用开发,基本都能找到理想的解决方案。本指南将从服务器选型、配置选择、部署流程到安全运维,系统梳理2026年最实用的操作要点,帮助你少走弯路,让网