大模型Function Call案例实战
【摘要】 我给你写一个完全贴近工业界真实场景的 Function Call 完整代码,基于 OpenAI API(国内也可替换为通义千问/文心一言),包含真实的模型决策、工具调用、结果整合全流程,注释详细,可直接运行。 前置准备安装依赖:pip install openai python-dotenv新建 .env 文件,填入你的 OpenAI API Key:OPENAI_API_KEY=your_...
我给你写一个完全贴近工业界真实场景的 Function Call 完整代码,基于 OpenAI API(国内也可替换为通义千问/文心一言),包含真实的模型决策、工具调用、结果整合全流程,注释详细,可直接运行。
前置准备
- 安装依赖:
pip install openai python-dotenv
- 新建
.env文件,填入你的 OpenAI API Key:
OPENAI_API_KEY=your_api_key_here
完整可运行代码
import json
import os
from dotenv import load_dotenv
from openai import OpenAI
# 加载环境变量
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# ====================== 第一步:定义真实的工具函数(模拟天气API) ======================
def get_weather(city: str, date: str = None) -> dict:
"""
模拟第三方天气查询接口(实际场景可替换为高德/百度天气API)
:param city: 城市名称
:param date: 查询日期(格式:YYYY-MM-DD),默认今日
:return: 天气信息字典
"""
# 模拟不同城市/日期的天气数据(实际场景替换为真实API调用)
mock_weather_data = {
"北京-2026-03-23": {"weather": "晴", "temp": "8~20℃", "wind": "微风"},
"上海-2026-03-23": {"weather": "多云", "temp": "10~22℃", "wind": "东风3级"},
"广州-2026-03-23": {"weather": "小雨", "temp": "18~25℃", "wind": "南风2级"},
# 默认今日数据
"北京": {"weather": "晴转多云", "temp": "7~19℃", "wind": "微风"},
"上海": {"weather": "阴", "temp": "9~21℃", "wind": "东风2级"},
"广州": {"weather": "中雨", "temp": "17~24℃", "wind": "南风3级"},
}
# 拼接查询键值
query_key = f"{city}-{date}" if date else city
# 获取天气数据,无匹配则返回默认提示
weather_info = mock_weather_data.get(query_key, {"weather": "暂无数据", "temp": "未知", "wind": "未知"})
return {
"city": city,
"date": date or "今日",
"weather": weather_info["weather"],
"temperature": weather_info["temp"],
"wind": weather_info["wind"]
}
# ====================== 第二步:定义工具描述(给大模型看的元数据) ======================
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市指定日期的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称(如:北京、上海、广州)",
"required": True
},
"date": {
"type": "string",
"description": "查询日期,格式为YYYY-MM-DD,可选,默认查询今日",
"required": False
}
},
"required": ["city"]
}
}
}
]
# ====================== 第三步:工具调用执行器(程序侧核心) ======================
def execute_tool(function_name: str, function_params: dict) -> dict:
"""
根据模型输出的函数名和参数,执行对应的工具函数
:param function_name: 模型指定的工具名
:param function_params: 模型指定的工具参数
:return: 工具执行结果
"""
tool_executors = {
"get_weather": get_weather # 工具名与实际函数的映射(核心!必须手写)
}
# 检查工具是否存在
if function_name not in tool_executors:
return {"error": f"未知工具:{function_name}"}
# 执行工具函数
try:
return tool_executors[function_name](**function_params)
except Exception as e:
return {"error": f"工具执行失败:{str(e)}"}
# ====================== 第四步:完整的Function Call流程 ======================
def chat_with_function_call(user_query: str) -> str:
"""
完整的对话流程:模型决策 → 工具调用 → 结果整合
:param user_query: 用户提问
:return: 最终回答
"""
print(f"👉 用户提问:{user_query}\n")
# 第一步:调用大模型,让模型决策是否调用工具
response = client.chat.completions.create(
model="gpt-3.5-turbo", # 也可替换为gpt-4
messages=[{"role": "user", "content": user_query}],
tools=tools, # 告诉模型可用的工具
tool_choice="auto" # 让模型自主决定是否调用工具
)
llm_response = response.choices[0].message
print(f"📝 模型原始响应:{llm_response}\n")
# 第二步:判断模型是否需要调用工具
if llm_response.tool_calls:
# 遍历模型指定的工具调用(支持多工具调用)
tool_results = []
for tool_call in llm_response.tool_calls:
func_name = tool_call.function.name
func_params = json.loads(tool_call.function.arguments)
print(f"🔧 模型决定调用工具:{func_name}")
print(f"📌 工具参数:{func_params}\n")
# 执行工具调用
tool_result = execute_tool(func_name, func_params)
tool_results.append(tool_result)
print(f"✅ 工具执行结果:{json.dumps(tool_result, ensure_ascii=False, indent=2)}\n")
# 第三步:将工具结果返回给模型,让模型生成自然语言回答
final_response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": user_query}, # 原始问题
llm_response, # 模型的工具调用决策
# 把工具结果作为新的消息传给模型
{"role": "tool", "content": json.dumps(tool_results, ensure_ascii=False)}
]
)
final_answer = final_response.choices[0].message.content
else:
# 模型不需要调用工具,直接回答
final_answer = llm_response.content
print(f"🎯 最终回答:{final_answer}\n")
return final_answer
# ====================== 测试运行 ======================
if __name__ == "__main__":
# 测试案例1:基础天气查询
chat_with_function_call("北京明天天气怎么样?")
# 测试案例2:多参数查询
# chat_with_function_call("查询上海2026-03-23的天气")
# 测试案例3:不需要调用工具的场景
# chat_with_function_call("介绍一下人工智能")
代码核心说明
- 工具函数层:
get_weather模拟真实的第三方API,实际项目中可替换为高德/百度天气API的调用逻辑; - 工具描述层:
tools是给大模型的“使用手册”,定义了工具名、功能、参数要求,模型会基于此输出规范的调用指令; - 执行器层:
execute_tool是程序侧的核心——手动映射工具名和实际函数,处理调用逻辑和异常,这部分必须手写; - 完整流程层:
chat_with_function_call实现了工业界标准的Function Call流程:- 模型接收问题+工具描述 → 决策是否调用工具;
- 程序解析模型的调用指令 → 执行工具;
- 工具结果回传给模型 → 模型生成自然语言回答。
运行效果示例
👉 用户提问:北京明天天气怎么样?
📝 模型原始响应:ChatCompletionMessage(content=None, role='assistant', function_call=FunctionCall(arguments='{"city":"北京","date":"2026-03-23"}', name='get_weather'), tool_calls=[ToolCall(id='call_xxx', function=FunctionCall(arguments='{"city":"北京","date":"2026-03-23"}', name='get_weather'), type='function')])
🔧 模型决定调用工具:get_weather
📌 工具参数:{'city': '北京', 'date': '2026-03-23'}
✅ 工具执行结果:
{
"city": "北京",
"date": "2026-03-23",
"weather": "晴",
"temperature": "8~20℃",
"wind": "微风"
}
🎯 最终回答:北京2026年03月23日的天气为晴,气温在8~20℃之间,伴有微风,整体天气状况良好,适合出行。
总结
- 核心分工:模型负责“决策调用哪个工具、传什么参数”,程序负责“解析指令、执行工具、返回结果”;
- 关键映射:
tool_executors字典是工具名和实际函数的核心映射,必须手动定义; - 真实场景适配:只需替换
get_weather为真实API调用,即可无缝迁移到生产环境。
这套代码完全符合工业界落地逻辑,面试时可以直接讲解代码结构+执行流程,面试官会认可你的工程落地能力。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)