作者:一位在魔搭上探索 AI 的开发者
时间:2025 年 12 月
🧠 背景:大模型的“知识边界”
大型语言模型(LLM)如 DeepSeek、GPT 等,在海量文本上预训练后,具备了强大的推理、写作和对话能力。但它们有一个天然限制:无法获取训练数据截止之后的实时信息。比如:
- “今天北京天气如何?”
- “现在比特币价格是多少?”
- “抚州明天会不会下雨?”
这些问题的答案不在模型参数中,而是存在于外部世界——需要通过 API、数据库或网络服务实时获取。
于是,一个关键问题浮现:如何让 LLM 主动“使用工具”去查询外部信息?
答案就是:Function Calling(函数调用)或 Tool Use(工具调用)机制。
🔧 核心思想:LLM + Tools = 智能代理
现代 LLM 接口(如 OpenAI 的 chat.completions)支持一种特殊能力:当用户提问涉及实时或外部数据时,模型可以“决定”调用一个预定义的工具函数,而不是直接生成答案。
这个过程通常分三步:
- 用户提问(如“抚州天气怎么样?”)
- LLM 分析问题,判断是否需要调用工具 → 返回一个
tool_call指令 - 程序执行对应函数(如调用天气 API) ,将结果作为“工具响应”传回
- 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度。
💡 为什么这很重要?
- 突破知识时效性限制:LLM 可以获取最新新闻、股价、天气、航班等。
- 构建智能 Agent:结合多个工具(搜索、计算、数据库查询),可实现复杂任务自动化。
- 安全可控:工具由开发者定义,避免模型“胡编乱造”。
- 模块化设计:工具可复用、可测试、可替换。
🌱 魔搭:降低 AI 应用门槛的开放平台
整个实验是在 魔搭(ModelScope) 上完成的。作为阿里云推出的模型开放平台,魔搭提供了:
- 海量开源模型(NLP、CV、语音等)
- 一键微调与部署能力
- 丰富的示例与 Notebook 环境
- 与主流框架(PyTorch、TensorFlow)无缝集成
配合 Jupyter Notebook 的交互式特性,开发者可以逐行调试、即时验证,极大提升实验效率。
🐍 Python 天生适合数据科学与机器学习,而
.ipynb文件正是探索算法、验证想法的最佳载体。
🚀 展望:智能互联网的未来
当 LLM 能够自由调用工具,它就不再是“静态的知识库”,而是一个能思考、能行动、能学习的数字智能体。
未来的应用场景包括:
- 智能客服自动查询订单状态
- 个人助理帮你订机票、查日程
- 科研助手自动检索论文并总结
- 教育机器人实时解答学生问题
而这背后的核心技术之一,正是我们今天实践的——Tool Use。
✅ 总结
| 步骤 | 关键点 |
|---|---|
| 1. 定义工具函数 | 如 get_weather(location) |
| 2. 描述工具 Schema | JSON 格式,供 LLM 理解 |
| 3. 调用支持 Tool 的 LLM | 使用 tools 和 tool_choice 参数 |
| 4. 执行工具并返回结果 | 解析 tool_calls,运行函数 |
| 5. 生成最终回答 | 将工具结果融入上下文 |
通过这套机制,我们成功让 LLM “走出幻觉”,拥抱真实世界 🌍。
动手试试吧!
在魔搭上加载一个 Reasoning 模型,写一个属于你自己的工具——也许是查快递、算汇率、甚至控制智能家居。
AI 的未来,不在云端,而在你手中的代码里。 💻✨
本文所有代码均可在交互式 Notebook 中运行,建议结合调试日志观察每一步的输出,加深理解。