这篇适合谁,读完能做什么
这篇适合已经知道智能体是什么,想搞清楚「工具」到底怎么接进大模型的读者。读完后,你应该能写出一个带类型标注的 Python 工具,用装饰器让它自动生成描述,并理解从模型输出文字到工具真正执行的完整过程。
工具是什么
工具就是交给大模型的一个函数,这个函数应该有明确的目标[1]。常见的工具包括:联网搜索、图片生成、从外部来源检索信息,以及调用 GitHub、YouTube、Spotify 等服务的接口[1]。
工具之所以重要,是因为大模型的知识只截止到训练时。需要最新数据时,智能体必须通过工具去获取。比如直接问模型今天的天气而没有搜索工具,它可能会编造一个答案[1]。
一个工具应该包含:对功能的文字描述、可以调用的函数本身、带类型的参数,以及(可选的)带类型的返回值[1]。
模型怎么「调用」工具
大语言模型只能接收文字、输出文字,它自己没办法调用任何工具。所谓给模型提供工具,就是让模型知道这些工具的存在,并在需要时指示它生成基于文字的调用指令[1]。
比如用户问巴黎的天气。模型识别出这是使用天气工具的机会,于是生成一段表示工具调用的文字,例如 call weather_tool('Paris')。智能体读到这段文字,识别出需要调用工具,替模型执行工具,拿到真实的天气数据[1]。
这些工具调用的步骤通常不会展示给用户。智能体会把它们作为一条新消息追加到对话里,再把更新后的对话交给模型,模型据此生成通顺的回答。对用户来说,好像是模型直接调用了工具,实际上整个执行过程都是智能体在后台完成的[1]。
工具的描述通过系统提示词(system prompt)交给模型,里面是对每个可用工具的文字说明[1]。描述必须精确,要说清工具做什么,以及它需要什么确切的输入。通常用计算机语言或 JSON 来写,不过任何精确、一致的格式都可以[1]。
从一个计算器工具开始
下面是一个最简化的计算器工具,它把两个整数相乘[1]:
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b交给模型的文字描述是:Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int。手写这种描述容易遗漏细节,而且每加一个工具都要保持同样的格式,很容易出错[1]。
用装饰器自动生成描述
更好的办法是让 Python 自己读取代码信息。函数只要有类型注解、文档字符串(docstring)和清晰的函数名,就可以用装饰器自动生成描述[1]:
@tool
def calculator(a: int, b: int) -> int:
"""Multiply two integers."""
return a * b
print(calculator.to_string())装饰器背后用的是 Python 的 inspect 模块,读取函数签名。它把函数的文档字符串作为描述,把函数名作为工具名[1]。to_string() 输出的结果,和手写的描述一模一样[1]。
一个通用的 Tool 类里有名称、描述、函数、参数和返回值,还有 __call__ 和 to_string() 两个方法。这是示例写法,但与大多数库中的真实实现很接近[1]。生成的描述会被注入系统提示词[1]。
工具的标准化:MCP
模型上下文协议(MCP)是一个开放协议,它规定应用如何把工具提供给大语言模型。任何实现了 MCP 的框架都能使用协议里定义的工具,不必为每个框架重新实现一遍工具接口[1]。
MCP 提供的东西包括:不断增长的预置集成列表,在不同大模型提供方之间切换的灵活性,以及在自己的基础设施内保护数据的最佳实践[1]。
行动:智能体怎样与环境互动
行动是智能体与环境互动的具体步骤,比如浏览网页、控制一台实体设备[2]。行动大致分为四类:信息获取、工具使用、环境交互和沟通[2]。
按照表达行动的方式,智能体可以分为三种[2]:
- JSON 智能体:用 JSON 格式指定要执行的动作。
- 代码智能体:写一段代码,由外部解释执行。
- 函数调用智能体:JSON 智能体的一个子类,经过微调,每个动作都生成一条新消息。
停止并解析:让输出可以被程序读取
实现行动的一个关键方法叫「停止并解析」(stop and parse),分三步[2]:
- 模型按预定的结构输出动作,格式可以是 JSON 或代码。
- 动作描述完整之后,模型停止继续生成 token。
- 外部解析器读取动作,判断要调用哪个工具,并提取参数。
这要求模型在输出完整动作后必须停下来,把控制权交还给智能体,这样输出才能被解析[2]。比如查询天气的动作可以写成:
{
"action": "get_weather",
"action_input": {"location": "New York"}
}框架读到这段内容,就能轻松解析出要调用的函数名和参数[2]。
代码智能体
代码智能体不输出简单的 JSON,而是生成一段可执行的代码,通常是 Python。代码能表达循环、条件判断和嵌套函数,生成的函数和模块可以在不同动作之间复用,出错时也更容易调试,还能直接调用外部库和 API[2]。
但执行模型生成的代码有安全风险,从提示注入到执行有害代码都可能发生。建议使用 smolagents 这类自带默认防护的框架[2]。
下一步
先用一个两三个工具的小项目,体验一遍「写函数、加装饰器、看描述、让模型调用、解析执行」的完整流程,再考虑把工具换成 MCP 服务器提供的标准工具。
本文改编自 Hugging Face 开源课程《Agents Course》第 1 单元[1][2],原文以 Apache-2.0 许可证发布。
来源
- 1What are Tools?Hugging Face agents-course (Apache-2.0)
- 2Actions: Enabling the Agent to Engage with Its EnvironmentHugging Face agents-course (Apache-2.0)
引用本页: 智能体的工具是怎么工作的. TellWorld, https://www.tellworld.net/zh/practice/practice-agent-tools-explained. 更新于 2026-11-14