Agent开发必看!DeepSeek-V3 Function Calling从原理到落地:教你让大模型“自己调用工具查天气、跑数据”
Function Calling 是大模型进化为 Agent 的 “核心中介技术”,而 DeepSeek-V3 为这一技术提供了便捷的实战载体。其核心逻辑是 “两次模型交互 + 一次工具执行”:第一次让模型判断 “要不要调用工具、调用哪个”,第二次让模型分析 “工具结果” 并生成答案。对开发者而言,从 “理解原理” 到 “实战落地”,关键在于:明确函数描述格式、掌握工具调用流程、做好 API 安全
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】
清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷】
文章目录
GPT多模态大模型与AI Agent智能体系列二百二十一
Agent开发必看!DeepSeek-V3 Function Calling从原理到落地:教你让大模型“自己调用工具查天气、跑数据”
在AI智能体(Agent)开发中,“让大模型调用外部工具”是绕不开的关键环节——如果没有工具调用能力,大模型顶多是个“能聊天的文本生成器”,连实时查天气、调用API、处理数据都做不到。而Function Calling(函数调用) 正是解决这一痛点的核心技术:它像一座“中介桥梁”,一边承接大模型的决策请求,一边调用外部工具(如天气API、数据库、代码解释器),最终让大模型从“被动对话”升级为“主动执行任务”的Agent。
本文以DeepSeek-V3-0324模型为例,从技术概念、实战准备(OpenWeather API)、完整执行流程到函数封装,全方位拆解Function Calling的原理与落地细节,帮开发者快速掌握“让大模型干活”的核心能力。
一、为什么Function Calling是Agent的“灵魂”?技术概念解析
大模型本身存在一个致命局限:无法直接与外部工具通信。比如用户问“北京今天天气怎么样”,DeepSeek-V3能理解意图,但它没有“实时获取天气数据”的接口;想让它“分析Excel里的销售数据”,它也不能直接读取本地文件——这也是传统聊天机器人与智能体(Agent)的本质区别:前者只输出信息,后者能执行任务。
而Function Calling的核心作用,就是填补“大模型”与“外部工具”之间的鸿沟,其技术逻辑可概括为“三步中介”:
- 大模型发起请求:用户提出需求(如查天气),开发者将“可调用的外部函数信息”(如函数名、功能描述、参数格式)传给大模型,大模型通过推理判断“需要调用该函数”;
- 外部工具执行任务:Function Calling接收大模型的“调用指令”(含函数名、参数),触发本地或云端的外部工具(如天气API、代码脚本)执行任务,获取结果;
- 结果返回与整理:Function Calling将工具执行结果回传给大模型,大模型分析结果后,用自然语言输出最终答案(如“北京今天阴,气温11.11°C”)。
简单说,Function Calling就像大模型的“专属助理”:大模型负责“判断要不要干活、干哪件活”,Function Calling负责“联系工具、把活干了、把结果带回来”,二者配合实现Agent的“自主执行能力”。
二、实战准备:OpenWeather API注册与数据获取(Function Calling的“工具载体”)
要实现“查天气”的Function Calling案例,首先需要一个能提供实时天气数据的外部工具——OpenWeather API(免费且易上手)。这部分虽标注“选学”,却是理解Function Calling实战的关键,步骤如下:
2.1 OpenWeather API Key获取流程(核心前提)
API Key是调用外部服务的“身份凭证”,防止接口被滥用,获取步骤清晰且无需科学上网:
- 注册账号:访问OpenWeather官网(https://openweathermap.org/),点击“Sign→Create Account”,用国内邮箱(如QQ邮箱)即可注册;
- 获取API Key:注册完成后,进入“API Keys”页面,系统会自动生成一个激活的API Key(若未生成,可手动点击“Create Key”创建);
- 设置环境变量:为避免API Key硬编码在代码中导致泄露,需将其设为系统环境变量(变量名建议为
OPENWEATHER_API_KEY
)。设置方法参考:Windows用“环境变量”面板,Linux/macOS在终端执行export OPENWEATHER_API_KEY="你的Key"
。
2.2 用OpenWeather API获取实时天气(工具调用测试)
获取API Key后,可通过Python代码调用API获取天气数据,核心步骤如下:
- 导入依赖库:需
os
(读取环境变量)、requests
(发送HTTP请求); - 读取API Key与构造请求:从环境变量中读取Key,指定城市(需英文,如“Beijing”,中文会导致识别失败)、单位(如“metric”代表摄氏度),构造API请求URL;
- 发送请求与解析结果:用
requests.get()
发送请求,若返回状态码为200(代表请求成功),用response.json()
解析JSON格式的天气数据(包含气温、湿度、风速等信息)。
示例代码片段(关键部分):
import os
import requests
# 读取环境变量中的API Key
open_weather_key = os.getenv("OPENWEATHER_API_KEY")
# 构造请求参数(城市:北京,单位:摄氏度)
city = "Beijing"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={open_weather_key}&units=metric"
# 发送请求并解析
response = requests.get(url)
if response.status_code == 200:
weather_data = response.json()
# 提取关键信息(气温、体感温度、湿度)
temp = weather_data["main"]["temp"]
feels_like = weather_data["main"]["feels_like"]
humidity = weather_data["main"]["humidity"]
print(f"北京当前气温:{temp}°C,体感温度:{feels_like}°C,湿度:{humidity}%")
else:
print(f"请求失败,状态码:{response.status_code}")
这一步的核心目的是验证“外部工具可正常调用”,为后续Function Calling对接大模型打下基础。
三、核心流程:DeepSeek-V3 Function Calling的“两次交互”(从请求到答案)
Function Calling的完整执行并非“一次调用模型就结束”,而是需要“两次模型交互+一次工具执行”,即First response(第一次请求模型,获取工具调用指令) 和Second response(第二次请求模型,生成最终答案)。这是开发者最容易混淆的部分,需逐步拆解:
3.1 First response:模型返回“工具调用指令”(不直接回答)
当用户提出“查北京天气”的需求时,第一次调用DeepSeek-V3模型,核心是“告诉模型有哪些可用函数”,让模型判断是否需要调用工具。
步骤1:定义“函数描述信息”(关键!模型靠这个识别函数)
需将外部函数(如get_weather
)的信息按指定格式传给模型,格式为functions
参数(list of dicts),每个dict包含3个核心键:
name
:函数名(字符串,需与实际函数名一致,仅含字母、数字、下划线、破折号,最长64字符);description
:函数功能描述(可选但必需,模型靠这个判断“何时该调用此函数”,描述越详细,模型判断越准确);parameters
:函数参数(必选,需符合JSON Schema格式,定义参数名、类型、是否必选、说明)。
以get_weather
函数为例,函数描述信息如下:
functions = [
{
"name": "get_weather",
"description": "获取指定城市的实时天气信息,城市名需为英文",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称(必须为英文,如Beijing、Shanghai)"
},
"unit": {
"type": "string",
"description": "温度单位,可选值:metric(摄氏度)、imperial(华氏度),默认metric"
}
},
"required": ["city"] # 必选参数:city
}
}
]
步骤2:调用模型,获取First response
构造messages
(包含用户问题),调用DeepSeek-V3的chat.completions.create()
,传入functions
参数,触发Function Calling功能:
from openai import OpenAI # DeepSeek API兼容OpenAI SDK格式
# 初始化客户端(base_url为DeepSeek API地址,api_key为你的DeepSeek Key)
client = OpenAI(api_key="你的DeepSeek API Key", base_url="https://api.deepseek.com")
# 构造用户消息
messages = [{"role": "user", "content": "查询北京今天的实时天气"}]
# 第一次调用模型(开启Function Calling)
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
functions=functions
)
步骤3:解析First response的“tool_calls”
此时模型不会直接输出天气答案,而是返回tool_calls
(代表“需要调用工具”),response.choices[0].message
的结构如下:
content
:为空(因为模型知道需调用工具,不生成文本回答);tool_calls
:列表,每个元素为ChatCompletionMessageToolCall
对象,包含:id
:工具调用请求ID(唯一标识);function
:函数调用信息(name
为函数名,arguments
为JSON格式的参数);type
:调用类型(固定为“function”)。
需提取function
的name
(函数名)和arguments
(参数),代码如下:
message = response.choices[0].message
# 提取工具调用信息
if message.tool_calls:
tool_call = message.tool_calls[0]
function_name = tool_call.function.name # 提取函数名:"get_weather"
function_args = eval(tool_call.function.arguments) # 提取参数:{"city": "Beijing", "unit": "metric"}
步骤4:本地执行函数(模型不执行,仅返回指令)
DeepSeek-V3仅负责“判断调用哪个函数、传什么参数”,不执行函数逻辑,因此需在本地实现get_weather
函数,并传入function_args
执行,获取天气数据:
def get_weather(city, unit="metric"):
"""本地实现的天气查询函数"""
open_weather_key = os.getenv("OPENWEATHER_API_KEY")
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={open_weather_key}&units={unit}"
response = requests.get(url)
if response.status_code == 200:
return response.json() # 返回JSON格式的天气数据
else:
return f"请求失败,状态码:{response.status_code}"
# 执行函数(用**将字典参数转为函数参数)
weather_result = get_weather(** function_args)
这里的**function_args
是Python的便捷语法,可将{"city": "Beijing", "unit": "metric"}
转为city="Beijing", unit="metric"
,避免手动拆解参数。
3.2 Second response:模型基于“工具结果”生成最终答案
第一次交互获取了“天气数据”,第二次交互需将该结果传给模型,让模型分析并输出自然语言答案。
步骤1:构造“function message”(传递工具执行结果)
需将工具执行结果封装为function
角色的消息,追加到messages
中,格式要求:
role
:固定为“function”;name
:调用的函数名(需与First response中的function_name
一致);content
:工具执行结果(如JSON格式的天气数据,需转为字符串)。
代码如下:
# 追加First response的tool_calls消息(assistant角色)
messages.append(message)
# 追加function message(工具执行结果)
messages.append({
"role": "function",
"name": function_name,
"content": str(weather_result) # 转为字符串,符合message格式要求
})
步骤2:第二次调用模型,获取最终答案
再次调用DeepSeek-V3,此时无需传入functions
(模型已知道工具调用完成),仅传入更新后的messages
:
# 第二次调用模型
second_response = client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
# 提取最终答案
final_answer = second_response.choices[0].message.content
print(final_answer)
# 输出示例:北京今天天气阴,多云,当前气温为11.11°C,体感温度8.82°C。湿度21%,能见度良好(10公里),风速2.08米/秒。
此时second_response.choices[0].message.finish_reason
为“stop”,代表模型已完成分析,无需进一步工具调用。
四、完整函数封装:让Function Calling流程“可复用”
为避免每次调用都重复写代码,可将“两次模型交互+工具执行”的流程封装为一个完整函数,实现“输入用户问题,输出最终答案”的自动化:
def agent_weather_query(user_question, deepseek_api_key):
"""
DeepSeek-V3 Function Calling天气查询Agent
:param user_question: 用户问题(如“查北京天气”)
:param deepseek_api_key: DeepSeek API Key
:return: 最终天气答案
"""
# 1. 初始化客户端
client = OpenAI(api_key=deepseek_api_key, base_url="https://api.deepseek.com")
# 2. 定义函数描述
functions = [
{
"name": "get_weather",
"description": "获取指定城市的实时天气信息,城市名需为英文",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名(英文)"},
"unit": {"type": "string", "description": "温度单位,默认metric(摄氏度)"}
},
"required": ["city"]
}
}
]
# 3. 第一次调用模型(获取tool_calls)
messages = [{"role": "user", "content": user_question}]
first_response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
functions=functions
)
first_message = first_response.choices[0].message
if not first_message.tool_calls:
return "模型未触发工具调用,无法获取天气数据"
# 4. 执行工具函数
tool_call = first_message.tool_calls[0]
function_name = tool_call.function.name
function_args = eval(tool_call.function.arguments)
weather_result = get_weather(** function_args)
# 5. 第二次调用模型(生成最终答案)
messages.append(first_message)
messages.append({
"role": "function",
"name": function_name,
"content": str(weather_result)
})
second_response = client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
return second_response.choices[0].message.content
# 调用封装函数
result = agent_weather_query("查上海今天的天气", "你的DeepSeek API Key")
print(result)
封装后,只需传入用户问题和API Key,即可快速获取天气答案,可轻松扩展到其他场景(如查股票、查快递)——只需替换functions
和对应的工具函数即可。
五、关键注意事项与技术价值
5.1 开发者必踩的3个坑
- 函数描述(description)不清晰:模型靠
description
判断是否调用函数,若描述模糊(如“获取天气”),模型可能不触发工具调用;需精确(如“获取指定英文城市的实时天气,含气温、湿度、风速”); - API Key泄露:切勿将API Key硬编码在代码中,务必通过环境变量或配置文件读取;
- 参数格式错误:
parameters
需严格符合JSON Schema格式,必选参数(如city
)必须标注,否则模型可能传错参数。
5.2 Function Calling的技术价值
对开发者而言,掌握DeepSeek-V3的Function Calling意味着:
- 快速搭建Agent:无需从零开发“决策逻辑”,借助大模型的推理能力,只需封装外部工具函数,即可实现“能干活的Agent”(如天气助手、数据分析助手);
- 扩展大模型边界:让大模型从“文本生成”延伸到“实际任务执行”,可对接数据库、API、本地脚本等,覆盖企业办公、个人效率等场景;
- 降低开发门槛:DeepSeek-V3兼容OpenAI SDK,无需学习新框架,熟悉Python即可上手。
六、总结
Function Calling是大模型进化为Agent的“核心中介技术”,而DeepSeek-V3为这一技术提供了便捷的实战载体。其核心逻辑是“两次模型交互+一次工具执行”:第一次让模型判断“要不要调用工具、调用哪个”,第二次让模型分析“工具结果”并生成答案。
对开发者而言,从“理解原理”到“实战落地”,关键在于:明确函数描述格式、掌握工具调用流程、做好API安全防护。一旦掌握,不仅能快速搭建天气查询这类简单Agent,还能扩展到更复杂的场景(如多工具协同、批量数据处理),真正让大模型从“聊天工具”变为“生产力助手”。
更多技术内容
更多技术内容可参见
清华《GPT多模态大模型与AI Agent智能体》书籍配套视频【陈敬雷】。
更多的技术交流和探讨也欢迎加我个人微信chenjinglei66。
总结
此文章有对应的配套新书教材和视频:
【配套新书教材】
《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】
新书特色:《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)是一本2025年清华大学出版社出版的图书,作者是陈敬雷,本书深入探讨了GPT多模态大模型与AI Agent智能体的技术原理及其在企业中的应用落地。
全书共8章,从大模型技术原理切入,逐步深入大模型训练及微调,还介绍了众多国内外主流大模型。LangChain技术、RAG检索增强生成、多模态大模型等均有深入讲解。对AI Agent智能体,从定义、原理到主流框架也都进行了深入讲解。在企业应用落地方面,本书提供了丰富的案例分析,如基于大模型的对话式推荐系统、多模态搜索、NL2SQL数据即席查询、智能客服对话机器人、多模态数字人,以及多模态具身智能等。这些案例不仅展示了大模型技术的实际应用,也为读者提供了宝贵的实践经验。
本书适合对大模型、多模态技术及AI Agent感兴趣的读者阅读,也特别适合作为高等院校本科生和研究生的教材或参考书。书中内容丰富、系统,既有理论知识的深入讲解,也有大量的实践案例和代码示例,能够帮助学生在掌握理论知识的同时,培养实际操作能力和解决问题的能力。通过阅读本书,读者将能够更好地理解大模型技术的前沿发展,并将其应用于实际工作中,推动人工智能技术的进步和创新。
【配套视频】
清华《GPT多模态大模型与AI Agent智能体》书籍配套视频【陈敬雷】
视频特色: 前沿技术深度解析,把握行业脉搏
实战驱动,掌握大模型开发全流程
智能涌现与 AGI 前瞻,抢占技术高地
上一篇:《GPT多模态大模型与AI Agent智能体》系列一》大模型技术原理 - 大模型技术的起源、思想
下一篇:DeepSeek大模型技术系列五》DeepSeek大模型基础设施全解析:支撑万亿参数模型的幕后英雄
更多推荐
所有评论(0)