大模型的toolcalls能力

admin 2026-04-02 05:23:35 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了大模型的toolcalls(工具调用)能力,解释了其含义、工作机制,并通过示例代码演示了如何让模型调用外部工具(如查询天气函数)来增强自身能力。文章还分析了其在Agent领域的应用,指出ToolCalls是实现智能体能力的核心手段,而Agent的本质是状态管理器。 综合评分: 85 文章分类: AI安全,技术标准,解决方案,安全开发,其他


cover_image

大模型的 tool calls 能力

原创

hyang0 hyang0

生有可恋

2026年3月29日 08:30 湖北

大模型的各项能力中有一项能力叫 “tool calls“,如果直接翻译就叫”工具调用”。

什么是 tool calls 的能力?

在 deepseek 模型的官方文档中有这么一个表:

https://api-docs.deepseek.com/zh-cn/quick_start/pricing

关于 tool calls 的解释,文档中是这样说的:

Tool Calls 让模型能够调用外部工具,来增强自身能力。

DeepSeek API 文档给出了 tool calls 的 API 示例:

from openai import OpenAI
def send_messages(messages):    response = client.chat.completions.create(        model="deepseek-chat",        messages=messages,        tools=tools    )    return response.choices[0].message
client = OpenAI(&nbsp; &nbsp; api_key="<your api key>",&nbsp; &nbsp; base_url="https://api.deepseek.com",)
tools = [&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"function",&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"function": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"name":&nbsp;"get_weather",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"description":&nbsp;"Get weather of a location, the user should supply a location first.",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"parameters": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"object",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"properties": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"location": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"string",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"description":&nbsp;"The city and state, e.g. San Francisco, CA",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"required": ["location"]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; },]
messages = [{"role":&nbsp;"user",&nbsp;"content":&nbsp;"How's the weather in Hangzhou, Zhejiang?"}]message = send_messages(messages)print(f"User>\t&nbsp;{messages[0]['content']}")
tool = message.tool_calls[0]messages.append(message)
messages.append({"role":&nbsp;"tool",&nbsp;"tool_call_id": tool.id,&nbsp;"content":&nbsp;"24℃"})message = send_messages(messages)print(f"Model>\t&nbsp;{message.content}")

这个例子中没有给出 get_weather 的实现,例子跑不起来。我在 ollama 下完成了一个可实际执行的例子,其中 get_current_weather() 是 dummy 函数,主要用来演示 tool calls 的用法。

import&nbsp;jsonfrom&nbsp;openai&nbsp;import&nbsp;OpenAI# 1. 初始化客户端 - 使用 Ollama APIclient = OpenAI(&nbsp; &nbsp; base_url="http://192.168.1.1:11434/v1",&nbsp; &nbsp; api_key="ollama"&nbsp;&nbsp;# Ollama 本地运行通常不需要 API key,这里任意填写即可)# 2. 定义工具(函数)的 schematools = [&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"function",&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"function": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"name":&nbsp;"get_current_weather",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"description":&nbsp;"获取指定城市的实时天气",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"parameters": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"object",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"properties": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"location": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"string",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"description":&nbsp;"城市名称,例如:北京、上海"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"unit": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"type":&nbsp;"string",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"enum": ["celsius",&nbsp;"fahrenheit"],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"description":&nbsp;"温度单位"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"required": ["location"]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }]# 3. 模拟实际执行的天气查询函数(实际可替换为 API 调用)def&nbsp;get_current_weather(location, unit="celsius"):&nbsp; &nbsp;&nbsp;# 这里仅为演示,返回模拟数据&nbsp; &nbsp; weather_data = {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"北京": {"celsius":&nbsp;22,&nbsp;"fahrenheit":&nbsp;72,&nbsp;"condition":&nbsp;"晴朗"},&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"上海": {"celsius":&nbsp;26,&nbsp;"fahrenheit":&nbsp;79,&nbsp;"condition":&nbsp;"多云"},&nbsp; &nbsp; }&nbsp; &nbsp; data = weather_data.get(location, {"celsius":&nbsp;20,&nbsp;"fahrenheit":&nbsp;68,&nbsp;"condition":&nbsp;"未知"})&nbsp; &nbsp;&nbsp;# 不区分大小写处理 unit 参数&nbsp; &nbsp; unit_lower = unit.lower()&nbsp;if&nbsp;unit&nbsp;else&nbsp;"celsius"&nbsp; &nbsp; temp = data[unit_lower]&nbsp; &nbsp; condition = data["condition"]&nbsp; &nbsp;&nbsp;return&nbsp;f"{location}当前{condition},气温{temp}°{'C'&nbsp;if&nbsp;unit_lower=='celsius'&nbsp;else&nbsp;'F'}"# 4. 用户对话messages = [&nbsp; &nbsp; {"role":&nbsp;"user",&nbsp;"content":&nbsp;"北京今天天气怎么样?"}]# 第一次请求:模型判断是否需要调用工具response = client.chat.completions.create(&nbsp; &nbsp; model="gpt-oss:20b", &nbsp;# 请替换为你在 Ollama 中实际使用的模型名称,例如:llama3.1, gemma, qwen2 等&nbsp; &nbsp; messages=messages,&nbsp; &nbsp; tools=tools,&nbsp; &nbsp; tool_choice="auto"&nbsp; &nbsp;# auto 让模型自主决定是否调用)# 获取模型返回的消息response_message = response.choices[0].messagetool_calls = response_message.tool_calls# 5. 如果模型决定调用工具,则处理调用请求if&nbsp;tool_calls:&nbsp; &nbsp;&nbsp;# 将模型的原始回复追加到对话历史&nbsp; &nbsp; messages.append(response_message)&nbsp; &nbsp;&nbsp;# 遍历模型请求的所有工具调用(本例只有一个)&nbsp; &nbsp;&nbsp;for&nbsp;tool_call&nbsp;in&nbsp;tool_calls:&nbsp; &nbsp; &nbsp; &nbsp; function_name = tool_call.function.name&nbsp; &nbsp; &nbsp; &nbsp; function_args = json.loads(tool_call.function.arguments)&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 执行对应的函数&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;function_name ==&nbsp;"get_current_weather":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = get_current_weather(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location=function_args.get("location"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unit=function_args.get("unit",&nbsp;"celsius")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result =&nbsp;f"未知工具:&nbsp;{function_name}"&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 将工具执行结果作为新消息加入历史&nbsp; &nbsp; &nbsp; &nbsp; messages.append({&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"role":&nbsp;"tool",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"tool_call_id": tool_call.id,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"content": result&nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp;&nbsp;# 6. 第二次请求:将工具结果发回模型,生成最终答案&nbsp; &nbsp; final_response = client.chat.completions.create(&nbsp; &nbsp; &nbsp; &nbsp; model="gpt-oss:20b", &nbsp;# 请替换为你在 Ollama 中实际使用的模型名称,例如:llama3.1, gemma, qwen2 等&nbsp; &nbsp; &nbsp; &nbsp; messages=messages,&nbsp; &nbsp; )&nbsp; &nbsp; final_answer = final_response.choices[0].message.content&nbsp; &nbsp;&nbsp;print("最终答案:", final_answer)else:&nbsp; &nbsp;&nbsp;# 模型未调用工具,直接输出回复&nbsp; &nbsp;&nbsp;print("直接回复:", response_message.content)

这个例子用的模型是 gtp-oss:20b,它也有 tool calls 的能力,这段代码演示了 tool calls 的用法,可以理解为 tool calls 就是大模型调函数。

目前 OpenClaw、Claud Code 等 agent 都有工具调用的能力,它们的原始能力就是 tool calls。

具体做法如下:

以 Claude Code 调用 grep 命令为例,首先大模型返回一个 tool_use 块,内容如下:

{&nbsp;&nbsp;"name":&nbsp;"Bash",&nbsp;&nbsp;"input": {&nbsp; &nbsp;&nbsp;"command":&nbsp;"grep -r&nbsp;\"function\"&nbsp;--include=\"*.js\"&nbsp;."&nbsp; }}

后续步骤:

  1. 宿主程序(Claude Code CLI)拦截这个 JSON,并没有再次请求模型,而是在真实的终端里执行 grep

  2. 宿主程序捕获命令的退出码(exit code)、stdoutstderr

  3. 宿主程序将结果封装成新的 tool_result 消息发回给模型。

  4. 模型分析结果,决定是继续执行下一条命令,还是给出最终答案。

模型本身并不直接执行 exec 系统调用,它只是“建议”执行某条命令,由宿主程序作为代理去执行。

命令行调用是 Tool Calls 的一种具体实现形式,Agent 对 Tool Calls 进行了进一步的封装,增加了状态管理、对话树等结构。

大模型是无状态的,Agent 的本质是“状态管理器”。

Claude Code 等工具利用模型的原生 Tool Calls 能力输出指令,再由一个高性能的宿主程序(Rust/Go/TypeScript 编写)去执行这些指令,并通过精密的 Prompt Engineering 和历史管理,让模型产生“我在操作电脑”的连贯感知。

Tool Calls 是实现手段,而对话树、状态维护、流式执行是赋予其“Agent 智能”的工程架构。

理解了 Tool Calls,基本上就理解了 OpenClaw、Claud Code 等 agent 的能力来源。

全文完。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:生有可恋 hyang0 hyang0《大模型的 tool calls 能力》

大模型的toolcalls能力 网络安全文章

大模型的toolcalls能力

文章总结: 本文介绍了大模型的toolcalls(工具调用)能力,解释了其含义、工作机制,并通过示例代码演示了如何让模型调用外部工具(如查询天气函数)来增强自身
评论:0   参与:  0