ウェブサイト検索

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


著者は「Write for DOnations」プログラムの一環として、寄付を受けるためにDirect Relief Programを選びました。

紹介

OpenAIのGPTモデルは、メールの草案作成、カスタマーサービスのFAQへの回答、翻訳など、さまざまなタスクのテキストコンテンツを生成するために広く使用されているため、人気を博しています。

これらのGPTモデルは、一般的にOpenAIがリリースしたチャットボットのChatGPTや、より大きな制御を提供する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パッケージ:最初の前提条件にあるチュートリアルに従った場合、django-appsというディレクトリ内にenvという名前の仮想環境が既にアクティブになっているはずです。ターミナルのプロンプトの最初にその名前がかっこ内に表示されていることで、仮想環境がアクティブであることを確認してください。アクティブでない場合は、次のコマンドを実行して手動でアクティブにできます:

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)を含む単一のメッセージオブジェクトと、コンテンツ/プロンプト1から10まで数えてを追加しました。

API呼び出しからの応答を確認するには、応答メッセージを印刷できます。これには、1から10までの数字が素敵なリストに含まれているはずです。

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

出力 :

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)
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)
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)
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)
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)
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)
['', '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という関数を定義して、単語のコレクションを入力として受け取ります:

import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_KEY"])
def generate_story(words):
    # Call the OpenAI API to generate the story
    response = get_short_story(words)
    # Format and return the response
    return format_response(response)

この関数では、ストーリーのためにOpenAIにAPIコールを行うために別の関数get_short_storyを呼び出し、次にAPIからのレスポンスをフォーマットするために別の関数format_responseを呼び出します。

さて、get_short_story関数に焦点を当てましょう。次の内容をあなたのstory_generator.pyファイルの最後に追加してください:

def get_short_story(words):
    # Construct the system prompt
    system_prompt = f"""You are a short story generator.
    Write a short story using the following words: {words}.
    Do not go beyond one paragraph."""
    # Make the API call
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{
            "role": "user",
            "content": system_prompt
        }],
        temperature=0.8,
        max_tokens=1000
    )

    # Return the API response
    return response

この関数では、最初にシステムプロンプトを設定します。これはモデルに実行すべきタスクを知らせ、ストーリーの長さを指定します。次に、このシステムプロンプトをChatCompletion APIに渡し、その応答を返します。

ついに、format_response 関数を実装できます。次の内容を story_generator.py ファイルの一番下に追加してください:

def format_response(response):
    # Extract the generated story from the response
    story = response.choices[0].message.content
    # Remove any unwanted text or formatting
    story = story.strip()
    # Return the formatted story
    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 - バックエンドビューとの統合:

Djangoプロジェクトにstory_generatorモジュールを統合するために、DjangoのビューとURLルートを作成する必要があります。ビューでは、リクエストから期待される単語を抽出し、generate_story関数を呼び出し、レスポンスを返します。

まず、Djangoアプリのディレクトリにあるファイルviews.pyを開きます。必要なモジュールをインポートし、generate_story_from_wordsという名前のビュー関数を追加します:

from django.http import JsonResponse
from .story_generator import generate_story

def generate_story_from_words(request):
    words = request.GET.get('words') # Extract the expected words from the request
    story = generate_story(words) # Call the generate_story function with the extracted words
    return JsonResponse({'story': story}) # Return the story as a JSON response

次に、urls.pyファイルを開き、generate_story_from_wordsビューのためのURLパターンを追加します:

urlpatterns = [
    # Other URL patterns...
    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に呼び出しを行い、温度や最大トークンなどのパラメーターを操作してモデルの動作をカスタマイズし、モデルに文脈を提供するためのシステムプロンプトを作成しました。また、story_generatorモジュールをDjangoプロジェクトに統合しました。これで、期待する単語をクエリパラメーターとして指定して/generate-story/エンドポイントにリクエストを送信することで短編小説を生成できるようになりました。

あなたのDjangoプロジェクトをさらに向上させるために、OpenAI APIの追加機能を探求し、さまざまなシステムプロンプトやパラメータを使ってユニークで創造的な物語を生成することができます。

関連記事: