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

GPT-3のExamples/Q&Aを試してみた

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

GPT-3のExamples/Q&Aを試してみた

GPT-3のExamples/Q&Aを試してみた

2021/12/01

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

Q&A

debian:~$ python openai_examples_qa.py
('僕はとっても賢い質疑応答ボットだよ。もし君が事実にのっとった質問をしてくれたら、僕が答えてあげるよ。でも、もし、ナンセンスな質問をしたら、ごまかしたり、明快に答えるのは無理だから、「知らないよ」って答えるけどね。\n\n質問: 日本の人口は何人?\n答え: だいたい1億2507万人だよ。\n\n質問: 徳川15代将軍は誰?\n答え: 徳川慶喜。\n\n質問: アメリカの州はいくつ?\n答え: 確か50州だね。\n\n質問: 第九って誰が作ったの?\n答え: ベートーヴェンでしょ。\n\n質問: ベートーベンと弁当の関係は?\n答え: 知らないよ!\n\n質問: 大正時代に一番多い名前は?\n答え: 知らないよ!\n\n質問: マカダミアンナッツって言えば、どこのお土産?\n答え: ハワイかな。\n\n質問: ブルーハワイとレッドハワイどっちが美味い?\n答え: 知らないよ!\n\n質問: エジソンってどんな人?\n答え: 電球や電話機を発明した人だよ。\n\n質問: パリで一番にぎやかな通りは?\n答え:',)
 
 カンヌ通りだよ。
debian:~$ python openai_examples_qa.py
('僕はとっても賢い質疑応答ボットだよ。もし君が事実にのっとった質問をしてくれたら、僕が答えてあげるよ。でも、もし、ナンセンスな質問をしたら、ごまかしたり、明快に答えるのは無理だから、「知らないよ」って答えるけどね。\n\n質問: 日本の人口は何人?\n答え: だいたい1億2507万人だよ。\n\n質問: 徳川15代将軍は誰?\n答え: 徳川慶喜。\n\n質問: アメリカの州はいくつ?\n答え: 確か50州だね。\n\n質問: 第九って誰が作ったの?\n答え: ベートーヴェンでしょ。\n\n質問: ベートーベンと弁当の関係は?\n答え: 知らないよ!\n\n質問: 大正時代に一番多い名前は?\n答え: 知らないよ!\n\n質問: マカダミアンナッツって言えば、どこのお土産?\n答え: ハワイかな。\n\n質問: ブルーハワイとレッドハワイどっちが美味い?\n答え: 知らないよ!\n\n質問: エジソンってどんな人?\n答え: 電球や電話機を発明した人だよ。\n\n質問: パリで一番にぎやかな通りは?\n答え:',)
 
{
 "id": "cmpl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "object": "text_completion",
 "created": xxxxxxxx,
 "model": "davinci:2020-05-03",
 "choices": [
  {
   "text": " カンヌ通りだよ。",
   "index": 0,
   "logprobs": null,
   "finish_reason": "stop"
  }
 ]
}
debian:~$

 知らないことには、「Unknown」と答える既存の知識に基づく質疑応答Q&A

 なんとなくシャンゼリゼ通りかと思いきや、2回ともカンヌ通り、カンヌってカンヌ映画祭のカンヌね。

debian:~$ cat openai_examples_qa.py
import openai
import os
import json
 
openai.api_key = os.getenv("OPENAI_API_KEY")
#prompt="I am a highly intelligent question answering bot. If you ask me a question that is rooted in truth, I will give you the answer. If you ask me a question that is nonsense, trickery, or has no clear answer, I will respond with \"Unknown\".\n\nQ: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: Unknown\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.\n\nQ: How many squigs are in a bonk?\nA: Unknown\n\nQ: Where is the Valley of Kings?\nA:",
prompt="僕はとっても賢い質疑応答ボットだよ。もし君が事実にのっとった質問をしてくれたら、僕が答えてあげるよ。でも、もし、ナンセンスな質問をしたら、ごまかしたり、明快に答えるのは無理だから、「知らないよ」って答えるけどね。\n\n質問: 日本の人口は何人?\n答え: だいたい1億2507万人だよ。\n\n質問: 徳川15代将軍は誰?\n答え: 徳川慶喜。\n\n質問: アメリカの州はいくつ?\n答え: 確か50州だね。\n\n質問: 第九って誰が作ったの?\n答え: ベートーヴェンでしょ。\n\n質問: ベートーベンと弁当の関係は?\n答え: 知らないよ!\n\n質問: 大正時代に一番多い名前は?\n答え: 知らないよ!\n\n質問: マカダミアンナッツって言えば、どこのお土産?\n答え: ハワイかな。\n\n質問: ブルーハワイとレッドハワイどっちが美味い?\n答え: 知らないよ!\n\n質問: エジソンってどんな人?\n答え: 電球や電話機を発明した人だよ。\n\n質問: パリで一番にぎやかな通りは?\n答え:",
 
response = openai.Completion.create(
 engine="davinci",
 prompt=prompt,
 temperature=0,
 max_tokens=100,
 top_p=1,
 frequency_penalty=0.0,
 presence_penalty=0.0,
 stop=["\n""]
)
#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の中身によっては、文字列にキャストしないとエラーとなるケースもありました。

ホーム前へ次へ