【GPT入门】第11课 FunctionCall调用本地代码入门

【GPT入门】第11课 FunctionCall调用代码入门

  • 1. 手撕FunctionCall
  • 2.代码
  • 3.functionCall的结果

1. 手撕FunctionCall

为了了解,funcationCall底层,手写一个functionCall多方法,并调用,体验

思路:
任务:让openai调用sum方法,对加法进行求和
1.定义sum方法,给openAi接口
2.让大模型自动识别用户问题,解释参数,获取调用方法id、方法名称、方法参数
3.把第二步的结果,给大模型,让大模型调用函数,并返回结果

2.代码

from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json_ = load_dotenv(find_dotenv())client = OpenAI()def print_json(data):"""打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;否则,直接打印该值。"""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=[{  # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用"type": "function","function": {"name": "sum","description": "加法器,计算一组数的和","parameters": {"type": "object","properties": {"numbers": {"type": "array","items": {"type": "number"}}}}}}],)print("response:")print(response)return response.choices[0].messagefrom math import *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)
print("------function call-----")
print(response)if (response.tool_calls is not None):# 是否要调用 sumtool_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, #用于表示函数调用Id"role":"tool","name":"sum","content":str(result) #数值 result 必须转为字符串})#再次调用大模型response = get_completion(messages)messages.append(response)print("-------最终 GPT 回复-------")print(response.content)print("---------对话历史----------")
print_json(messages)

3.functionCall的结果

C:\ProgramData\anaconda3\envs\gptLearning\python.exe E:\workspace\gptLearning\gptLearning\les03\Lesson01_functionCalling.py 
response:
ChatCompletion(id='chatcmpl-B8xbekE9Xfke8t1AkftFpEzpcdtho', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_CcEYaIPwl1Ru63XmMm6qSGFD', function=Function(arguments='{"numbers":[1,2,3,4,5,6,7,8,9,10]}', name='sum'), type='function')]), content_filter_results={})], created=1741475450, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier=None, system_fingerprint='fp_b705f0c291', usage=CompletionUsage(completion_tokens=32, prompt_tokens=79, total_tokens=111, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)), prompt_filter_results=[{'prompt_index': 0, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'jailbreak': {'filtered': False, 'detected': False}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}}])
------function call-----
ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_CcEYaIPwl1Ru63XmMm6qSGFD', function=Function(arguments='{"numbers":[1,2,3,4,5,6,7,8,9,10]}', name='sum'), type='function')])
response:
ChatCompletion(id='chatcmpl-B8xbfvdhavJ9RTAVxfAk3SmkIjVOT', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='The sum of the numbers 1 through 10 is 55.', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1741475451, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_06737a9306', usage=CompletionUsage(completion_tokens=16, prompt_tokens=118, total_tokens=134, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
-------最终 GPT 回复-------
The sum of the numbers 1 through 10 is 55.
---------对话历史----------
{"role": "system","content": "你是一个数学家"
}
{"role": "user","content": "Tell me the sum of 1,2,3,4,5,6,7,8,9,10"
}
{"content": null,"refusal": null,"role": "assistant","audio": null,"function_call": null,"tool_calls": [{"id": "call_CcEYaIPwl1Ru63XmMm6qSGFD","function": {"arguments": "{\"numbers\":[1,2,3,4,5,6,7,8,9,10]}","name": "sum"},"type": "function"}]
}
{"tool_call_id": "call_CcEYaIPwl1Ru63XmMm6qSGFD","role": "tool","name": "sum","content": "55"
}
{"content": "The sum of the numbers 1 through 10 is 55.","refusal": null,"role": "assistant","audio": null,"function_call": null,"tool_calls": null
}Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL主从架构配合ShardingJdbc实现读写分离

文章目录 目录架构搭建读写分离pom.xmlfdy-live-user-provider 模块application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目录 架构搭建 基于Docker去创建MySQL的主从架构 读写分离 pom.xml <dependency><groupId>mysql…

计网面试准备

正确理解网络数据传输过程 同一路由器的不同接口属于不同局域网&#xff0c;广播只能在同一个局域网

NLP常见任务专题介绍(1)-关系抽取(Relation Extraction, RE)任务训练模板

📌 关系抽取(Relation Extraction, RE)任务训练示例 本示例展示如何训练一个关系抽取模型,以识别两个实体之间的关系。 1️⃣ 任务描述 目标:从文本中提取两个实体之间的语义关系,例如 “人物 - 组织”、“药物 - 疾病”、“公司 - 创始人” 等。输入:句子 + 标注的实…

【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理

远程登录的工作原理 背景介绍远程登录远程登录的服务模式远程登录服务的实现基础远程登录服务的运行模式Telnet服务为什么不被操作系统管理 Telnet协议的原理网络虚终端&#xff08;NVT&#xff09;结束标示NVT的原理NVT屏蔽差异 背景介绍 绝大多数计算机都是运行多用户操作系…

在 Spring Boot 中实现基于 TraceId 的日志链路追踪

1 前言 1.1 什么是 TraceId? TraceId 是一个唯一的标识符,用于跟踪分布式系统中的请求。每个请求从客户端发起到服务端处理,再到可能的多个微服务调用,都会携带这个 TraceId,以便在整个请求链路中进行追踪和调试。 1.2 日志链路追踪的意义 日志链路追踪可以帮助开发者…

游戏引擎学习第150天

回顾与当天计划 我们在这里完全不使用任何库&#xff0c;所以我们完全是引擎和库免疫的, 正如大家所知道的&#xff0c;我们正在编写自己的资源处理系统&#xff0c;准确来说&#xff0c;是一个资源加载系统。过去一周我们已经完成了很多工作&#xff0c;现在只剩下最后几步&a…

Flutter中stream学习

Flutter中stream学习 概述Stream的基础概念stream的常用方法Stream.fromFuture(Future<T> future)Stream.fromFutures(Iterable<Future<T>> futures)Stream.fromIterable(Iterable<T> elements)Stream.periodic(Duration period, [T computation(int c…

基于javaweb的SSM房屋租赁管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

从0开始的操作系统手搓教程45——实现exec

目录 建立抽象 实现加载 实现sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因为实现问题没有测试。所以更像是笔记&#xff01; exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说&#xff0c;exec 会将当前正在运行的用户进程的进程体&…

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…

基于云函数的自习室预约微信小程序+LW示例参考

全阶段全种类学习资源&#xff0c;内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等&#xff0c;持续更新~ 文章目录 [TOC](文章目录) 1.项目介绍2.项目部署3.项目部分截图4.获取方式 1.项目介绍 技术栈工具&#xff1a;云数据库…

卷积神经网络与计算机视觉:从数学基础到实战应用

卷积神经网络与计算机视觉&#xff1a;从数学基础到实战应用 摘要 本文深入解析卷积神经网络&#xff08;CNN&#xff09;的核心原理及其在计算机视觉中的应用。首先介绍卷积与互相关的数学定义及在神经网络中的实际应用差异&#xff0c;接着从系统设计视角分析卷积的线性代数…

从Manus到OpenManus:多智能体协作框架如何重构AI生产力?

文章目录 Manus&#xff1a;封闭生态下的通用AI智能体OpenManus&#xff1a;开源社区的闪速复刻挑战与未来&#xff1a;框架落地的现实边界当前局限性未来演进方向 OpenManus使用指南1. 环境配置2. 参数配置3. 替换搜索引擎4. 运行效果 协作框架开启AI生产力革命 Manus&#xf…

js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。

## 效果如上 <!-- 将 main.js 和 worker.js 放在同一个目录下&#xff0c;然后在 HTML 文件中引入 main.js --><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

深入理解 Linux 中的 -h 选项:让命令输出更“人性化”

在 Linux 系统中&#xff0c;命令行工具是系统管理员和普通用户最常用的交互方式之一。然而&#xff0c;命令行输出往往充满了技术性术语和数字&#xff0c;对于初学者或非技术用户来说可能显得晦涩难懂。幸运的是&#xff0c;许多 Linux 命令都提供了一个非常实用的选项&#…

Docker Compose国内镜像一键部署dify

克隆代码 git clone https://github.com/langgenius/dify.git进入docker目录 cd docker修改.env部分 # 将环境模版文件变量重命名 cp .env.example .env # 修改 .env,修改nginx的host和端口,避免端口冲突 NGINX_SERVER_NAME192.168.1.223 NGINX_PORT1880 NGINX_SSL_PORT1443…

红队OPSEC(安全运营)个人总结

OPSEC又称&#xff1a;运营安全&#xff0c;是指在红队的视角下&#xff0c;蓝队对我方的威胁。 OPSEC漏洞的五个流程&#xff1a; 关键信息识别&#xff1a;指红队的关键信息不泄露&#xff0c;包括但不限于红队的攻击意图&#xff0c;能力&#xff0c;人员&#xff0c;活动及…

NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)

P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…