実装例② コンテンツのリアルタイム自動生成
生成AIの一つに分類されているChatGPTは、会話を行う際に謂わば「返答内容を生成」しているわけですが、テキストで表現可能なデータならどんなものでも生成することができます。
例として、ゲームのキャラクターデータを自動生成するプログラムについて考えてみましょう。Web版のChatGPTをそのようなアイデア出しのために使用した経験がある方もいると思います。しかし、AIによって生成されたアイデアをゲームに実装するまでには、多くの手間がかかることが予想されます。ChatGPT APIをシステムに統合すれば、ゲーム内でキャラクターデータを全自動でリアルタイムに生成して登場させる、といったことが可能になります。
先ほどと同じようにFunction Callingによって実現することももちろん可能ですが、ここではJSONモードという別の機能を使ってデータを出力する方法をご紹介します。
プロンプトを作成する
FunctionCallingでJSONデータを出力する際は、出力形式を専用フォーマットで明確に定義することができましたが、JSONモードではプロンプトの記述で出力形式を指定します。複雑な階層構造を持たないシンプルなデータであれば、こちらのやり方の方が少ないトークン数で済むことも多いはずです。
# ChatGPTへの指示文
prompt_template = “""あなたは優秀なゲームクリエイターです。
以下の世界観と概要に基づいて敵モンスターのデータを水平思考で考案してください。
# 世界観
- 西洋風RPG
- 魔王討伐を目指し勇者たちが旅をする物語
# 概要
{overview}
# 出力形式
JSON
# 出力項目
- name: 名前(日本語)
- biography: 略歴(日本語)
- character: 性格(日本語, 箇条書き)
- appearance: 外見(日本語, 箇条書き)
- level: レベル(数値, 1-100)
- power: 攻撃力(数値, 1-255)
- defence: 防御力(数値, 1-255)
- magic: 魔力(数値, 1-255)
- speed: 素早さ(数値, 1-255)
- image_prompt: 画像生成プロンプト(英語)
"""
overview = "中盤で登場するボスモンスター"
prompt = prompt_template.format(overview=overview)
JSONモードを使用する際は、結果をJSONで出力してほしいという旨を必ずプロンプトとしてAIに伝えてあげる必要があるという点にご注意ください。こちらの例では、「出力形式」という項目でJSONを出力するよう指定しています。
プロンプトとして記述する内容は生成結果の質を大きく左右するため、結果を確認しながら最善の書き方を探すと良いでしょう。
APIを実行する
キャラクター生成実行
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{'role': 'system', 'content': prompt}],
temperature=1,
response_format={ "type": "json_object" }
)
こちらで鍵となるパラメーターは以下です。
response_format
このパラメーターに{ "type": "json_object" }を指定することで、JSONモードが有効になります。こちらを指定せずにプロンプトでJSONでの出力を指示すると、データの前後に前置きや補足説明が入ったりすることがあるのですが、JSONモードでは余計な文言は一切入らず、そのまま解析可能なJSONデータだけを直接取得できます。注意点として、JSONで出力するという旨をプロンプト内で指示せずにこちらを有効にしてしまうと、最大文字数に達するまで半角スペースを出力し続けるという動作をすることがあるようです。詳しくはドキュメントのresponse_formatの解説をご覧ください。
実行結果を確認する
# 生成結果を取得 response_message = response.choices[0].message print(response_message.content)
レスポンスオブジェクトから生成結果を取得する方法は、通常の会話を行う時と同じです。こちらを実行すると、以下のようなJSONデータが表示されます。
{
"name": "グリムロック",
"biography": "古代より封印されていた古の魔物。魔王の手先として数多の戦争に参加し、無数の勇者を葬り去ってきた暗黒の存在。",
"character": [
"残忍で冷酷な性格",
"知性を持ち、計画的な戦術を練る"
],
"appearance": [
"巨大な骸骨のボディに、漆黒の鎧と赤い炎が蠢く"
],
"level": 75,
"power": 200,
"defence": 180,
"magic": 220,
"speed": 150,
"image_prompt": "An intimidating, ancient skeletal monster with dark armor and glowing red flames."
}
指定したプロンプトに従ってデータが生成されています。JSONを解析すれば、これらのデータをゲーム内へ容易に展開できます。
また、「image_prompt」の内容は画像生成AIでこのキャラクターを描画させるためのプロンプトを示しており、ChatGPTと同じくOpenAIが提供しているImage Generation APIを利用すると、ここからキャラクターのビジュアルも生成することができます。
現在のところはこのような一枚絵の生成が比較的手軽に実装できる限度ですが、将来的には3Dモデルやモーションの自動生成もこれと同等の手軽さで利用できるようになる日もそう遠くないかもしれません。
上記の例を実際のゲームシステムに組み込んで実用的な運用を行うためには、様々な観点で調整が必要になるでしょう。しかし、データのリアルタイム生成が理論上可能であることは分かっていただけたかと思います。従来の技術では実現できなかった新しい体験を創造することが可能になりつつあるという点で、今後の発展が楽しみな活用分野です。
