【AI-11 Python-1/Lesson35(2025-11-18)】大模型如何与现实世界对话:通过工具调用实现天气查询功能详解🌤️

82 阅读7分钟

🌤️在人工智能快速发展的今天,大语言模型(Large Language Models, LLMs)已经成为人机交互的重要桥梁。然而,尽管LLMs具备强大的语言理解和生成能力,它们本质上仍受限于训练数据的时间范围——无法直接获取实时信息,例如当前的天气、股票价格或新闻事件。为了解决这一问题,业界普遍采用“工具调用”(Tool Calling)机制,让大模型能够动态调用外部API,从而与真实世界进行交互。本文将深入解析这一机制,并以一个完整的天气查询案例为核心,详细展开从代码实现到系统架构的全过程。


🔍 为什么大模型需要“工具”?

大语言模型如 DeepSeek、GPT、Qwen 等,其知识来源于预训练阶段所摄入的海量文本。这些文本通常截止于某个时间点(例如2024年或2025年初),因此模型不具备访问互联网的原生能力。当用户问出“北京今天天气怎么样?”这类问题时,模型若仅凭记忆回答,可能给出过时甚至错误的信息。

关键痛点

  • 实时性缺失
  • 动态数据不可见
  • 无法执行外部操作(如发送邮件、查数据库)

于是,“工具调用”应运而生。它允许大模型在推理过程中,识别出需要外部信息的任务,并主动请求调用预定义的函数(如 get_weather),再将结果整合进最终回答中。这相当于给AI装上了“手脚”,使其不仅能“思考”,还能“行动”。


⚙️ 工具调用的技术原理

OpenAI 在其 API 中率先标准化了工具调用流程,后续包括 DeepSeek、Anthropic、阿里通义等平台也纷纷跟进。其核心思想是:

  1. 定义工具(Tool Definition):以 JSON Schema 形式描述函数名称、参数、用途。
  2. 模型决策是否调用:LLM 分析用户输入后,决定是否需要调用工具。
  3. 返回函数调用请求:模型输出包含 tool_calls 字段,指定要调用的函数及参数。
  4. 执行函数并回传结果:开发者代码执行该函数,将结果作为“工具消息”加入对话历史。
  5. 模型生成最终回答:基于原始问题 + 工具返回结果,生成自然语言回复。

整个过程构成一次多轮对话(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_weathersearch_newscalculate 等多个工具,模型自动选择。

📚 总结:从“知道”到“做到”

大语言模型正从“静态知识库”进化为“动态智能代理”。通过工具调用机制,我们赋予了 AI 获取实时信息、操作外部系统的能力。本文以天气查询为例,完整展示了:

  1. 如何定义工具(JSON Schema)
  2. 如何实现工具函数(Python + requests)
  3. 如何与支持工具调用的大模型(如 DeepSeek Reasoner)进行多轮交互
  4. 如何利用 Jupyter Notebook 进行高效实验

这不仅是技术实现,更是AI 应用范式的转变——未来的智能助手,不再是“会说话的百科全书”,而是“能办事的数字员工”。

🌟 正如那句注释所说:
“llm 调用 tools, 让 llm 和外界交流”
—— 这正是通往通用人工智能(AGI)的关键一步。