聊天补全模型调用函数
这个笔记包含怎样使用聊天补全API结合外部的函数调用来扩展GPT模型的能力
tools在聊天补全API中是一个可选的参数,可以定义指定的函数调用。目的是能使模型生成遵循指定规范的函数参数。请注意:API实际上不执行任何的函数调用。由开发者使用模型输出时执行函数调用。
在tools参数内部,如果提供了functions参数,那么在默认情况下,模型来决定何时使用其中一个适合的函数。API可通过设置tool_choice参数{“name”: “”},强制调用一个指定的函数。也可以设置tool_choice参数为none,强制不调用任何函数。如果使用了函数,则输出将在响应中包含"finish_reason": “function_call”,以及包含函数名称和生成的函数参数的tool_choice对象。
1. 概述
这个笔记包含下面两部分:
- 怎样生成函数参数 指定一组函数并使用模型API生成函数参数。
- 怎样使用模型生成的参数调用函数 通过实际执行带有模型生成参数的函数来关闭循环。
1.1 怎样生成函数参数
安装依赖包
pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tenacity
pip install tiktoken
pip install termcolor
pip install openai
# 导入依赖库
import json
from tenacity import retry, wait_random_exponential, stop_after_attempt
from termcolor import colored
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
# 加载 .env 文件中定义的环境变量
_ = load_dotenv(find_dotenv())
GPT_MODEL = "gpt-3.5-turbo-0613"
# 初始化 OpenAI 客户端
client = OpenAI() # 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL
1.2 实用函数
首先定义几个公用的函数,以调用聊天补全API,维护和保持对话记录状态。
@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):
"""封装OpenAI API调用"""
try:
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
tool_choice=tool_choice,
)
return response
except Exception as e:
print("Unable to generate ChatCompletion response")
print(f"Exception: {
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'