🌤️在人工智能快速发展的今天,大语言模型(Large Language Models, LLMs)已经成为人机交互的重要桥梁。然而,尽管LLMs具备强大的语言理解和生成能力,它们本质上仍受限于训练数据的时间范围——无法直接获取实时信息,例如当前的天气、股票价格或新闻事件。为了解决这一问题,业界普遍采用“工具调用”(Tool Calling)机制,让大模型能够动态调用外部API,从而与真实世界进行交互。本文将深入解析这一机制,并以一个完整的天气查询案例为核心,详细展开从代码实现到系统架构的全过程。
🔍 为什么大模型需要“工具”?
大语言模型如 DeepSeek、GPT、Qwen 等,其知识来源于预训练阶段所摄入的海量文本。这些文本通常截止于某个时间点(例如2024年或2025年初),因此模型不具备访问互联网的原生能力。当用户问出“北京今天天气怎么样?”这类问题时,模型若仅凭记忆回答,可能给出过时甚至错误的信息。
✅ 关键痛点:
- 实时性缺失
- 动态数据不可见
- 无法执行外部操作(如发送邮件、查数据库)
于是,“工具调用”应运而生。它允许大模型在推理过程中,识别出需要外部信息的任务,并主动请求调用预定义的函数(如 get_weather),再将结果整合进最终回答中。这相当于给AI装上了“手脚”,使其不仅能“思考”,还能“行动”。
⚙️ 工具调用的技术原理
OpenAI 在其 API 中率先标准化了工具调用流程,后续包括 DeepSeek、Anthropic、阿里通义等平台也纷纷跟进。其核心思想是:
- 定义工具(Tool Definition):以 JSON Schema 形式描述函数名称、参数、用途。
- 模型决策是否调用:LLM 分析用户输入后,决定是否需要调用工具。
- 返回函数调用请求:模型输出包含
tool_calls字段,指定要调用的函数及参数。 - 执行函数并回传结果:开发者代码执行该函数,将结果作为“工具消息”加入对话历史。
- 模型生成最终回答:基于原始问题 + 工具返回结果,生成自然语言回复。
整个过程构成一次多轮对话(Multi-turn Conversation),但对用户而言是透明的——仿佛AI“知道”实时天气。
🌦️ 实战案例:用 Python 实现天气查询工具
以下内容基于实际 Jupyter Notebook(.ipynb)文件中的代码逻辑,完整还原了从环境配置到最终交互的全流程。
第一步:安装依赖库
!pip install requests
!pip install openai
requests:用于发起 HTTP 请求,调用天气 API。openai:虽然名为 OpenAI,但兼容 DeepSeek 等支持 OpenAI 协议的模型服务。
💡 注意:此处使用的是 DeepSeek 的 API 接口(
base_url = 'https://api.deepseek.com/v1'),说明工具调用机制具有良好的跨平台兼容性。
第二步:编写天气查询函数
import requests
def get_weather(location: str) -> str:
url = "https://api.seniverse.com/v3/weather/now.json"
params = {
"key": "SaVSOt7sYbwpka9iv", # 心知天气 API 密钥
"location": location,
"language": "zh-Hans"
}
try:
resp = requests.get(url, params=params, timeout=10)
data = resp.json()
if "results" in data:
r = data["results"][0]
city = r["location"]["name"]
now = r["now"]
text = now["text"] # 如“晴”、“阴”
temp = now["temperature"] # 摄氏度
return f"{city}当前天气:{text}, 气温 {temp}度"
else:
return "查询失败"
except Exception as e:
return f"异常:{e}"
- 使用的是 心知天气 的免费 API。
- 函数接收城市名(如“抚州”),返回结构化字符串。
- 异常处理确保程序健壮性。
运行示例:
print(get_weather("抚州"))
# 输出:{'results': [...]}
# 抚州当前天气:阴, 气温 8度
第三步:定义 OpenAI 风格的工具描述
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如'北京'"
}
},
"required": ["location"]
}
}
}
]
- 这段 JSON 告诉模型:“你可以调用一个叫
get_weather的函数,它需要一个location参数。” - 模型在推理时会参考此 Schema,判断是否触发调用。
第四步:与大模型交互(多轮对话)
from openai import OpenAI
import json
client = OpenAI(
api_key='sk-b96af4b3f3f7406ca872a01ee7276f95',
base_url='https://api.deepseek.com/v1'
)
messages = [{"role": "user", "content": "北京天气怎么样"}]
# 第一轮:模型决定是否调用工具
response = client.chat.completions.create(
model='deepseek-reasoner',
messages=messages,
tools=tools,
tool_choice="auto",
temperature=0.3
)
response_message = response.choices[0].message
messages.append(response_message)
# 如果模型要求调用工具
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
if function_name == "get_weather":
function_response = get_weather(function_args["location"])
else:
function_response = "未知工具"
# 将工具执行结果加入对话历史
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response
})
# 第二轮:模型基于工具结果生成最终回答
final_response = client.chat.completions.create(
model="deepseek-reasoner",
messages=messages,
temperature=0.3
)
print(final_response.choices[0].message.content)
执行结果示例:
根据查询结果,北京当前天气情况:
- 天气状况:晴 ☀️
- 当前气温:3°C
今天北京天气不错,阳光明媚,但气温较低,建议您:
- 外出时注意保暖,穿着厚外套
- 由于天气晴朗,适合户外活动
- 早晚温差可能较大,注意适时增减衣物
需要了解未来几天的天气预报吗?我可以为您查询更详细的天气信息。
🧠 背后的智能:Reasoning Model 的作用
本例中使用的模型是 deepseek-reasoner,属于推理型大模型(Reasoning Model)。与普通生成模型不同,这类模型特别擅长:
- 任务分解:识别“天气查询”是一个需要外部数据的任务。
- 结构化输出:严格按照
tool_calls格式返回函数调用指令。 - 上下文融合:将工具返回的原始数据(如“晴, 3度”)转化为有温度、有建议的自然语言。
📌 Jupyter Notebook 的优势:
.ipynb文件支持逐单元格执行,非常适合调试此类多步骤流程。开发者可以:
- 先测试
get_weather函数是否正常- 再观察模型是否正确生成
tool_calls- 最后验证最终回答质量
这种模块化实验方式极大提升了开发效率。
🌐 更广阔的图景:智能互联网的崛起
正如文档中所言:
“llm 和原有的互联网文明桥接起来?智能互联网来了”
工具调用不仅是技术技巧,更是下一代人机交互范式的核心。未来,我们可以想象:
- 用户说:“帮我订一张明天去上海的高铁票” → LLM 调用 12306 API
- “把上周的销售数据画成折线图” → 调用数据库 + Matplotlib
- “提醒我每天早上8点吃药” → 调用日历/通知系统
这一切的前提,是建立一个标准化、安全、可组合的工具生态。目前,OpenAI 的 Function Calling、DeepSeek 的 Tool Use、阿里 ModelScope 的插件体系,都在朝这个方向迈进。
🛠️ 补充知识:关于 API 与安全性
- 心知天气 API:免费版有调用频率限制,生产环境需申请正式 Key。
- API Key 安全:示例中硬编码了 Key,实际项目应使用环境变量或密钥管理服务。
- 错误处理:网络超时、API 配额耗尽等情况需更完善的异常捕获。
- 多工具支持:可同时注册
get_weather、search_news、calculate等多个工具,模型自动选择。
📚 总结:从“知道”到“做到”
大语言模型正从“静态知识库”进化为“动态智能代理”。通过工具调用机制,我们赋予了 AI 获取实时信息、操作外部系统的能力。本文以天气查询为例,完整展示了:
- 如何定义工具(JSON Schema)
- 如何实现工具函数(Python + requests)
- 如何与支持工具调用的大模型(如 DeepSeek Reasoner)进行多轮交互
- 如何利用 Jupyter Notebook 进行高效实验
这不仅是技术实现,更是AI 应用范式的转变——未来的智能助手,不再是“会说话的百科全书”,而是“能办事的数字员工”。
🌟 正如那句注释所说:
“llm 调用 tools, 让 llm 和外界交流”
—— 这正是通往通用人工智能(AGI)的关键一步。