🐱

OpenAI APIを使用したアプリを構築してみた

2023/03/14に公開

OpenAIの公式ホームページにAPIの使用方法が書かれていたので、サンプルアプリと共に構築してみました。

前提条件

  • Pythonがインストール済み。インストールしていない人はこちらから。

アプリのコードを用意する

下記のリポジトリをクローンしてアプリファイルをインストールします。または、公式サイトからzipファイルをダウンロードします。

git clone https://github.com/openai/openai-quickstart-python.git

APIキーを追加する

クローンしたリポジトリに移動して、新規の.envファイルを作成します。

% cd openai-quickstart-python
% cp .env.example .env

作成できたか確認します。
※ユーザー名は隠しています。

% ls -l
total 56
416B Mar 12 16:57 .
160B Mar 12 16:37 ..
213B Mar 12 17:04 .env
162B Mar  8 12:06 .env.example
115B Mar  8 12:06 .gitignore
1.0K Mar  8 12:06 LICENSE
1.2K Mar  8 12:06 README.md
96B Mar 12 16:57 __pycache__
940B Mar  8 12:06 app.py
413B Mar  8 12:06 requirements.txt
128B Mar  8 12:06 static
96B Mar  8 12:06 templates
192B Mar 12 16:49 venv

公式ページでAPIキーが作成できるので、そこでキーを作成します。

それから、そのキーを新規で作った.envファイルに追加します。

% code .env
FLASK_APP=app
FLASK_ENV=development

# Once you add your API key below, make sure to not share it with anyone! The API key should remain private.
OPENAI_API_KEY=ここにキーを入れる

アプリを実行する

下記のコマンドを実行して、アプリを起動させます。
pythonコマンドはバージョンによって変わります。

python3 -m venv venv
. venv/bin/activate
pip3 install -r requirements.txt
flask run
 * Serving Flask app 'app' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 177-654-623

アプリが起動出来ました。
http://127.0.0.1:5000/ をブラウザで開くとアプリを見ることができます。
動物の名前を入力すると、スーパーヒーローのような動物の名前を3つ提案してくれます。

以上でアプリ構築は完了です。
次はコードについて見ていきます。

コードの確認

app.pyファイルを開くと、コードが確認出来ます。
response = openaiの所で実際のAPIリクエストを送っています。

% code app.py
import os

import openai
from flask import Flask, redirect, render_template, request, url_for

app = Flask(__name__)
openai.api_key = os.getenv("OPENAI_API_KEY")


@app.route("/", methods=("GET", "POST"))
def index():
    if request.method == "POST":
        animal = request.form["animal"]
        response = openai.Completion.create(
            model="text-davinci-003",
            prompt=generate_prompt(animal),
            temperature=0.6,
        )
        return redirect(url_for("index", result=response.choices[0].text))

    result = request.args.get("result")
    return render_template("index.html", result=result)


def generate_prompt(animal):
    return """Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: {}
Names:""".format(
        animal.capitalize()
    )

因みに私はプログラミングには苦手なので、ChatGPTにコードの内容を解説してもらいました。
結構分かりやすく解説されていますね。

1行目: os モジュールをインポートします。このモジュールは、OSに依存する機能にアクセスするために使用されます。
2行目: openai モジュールをインポートします。このモジュールは、OpenAIのAPIにアクセスするために使用されます。
3行目: Flask、redirect、render_template、request、url_for をそれぞれインポートします。これらは、Flaskフレームワークの機能を使用するために必要です。
5行目: Flaskアプリケーションを作成し、app変数に格納します。
6行目: openai.api_key 変数を設定します。APIキーは、OpenAI APIにアクセスするために必要です。
8行目: / というURLに関連付けられた関数 index を定義します。GET と POST メソッドの両方を許可しています。
10-14行目: request.method が "POST" である場合、フォームから入力された animal の名前を取得し、OpenAI APIを使用してその名前に関連する3つのスーパーヒーロー名を生成します。生成された名前のうち、最初の名前を含むURLにリダイレクトします
16-18行目: request.args.get("result") を使用して、前回のリクエストで生成された結果を取得します。
20-22行目: generate_prompt 関数を定義します。この関数は、与えられた動物に対して3つのスーパーヒーロー名を生成するためのプロンプトを返します。
23行目: animal の名前を大文字に変換し、プロンプト文字列内に挿入されます。

以上で今回のやってみたは終了となります。

Discussion