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

本博客介绍如何利用OpenAI的Chat Completions API结合外部函数,如获取天气预报和执行SQL查询。通过设置`functions`参数,GPT模型能生成符合指定函数参数的回复。示例展示了如何强制使用或不使用函数,并通过执行GPT生成的SQL查询从Chinook数据库获取信息。
摘要由CSDN通过智能技术生成

基于 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']}
下面是一个使用 Python 和 requests 库的示例代码,用于与 OpenAI 的 GPT-3 模型进行对话: ```python import requests # 在 OpenAI API 中创建一个新的引擎,获取 API 密钥 # 在这里使用 YOUR_API_KEY 替换为你自己的 API 密钥 url = "https://api.openai.com/v1/engines/davinci-codex/completions" headers = {"Content-Type": "application/json", "Authorization": f"Bearer {YOUR_API_KEY}"} # 定义一个函数,用于向 OpenAI 发送请求并返回响应 def generate_text(prompt): # 设置请求数据,prompt 是对话的起点 data = { "prompt": prompt, "max_tokens": 2048, "temperature": 0.5, "n": 1, "stop": "\n" } # 发送 POST 请求 response = requests.post(url, headers=headers, json=data) # 处理响应数据 if response.status_code == 200: return response.json()['choices'][0]['text'] else: raise ValueError("Failed to generate text from AI model.") # 使用 generate_text 函数进行对话 while True: prompt = input("You: ") response = generate_text(prompt) print("AI: " + response) ``` 在这个示例代码中,我们使用了 OpenAI API 中的 `davinci-codex` 引擎,这是一个基于 GPT-3 的模型。我们定义了 `generate_text` 函数,该函数接受一个对话起点 prompt,然后向 OpenAI API 发送一个 POST 请求,请求的数据包括对话起点、生成的最大 token 数、温度等参数。在响应中,我们提取了模型生成的文本并返回给调用者。最后,我们使用 `while` 循环来不断与模型进行对话。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hugo_Hoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值