当前位置: 首页 > backend >正文

Function Calling的时序图(含示例)

🧍 用户:

发起请求,输入 prompt(比如:“请告诉我北京的天气”)。

🟪 应用:

将用户输入的 prompt 和函数定义(包括函数名、参数结构等)一起发给 OpenAI。

接收 OpenAI 返回的「函数调用参数」。

根据这些参数,调用本地或后端实现的实际函数(比如:天气 API)。

获取函数返回的结果。

🟩 OpenAI:

接收到 prompt + function 定义后,判断是否应该调用某个函数。

如果模型决定调用函数,就返回相应函数名和参数。

应用调用完函数并把结果发回来后,OpenAI 生成自然语言的回答。

时序图:

在这里插入图片描述
示例:

# === 标准库 ===
import json
import math# === 第三方库 ===
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv# === 环境变量初始化 ===
_ = load_dotenv(find_dotenv())# === OpenAI 客户端 ===
client = OpenAI()# === 工具函数:格式化打印 JSON ===
def print_json(data):"""打印参数。如果参数是结构化(如 dict 或 list),则格式化打印;否则直接输出。"""if hasattr(data, 'model_dump_json'):data = json.loads(data.model_dump_json())if isinstance(data, list):for item in data:print_json(item)elif isinstance(data, dict):print(json.dumps(data, indent=4, ensure_ascii=False))else:print(data)# === 核心功能函数:与大模型对话 ===
def get_completion(messages, model="gpt-4o-mini"):response = client.chat.completions.create(model=model,messages=messages,temperature=0.7,tools=[{"type": "function","function": {"name": "sum","description": "加法器,计算一组数的和","parameters": {"type": "object","properties": {"numbers": {"type": "array","items": {"type": "number"}}}}}}],)return response.choices[0].message# === 主逻辑 ===
prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."messages = [{"role": "system", "content": "你是一个数学家"},{"role": "user", "content": prompt}
]response = get_completion(messages)
messages.append(response)if response.tool_calls:tool_call = response.tool_calls[0]if tool_call.function.name == "sum":args = json.loads(tool_call.function.arguments)result = sum(args["numbers"])messages.append({"tool_call_id": tool_call.id,"role": "tool","name": "sum","content": str(result)})response = get_completion(messages)messages.append(response)print("=====最终 GPT 回复=====")print(response.content)print("=====对话历史=====")
print_json(messages)
http://www.xdnf.cn/news/339.html

相关文章:

  • 2025年第十六届蓝桥杯Python程序设计赛道B组
  • 启动vite项目报Unexpected “\x88“ in JSON
  • Vue 开发实战:从入门到精通的经验之谈
  • Seed-Thinking-v1.5:推理模型新标杆诞生
  • 实用工具-screenrec介绍(截图工具)
  • 【AI图像创作变现】01文生图原理与提示词结构
  • 如何查看自己的主机地址
  • vue3中ref创建的变量使用`.value`(可以使用volar插件自动添加`.value)
  • 4月18日复盘
  • 1.Three.js 场景(Scene)详解
  • Ext系列⽂件系统
  • Attention 机制核心 - Transformer 的基石
  • CVE-2023-46604漏洞复现与深度分析
  • 他吞吞吐吐他吞吞吐吐
  • 前沿篇|CAN XL 与 TSN 深度解读
  • 管家婆工贸ERP BB034.销售订单保存获取价格跟踪
  • 如何模拟浏览器行为获取网页中的隐藏表单数据?
  • 动态规划入门:4种背包问题大纲
  • 自适应布局,平均分配,自动换行,上下对齐
  • C++常用锁总结
  • 需求:金额字段要求只能输入两位且直接进行截断
  • 楼梯上下检测数据集VOC+YOLO格式5462张2类别
  • ifconfig -bash: ifconfig: command not found
  • bulk-seq分析,表达量你使用fpkm?还是tpm?
  • 邮件自动回复助手(Rasa/SMTP)实现教程
  • 【Triton 教程】triton_language.full
  • 代码随想录算法训练营第二十一天
  • 【认知觉醒】是什么? 如何做到 ? ( 持续更新ing )
  • 2021 CCF CSP-S2.廊桥分配
  • Arduino无线体感机器手——问题汇总