OpenAI 文章生成モデルGPT−3のAPIを使ってみる
ChatGPTで使われているモデルのAPIが公開されました。
こちらもご覧ください。
OpenAI ChatGPTのモデル(gpt-3.5-turbo)を使ってみる
OpenAIのGPT-3の性能が話題となっています。Playgroundを使った利用に関しては、以下の記事を参照してください。
今回は、GPTの最新モデル(text-davinci-003)を使って、ChatGPTのような対話アプリケーションを作ってみます。
OpenAIからは利用できるAPIが提供されているのでアプリケーションから直接このAPIを叩けば良いのですが、クライアントアプリに組み込んでしまうと使い勝手が悪いので、仲介するAPIを作りたいと思います。これでさまざまなクライアントから必要に応じて、GPT-3にアクセスできます。
このAPIは、クライアントからのリクエストをOpen AIに投げるだけなので、常時動作の必要はありません。コストもかかりますので、AWSのLambdaを使います。以前、Chaliceという便利な仕組みで同様のことをしていますので、今回もChaliceを使います。
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”にアクセスすると、以下のような画面が出現するかと思います。
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のコストにも影響をしますので、都度、適切に生成すべきかと思います。
追記
OpenAIのAPIを利用した開発をする際に重要なコンテンツチェックに関して、以下の記事を書きました。併せてご覧ください。