声明:本篇博客是以吴恩达的【Agent智能体】教程为基础,并对其中的内容做了笔记整理以及个人收获的总结。
下面的例子都使用AISuite 开源库,让大语言模型调用工具。
注意:大模型本身不直接调用工具,它只是请求“你”去调用工具。但是在开发代理型工作流的开发者中,有时会直接说大模型调用了工具,虽然这并不是技术上的真实过程,这样说只是为了方便
定义工具 (Defining the tool)
图片使用的代码库是aisuite,演示了如何让模型调用一个简单的 Python 函数
定义工具 (Defining the tool)
左侧: Python 函数get_current_time(),用于获取当前时间。- 注释(Docstring):
"""Returns the current time as a string"""。在 AI Agent 的开发中,这段描述至关重要。底层的框架会自动读取这段文字,把它发给大模型,大模型正是依靠这句话来理解“这个工具是干什么用的”以及“什么时候该用它”。
- 注释(Docstring):
调用语法 (Syntax)
右侧展示了如何将刚刚定义好的工具传递给大语言模型(这里调用的是openai:gpt-4o)。tools=[get_current_time](工具列表):你只需把左侧写好的 Python 函数名放在列表中传给大模型。框架会自动把函数转化为模型能看懂的 JSON 格式描述。max_turns=5(最大轮次):作用是“限制 LLM 连续请求工具的次数,防止出现循环”。实际情况中这种死循环一般很少发生。
总结
The function get_current_time is automatically described to the LLM to enable it to decide when to use it.总结了整个过程的核心机制:- 系统会自动将函数描述给 LLM,赋予 LLM 自主决策的能力。当你问模型“现在几点了”时,模型会自己判断需要调用
get_current_time这个工具来获取答案,而不是瞎编一个时间。
- 系统会自动将函数描述给 LLM,赋予 LLM 自主决策的能力。当你问模型“现在几点了”时,模型会自己判断需要调用
AI Agent 框架在后台工作的底层机制(无参)
底层会直接生成一个详细描述函数的JSON架构,这是实际传递给大模型的内容
这个图展示了从Python 函数到JSON Schema的自动映射过程。
大模型原生并不直接运行 Python 代码,它们通过 API 接收标准的 JSON 格式数据。
aisuite这类框架是如何在后台做自动转换的:
红框(函数名映射):Python 代码定义的函数名
get_current_time,被框架自动提取,并填入了右侧 JSON Schema 中的"name"字段。- 这告诉大模型:“这里有一个工具,它的代号叫这个”。
绿框(功能描述映射):Python 代码中的文档字符串
"""Returns the current time as a string""",被自动提取并填入了右侧 JSON 的"description"字段。- 作用:大模型就是通过阅读这句 description,来理解这个工具的具体功能,从而决定在何时调用它。
“the name and description get added automatically”(名称和描述会被自动添加)
- 作为开发者,你只需要像左下角那样,简单地把
get_current_time放入tools列表中传给框架。你不需要手动去手写右上方那一坨繁琐的 JSON Schema 字典,框架(如aisuite、LangChain或OpenAI SDK)会在底层替你完成这些翻译和组装工作。
三者的关系
get_current_time:开发者编写的真实代码实体。 它包含了具体的业务逻辑(获取系统时间)和人类可读的注释说明(Docstring)- 大语言模型(LLM)本身是一个文本处理引擎,它在云端的服务器里,并不能直接运行你本地或服务器上的 Python 代码
JSON Schema:给大模型看的内容- 大模型不懂如何直接运行 Python,它只认一种标准化的数据格式 - JSON
- 它是大模型的“API 接口文档”。通过这种标准化的 JSON 格式,大模型就能清楚地知道这个函数的作用以及需要调用的场景
- JSON Schema 就是
get_current_time这段 Python 代码在 AI 世界里的名片。
aisuite库 API:连接两者的中转站:- 没有
aisuite(或者 OpenAI 原生 SDK 等框架),你需要自己手动写代码把 Python 函数转成那一大坨复杂的 JSON,不仅繁琐,而且容易出错。 - 作用:
aisuite作为中间商。当你把get_current_time丢进tools=[get_current_time]时,aisuite会在后台自动完成以下工作:- 解析你的 Python 函数名和注释。
- 组装成大模型需要的 JSON Schema 格式。
- 打包发送给大模型。
- 并且,如果大模型回复“我要调用这个工具”,
aisuite还会负责执行这个 Python 函数,并把运行结果再次发回给大模型
- 没有
AI Agent 框架在后台工作的底层机制(带参)
这个图展示了如何给工具加上“参数(Parameters)”,让大语言模型(LLM)能够更灵活地传递信息给工具。
自动映射的三要素
左侧是你写的 Python 代码,右侧是框架自动生成的 JSON Schema 。框架做了自动翻译工作:
红框(函数名):将 Python 函数名
get_current_time映射到 JSON 的name字段。绿框(整体描述):将文档字符串映射到 JSON 的
description,告诉大模型这个工具现在的用途是“获取指定时区的当前时间”。蓝框(参数 ):
- 左侧:Python 函数的括号里多了一个参数
(timezone)。 - 右侧:在 JSON 中生成了一个非常详细的
"parameters"字典。这里面不仅告诉大模型需要提供timezone这个参数,还规定了它的数据类型("type": "string"),并且给出了具体的格式示例(例如'America/New_York')。
- 左侧:Python 函数的括号里多了一个参数
为什么需要这个蓝框?(大模型的思考过程)
有了这段详细的 JSON 参数说明,大模型在处理你的问题时,就能完成参数提取的工作。
举个例子,假设你问大模型:“东京现在几点了?”
- 大模型阅读右侧的 JSON 说明书。
- 它判断出需要调用
get_current_time工具。 - 关键步骤:结合蓝框里的要求和你的问题,大模型会自动把“东京”转换成符合规范的时区字符串(如
Asia/Tokyo)。 - 大模型向框架发送请求:“请执行
get_current_time,并把参数设为Asia/Tokyo”。
用一个例子简单说一下具体的执行流程:
用户输入:“请问现在纽约几点了”
- 第一步:
aisuite框架开始进行翻译工作
aisuite拿到你的get_current_time函数,然后把它翻译成了JSON Schema(AI的说明书)aisuite将用户的提问跟这个JSON数据一起打包发送给LLM- 此时LLM得到的数据是这样的:
- 用户消息:“请问现在纽约几点了?”
- 工具 (JSON格式):
[{"name": "get_current_time", "description": "获取指定时区的时间", "parameters": {"timezone": "string"}}]- 第二步:LLM开始思考
- “用户问的是纽约时间。”
- 看工具列表:正好有一个叫
get_current_time的工具,可以查时区时间。- LLM决定不直接回答,而是向
aisuite发送一个“调用请求”。- 大模型回复给
aisuite的数据:
- 动作:
call_function- 工具名:
get_current_time- 提取到的参数:
{"timezone": "America/New_York"}- 第三步::
aisuite收到指令之后,执行工具
aisuite会在你的本地电脑/服务器上,真正执行你的Python 代码- 假设代码运行完毕,返回了字符串
"09:30:15"。aisuite再次把这个结果发送给大模型- 第四步:LLM进行最终回答
- 大模型拿到了具体的时间数据,结合用户的原始问题,生成了一句自然流畅的人类语言。
- 大模型输出:“现在纽约的时间是上午 09:30:15。”
aisuite将这句话返回给你的程序,展示在屏幕上。
总结
这篇博文展示了现代进行工具调用的一些基本语法与底层逻辑。文本用的是开源代码库aisuite为例进行了详细拆解,但还有许多类似且成熟的框架(例如 LangChain、LlamaIndex 或 OpenAI 原生 SDK 等)。无论你未来在开发中选择哪一种框架,它们背后的核心价值和运转机制都是类似的。
总而言之,工具调用并不神秘,它就是一个标准化数据格式(JSON)的自动映射与协同执行过程。
如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!