Python(オセロ04_Geminiの有料版でのトライアル2)
■生成AIで対戦相手を作る(その04)。
前回、1ゲーム最後までできた。ただ、無効な手を指定する場合もあり無駄もある。そのあたりの改善を考えていきたい。また、別モデルでgemini-3-flash-previewも使ってみる。
なお、料金について、前回は入力と出力で同じ量と仮定して計算したけど、下記コードで取得したトークン量から計算すると妥当な額だった。
usage = response.usage_metadata
prompt_tokens = usage.prompt_token_count
total_tokens = usage.total_token_count
入力トークンは38304、合計トークンは1198020だったので、合計トークンから入力トークンを引いたものを出力とすると下の計算になる。実際は444円(税抜き)だったけど、下の結果は為替の差程度。

前回のAIの回答では、盤の外の手や置けない場所を繰り返し指定するなど無駄なところがあった。なので下の方法を改善として組み込む。入力内容がその下。だいたい500トークン前後。
・置ける場所のリストを入力する。
(現在は盤の状態を入力して、その中の空のところに置くよう指定)。
・置けない場所を指定された場合、置ける場所のリストから削除。
(繰り返し同じ置けない場所を指定されることを防ぐ)。
response = client.models.generate_content(
model=model_id,
contents=f"盤面: {board}, 置ける場所:{tempBlankList}",
config=types.GenerateContentConfig(
system_instruction=(
"あなたはプロのオセロ(リバーシ)プレイヤーです。あなたは●の手番です。"
"オセロ(リバーシ)のルールに従って、置ける場所から1つ指示してください。回答は[行,列]形式のみ(行は上からの何番目。列は左からの何番目とします)。例:[3,5]。"
"同じ盤面が入力された場合、前回と別の位置を回答して下さい。"
"置くところがないときはNoneを返却"
),
temperature=0.1,
),
)
結果が下(途中でよく分からない回答でエラーになったけど)。



回答を見る限り、無効な手、同じ手を繰り返し出力するといったことは避けられている。よく分からない回答となった場合は回答を処理しないように修正(例えば、[x,y]の5文字分に区切って左端の文字が"["となっている場合のみそれ以降の処理を通す)。
置ける場所のリストは石をひっくり返せない無効な手も含むので、事前に返せる場所だけにすることもできるけど、一端はこれで何度か試していきたい。
上の構成で、gemini-3-flash-previewでトライ。



39手で最後までできた。ただ、[3,5]]や[8, 7]といった無効になる手も出てしまっている。この辺りは入力の指示内容で改善できるかな。結果としてはAIの負け(●29 vs ○35)。合計トークンは1012633のため、1手毎のトークンはGemini 2.5 Flashよりも多くなっているよう。
トークンや費用の情報の整理、コードの改善もある程度できたので、次回はモデル別に何度か試したい
(無料のクレジットも$300分あるので)。
