使用Python进行OpenAI函数调用的明确指南

ChatGPT中文站
An image generated from https://vidura.ai

嗨,读者们。很久没有写文章了。在这篇关于OpenAI的简短文章中,我们将了解如何使用Python OpenAI库,利用OpenAI的新功能调用特性,从GPT模型中强制实现结构化输出。

安装虚拟环境

首先创建一个Python虚拟环境,并使用以下命令安装`openai` pip软件包:

python3 -m venv venv
source venv/bin/activate
pip install openai --upgrade

一旦程序包安装成功,请转到您的OpenAI帐户并在此处创建访问密钥:https://platform.openai.com/account/api-keys。

假设您的API密钥是:`sk-xyzabc`(永远不要向任何人透露您的真实密钥)

将 Open AI API 密钥添加到环境中。

使用以下命令将此密钥导出为环境变量:

export OPENAI_API_KEY=sk-xyzabc

强烈不建议在代码中硬编码API密钥,因为有可能会意外提交到版本控制。

安装PyDantic以生成JSON模式。

OpenAI API接受函数输出的JSON架构。为了简化在Python中创建此模式,我们可以定义一个PyDantic类来结构化模型并将其转换为JSON架构以避免冗长和错误。

pip install pydantic --upgrade

有了这个安装,我们现在可以尝试OpenAI API。让我们定义一个目标并提供一个示例来完成这个目标。

目标:

强制`gpt-3.5-turbo`模型对于问题生成可预测的JSON输出。

“解释一个过程?” 或者 “如何?”

解决方案:

为了做到这一点,我们首先需要想出一个模式。让我们定义一个 PyDantic 模型。我这样做是为了指导一个 OpenAI 模型“为一个要求的问题提供一个标题和一系列步骤,并生成一个可解析的 JSON 输出”。

from typing import List
from pydantic import BaseModel

class StepByStepAIResponse(BaseModel):
title: str
steps: List[str]

它是一个简单的Python类(继承了一个Pydantic BaseModel)。为了将该类转换为JSON架构,只需调用“schema()”函数:

schema = StepByStepAIResponse.schema() # returns a dict like JSON schema

# schema content looks like below

"""
{
'title': 'StepByStepAIResponse',
'type': 'object',
'properties': {'title': {'title': 'Title', 'type': 'string'},
'steps': {'title': 'Steps', 'type': 'array', 'items': {'type': 'string'}}},
'required': ['title', 'steps']
}
"""

我们很快会在我们的例子中使用这个模式。

现在,让我们实际调用OpenAI并应用一个名为“get_answer_for_user_query”的“虚幻”函数,通过引导AI返回JSON输出。我将称呼这个函数为'虚幻',因为其控制执行是由OpenAI模型自动推断出来的,使用名称,描述和输出模式但未被开发者定义。

进行OpenAI API函数调用

我们需要使用必要的参数调用“ChatCompletion.create()”方法,将用户查询传递到OpenAI模型。我们需要使用`gpt-3.5-turbo-0613`(在末尾标记为`0613`,此代码撰写时,函数调用仅适用于此模型或`gpt-4-0613`)。 代码如下所示。

import openai
import os
import json

openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[
{"role": "user", "content": "Explain how to assemble a PC"}
],
functions=[
{
"name": "get_answer_for_user_query",
"description": "Get user answer in series of steps",
"parameters": StepByStepAIResponse.schema()
}
],
function_call={"name": "get_answer_for_user_query"}
)

output = json.loads(response.choices[0]["message"]["function_call"]["arguments"])

# output content
"""
{
'title': 'Steps to assemble a PC',
'steps': [
'1. Gather all necessary components',
'2. Prepare the PC case',
'3. Install the power supply',
'4. Mount the motherboard',
'5. Install the CPU and CPU cooler',
'6. Install RAM modules',
'7. Install storage devices',
'8. Install the graphics card',
'9. Connect all cables',
'10. Test the PC'
]
}
"""

现在,我们可以在Python中以编程方式使用输出(dict)。`ChatCompletion.complete()`代码中的重要参数是`functions = [{}]`,它需要一个函数列表。 “name”键指定函数名称,“description”指定有关函数的元信息,以供OpenAI模型使用。 “parameters”密钥是我们传递JSON模式的地方。这段代码,

function_call={"name": "get_answer_for_user_query"}

指定OpenAI模型是否应使用函数列表中的某些函数。将此值设置为“auto”可以让AI模型猜测,因此我建议始终添加函数名称而不是“auto”。

如果您想从该响应字典创建一个StepByStepAIResponse对象,您可以这样做:

sbs = StepByStepAIResponse(**output)

# Now access sbs.title, sbs.steps in your code

让我们再试一次用户查询:“如何制作煎饼?”。我修改了消息参数中的“content”值以调整查询。代码看起来像这样。

# ... imports and other code

response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[
{"role": "user", "content": "How to make a pancake ?"}
],
functions=[
{
"name": "get_answer_for_user_query",
"description": "Get user answer in series of steps",
"parameters": StepByStepAIResponse.schema()
}
],
function_call={"name": "get_answer_for_user_query"}
)

output = json.loads(response.choices[0]["message"]["function_call"]["arguments"])

# output content

"""
{
'title': 'Pancake Recipe',
'steps':
[
'In a mixing bowl, whisk together flour, sugar, baking powder, and salt.',
'In a separate bowl, whisk together milk, eggs, and melted butter.',
'Add the wet ingredients to the dry ingredients and mix until just combined. Do not overmix.',
'Heat a non-stick skillet or griddle over medium heat. Lightly grease with butter or cooking spray.',
'Pour 1/4 cup of batter onto the skillet for each pancake. Cook until bubbles form on the surface, then flip and cook until golden brown.',
'Serve the pancakes hot with your favorite toppings, such as syrup, fruits, or whipped cream.'
]
}
"""

对于查询,我们按照很好的顺序得到了一系列步骤。这就是我们如何指示 OpenAI 模型(在这种情况下是 `gpt-3-turbo-0613`)按特定结构输出的方法。

此示例的完整代码段可在此处找到:https://gist.github.com/narenaryan/e8a5aac3825b0e752cf70daa69abb65a

结论

OpenAI API函数调用是引导OpenAI模型生成可预测响应的强大方式,否则需要仔细的提示说明。毫无疑问,函数调用应用程序令人兴奋。感谢阅读本文,祝你有美好的一天 :)

参考文献:

2023-10-20 16:56:20 AI中文站翻译自原文