DjangoプロジェクトにOpenAI GPTモデルを統合する方法

著者は、Direct Relief Programを寄付の受け手として選択しました。Write for DOnationsプログラムの一環として。

はじめに

OpenAI GPTモデルは、電子メールの下書き、顧客サービスのFAQの回答、言語翻訳など、さまざまなタスクのテキストコンテンツ生成に広く使用されています。

これらのGPTモデルは、一般的にはChatGPT(OpenAIによってリリースされたチャットボット)を介して利用されるか、より細かい制御を提供するAPIやライブラリを介して利用されます。このチュートリアルでは、Djangoウェブプロジェクト内でOpenAI APIを使用してこれらのモデルを活用する方法を説明します。さまざまなパラメータを使用してChatCompletion APIを呼び出し、その応答をフォーマットして利用する方法を学びます。

このチュートリアルの最後までには、提供された単語を使用して短いストーリーを構築するためにOpenAIにリクエストを送信し、その応答を返すDjangoエンドポイントを作成します。

前提条件

このチュートリアルを完了するには、以下が必要です:

  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 APIキーをOpenAIクライアントに追加し、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(他のオプションは system および assistant)であり、コンテンツ/プロンプトが 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 コールを成功させたので、モデルの動作をカスタマイズするためのパラメーターをどのように扱うかを探ってみましょう。生成されるテキストを制御するためのいくつかの利用可能なパラメーターがあります。以下の3つを見てみましょう。

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 を2回試してみましょう:

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.

かなり興味深いですね! Djangoのビューからgenerate_story関数を呼び出すので、printステートメントの行を削除しましょう。 story_generator.py ファイルからハイライトされた行を削除してください:

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

システムプロンプトを実験して、ストーリーの生成を改善するために、より多くのコンテキストやルールを追加してください。

次のステップに進み、story_generator モジュールをDjangoプロジェクトに統合します。

ステップ4 – バックエンドビューとの統合:

story_generator モジュールをDjangoプロジェクトに統合するために、DjangoのビューとURLルートを作成する必要があります。ビューでは、リクエストから予想される単語を抽出し、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"

コマンドを実行した後、サーバーから生成されたストーリーを含むレスポンスが表示されます:

(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 GPTモデルをOpenAI APIを使用してDjangoプロジェクトに統合する方法を学びました。ChatCompletion APIに対して呼び出しを行い、温度や最大トークンなどのパラメータを操作してモデルの振る舞いをカスタマイズし、システムプロンプトを作成してモデルにコンテキストを提供しました。また、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