让大模型“联网”:用工具调用打通 LLM 与现实世界

7 阅读5分钟

作者:一位在魔搭上探索 AI 的开发者
时间:2025 年 12 月


🧠 背景:大模型的“知识边界”

大型语言模型(LLM)如 DeepSeek、GPT 等,在海量文本上预训练后,具备了强大的推理、写作和对话能力。但它们有一个天然限制:无法获取训练数据截止之后的实时信息。比如:

  • “今天北京天气如何?”
  • “现在比特币价格是多少?”
  • “抚州明天会不会下雨?”

这些问题的答案不在模型参数中,而是存在于外部世界——需要通过 API、数据库或网络服务实时获取。

于是,一个关键问题浮现:如何让 LLM 主动“使用工具”去查询外部信息?

答案就是:Function Calling(函数调用)或 Tool Use(工具调用)机制


🔧 核心思想:LLM + Tools = 智能代理

现代 LLM 接口(如 OpenAI 的 chat.completions)支持一种特殊能力:当用户提问涉及实时或外部数据时,模型可以“决定”调用一个预定义的工具函数,而不是直接生成答案。

这个过程通常分三步:

  1. 用户提问(如“抚州天气怎么样?”)
  2. LLM 分析问题,判断是否需要调用工具 → 返回一个 tool_call 指令
  3. 程序执行对应函数(如调用天气 API) ,将结果作为“工具响应”传回
  4. LLM 再次生成最终回答,整合工具返回的真实数据

这就形成了一个闭环的智能代理系统,让 LLM 不再是“闭门造车”,而是能与真实世界互动的“智能体”。


🛠️ 实战:在 Jupyter Notebook 中实现天气查询工具

我们以“查询城市天气”为例,完整演示这一流程。

第一步:准备工具函数

首先,我们需要一个能调用天气 API 的 Python 函数。这里使用 心知天气 的免费接口:

import requests

def get_weather(location: str) -> str:
    url = "https://api.seniverse.com/v3/weather/now.json"
    params = {
        "key": ".........",  # 替换为你自己的 API Key
        "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}"

✅ 这个函数接收城市名,返回结构化天气描述,是典型的“工具函数”。


第二步:定义工具 Schema(供 LLM 理解)

为了让 LLM 知道“有哪些工具可用”,我们需要用 JSON Schema 描述工具:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",  # 必须与函数名一致
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市名称,如'北京'"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

📌 注意:虽然示例中曾误写为 get_weather0,但函数名必须与实际 Python 函数一致,否则后续调用会失败。


第三步:调用支持 Tool Use 的 LLM

我们使用 DeepSeek 提供的 OpenAI 兼容接口(部署在 https://api.deepseek.com/v1):

from openai import OpenAI
import json

client = OpenAI(
    api_key='...........', # 替换为你自己的 API Key
    base_url='https://api.deepseek.com/v1'
)

然后发起对话:

messages = [{"role": "user", "content": "北京天气怎么样?"}]

# 第一次调用:可能触发 tool_call
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)  # 保存模型回复(含 tool_call)

如果模型认为需要查天气,response_message.tool_calls 将非空。


第四步:执行工具并返回结果

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
        })

第五步:生成最终回答

最后,再次调用 LLM,传入完整的对话历史(包括工具结果):

final_response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=messages,
    temperature=0.3
)
print(final_response.choices[0].message.content)

✅ 输出示例:

北京当前天气:多云,气温17度。


💡 为什么这很重要?

  1. 突破知识时效性限制:LLM 可以获取最新新闻、股价、天气、航班等。
  2. 构建智能 Agent:结合多个工具(搜索、计算、数据库查询),可实现复杂任务自动化。
  3. 安全可控:工具由开发者定义,避免模型“胡编乱造”。
  4. 模块化设计:工具可复用、可测试、可替换。

🌱 魔搭:降低 AI 应用门槛的开放平台

整个实验是在 魔搭(ModelScope) 上完成的。作为阿里云推出的模型开放平台,魔搭提供了:

  • 海量开源模型(NLP、CV、语音等)
  • 一键微调与部署能力
  • 丰富的示例与 Notebook 环境
  • 与主流框架(PyTorch、TensorFlow)无缝集成

配合 Jupyter Notebook 的交互式特性,开发者可以逐行调试、即时验证,极大提升实验效率。

🐍 Python 天生适合数据科学与机器学习,而 .ipynb 文件正是探索算法、验证想法的最佳载体。


🚀 展望:智能互联网的未来

当 LLM 能够自由调用工具,它就不再是“静态的知识库”,而是一个能思考、能行动、能学习的数字智能体

未来的应用场景包括:

  • 智能客服自动查询订单状态
  • 个人助理帮你订机票、查日程
  • 科研助手自动检索论文并总结
  • 教育机器人实时解答学生问题

而这背后的核心技术之一,正是我们今天实践的——Tool Use


✅ 总结

步骤关键点
1. 定义工具函数get_weather(location)
2. 描述工具 SchemaJSON 格式,供 LLM 理解
3. 调用支持 Tool 的 LLM使用 toolstool_choice 参数
4. 执行工具并返回结果解析 tool_calls,运行函数
5. 生成最终回答将工具结果融入上下文

通过这套机制,我们成功让 LLM “走出幻觉”,拥抱真实世界 🌍。


动手试试吧!
在魔搭上加载一个 Reasoning 模型,写一个属于你自己的工具——也许是查快递、算汇率、甚至控制智能家居。
AI 的未来,不在云端,而在你手中的代码里。 💻✨


本文所有代码均可在交互式 Notebook 中运行,建议结合调试日志观察每一步的输出,加深理解。