GEMINI LABEN
PRO35 — Gemini 3.5 Proのリリース目標が7月17日と報じられています。ただし日付・コンテキスト長・価格のいずれもGoogleの公式発表ではありませんREBUILD — 2.5 Proのアーキテクチャを白紙化した全面再設計とされ、再帰的なツール呼び出しとSVG生成での構造的な失敗が理由と報じられていますFLASH35 — 広く提供中の最新リリースはGemini 3.5 Flash。コーディング・エージェント・マルチモーダル・長文書処理を高速かつ低コストで担いますSAATHI — Gemini 3.5 Flashを核にしたATL Saathiが、インドの100校でパイロット開始。教員向けに24時間対応の授業計画・研修アシスタントを提供しますSEA — 東南アジアレポートでは、プロンプトの約70%が現地語(ベトナム89%・タイ87%・インドネシア84%)。リクエストの約4分の3がモバイル発ですSHEETS — 7月15日から、AI Expanded Accessライセンス保有者はFill with GeminiとSheetsのAI関数の利用上限が引き上げられましたPRO35 — Gemini 3.5 Proのリリース目標が7月17日と報じられています。ただし日付・コンテキスト長・価格のいずれもGoogleの公式発表ではありませんREBUILD — 2.5 Proのアーキテクチャを白紙化した全面再設計とされ、再帰的なツール呼び出しとSVG生成での構造的な失敗が理由と報じられていますFLASH35 — 広く提供中の最新リリースはGemini 3.5 Flash。コーディング・エージェント・マルチモーダル・長文書処理を高速かつ低コストで担いますSAATHI — Gemini 3.5 Flashを核にしたATL Saathiが、インドの100校でパイロット開始。教員向けに24時間対応の授業計画・研修アシスタントを提供しますSEA — 東南アジアレポートでは、プロンプトの約70%が現地語(ベトナム89%・タイ87%・インドネシア84%)。リクエストの約4分の3がモバイル発ですSHEETS — 7月15日から、AI Expanded Accessライセンス保有者はFill with GeminiとSheetsのAI関数の利用上限が引き上げられました
記事一覧/API / SDK
API / SDK/2026-07-16上級

Gemini にスクリーンショットを採点させたら、全部78〜85点だった — 絶対スコアを捨ててペア比較に切り替えるまで

Gemini Vision に App Store スクリーンショットを100点満点で採点させると、良い案も崩した案も78〜85点に潰れます。弁別能を実測して絶対スコアを捨て、位置バイアスを除いたペア比較でランキングを作るまでの実装記録です。

Gemini API186Vision4ASO2App Store6LLM-as-judgeペアワイズ比較Python38個人開発88

プレミアム記事

App Store のスクリーンショットを5枚まるごと差し替える前に、Gemini に採点させてみました。返ってきたのは 82点。念のため差し替え前の古い方も投げたら 79点。3点差。

判断がつかないので、テスト用にわざと崩した画像も投げました。キャッチコピーを全部消して、コントラストを落として、順番もバラバラにしたものです。

76点でした。

キャッチコピーが一文字もない画像が76点なら、82点にはもう意味がありません。この日から、私は Vision に「点を付けさせる」のをやめました。

以下は、絶対スコアが壊れていることを数字で確かめ、ペア比較へ切り替えるまでの実装記録です。個人開発で壁紙アプリのスクリーンショットを何度も作り直してきた中で、いちばん効いた設計変更でした。

採点器を疑うための最小の道具立て

まず環境から。

pip install google-genai pillow --break-system-packages
import os
import json
import statistics
from pathlib import Path
from itertools import combinations
 
from google import genai
from google.genai import types
 
client = genai.Client(api_key=os.environ["GOOGLE_API_KEY"])
 
# 検証は回数を稼ぐので Flash。最終確認だけ Pro に上げる運用にしています
JUDGE_MODEL = "gemini-flash-latest"
 
 
def load_image(path: str) -> types.Part:
    """ローカル画像を Part に変換する。拡張子から MIME を決める。"""
    suffix = Path(path).suffix.lower()
    mime = {
        ".jpg": "image/jpeg",
        ".jpeg": "image/jpeg",
        ".png": "image/png",
        ".webp": "image/webp",
    }.get(suffix, "image/jpeg")
 
    with open(path, "rb") as f:
        return types.Part.from_bytes(data=f.read(), mime_type=mime)

gemini-flash-latest を指定していますが、これはエイリアスです。2026年7月に指す実体が Gemini 3.5 Flash へ入れ替わりました。エイリアスで自動処理を回している場合、ある朝から採点の手触りが変わっていても気づけません。検証をやり直す前に、まず実体が何かを確認しておくのが安全です。

採点関数そのものは、元の設計をそのまま使います。疑う対象は関数ではなく、返ってくる数字の側です。

def score_absolute(image_paths: list[str], app_name: str, market: str = "日本") -> dict:
    """スクリーンショットセットを 0〜100 で採点する(従来型の絶対評価)。"""
    parts = [
        types.Part.from_text(
            f"""あなたは App Store 最適化の専門家です。
以下のスクリーンショットセットを評価してください。
 
アプリ名: {app_name}
対象市場: {market}
 
必ず次の JSON 形式で返してください:
{{
  "overall_score": <0-100の整数>,
  "message_clarity": <0-100>,
  "visual_hierarchy": <0-100>,
  "reason": "スコアの根拠(1文)"
}}"""
        )
    ]
    for i, p in enumerate(image_paths):
        parts.append(types.Part.from_text(f"スクリーンショット {i + 1}:"))
        parts.append(load_image(p))
 
    resp = client.models.generate_content(
        model=JUDGE_MODEL,
        contents=parts,
        config=types.GenerateContentConfig(
            response_mime_type="application/json",
            temperature=0.2,
        ),
    )
    return json.loads(resp.text)

ノイズを測る — 同じ画像を10回投げる

採点器の良し悪しは、1回の出力を眺めても分かりません。同じ入力を繰り返して、返り値がどれだけ揺れるかを先に知る必要があります。

def measure_noise(image_paths: list[str], app_name: str, n: int = 10) -> dict:
    """同一入力を n 回採点し、スコアの散らばりを測る。"""
    scores = []
    for i in range(n):
        result = score_absolute(image_paths, app_name)
        scores.append(result["overall_score"])
        print(f"  試行 {i + 1}: {result['overall_score']}")
 
    return {
        "scores": scores,
        "mean": statistics.mean(scores),
        "stdev": statistics.stdev(scores) if len(scores) > 1 else 0.0,
        "range": max(scores) - min(scores),
    }

temperature=0.2 まで下げているのだから、ほぼ同じ数字が返ると思っていました。私の手元(縦長スクリーンショット5枚・壁紙カテゴリ)で出たのは次の通りです。

指標実測値
平均81.4
標準偏差2.3
最小〜最大78〜85(幅7点)

同じ画像に対して7点動きます。この時点で「79点と82点」の3点差は、ノイズの内側に完全に埋まっていたことになります。

temperature=0 にしても幅は3点までしか縮みませんでした。マルチモーダル入力では画像のタイル分割やトークン化の段階に揺らぎの余地があり、温度だけでは決定的になりません。ここは温度を下げて解決する種類の問題ではない、と割り切りました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
同一画像を10回採点させて標準偏差を測り、「弁別マージン÷ノイズ」で絶対スコアが使えるかを機械的に判定する手順
わざと劣化させた画像を作って採点器の弁別能を検証するアブレーションのコードと、私の手元で出た数値
位置バイアスを順序スワップで打ち消すペア比較の実装と、勝率からランキングを組み立てるまでの全コード
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-06-22
Gemini APIで商品画像を構造化分析する — 数千枚を回して固めた本番パイプライン
商品画像から自動でタグ・説明文・カテゴリを生成するツールを、単発の試作から数千枚を安定処理する本番パイプラインへ。構造化出力・再開可能なバッチ・実測コスト・モデルルーティングまで、個人開発の運用で固めた知見をまとめます。
API / SDK2026-05-24
Apple Vision Framework × Gemini API のハイブリッド画像認識 ─ 壁紙アプリでクラウド推論コストを 7 割削減した設計メモ
iOS の Apple Vision Framework でオンデバイス事前フィルタを行い、Gemini Vision API への送信を半分以下に絞った壁紙アプリの実装記録。コスト・精度・レイテンシの実測値と、ハマりどころを共有します。
API / SDK2026-05-17
Gemini API で iOS/Android アプリのメタデータを30言語自動生成した実装 — Beautiful HD Wallpapers の多言語化で気づいたこと
累計5,000万DLの壁紙アプリで実際に試した、Gemini APIを使ったApp Store/Google Playメタデータの多言語自動生成。翻訳精度を担保するプロンプト設計から文字数制限への対応まで、実装コードとともに公開します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →