はじめに
AI駆動開発全盛期の昨今、意外と生成AIを「活用する」側のアプリケーションについてはあまり盛り上がっていない印象があります。
ということで、今回は生成AIを活用した美少女ゲーム「AIとココロのダイアグラム」を制作したので、このご紹介です。
ここではあくまでも技術的な部分のTips的なメモが中心になりますので、実際にプレイしたいという方は以下まで。(無料)
※β版のため、APIの使用上限が存在します。途中でプレイできなくなることがあります。
使用モデルと言語
モデルはGemini APIの「gemini-2.5-flash-lite」です。Geminiの中では2025年10月時点でこれが最も高速で、かつ無料枠も充実しています。
フロントエンドはHTML, CSS, Javascript, jQueryなどの一般的なもの、バックエンドはPHPとPythonを使っています。
Python x Gemini API
Gemini API、すなわち生成AIまわりのプログラムは全てPythonで実装しています。
もちろんPHPやJavascriptでも実装が可能ですが、現状最もPythonでの開発が楽だと感じます。
Markdown × JSON
基本的に、生成AIに入力するプロンプトはMarkdown形式で書きます。これは生成AIアプリケーション開発では必須ですし、もちろんみなさんも知っているところだと思います。
ただ問題は、出力の形式です。アプリケーションの場合、構造化されたデータで出力したいと考えるのが普通です。
なんと便利なことに、Gemini APIでは構造化データ (JSONなど) で出力できる機能がついているんですよね。
ただこの構造化データを出力する方法について、あまり日本語の文献が無かったため、ここにまとめておきます。
まずはPydanticのクラスを作成します。
from google import genai
from pydantic import BaseModel
class Reply(BaseModel):
reply: str
delta: int
place: str
system_instructionにも明示しておきます。これがないと定義したクラスのメンバ変数名と実際の出力が噛み合わないことが恐らく起こりえます。
(これについての資料があまり見つかりませんでした。詳しい方いたら教えてください。)
system_instruction = """
応答な必ず以下のJSON形式で返してください。他のテキストは一切含めないでください。
{
"reply": "ここにキャラクターのとしての返答を記述",
"delta": ここに好感度の変動量を記述,
"place": "次の会話場所"
}
"""
それを以下のようにconfigの中に入れます。
config = {
"system_instruction": system_instruction,
"response_mime_type": "application/json",
"response_schema": Reply
}
あとはgenerate_contentに入れるだけ
response = client.models.generate_content(
model=MODEL_NAME,
contents=contents,
config=config)
(もちろんclient, MODEL_NAME, contentsは事前に用意しておく必要があります。)
ちなみに実際のコードでは、system_instructionは他にゲームに関する情報をふんだんに入れてあります。
むしろこのsystem_instructionの中身がゲームの本体とまで言えます。
おわりに
生成AIのAPIまわりに関しては、日々進歩しているところですので、この記事の情報もいつか古いものになっていくでしょう。
ただ現状有用な記事があまり無い状態でもあると思うので、積極的に活用事例やTipsを紹介していかないとなと思うところです。