OpenAI API - Function calling 的概念与使用(二)

目录

概述

安装必要的依赖包

导入必要的模块并初始化OpenAI客户端

强制使用特定函数或不使用函数

并行函数调用

如何使用模型生成的参数调用函数

指定一个执行 SQL 查询的函数

提取数据库架构的表示

定义函数规范

执行SQL查询

使用Chat Completions API调用函数的步骤:

总结


概述

        继 OpenAI API - Function calling 的概念与使用(一)文章,这次,我以学习笔记的形式来介绍如何结合外部函数使用Chat Completions API来扩展GPT模型的功能,

学习笔记整理不易,如果对您有帮助还望大家多多点赞收藏+关注!谢谢大家!

tools 是Chat Completion API中的一个可选参数,可以用来提供函数规范。其目的是使模型生成符合提供的函数规范的函数参数。需要注意的是,API不会实际执行任何函数调用,函数调用需要开发人员根据模型输出自行执行。

tools 参数中,如果提供了 functions 参数,则默认情况下,模型会自行决定何时适当地使用这些函数。API可以通过设置 tool_choice 参数为 {"type": "function", "function": {"name": "my_function"}} 来强制使用特定函数。API也可以通过将 tool_choice 参数设置为 none 来强制不使用任何函数。如果使用了某个函数,输出中会包含 finish_reason: "tool_calls" 以及一个 tool_calls 对象,其中包含函数的名称和生成的函数参数。

安装必要的依赖包
  • 首先需要安装几个Python库,包括 scipytenacitytiktokentermcoloropenai
!pip install scipy --quiet
!pip install tenacity --quiet
!pip install tiktoken --quiet
!pip install termcolor --quiet
!pip install openai --quiet
导入必要的模块并初始化OpenAI客户端
  • 导入 json 模块,OpenAI 模块,以及 tenacity 模块中的 retry, wait_random_exponential, stop_after_attempt。另外,还需要导入 termcolor 模块中的 colored
  • 初始化 OpenAI 客户端。
import json
from openai import OpenAI
from tenacity import retry, wait_random_exponential, stop_after_attempt
from termcolor import colored  

GPT_MODEL = "gpt-4o"
client = OpenAI()

首先,我们定义一些用于调用Chat Completions API以及维护和跟踪对话状态的实用工具。

重试机制的装饰器 @retry

        这个装饰器使用了 tenacity 库,用于在调用API时实现重试机制。wait_random_exponential 设置了指数退避策略,最大等待时间为40秒,stop_after_attempt(3) 设置了最大重试次数为3次。

chat_completion_request 函数

        该函数用于向Chat Completions API发送请求。函数接受消息、工具和工具选择作为参数,并返回API的响应。如果请求失败,捕获异常并打印错误信息。

pretty_print_conversation 函数

        这个函数用于美化打印对话内容。根据消息的角色(系统、用户、助手、函数),用不同的颜色打印消息内容。颜色由 termcolor 库的 colored 函数实现。

from tenacity import retry, wait_random_exponential, stop_after_attempt
from termcolor import colored  

GPT_MODEL = "gpt-4o"
client = OpenAI()

# 定义重试机制的装饰器,设置重试策略
@retry(wait=wait_random_exponential(multiplier=1, max=40), stop=stop_after_attempt(3))
def chat_completion_request(messages, tools=None, tool_choice=None, model=GPT_MODEL):
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages,
            tools=tools,
            tool_choice=tool_choice,
        )
        return response
    except Exception as e:
        print("无法生成ChatCompletion响应")
        print(f"异常: {e}")
        return e

# 定义一个函数用于美化打印对话内容
def pretty_print_conversation(messages):
    role_to_color = {
        "system": "red",
        "user": "green",
        "assistant": "blue",
        "function": "magenta",
    }
    
    for message in messages:
        if message["role"] == "system":
            print(colored(f"system: {message['content']}\n", role_to_color[message["role"]]))
        elif message["role"] == "user":
            print(colored(f"user: {message['content']}\n", role_to_color[message["role"]]))
        elif message["role"] == "assistant" and message.get("function_call"):
            print(colored(f"assistant: {message['function_call']}\n", role_to_color[message["role"]]))
        elif message["role"] == "assistant" and not message.get("function_call"):
            print(colored(f"assistant: {message['content']}\n", role_to_color[message["role"]]))
      
### 如何部署 OpenAI API 为了确保应用程序的安全性和稳定性,在部署涉及敏感信息(如API密钥)的应用程序时,采取适当措施至关重要。对于Web应用而言,直接在前端暴露API密钥存在安全隐患;因此推荐的做法是在服务器端处理这些请求。 #### 使用环境变量管理API密钥 当构建ReactJS项目并打算将其托管于GitHub Pages这样的静态站点服务上时,应该从未将任何秘密信息硬编码至客户端代码内。相反地,应当利用`.env`文件存储开发期间所需的配置项,并通过Git忽略列表防止提交此类敏感资料到版本控制系统中去[^1]。 然而值得注意的是,一旦涉及到生产环境中实际调用第三方接口的情况,则更适宜采用后端代理的方式来进行间接访问——即创建自己的RESTful微服务作为中介层负责转发最终用户的HTTP请求给目标平台的同时也承担起鉴权职责。这不仅有助于保护凭证免遭泄露风险,还能实现诸如限流控制等功能增强整体架构灵活性安全性。 #### 构建后端中间件 一种常见的做法是借助云函数(Cloud Function),比如Google Cloud Functions 或者 AWS Lambda 来搭建这样一个轻量级的服务网关。以Firebase为例,可以编写一段Node.js脚本来封装对OpenAI API的具体操作逻辑: ```javascript const functions = require('firebase-functions'); const axios = require('axios'); // 安全地读取环境变量中的API Key const OPENAI_API_KEY = process.env.OPENAI_API_KEY; exports.openAiProxy = functions.https.onRequest(async (req, res) => { try { const response = await axios.post( "https://api.openai.com/v1/engines/davinci-codex/completions", req.body, { headers: {"Authorization": `Bearer ${OPENAI_API_KEY}`} } ); return res.status(200).json(response.data); } catch(error){ console.error("Error calling OpenAI API:", error.message); return res.status(500).send({ message:error.message }); } }); ``` 上述代码片段展示了如何定义一个HTTPS触发器类型的Cloud Function实例,它接受来自外部的POST请求并将之转交给指定引擎完成文本补全文案的任务。此同时,所有必要的身份验证参数均来源于运行时刻上下文中预先加载好的配置对象而非明文形式写死在线路里头[^2]。 #### 部署流程概述 最后一步就是按照所选平台官方文档指示完成整个项目的上线准备工作了。如果是基于Firebase的话,那么只需简单执行几条命令即可快速发布最新改动成果: ```bash npm install -g firebase-tools firebase login firebase init hosting:functions firebase deploy ``` 以上步骤会引导开发者初始化项目结构、关联远程仓库以及推送本地更改记录直至云端生效为止。当然具体细节可能会因个人需求差异而有所不同,请参照各自服务商提供的指南做相应调整优化[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值