如何在Django项目中集成OpenAI GPT模型

作者选择了直接援助计划作为为捐赠而写计划的一部分的捐赠受益方。

介绍

OpenAI GPT 模型由于被广泛用于生成各种任务的文本内容而备受欢迎,例如起草电子邮件、回答客户服务常见问题和语言翻译等等。

这些 GPT 模型通常通过由 OpenAI 发布的聊天机器人 ChatGPT,或通过提供更多控制权的 API 和库来使用。本教程将指导您如何在 Django 网络项目中使用 OpenAI API 来利用这些模型。您将学习如何使用不同参数调用 ChatCompletion API,以及如何格式化和利用其响应。

完成本教程后,您将创建一个 Django 端点,当调用时,将向 OpenAI 发送请求,使用提供的单词构建一个简短的故事,并返回其响应。

先决条件

要完成本教程,您需要:

  1. 一个现有的Django项目。如果你从零开始,可以按照如何设置Django开发环境教程来设置Django项目。

  2. 一个OpenAI账户:前往OpenAI平台网站,查找“注册”按钮。注册后,您必须验证您的电子邮件地址并输入个人信息。

  3. 一个OpenAI API密钥:设置好您的账户后,登录并从您的仪表板导航到API密钥部分。点击“创建新的密钥”。您的API密钥将被生成,看起来类似于sk-abcdefghijklmnop。请务必将此密钥保存在安全位置,因为您将无法再次查看它。

  4. OpenAI Python 包:如果您已经按照第一个先决条件中的教程操作,则应该已经有一个名为 env 的虚拟环境处于活动状态,在名为 django-apps 的目录中。通过确认其名称是否出现在括号中以及是否位于您的终端提示符的开头来确保您的虚拟环境处于活动状态。如果它没有被激活,您可以通过运行以下命令手动激活它:

sammy@ubuntu:$ .env/bin/activate

在您的终端从 django-apps 目录。一旦您的环境处于活动状态,请运行以下命令安装 OpenAI Python 包:

(env)sammy@ubuntu:$ pip install openai

步骤 1 — 调用 OpenAI

在这一步中,您将向 OpenAI 客户端添加您的 OpenAI API 密钥,并对 ChatCompletion API 进行简单的 API 调用。您还将检查您从 API 得到的响应。

要开始,请打开您的 Python 解释器:

(env)sammy@ubuntu:$ python

首先,导入 OpenAI 客户端并将您的 API 密钥添加到客户端:

from openai import OpenAI
client = OpenAI(api_key="your-api-key")

"your-api-key" 替换为您从 OpenAI 平台获取的实际 API 密钥。

现在,让我们对 ChatCompletion API 进行 API 调用。使用 chat.completions.create() 方法:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "count 1 to 10"}])

在上述代码中,我们指定了要使用的模型gpt-3.5-turbo,添加了一个包含角色 user(其他选项为 systemassistant)以及内容 / 提示 count 1 to 10 的单个 消息对象。

要查看 API 调用的响应,请打印响应消息,该消息应包含一个漂亮的小列表,其中包含数字 1 到 10:

print(response.choices[0].message.content)

输出:

Output
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

恭喜!您已成功地对 OpenAI 进行了简单的 API 调用,并获取了响应。我们将格式化并利用 API 响应来创建下一步中的一个简短故事。

步骤 2 — 处理参数

现在您已成功地对ChatCompletion API进行了简单的API调用,让我们探索如何使用参数来定制模型的行为。有几个可用的参数可以让您控制文本的生成。我们将看看以下三个。

1. 温度: 温度参数决定了生成内容的随机程度。较高的温度值,如0.8,会产生更多样化和创造性的回复,而较低的温度值,如0.1,则会产生更相似的回复。例如:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], temperature=0.1)
print(response.choices[0].message.content)
Output
1. Apple 2. Elephant 3. Sunshine 4. Adventure 5. Serenity

让我们再次尝试temperature=0.1,看看生成的新文本:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], temperature=0.1)
print(response.choices[0].message.content)
Output
1. Apple 2. Elephant 3. Sunshine 4. Adventure 5. Serenity

文本结果相同。现在,让我们两次尝试temperature=0.8

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], temperature=0.8)
print(response.choices[0].message.content)
cat, apple, guitar, sky, book
response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], temperature=0.8)
print(response.choices[0].message.content)
Output
1. Apple 2. Sunshine 3. Happiness 4. Love 5. Technology

2. 最大令牌数: 这允许您限制生成文本的长度。设置特定值确保响应不超过一定数量的令牌。令牌与响应中的单词数量成比例。例如:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], max_tokens=10)
print(response.choices[0].message.content)
Output
1. Apple 2. Car

将值更改为20:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], max_tokens=20)
print(response.choices[0].message.content)
Output
1. Apple 2. Car 3. Music 4. Ocean 5. Love

3. 流: 这决定了响应是否应该被流式传输或返回。当设置为True时,API响应将被流式传输,这意味着您将按块接收生成的输出。这对于长时间的对话或实时应用程序很有用。要启用流式传输,请在API调用中添加stream参数,并将其值设置为True。例如:

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "mention five words"}], stream=True)
collected_messages = []
for chunk in response:
...   chunk_message = chunk.choices[0].delta.content
...   if chunk_message is not None:
...     collected_messages.append(chunk_message)
print(collected_messages)
Output
['', 'cat', '\n', 'book', '\n', 'computer', '\n', 'sun', '\n', 'water']

在上面的代码中,chunk_message 变量保存了 API 返回的每个块中的消息内容。在将每个块添加到 collected_messages 列表之前,我们检查块是否为 None,因为最后一个块的内容通常是 None

利用这些参数可以定制模型的行为,并控制生成的响应,以更好地适应您的应用程序或项目。尝试不同的值以实现所需的结果。

在下一步中,我们将以系统提示的形式为模型提供一些上下文。

步骤 3 — 创建系统提示

在这一步中,我们将结合我们所学的所有信息,并创建一个系统提示,为 GPT 模型提供上下文,告诉它其目的并指定其规则。

首先,让我们创建一个 Python 模块,其中包含一个处理此任务的函数。关闭解释器,并在您的 Django 项目目录中创建一个名为 story_generator.py 的新文件。

(env)sammy@ubuntu:$ touch ~/my_blog_app/blog/blogsite/story_generator.py

接下来,您可以将 OpenAI API 密钥添加到您的环境变量中,以便您不必直接将其添加到 Python 文件中:

(env)sammy@ubuntu:$ export OPENAI_KEY="your-api-key"

打开 story_generator.py,在其中创建一个 OpenAI 客户端,并定义一个名为 generate_story 的函数,该函数以一组单词作为输入:

~/my_blog_app/blog/blogsite/story_generator.py
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_KEY"])
def generate_story(words):
    #调用OpenAI API生成故事
    response = get_short_story(words)
    #格式化并返回响应
    return format_response(response)

在此函数中,我们调用一个单独的函数get_short_story来对OpenAI进行故事的API调用,然后调用另一个函数format_response来格式化API的响应。

现在,让我们专注于get_short_story函数。将以下内容添加到您的story_generator.py文件底部:

~/my_blog_app/blog/blogsite/story_generator.py
def get_short_story(words):
    #构建系统提示
    system_prompt = f"""You are a short story generator.
    Write a short story using the following words: {words}.
    Do not go beyond one paragraph."""
    #进行API调用
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{
            "role": "user",
            "content": system_prompt
        }],
        temperature=0.8,
        max_tokens=1000
    )

    #返回API响应
    return response

在此函数中,我们首先设置系统提示,该提示通知模型需要执行的任务,并指定故事的长度。然后我们将此系统提示传递给ChatCompletion API并返回其响应。

最后,我们可以实现format_response函数。将以下内容添加到您的story_generator.py文件底部:

~/my_blog_app/blog/blogsite/story_generator.py
def format_response(response):
    #从响应中提取生成的故事
    story = response.choices[0].message.content
    #删除任何不需要的文本或格式
    story = story.strip()
    #返回格式化后的故事
    return story

您现在可以通过调用generate_story函数来测试这些功能,将单词集合作为其参数,并打印其响应。将以下内容添加到您的story_generator.py文件的底部:

print(generate_story("cat, book, computer, sun, water"))

现在保存并退出文件。运行脚本以查看生成的故事:

(env) sammy@ubuntu:$ python ~/my_blog_app/blog/blogsite/story_generator.py

输出:

In a cozy corner of a sunlit room, a fluffy cat named Whiskers lounged lazily next to a towering bookshelf. Amongst the rows of books, a curious computer hummed softly. As the sun streamed through the window, casting a warm glow, Whiskers noticed a small water stain on the shelf. Intrigued, the cat pawed at the book closest to the mark. As if guided by fate, the book opened to reveal a hidden compartment containing a glittering diamond necklace. With the secret now unveiled, Whiskers embarked on an unexpected adventure, where the sun, water, and the power of knowledge merged into a thrilling tale of mystery and discovery.

非常有趣!让我们删除带有print语句的行,因为我们将从Django视图中调用generate_story函数。从您的story_generator.py文件中删除突出显示的行:

print(generate_story("cat, book, computer, sun, water"))

随意尝试使用系统提示进行实验,并添加更多上下文和规则以改进生成的故事。

继续下一步,将story_generator模块集成到您的Django项目中。

第4步 – 与后端视图集成:

您必须创建一个Django视图和URL路由,将story_generator模块集成到您的Django项目中。在视图中,您将从请求中提取期望的单词,调用generate_story函数,并返回响应。

首先,打开您Django应用程序目录中的views.py文件。导入必要的模块并添加名为generate_story_from_words的视图函数:

~/my_blog_app/blog/blogsite/views.py
from django.http import JsonResponse
from .story_generator import generate_story

def generate_story_from_words(request):
    words = request.GET.get('words') # 从请求中提取期望的词语
    story = generate_story(words) # 使用提取的词语调用 generate_story 函数
    return JsonResponse({'story': story}) # 以 JSON 响应返回故事

接下来,打开 urls.py 文件并为 generate_story_from_words 视图添加一个 URL 模式:

~/my_blog_app/blog/blogsite/urls.py
urlpatterns = [
    # 其他 URL 模式...
    path('generate-story/', views.generate_story_from_words, name='generate-story'),
]

现在,您可以请求 /generate-story/ 端点。例如,要使用 curl 进行测试,您可以向该端点发出带有期望词语作为查询参数的 GET 请求。打开您的终端并运行以下命令:

(env)sammy@ubuntu:$ curl "http://your_domain/generate-story/?words=cat,book,computer,sun,water"

请确保将 "http://your_domain" 替换为您的 Django 项目托管的实际域名。词语 "cat,book,computer,sun,water" 表示您希望生成故事的期望词语。您可以将它们更改为任何您喜欢的词语。

运行命令后,您应该会看到来自服务器的响应,其中包含生成的故事:

(env)sammy@ubuntu:$ curl "http://your_domain/generate-story/?words="cat,book,computer,sun,water"

输出:

{"story": "Once upon a time, in a cozy little cottage nestled amidst a dense forest, a curious cat named Whiskers sat by the window, basking in the warm rays of the sun. As Whiskers lazily flicked his tail, his eyes caught sight of a dusty book lying on a nearby shelf. Intrigued, he carefully jumped onto the shelf, causing a cascade of books to tumble down, one opening up to reveal a hidden compartment. Inside, Whiskers discovered an ancient computer, its screen flickering to life as he brushed against the power button. Mesmerized by the glowing screen, Whiskers ventured into a world of virtual landscapes, where he roamed freely, chasing digital fish and pausing to admire breathtaking waterfalls. Lost in this newfound adventure, Whiskers discovered the wonders of both the tangible and virtual worlds, realizing that true exploration knows no bounds."}

结论

完成本教程后,您已经学会了如何使用 OpenAI API 将 OpenAI GPT 模型集成到您的 Django 项目中。您已经调用了 ChatCompletion API,通过调整诸如温度和最大 token 等参数来自定义模型的行为,并创建了一个系统提示,为模型提供上下文。您还将 story_generator 模块集成到了您的 Django 项目中。现在,您可以通过请求带有期望单词作为查询参数的 /generate-story/ 端点来生成简短故事。

要进一步增强您的 Django 项目,您可以探索 OpenAI API 的其他功能,并尝试不同的系统提示和参数来生成独特和创意丰富的故事。

Source:
https://www.digitalocean.com/community/tutorials/how-to-integrate-openai-gpt-models-in-your-django-project