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

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

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

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

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

2021/11/22

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

Classification

debian:~$ python openai_examples_classification.py
('下記は、果物のリストであり、こんな感じの関係があり、\n\nサクランボ: 春の果物、赤くて甘い\nすいか: 夏の果物、外は緑、中は赤、水分たっぷりで甘い\n柿: 秋の果物でオレンジ色、シャキシャキした硬めのもジューシーな柔らかめのも甘くて美味しい\nりんご: 冬の果物で皮はその多くは赤く身は白い、甘酸っぱいのも甘いのもある\nメロン:',)
 
 冬の果
debian:~$ python openai_examples_classification.py
('下記は、動物の鳴き声のリストであり、こんな感じ、\n\n犬: わんわん\n猫: ニャーニャー\nねずみ: チューチュー\n馬: ヒヒーン\n牛:',)
 
 ヒヒーン
debian:~$ python openai_examples_classification.py
('下記は、パソコン周辺機器のリストであり、こんな感じ、\n\nモニター: 文字や映像を映し出す\nキーボード: 文字を入力する\nマウス: 方向を示す\nマイク: 音を入力する\nスピーカー:',)
 
 音を出力する
debian:~$ python openai_examples_classification.py
("The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:",)
 
{
 "id": "cmpl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "object": "text_completion",
 "created": xxxxxxxx,
 "model": "davinci:2020-05-03",
 "choices": [
  {
   "text": " 音を出力する",
   "index": 0,
   "logprobs": null,
   "finish_reason": "stop"
  }
 ]
}
debian:~$

 とあるカテゴリ分けを例示しつつ、質問すると相応に分類するClassification

 果物についての応答は、途中で欠落していますが、後述のようにスクリプト側でmax_tokens値を相応に設定すれば、後の文字列も表示されます。

 が、この瞬間は、日本語だから、こういうこともあるのかな?程度で、気づかず、動物の鳴き声のサンプルを試すことに。

 動物の鳴き声は提示したサンプル数が少なかったのか、牛がヒヒーンと鳴く羽目に。

 一方、パソコン周辺機器の例は、見事に答えてますね。

 また、応答が英語になるものもある中、このサンプルも応答は日本語でした。

debian:~$ cat openai_examples_classification.py
import openai
import os
import json
 
openai.api_key = os.getenv("OPENAI_API_KEY")
#prompt="The following is a list of companies and the categories they fall into\n\nFacebook: Social media, Technology\nLinkedIn: Social media, Technology, Enterprise, Careers\nUber: Transportation, Technology, Marketplace\nUnilever: Conglomerate, Consumer Goods\nMcdonalds: Food, Fast Food, Logistics, Restaurants\nFedEx:",
#prompt="下記は、果物のリストであり、こんな感じの関係があり、\n\nサクランボ: 春の果物、赤くて甘い\nすいか: 夏の果物、外は緑、中は赤、水分たっぷりで甘い\n柿: 秋の果物でオレンジ色、シャキシャキした硬めのもジューシーな柔らかめのも甘くて美味しい\nりんご: 冬の果物で皮はその多くは赤く身は白い、甘酸っぱいのも甘いのもある\nメロン:",
#prompt="下記は、動物の鳴き声のリストであり、こんな感じ、\n\n犬: わんわん\n猫: ニャーニャー\nねずみ: チューチュー\n馬: ヒヒーン\n牛:",
prompt="下記は、パソコン周辺機器のリストであり、こんな感じ、\n\nモニター: 文字や映像を映し出す\nキーボード: 文字を入力する\nマウス: 方向を示す\nマイク: 音を入力する\nスピーカー:",
 
response = openai.Completion.create(
 engine="davinci",
 prompt=prompt,
 temperature=0,
 max_tokens=16,
 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キーが入っている前提です。

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

 元の英語オリジナルのサンプルでは、max_tokens=6でしたが、今回は、日本語で、このサンプルの応答には不足するのでmax_tokens=16としました。

 果物の例では、max_tokens=6のままだったので「冬の果」で終わっており、続きもあったとは思うものの、メロンは冬の果物ではないこともあり、修正後の再確認はしませんでした。

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

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

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

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

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

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

ホーム前へ次へ