OpenAI APIを活用した遊戯王APIからの情報取得システムがパワーアップ
前回作成したFunction Callingから遊戯王APIにアクセスするシステムは英語のカード名にしか対応しない問題があった。
そこで、
- 日本語への対応
- あいまい入力への対応
を行った。
1. 実験結果
まずは実験結果から見せる。
- 実験1
1
2[SYSTEM MESSAGE]テキストを入力してください: バスターブレイダーーの攻撃力は?
[AI]バスターブレイダーーの攻撃力は2600です。ただし、相手のフィールドや墓地にいるドラゴン族モンスターが1体につき攻撃力が500アップします
「バスターブレイダーー」という間違った入力に対して答えていることが分かる。
また、普通のChatGPTと比較すると遊戯王APIから取得した正確な情報を返しているところが優れている。
- 実験2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[SYSTEM MESSAGE]テキストを入力してください: オシリスの天空流について表にまとめて!
[AI]オシリスの天空流についての表は以下の通りです。
------------------------------
| 名前 | オシリスの天空竜 |
------------------------------
| レベル | 10 |
------------------------------
| 属性 | 神 |
| 種族 | 神獣 |
------------------------------
| 効果 | モンスターがフィールドに召喚された場合、そのモンスターの攻撃力を2000ポイント下げる。もし下げた結果、攻撃力が0になった場合、そ
のモンスターは破壊される。手札のカード1枚につき、このカードの攻撃力と守備力は1000ポイントアップする。このカードの召喚は、通常召喚時に3
体のモンスターをリリースしなければならない。この効果の召喚は無効化されない。このカードの召喚時、カードの効果は発動できない。1ターンに1
度、このカードが特殊召喚された場合、エンドフェイズ時に墓地に送る。 |
これがオシリスの天空流のカード情報です。
参照元が英語テキストなので本来の日本語テキストとは若干異なるが正しい答えが返ってきている。
あえて「オシリスの天空流」というこちらの誤字を使って回答しているのはユーザーへの配慮なのか。
- 実験3
1
2
3
4[SYSTEM MESSAGE]テキストを入力してください: サイコショッカーの攻撃力は?
[DEBUG][('人造人間-サイコ・ショッカー', 78.75, 12), ('脅威の人造人間-サイコ・ショッカー', 78.75, 3785), ('ダッカー', 77.14285714285715, 2498), ('サイコトラッカー', 75.0, 2730), ('ブロッカー', 67.5, 6870)]
[AI]「サイコショッカー」というカード名の詳細情報は存在しません。ただし、人造人間-サイコ・ショッカーや脅威の人造人間-サイコ・ショッカ
ーなど、関連するカードが存在することがわかりました。これらのカードについての攻撃力については詳細情報が必要です。
今回のシステムは、
- 最も類似度が高いカード名の類似度を取得
- 類似度が80以上であれば:そのカードの情報を返す
- 類似度が80未満であれば:類似度上位5件のカード名を返す
という処理にしている。
「サイコショッカー」と「人造人間-サイコ・ショッカー」の類似度は78.75と、80未満だったので正解の候補を返す。
この場合の処理についても良い感じのメッセージを生成してくれている。
2. 前回からの修正点
前回からの修正点を記す。
コードは最後に載せる。
2.1. システムフロー
この図の「関数が選ばれた場合の処理」の中身が追加、変更されている。
2.2. 日本語への対応
たまたま持っていた遊戯王の「日本語カード名」と「カードID」の紐づいた表を使用。
下記のような形式。
cardinfo.csv
1
2
3
4
5
6
7
8
9rank,name_jp,card_id,atk,def
1,ブラック・マジシャン,46986414,2500,2100
2,青眼の白龍,89631139,3000,2500
3,ブラック・マジシャン・ガール,38033121,2000,1700
4,マスター・オブ・OZ,27134689,4200,3700
5,サイバー・ドラゴン,70095154,2100,1600
.
.
.
これは以前の実験で得た副産物。
2.3. あいまい入力への対応
rapidfuzzを使用して名寄せを行う関数search_correct_name
を作成。
入力文字列と最も類似度の高い文字列が正式名称だと判断して処理を行う。
3. コード
今回の実験で使用したコード。
python3.11
rapidfuzz, pandas, openaiを別途インストール
1 | from rapidfuzz.process import extract |