OpenAI 文章生成モデルGPT−3のAPIを使ってみる

OpenAIのGPT-3の性能が話題となっています。Playgroundを使った利用に関しては、以下の記事を参照してください。

Open AI 最新の文章生成モデル(GPT-3 text-davinci-003) を使ってみる

Open AIは人工知能を研究する団体です。画像生成モデルのDALL-Eや、文章生成モデルのGPT-3などが有名です。先月、GPT-3の最新モデルが公開されたとのことですので、試して…

今回は、GPTの最新モデル(text-davinci-003)を使って、ChatGPTのような対話アプリケーションを作ってみます。

OpenAIからは利用できるAPIが提供されているのでアプリケーションから直接このAPIを叩けば良いのですが、クライアントアプリに組み込んでしまうと使い勝手が悪いので、仲介するAPIを作りたいと思います。これでさまざまなクライアントから必要に応じて、GPT-3にアクセスできます。

このAPIは、クライアントからのリクエストをOpen AIに投げるだけなので、常時動作の必要はありません。コストもかかりますので、AWSのLambdaを使います。以前、Chaliceという便利な仕組みで同様のことをしていますので、今回もChaliceを使います。

AWS Lambda のChalice使ってflask APIをデプロイする

前回、Netlifyの記事を書きましたが、今回は、Chaliceです。 接続としては、以下の通りです。 <LINE> ー <Dialogflow> ー <heroku> ー <V […]

OpenAI Build your application

OpenAIのサンプルはflaskを使っていますので、サンプルをベースに改造していきます。(Open AI Quick start tutorial)

先に、チュートリアルに従って、ペットの名前をつけるWebアプリを作成してみます。

コードを取得し、サンプルの環境ファイル(.env)を作成します。

git clone https://github.com/openai/openai-quickstart-python.git
cd openai-quickstart-python
cp .env.example .env

次に、「Create new secret key」ボタンを押してOPENAI _API_KEYを取得します。先ほどの.envファイルに取得したキーを設定しておきます。

FLASK_APP=app
FLASK_ENV=development
OPENAI_API_KEY=<Your API key>

最後に、仮想環境をアクティベートして、必要なライブラリをpip install できたら、flask runでアプリを実行させます。

python -m venv venv
. venv/bin/activate
pip install -r requirements.txt
flask run

”http://localhost:5000”にアクセスすると、以下のような画面が出現するかと思います。

Open AI quick tutorial

Enter an animal に DogとかCatを入力すると名前をいくつか表示してくれます。

この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-002",
            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()
    )

コードを見ると、タスクに必要なpromptをgenerate_promptで作成して、openai.Completion.create()にモデルなどのパラメータと一緒に渡せば良いことがわかります。

また、このサンプルのpromptには、Cat,Dogに対して幾つかの例を提示しておいて、入力されたAnimalに対してsuperheroな名前を3つ提案することが記載されています。

対話アプリケーションへの適用(Chat APIの作成)

さて、本題に戻ります。対話アプリケーションから呼び出されるAPIを先ほどのサンプルをベースに作っていきます。

サーバーレスで実装するために、Lambda(Chalice)を使っています。GoogleやIBMのCloud Functionでもいいかと思います。

from chalice import Chalice
import os
import openai


app = Chalice(app_name=<Your APP Name>)
app.debug = True

openai.api_key = <Your openAI-API key>

@app.route('/')
def index():
    return {'hello': 'world'}

@app.route('/chat', methods=['POST'])
def chat():
    try:    
        request = app.current_request

        model = request.json_body['model']
        user_prompt = request.json_body['user_prompt']
        temperature =request.json_body['temperature']
        max_tokens=request.json_body['max_tokens']
        
        response = openai.Completion.create(
            model=model,
            prompt='以下はAIアシスタントとの会話です。Human:久しぶり。\nAI:久しぶりですね。\nHuman:'+user_prompt+'\nAI:',
            temperature=float(temperature),
            max_tokens=int(max_tokens)
        )
        return response.choices[0].text

    except:
        return {"result":"error"}



上記例では、https://<Yout URL>/chatに対して、以下のようなJSONをPOSTすると、AIアシスタントの応答を返してくれます。

{
    "model":"text-davinci-003",
    "user_prompt":"今日のお昼ご飯は何を食べようかな?",
    "temperature":"0.6",
    "max_tokens":"80"

}

chatタスク専用なので、上記のようにしましたが、汎用的にするためにprompt全体をクライアント側で生成して、APIに渡しても良いかもしれません。例えば、数回分の会話履歴をpromptに与えてやると、流れに従ったより自然な対話応答が生成されるかと思います。

promptの内容は応答の精度や処理時間、GPT-3のコストにも影響をしますので、都度、適切に生成すべきかと思います。