気の向くままに辿るIT/ICT
ソフトウェア

自然言語処理モデルGPT-3を使う

ホーム前へ次へ
フリーソフト・オープンソースを活用しよう。

自然言語処理モデルGPT-3を使う

自然言語処理モデルGPT-3を使う

2021/11/20

 GPT(Generative Pre-trained Transformer)、GPT-2に次いで2020年06月に人数制限付きでAPIが公開されていたGPT-3(かのイーロン・マスク氏が共同代表のOpenAI発表の与えられたフレーズの次に来る言葉を予測する機械学習による自然言語処理モデルの第3バージョン)が、昨日の2021年11月19日、人数制限が撤廃され、広く公開されたということで早速、利用させて頂くことに。

 登録は無料ですが、API利用は有料!?みたいなので要注意(超巨大データを使ったマシンラーニングには莫大な費用かかってるでしょうからね)。

 ただ、現在は、最初の3ヶ月間有効な18ドル分の無料クレジットの実験中っぽいです。

 どうやって請求されるのか?18ドル超えるか、3ヶ月経過後から?

 以降は?あくまで現時点では、半角約4文字で1トークンらしく、各処理エンジンada/babbage/curie/davinci、それぞれ1000(1k)トークンいくら的な料金体系。

 ということは、日本語が基本2バイトだから2文字/トークン?、2000文字/1000トークン以内で?一番単価が高いdavinciだと今は0.06ドル(6セント)、無料クレジット18ドルってことは、300倍?、2000文字x300=60万文字?

 計算間違ってなくて、3ヶ月18ドル無料クレジットが有効なら、期限内にExamplesを1〜2件ずつテストするくらいは、どの処理エンジンを選んでも十分、無料でいけそう?

 よく見たら、ログインすれば、利用量・利用料をグラフ付き等々で確認できるダッシュボードがあるとのことで確認してみたところ...。

 日別グラフを見るとIntroduction時点からカウント、エラーになったケースも含まれる模様。

 また、当然?応答のresponseだけでなく、問いかけなどのprompt分も含まれるようです。

 それを含め、Examples 5件、基本、日本語でそれぞれ各2〜3回程度実行で現在0.55/18ドルとなっています。

 Examplesのケーススタディは、現時点で49件あるので順調にいけば、5.5ドルもあれば、いけそう、ということは余力さえあれば、無料枠内でまだ他でも遊べそうです。

 気づけば、[Grant 1 $18.00 2022年3月1日]とあり、どの辺りがしきい値なのか、20日からだと期限は、翌月からカウントされるようですね。

[2021/12/04] 処理エンジンにdavinci-codexを使う9件ほどはエンジンがないエラーになりつつ、Examplesをすべて試してみたところ、無料枠の1/10程度の1.88/18ドルでした。

利用登録とログイン

 利用開始には、次の手順が必要でした。

開発者クイックスタート

 ログイン後にアクセスすると冒頭に自身のAPIキーが表示されるDeveloper quickstartに沿ってcurlサンプル、openaiのpip/pip3によるインストールとサンプルを実行していきたいと思います。

 が、インストールは簡単な一方、自身の環境の問題か、OpenAI側のうっかりミスなのか、サンプルは、すんなりとはいかず、諦めとちょっとした対策が必要なので要注意。

debian:~$ curl https://api.openai.com/v1/engines/davinci/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer API_KEY" \
-d '{"prompt": "This is a test", "max_tokens": 5}'
{"id": "cmpl-xxxyyyzzz", "object": "text_completion", "created": aaabbbccc, "model": "davinci:2020-05-03", "choices": [{"text": ",\" she said. She", "index": 0, "logprobs": null, "finish_reason": "length"}]}
{
 "error": {
  "message": "You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. Authorization: Bearer YOUR_KEY), or as the password field (with blank username) if you're accessing the API from your browser and are prompted for a username and password. You can obtain an API key from https://beta.openai.com. Feel free to email support@openai.com if you have any questions.",
  "type": "invalid_request_error",
  "param": null,
  "code": null
 }
}
debian~:$

 最初のcurlコマンドのサンプルからしてつまづきます。

 自分のAPIキーを入れ、実行すると何も返ってきません。

 なぜか、再現しませんが、エラーが出ることも。

 応答がないのは、各種ExamplesのPythonスクリプト同様、内部で出力設定されていない可能性が高そうです。

 このままでは、進まないので、とりあえず、openaiをインストールしてみることに。

debian~:$ python -V
Python 3.9.2
debian~:$ pip3 --version
pip 20.3.4 from /usr/lib/python3/dist-packages/pip (python 3.9)
debian~:$ pip3 install -U openai
debian~:$ openai -h
...
debian~:$

 openaiのインストールはpip/pip3で簡単。

debian~:$ openai api completions.create -e davinci -p "This is a test" -M 5 --stream
Error: No API key provided. You can set your API key in code using 'openai.api_key = <API-KEY>', or you can set the environment variable OPENAI_API_KEY=<API-KEY>). If your API key is stored in a file, you can point the openai module at it with 'openai.api_key_path = '. You can generate API keys in the OpenAI web interface. See https://onboard.openai.com for details, or email support@openai.com if you have any questions.
debian~:$

 順が逆になりますが、端末からコマンドを実行すると...API keyがないエラー。

debian~:$ openai api completions.create -e davinci -p "This is a test" -M 5 --stream openai.api_key = API-KEY
openai: error: unrecognized arguments: openai.api_key = API-KEY
debian~:$ export OPENAI_API_KEY=API-KEY
debian~:$ openai api completions.create -e davinci -p "This is a test" -M 5 --stream
This is a test. (Demonstrators
debian~:$

 ならばと後述のエラーメッセージにあるようにopenai.api_key = API-KEY(もちろん自分のキー)を入れても...エラー。

 が、環境変数に設定したら、This is a test. (Demonstratorsと返ってきました。

debian~:$ cat openai_gpt3_test.py
import os
import openai
 
# Load your API key from an environment variable or secret management service
openai.api_key = os.getenv("OPENAI_API_KEY")
 
response = openai.Completion.create(engine="davinci", prompt="This is a test", max_tokens=5)
debian~:$ python openai_gpt3_test.py
Traceback (most recent call last):
 File "/home/xxx/tmp/openai_gpt3_test.py", line 8, in <module>
  response = openai.Completion.create(engine="davinci", prompt="This is a test", max_tokens=5)
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_resources/completion.py", line 31, in create
  return super().create(*args, **kwargs)
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_resources/abstract/engine_api_resource.py", line 58, in create
  requestor = api_requestor.APIRequestor(
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_requestor.py", line 75, in __init__
  self.api_key = key or util.default_api_key()
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/util.py", line 160, in default_api_key
  raise openai.error.AuthenticationError(
openai.error.AuthenticationError: No API key provided. You can set your API key in code using 'openai.api_key = <API-KEY>', or you can set the environment variable OPENAI_API_KEY=<API-KEY>). If your API key is stored in a file, you can point the openai module at it with 'openai.api_key_path = <PATH>'. You can generate API keys in the OpenAI web interface. See https://onboard.openai.com for details, or email support@openai.com if you have any questions.
debian~:$ python openai_gpt3_test.py
debian~:$

 前後しますが、OPENAI_API_KEYをexportする前にスクリプトに挑戦するも...同じようなAPI keyないよエラー。

 それもそのはず、os.getenv(OPENAI_API_KEY)は、環境変数OPENAI_API_KEYの値を取得する関数なので、この環境変数にAPI KEYを設定しなければなりません。

 ちなみに前述のopenai apiコマンドライン操作は、あのままではできなくなりますが、環境変数OPENAI_API_KEYを使わなくても、エラーメッセージにもある通り、openai.api_keyに直接APIキーを入れても、ファイルにAPIキーを保存してopenai.api_key_pathを指定してもいけます。

 自身は、Debian GNU/Linuxでsh/bashを使っているのでマシン起動時に設定しておくべく、.profileなり、.bash_profileや.bashrcなりに(export OPENAI_API_KEY=...と)追記しておくことにして、とりあえず、端末からexport。

 ということでexport OPENAI_API_KEY=...として改めてスクリプトを実行すると何も返ってきません...。

debian:~$ vi openai_gpt3_test.py
...
import os
import json
import openai
...
openai.api_key = os.getenv("OPENAI_API_KEY")
#openai.api_key = "API_KEY"
#openai.api_key_path =  "file_path"
...
response = openai.Completion.create(engine="davinci", prompt="空がきれい", max_tokens=5)
print(json.dumps(response, ensure_ascii=False, indent=2))
debian:~$ python openai_gpt3_test.py
{
 "id": "cmpl-aaabbbccc",
 "object": "text_completion",
 "created": 0123456789,
 "model": "davinci:2020-05-03",
 "choices": [
  {
   "text": " だった",
   "index": 0,
   "logprobs": null,
   "finish_reason": "length"
  }
 ]
}
debian:~$

 そりゃそうだ、このPythonスクリプトには、出力ステートメントがない...。

 というわけで調べてみると結果がjson形式で返ってくるらしくjson形式で結果を得れば良いらしい。

 json形式なら、結果を取得してみれば、配列構造もわかるでしょ、ということで実行。

 おお、結果が出力され、配列構造も、試しに日本語で「空がきれい」として実行したところ、(今回は)「だった」という結果が配列要素textに入ってくるということもわかりました。

 通り一辺ではないでしょうから、実行する度に違う答えが返ってくるのでしょう。

debian:~$ vi openai_gpt3_test.py
...
import os
import json
import openai
...
openai.api_key = os.getenv("OPENAI_API_KEY")
#openai.api_key = "API_KEY"
#openai.api_key_path =  "file_path"
...
response = openai.Completion.create(engine="davinci", prompt="空がきれい", max_tokens=5)
#print(json.dumps(response, ensure_ascii=False, indent=2))
print(response['choices'])
print(response['choices'][0])
print(response['choices'][0]['text'])
#print(str(response['choices'][0]['text']))
debian:~$ python openai_gpt3_test.py
{
[<OpenAIObject at 0x7fa112255e50> JSON: {
 "finish_reason": "length",
 "index": 0,
 "logprobs": null,
 "text": "\u3060\u3057\u3001\u306a\u306b"
}]
{
 "finish_reason": "length",
 "index": 0,
 "logprobs": null,
 "text": "\u3060\u3057\u3001\u306a\u306b"
}
だし、なに
debian:~$

 試しにresponse['choices']、response['choices'][0]、response['choices'][0]['text']を出力するようにしてみました。

 すると同じ「空はきれい」に対し、今度は、「だし、なに」と返ってきました。

 が、句読点のせいか、配列全体の方のtext値は、文字コードになっているようです。

 ここではJson形式の結果が芳しくないですが、ExamplesEnglish to French英語から仏語への翻訳では、Json形式では正しく結果を取得できる一方、print文だとフランス語の文字によっては?[TypeError: can only concatenate tuple (not "str") to tuple]といったエラーが出るので明示的に文字列へのキャストを要すこともあるなど、一長一短です。

 利用者で対処できる部分はまだしも、冒頭のcurl結果がかえってこない件やドキュメントへのprint文やjson取得サンプルの反映含め、OpenAIに改善をお願いしたいところですね。

 というわけで次回は、Examplesを試してみたいと思います。

ホーム前へ次へ