目录
使用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库,包括
scipy
、tenacity
、tiktoken
、termcolor
和openai
。
!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"]]))