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

GPT-3のExamples/Explain codeを試してみた

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

GPT-3のExamples/Explain codeを試してみた

GPT-3のExamples/Explain codeを試してみた

2021/11/23

 OpenAIの自然言語処理モデルGPT-3のExamples/Explain codeを試してみました。

Explain code

debian:~$ python openai_examples_explain_code.py
Traceback (most recent call last):
 File "/path/to/openai_examples_explain_code.py", line 10, in
  response = openai.Completion.create(
 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 65, in create
  response, _, api_key = requestor.request(
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_requestor.py", line 107, in request
  resp, got_stream = self._interpret_response(result, stream)
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_requestor.py", line 292, in _interpret_response
  self._interpret_response_line(
 File "/home/xxx/.local/lib/python3.9/site-packages/openai/api_requestor.py", line 318, in _interpret_response_line
  raise self.handle_error_response(
openai.error.InvalidRequestError: Engine not found
debian:~$ vi openai_examples_explain_code.py
...
  engine = "davinci-codex"
  engine = "davinci"
...
debian:~$ python openai_examples_explain_code.py
('import os\nimport json\nimport openai\n\nopenai.api_key = os.getenv("OPENAI_API_KEY")\nprompt="\n\n"""\n上記のスクリプトは何をしているのかな?:\n1.",\n\nresponse = openai.Completion.create(\n engine="davinci-codex",\n prompt=prompt,\n temperature=0,\n max_tokens=64,\n top_p=1.0,\n frequency_penalty=0.0,\n presence_penalty=0.0,\n stop=["""""]\n)\nprint(prompt)\nprint("")\nprint(json.dumps(response, ensure_ascii=False, indent=2))\n\n"""\n上記のスクリプトは何をしているのかな?:\n1.',)
 
 
 
 
debian:~$

 複雑なプログラミングコードの一部を自然言語で説明するExplain code

 このスクリプトが何をしているのか説明してもらおうとスクリプトを書いてみました。

 が、残念ながら、4つしかないかと思いきや、いろいろバリエーションがありそうな処理エンジン、サンプル指定のdavinci-codexが見当たらないエラーに見舞われました。

 他のサンプルでは、それでもいけていましたが、ダブルクォートだらけだからかと大外をシングルクォートにしてもダメ。

 davinci-codexをdavinciに修正してみたら、ソース解析のような特殊ケースには対応していないようで2回ほど試しましたが応答がないというか、無回答でした。

OpenAI GPT-3 codex利用申請フォームリンクの場所
2021/12/04

 あ、一通り終わってよく見たら、各Examplesの右上に[Open in Playground]というボタンがあり、(davinci-)codexを使うものは背景がグレーアウトでポイントは可、クリック不可、それ以外はグリーンでクリック可能でWebエディタ?に遷移するようになっていました。

 でグレーアウトされた[Open in Playground]をマウスでポイントして文中の[join the waitlist]のリンクをクリックすると申請フォームに遷移、登録後、しばらく待って利用可能メールがくれば晴れてcodexエンジンを使えるようになるとのこと。

 これは、現時点ではプライベートベータ版であるCodexモデルシリーズを使うサンプルで、やってみたいなら待機リストに登録してねってことのようです。

debian:~$ cat openai_examples_chat.py
import openai
import os
import json
 
openai.api_key = os.getenv("OPENAI_API_KEY")
#prompt="class Log:\n def __init__(self, path):\n dirname = os.path.dirname(path)\n os.makedirs(dirname, exist_ok=True)\n f = open(path, \"a+\")\n\n # Check that the file is newline-terminated\n size = os.path.getsize(path)\n if size > 0:\n f.seek(size - 1)\n end = f.read(1)\n if end != \"\\n\":\n f.write(\"\\n\")\n self.f = f\n self.path = path\n\n def log(self, event):\n event[\"_event_id\"] = str(uuid.uuid4())\n json.dump(event, self.f)\n self.f.write(\"\\n\")\n\n def state(self):\n state = {\"complete\": set(), \"last\": None}\n for line in open(self.path):\n event = json.loads(line)\n if event[\"type\"] == \"submit\" and event[\"success\"]:\n state[\"complete\"].add(event[\"id\"])\n state[\"last\"] = event\n return state\n\n\"\"\"\nHere's what the above class is doing:\n1.",
#prompt="import os\nimport json\nimport openai\n\nopenai.api_key = os.getenv("OPENAI_API_KEY")\nprompt="\n\n\"\"\"\n上記のスクリプトは何をしているのかな?:\n1.",\n\nresponse = openai.Completion.create(\n engine="davinci-codex",\n prompt=prompt,\n temperature=0,\n max_tokens=64,\n top_p=1.0,\n frequency_penalty=0.0,\n presence_penalty=0.0,\n stop=["\"\"\""]\n)\nprint(prompt)\nprint("")\nprint(json.dumps(response, ensure_ascii=False, indent=2))\n\n\"\"\"\n上記のスクリプトは何をしているのかな?:\n1.",
prompt='import os\nimport json\nimport openai\n\nopenai.api_key = os.getenv("OPENAI_API_KEY")\nprompt="\n\n\"\"\"\n上記のスクリプトは何をしているのかな?:\n1.",\n\nresponse = openai.Completion.create(\n engine="davinci-codex",\n prompt=prompt,\n temperature=0,\n max_tokens=64,\n top_p=1.0,\n frequency_penalty=0.0,\n presence_penalty=0.0,\n stop=["\"\"\""]\n)\nprint(prompt)\nprint("")\nprint(json.dumps(response, ensure_ascii=False, indent=2))\n\n\"\"\"\n上記のスクリプトは何をしているのかな?:\n1.',
 
response = openai.Completion.create(
 engine="davinci",
 prompt=prompt,
 temperature=0.9,
 max_tokens=150,
 top_p=1,
 frequency_penalty=0.0,
 presence_penalty=0.6,
 stop=["\n", " Human:", " AI:"]
)
#print(prompt)
print(str(prompt))
print(" ")
print(response['choices'][0]['text'])
#print(str(response['choices'][0]['text']))
#print(json.dumps(response, ensure_ascii=False, indent=2))
debian:~$

 ソースはこんな感じ、環境変数OPENAI_API_KEYに自分のAPIキーが入っている前提です。

 そのままでは想定通り機能しないので一部オリジナルソースから変更しています。

 print()、もしくは、json出力しないと実行しても何も表示されないので何れかを追加する必要があり、後者用にimport jsonを追加。

 が、応答内容によっては、何れか一方では表示できないことがあり、他方を使用せざるを得ないこともあります。

 表示できないのが、print文なら、response配列を文字列にキャストすれば、たいていは凌げますが。

 応答文だけだとチャット状態にならず、問いかけ文も表示したいところ。

 が、サンプル通りだとprintやjson形式で出力しようにも問いかけ用の変数promptがスコープの範囲になく、スコープに入るようPythonの場合だとインデント階層を相応に上げたところで変数が登場(変数宣言)するようにする必要があります。

 また、promptの中身によっては、文字列にキャストしないとエラーとなるケースもありました。

ホーム前へ次へ