見出し画像

【AI】claude-3.5-sonnetがお馬鹿な件

ITエンジニアの ゆる写 です。
前回こんな記事を書きました。

そこで大きな壁にぶちあったためゼロベースで作り直すことにしました。
ローグライクゲームを作るのにCursor Composer Agentでモデルにclaude-3.5-sonnetを指定してコードを生成させています。今回はその中で出てきた問題をご紹介します。

ローグライクゲームで大事な要素って何があるかご存知ですか?そもそもローグライクゲームとはという方は下記を軽く読んでいただくと良いと思います。

ローグライクゲームの特徴とはこんな感じです。

  • 文字による情報表示

  • 文字によるコマンド入力

  • マップ生成システム

  • ターン制の戦闘システム

  • シングルプレイヤー

  • パーマデス(やり直し不可)

  • スコアランキング

  • 食糧問題

すべての特徴を満たさなくてもローグライクゲームです。
例えばトルネコの大冒険や風来のシレンはコンシューマー向けのグラフィカルなローグライクゲームです。

さて、claude-3.5-sonnetでどんな問題が発生したか紹介しましょう。
今回は特徴の一つマップ生成システムで問題を起こしました。

以下のW(all)で囲まれた部屋を管理するRoomクラスを定義しました。
Roomクラスはinner()メソッドでF(loor)の座標をスライスで返します。

WWWWW
WFFFW
WFFFW
WFFFW
WWWWW

このRoomクラスの壁にドアを作りたい。こんな風に部屋の4方向の壁にD(oor)が出来る予定でした。角の壁にはドアを生成しない制限を入れています。

WWDWW
WFFFW
DFFFD
WFFFW
WWDWW

ところがこんなRoomが出来てしまいました。そうです。床をドアで上書きしているのです。

WWWWW
WFDFW
WDFDW
WFDFW
WWWWW

AIに問いただしました。一部端折っています。

ゆる写「Roomクラスで部屋を管理していると思うが、部屋の構成として壁は含まれているのか?それとも壁の内側だけの管理ですか?」
生成AI「Roomクラスの現在の実装を確認すると、壁を含まない内側の領域だけを管理していることがわかります」
ゆる写「Roomのinnerは部屋の内部領域を示すスライスを返しますから内部しか持っていないでしょうね。
ではRoomにおいての壁とは何ですか?
innerの外側のことではないのでしょうか?」
ゆる写「innerの1つ外側を壁と定義し、扉を作ってはいけない角を排除した残りが扉を作れる壁と捉えることは出来ませんか?
その壁と通路が交わる接続点に扉を作れば良さそうですけど。」
ゆる写「あなたのロジックだとinnerの一番外側の壁に見立てて扉を生成しているように見えます。実際にどうですか?あなたの意見を聞きたいです。」
生成AI「はい、ご指摘の通りです。」

あ、認めやがった。
とまーこんなやり取りを生成AIとしていました。

このように生成AIだけで何かを作らせるのは現時点では難しいと感じました。もちろんオセロや三目並べ、数独のようなゲームはいとも簡単に実装してくれます。ルールが複雑に絡みあうゲームになるととたんに駄目ですね。ちなみにローグライクゲームの元になるオリジナルRogueは1980年ごろのゲームです。一度ソースコードを紛失したりして、Rogue Cloneが作られ、オリジナルのソースコードが見つかったりしましたが、、、
Rogue Cloneのソースコードは公開されています。それでも作れないんですよね。
散々プログラマーは要らなくなると言われていますがわたし的には疑問です。生成AIに作らせるのは悪いことではない。ただ人間が介入する余地は十分にありますし、間違いは間違いと伝えないと駄目だなと思いました。つまり舵取りは人間がするべきなんですよ。

ではでは


いいなと思ったら応援しよう!