AI大模型应用开发实践:4.基于 Chat Completions API 实现外部函数调用

news2025/1/11 20:48:48

基于 Chat Completions API 实现外部函数调用

2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增了 Function Calling 功能。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详见OpenAI Blog

functions 是 Chat Completion API 中的可选参数,用于提供函数定义。其目的是使 GPT 模型能够生成符合所提供定义的函数参数。请注意,API不会实际执行任何函数调用。开发人员需要使用GPT 模型输出来执行函数调用。

如果提供了functions参数,默认情况下,GPT 模型将决定在何时适当地使用其中一个函数。

可以通过将function_call参数设置为{"name": "<insert-function-name>"}来强制 API 使用指定函数。

同时,也支持通过将function_call参数设置为"none"来强制API不使用任何函数。

如果使用了某个函数,则响应中的输出将包含"finish_reason": "function_call",以及一个具有该函数名称和生成的函数参数的function_call对象。

在这里插入图片描述

概述

本 Notebook 介绍了如何将 Chat Completions API 与外部函数结合使用,以扩展 GPT 模型的功能。包含以下2个部分:

  • 如何使用 functions 参数
  • 如何使用 function_call 参数
  • 使用 GPT 模型生成函数和参数
  • 实际执行 GPT 模型生成的函数(以 SQL 查询为例)

注意:本示例直接构造 HTTP 请求访问 OpenAI API,因此无需使用 openai Python SDK。

安装依赖包

!pip install scipy tenacity tiktoken termcolor openai requests
import json
import requests
import os
from tenacity import retry, wait_random_exponential, stop_after_attempt
from termcolor import colored

GPT_MODEL = "gpt-3.5-turbo"

定义工具函数

首先,让我们定义一些用于调用聊天完成 API 的实用工具,并维护和跟踪对话状态。

# 使用了retry库,指定在请求失败时的重试策略。
# 这里设定的是指数等待(wait_random_exponential),时间间隔的最大值为40秒,并且最多重试3次(stop_after_attempt(3))。
# 定义一个函数chat_completion_request,主要用于发送 聊天补全 请求到OpenAI服务器
@retry(wait=wait_random_exponential(multiplier=1, max=40), stop=stop_after_attempt(3))
def chat_completion_request(messages, functions=None, function_call=None, model=GPT_MODEL):

    # 设定请求的header信息,包括 API_KEY
    headers = {
   
        "Content-Type": "application/json",
        "Authorization": "Bearer " + os.getenv("OPENAI_API_KEY"),
    }

    # 设定请求的JSON数据,包括GPT 模型名和要进行补全的消息
    json_data = {
   "model": model, "messages": messages}

    # 如果传入了functions,将其加入到json_data中
    if functions is not None:
        json_data.update({
   "functions": functions})

    # 如果传入了function_call,将其加入到json_data中
    if function_call is not None:
        json_data.update({
   "function_call": function_call})

    # 尝试发送POST请求到OpenAI服务器的chat/completions接口
    try:
        response = requests.post(
            "https://api.openai.com/v1/chat/completions",
            headers=headers,
            json=json_data,
        )
        # 返回服务器的响应
        return response

    # 如果发送请求或处理响应时出现异常,打印异常信息并返回
    except Exception as e:
        print("Unable to generate ChatCompletion response")
        print(f"Exception: {
     e}")
        return e

# 定义一个函数pretty_print_conversation,用于打印消息对话内容
def pretty_print_conversation(messages):

    # 为不同角色设置不同的颜色
    role_to_color = {
   
        "system": "red",
        "user": "green",
        "assistant": "blue",
        "function": "magenta",
    }

    # 遍历消息列表
    for message in messages:

        # 如果消息的角色是"system",则用红色打印“content”
        if message["role"] == "system":
            print(colored(f"system: {
     message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"user",则用绿色打印“content”
        elif message["role"] == "user":
            print(colored(f"user: {
     message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"assistant",并且消息中包含"function_call",则用蓝色打印"function_call"
        elif message["role"] == "assistant" and message.get("function_call"):
            print(colored(f"assistant[function_call]: {
     message['function_call']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"assistant",但是消息中不包含"function_call",则用蓝色打印“content”
        elif message["role"] == "assistant" and not message.get("function_call"):
            print(colored(f"assistant[content]: {
     message['content']}\n", role_to_color[message["role"]]))

        # 如果消息的角色是"function",则用品红色打印“function”
        elif message["role"] == "function":
            print(colored(f"function ({
     message['name']}

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

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

相关文章

文件传输服务应用1——java集成smb2/3详细教程和windows共享服务使用技巧

在实际项目开发过程中&#xff0c;读取网络资源或者局域网内主机的文件是必要的操作和需求。而FTP&#xff08;文件传输协议&#xff09;和SMB&#xff08;服务器消息块&#xff09;是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点&#xff0c;但同…

mac清理软件推荐免费 mac清理系统数据怎么清理 cleanmymac和腾讯柠檬哪个好

macbook是苹果公司的一款高性能的笔记本电脑&#xff0c;受到了很多用户的喜爱。但是&#xff0c;随着使用时间的增长&#xff0c;macbook的系统也会积累一些垃圾文件&#xff0c;影响其运行速度和空间。那么&#xff0c;macbook系统清理软件推荐有哪些呢&#xff1f;macbook用…

【Text2SQL 论文】SQLova:首次将 PLM 应用到 NL2SQL 中

论文&#xff1a;A Comprehensive Exploration on WikiSQL with Table-Aware Word Contextualization ⭐⭐⭐⭐ KR2ML Workshop at NeurIPS 2019, arXiv:1902.01069 Code: SQLova | GitHub 参考文章&#xff1a;将预训练语言模型引入WikiSQL任务 | CSDN 一、论文速度 这篇论文…

ZEDmini使用完全指南

ZEDmini使用 ZED stereolabs 开箱测评 使用说明 ubuntu18.04nvidiacuda10 ubuntu18.04ZED SDK安装和使用 Ubuntu16.04安装NVIDIA显卡驱动 查看显卡信息 redwallredwall-G3-3500:~/catkin_ws$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Device …

XV7011BB陀螺仪传感器广泛用于工业应用

陀螺仪传感器作为一种重要的惯性传感器&#xff0c;在航空航天、智能手机与可穿戴设备、工业控制与机器人、汽车行业、医疗仪器等多个领域都有着重要的应用&#xff0c;为这些领域的发展和创新提供了关键支持。 Epson陀螺仪传感器系列以其优异的性能和可靠性著称&#xff0c…

【20天拿下Pytorch:Day 8】模型层layers

文章目录 1. 内置模型层1.1 基础层1.2 卷积网络相关层1.3 循环网络相关层1.4 Transformer相关层 2. 自定义模型层 深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类&#xff0c;具备参数管理功能。 注&#xff1a;这…

最新 ROS 2 Jazzy Jalisco 发布!支持 Ubuntu 24.04

系列文章目录 前言 世界海龟日快乐 今天&#xff0c;ROS 2 发布团队很高兴地宣布 ROS 2 的第十个版本&#xff1a;Jazzy Jalisco&#xff08;代号 jazzy&#xff09;。 除了之前分享的官方徽标&#xff0c;我们还发布了全新的 Jazzy Jalisco 图标。 Jazzy Jalisco 是一个长期支…

2024电工杯A题保姆级分析完整思路+代码+数据教学

2024电工杯A题保姆级分析完整思路代码数据教学 A题题目&#xff1a;园区微电网风光储协调优化配置 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析&#xff1a; 题目要求对园区微电网进行风光储协调优化配置&#xff0c;具体涉及三个园区&#xff08…

小蓝和小青在做数字破解游戏

小蓝和小青在做数字破解游戏,设某图案由m*n的0和1点阵组成&#xff0c;依照以下规则破解连续一组数值&#xff0c;从点阵图第一行第一个符号开始计算&#xff0c;从左到右&#xff0c;由上至下。第一个数表示连续有几个0&#xff0c;第二个数表示接下来连续有几个1&#xff0c;…

链表经典OJ问题【环形链表】

题目导入 题目一&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环 题目二&#xff1a;给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 NULL。 题目一 给你一个链表的头节点 head &#xff0c;…

什么是物联网通信网关?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

Q-Learning学习笔记-李宏毅

introduction 学习的并不是policy&#xff0c;而是学习critic&#xff0c;critic用来评价policy好还是不好&#xff1b;一种critic&#xff1a;state value function V π ( s ) V^\pi(s) Vπ(s)是给定一个policy π \pi π&#xff0c;在遇到state s s s之后累积的reward的…

并发控制利器Semaphore

并发控制利器&#xff1a;Semaphore详解与应用 简介 Semaphore 是Java并发编程中的一个重要工具&#xff0c;用于管理对共享资源的访问权限&#xff0c;确保系统资源不会因过度访问而耗尽。形象地说&#xff0c;Semaphore 可以比喻为交通信号灯&#xff0c;它控制着能够同时进…

Spring Cloud 系列之Gateway:(9)初识网关

传送门 Spring Cloud Alibaba系列之nacos&#xff1a;(1)安装 Spring Cloud Alibaba系列之nacos&#xff1a;(2)单机模式支持mysql Spring Cloud Alibaba系列之nacos&#xff1a;(3)服务注册发现 Spring Cloud 系列之OpenFeign&#xff1a;(4)集成OpenFeign Spring Cloud …

探索 JavaScript 新增声明命令与解构赋值的魅力:从 ES5 迈向 ES6

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

【区块链】caliper压力测试

本文上接postman接口测试 参照工程项目使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试 首先启动webase python3 deploy.py startAll vim /opt/bencahmark/caliper-benchmark/networks/fisco-bcos/test-nw/fisco-bcos.json 命令便捷查…

刷代码随想录有感(75):回溯问题——非递减子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> tmp;vector<vector<int>> res;void backtracking(vector<int> nums, int start){if(tmp.size() > 2){res.push_back(tmp);}unordered_set<int> uset;for(int i sta…

JMeter 基本使用【Windows Jmeter GUI 图形界面】

1.安装jmeter GUI图形界面 需要安装JDK 官方网址: Apache JMeter - Apache JMeter™ linux tgz windows zip 2. 目录及文件 bin: 核心可执行文件&#xff0c;包含配置 extras&#xff1a;插件扩展包 lib&#xff1a;核心依赖包 ext&#xff1a;核心包 junit&#xff1a;单…

低代码开发:成本革命,还是技术幻象?

在当今快速发展的数字化时代&#xff0c;企业面临着不断增长的技术需求和日益紧缩的预算压力。开源低代码开发平台&#xff08;YDUIbuilder&#xff09;应运而生&#xff0c;承诺以更低的成本和更快的速度交付应用程序。但低代码开发真的能减少成本吗&#xff1f;本文将深入探讨…