GEMINI LABEN
SUNSET — 画像生成モデルの停止まで残り6日です。imagen-4.0 系と Gemini 3 Image 系が8月17日に止まりますMIGRATE — 移行先として gemini-3.1-flash-image が案内されています。generate_images から generate_content への書き換えが必要ですCHECK — 移行後に同じプロンプトで同じ絵が出る保証はありません。必要な生成物は停止前に確保しておく判断が要りますCLASSROOM — 8月17日は Gemini in Classroom のモバイル提供が始まる日でもあります。web は8月10日に全年齢の学生へ広がりましたDEPRECATION — Grok 4.1 ファミリーの停止は8月20日、gemini-robotics-er-1.6-preview は8月31日で、後継は er-2 系ですCHANGELOG — Gemini API の changelog は7月30日が最新のままです。直近の大きな変更は Gemini 3.6 Flash と 3.5 Flash-Lite の GA ですSUNSET — 画像生成モデルの停止まで残り6日です。imagen-4.0 系と Gemini 3 Image 系が8月17日に止まりますMIGRATE — 移行先として gemini-3.1-flash-image が案内されています。generate_images から generate_content への書き換えが必要ですCHECK — 移行後に同じプロンプトで同じ絵が出る保証はありません。必要な生成物は停止前に確保しておく判断が要りますCLASSROOM — 8月17日は Gemini in Classroom のモバイル提供が始まる日でもあります。web は8月10日に全年齢の学生へ広がりましたDEPRECATION — Grok 4.1 ファミリーの停止は8月20日、gemini-robotics-er-1.6-preview は8月31日で、後継は er-2 系ですCHANGELOG — Gemini API の changelog は7月30日が最新のままです。直近の大きな変更は Gemini 3.6 Flash と 3.5 Flash-Lite の GA です
記事一覧/API / SDK
API / SDK/2026-08-03上級

Memory profiles の更新ポリシーを測って選ぶ — 確定値を守るガードが精度を16ポイント下げた記録

Memory Bank の Memory profiles が GA になり、構造化された記憶を後段へ渡せるようになりました。更新ポリシーを3種類つくって同条件で比較したところ、直感的に正しく見えた防御が精度を下げていました。計測コード一式と、フィールド別TTLへ切り替えるまでの記録です。

Gemini API207Memory Bank2Memory profiles2エージェント設計4スキーマ設計個人開発95

プレミアム記事

サポート問い合わせのログを眺めていて、手が止まりました。

壁紙アプリの問い合わせ窓口です。同じ利用者のプロファイルに billing_plan: pro と記録されているのに、当人は「無料のままです」と書いてきています。App Store 側の購読状況を照会すれば済む話ではありますが、そもそも記録が信じられないなら、プロファイルを持つ意味が半分なくなります。記録の更新日時を見ると3週間前。3週間前には確かに Pro でしたし、その時の記録は本人の明言に基づいた確度の高いものでした。

つまり、間違った値が入っていたわけではありません。正しかった値が、正しかったまま古くなっていたのです。

Memory Bank の Memory profiles が一般提供へ移ったのは 2026年8月1日の changelog でのことでした。静的なスキーマを定義しておくと、モデルがそれを埋めて更新してくれる。自由記述の記憶より後段の処理で扱いやすい形になる。読んだときは素直に嬉しかったのですが、実際に組み込む段になって、いちばん難しいのはスキーマの形ではなく更新をいつ受け入れ、いつ拒むかだと分かってきました。

その判断を勘で決めるのが嫌だったので、手元に小さな比較ハーネスを書いて測りました。結果は予想と逆でした。

構造化が持ち込んだのは、記憶の形式ではなく更新の責任

自由記述の記憶と Memory profiles の差は、しばしば「文章か JSON か」として語られます。ただ、運用してみると本質はそこではありませんでした。

自由記述のメモリは、矛盾をそのまま抱えられます。「7月上旬には Pro だと述べていたが、7月下旬には無料だと述べている」という2行を並べて置いておけば、読む側のモデルが文脈で判断してくれます。冗長ですが、判断を先送りできる余地がある。

構造化プロファイルには、その逃げ場がありません。billing_plan というフィールドは1つの値しか持てないため、書き込みの瞬間に「どちらが正しいか」を決め切る必要があります。この決定を誰がどう下すかを設計しないまま構造化すると、最後に書き込まれた値がそのまま正解として下流へ流れていきます。

私自身、最初はここを軽く見ていました。スキーマさえ丁寧に切れば、あとはモデルが埋めてくれると考えていたのです。

確度をスキーマに持たせる

そこでまず、値そのものだけでなく「その値がどこから来たか」をスキーマに入れました。

{
  "type": "object",
  "properties": {
    "billing_plan": {
      "type": "object",
      "properties": {
        "value":       { "type": "string", "enum": ["free", "pro", "ultra"] },
        "confidence":  { "type": "string", "enum": ["confirmed", "inferred"] },
        "observed_at": { "type": "string", "format": "date-time" },
        "source":      { "type": "string", "description": "発話ID または推論の根拠" }
      },
      "required": ["value", "confidence", "observed_at"]
    }
  }
}

confirmed は本人が明示的に述べた値、inferred はモデルが文面から推測した値です。この区別さえ入れておけば、あとは「推測値で確定値を上書きしない」というガードを書けば安全だろう。そう考えたのが、この記事で覆される仮説でした。

まず注入トークンを測る

ポリシーの話に入る前に、そもそも構造化がどれだけ効くのかを確かめました。20フィールドのプロファイルと、同じ20件の事実を文章で保持した自由記述メモリを、それぞれトークン化して比べます。

計測には cl100k_base を使いました。Gemini のトークナイザとは異なるため、絶対値ではなく比率として読んでください。日本語混じりのテキストにおける相対的な傾向は十分に見えます。

import json, tiktoken
 
enc = tiktoken.get_encoding("cl100k_base")
tok = lambda s: len(enc.encode(s))
 
fields = {
    "primary_language": "Swift", "target_platform": "iOS",
    "billing_plan": "pro", "preferred_locale": "ja",
    "build_tool": "Xcode", "notify_channel": "push",
    "team_size": "1", "ci_provider": "Xcode Cloud",
    "min_os_version": "iOS 26", "analytics_tool": "App Store Connect",
    "paywall_style": "hard", "review_prompt_timing": "3回目起動",
    "asset_pipeline": "Figma→SwiftGen", "crash_tool": "Crashlytics",
    "localization_langs": "ja,en", "monetization": "サブスク",
    "test_device": "iPhone 15", "design_system": "独自",
    "backend": "Cloudflare Workers", "push_provider": "APNs",
}
profile = json.dumps(fields, ensure_ascii=False, separators=(",", ":"))
 
def freeform(history_depth):
    """同じ20件を文章で保持し、更新履歴を history_depth 回分ぶら下げる"""
    out = []
    for k, v in fields.items():
        out.append(f"- ユーザーの{k}{v}です。")
        for i in range(history_depth):
            out.append(f"  ({i+1}回前の会話では別の値を述べていましたが、上記が最新です)")
    return "\n".join(out)
 
print(f"profile: {tok(profile)} tok")
for h in (0, 1, 2, 3):
    f = tok(freeform(h))
    print(f"freeform(history={h}): {f} tok  ratio={f / tok(profile):.1f}x")

手元での出力は次のとおりです。

形式トークン数プロファイル比
構造化プロファイル(20フィールド)1371.0x
自由記述・履歴なし2962.2x
自由記述・履歴1回分8966.5x
自由記述・履歴2回分1,49610.9x
自由記述・履歴3回分2,09615.3x

履歴を持たない自由記述との差は 2.2倍にとどまります。派手な数字ではありません。差が開くのは、更新履歴が積み上がったときです。

Gemini 3.6 Flash の入力単価 $1.50 per Mtok で、1日1,000リクエストを30日回した場合を試算すると、137トークンなら月 $6.17、1,496トークンなら月 $67.32。差は約 $61 です。個人開発の規模だと無視できない額になってきます。

ただ、この差は「構造化が偉い」という話ではありません。自由記述側も定期的に要約して圧縮すれば近づきます。むしろ圧縮を自前で運用し続けなくてよくなることが、Memory profiles を選ぶ実務上の理由でした。

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

この記事の続きを読む

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

この記事で得られること
確定値を推測値で上書きしないガードが、揮発しやすいフィールドで正解率を68.9%から52.5%へ下げた計測結果と、その理由
混在プロファイルでフィールド別TTLに切り替えて正解率76.0%→81.8%まで戻した、そのまま走る比較ハーネスの全コード
自由記述メモリとの注入トークン比較 — 137トークン対1,496トークン、1日1,000リクエストなら月$6.17対$67.32
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

高度な活用2026-08-09
記憶が消えたのではなく、別のプロファイルに書かれていました — Memory profiles のスコープキーを実測で正す
Memory Bank のプロファイルはスキーマとスコープの組で一意になります。呼び出し側でスコープの形がわずかにぶれると、エラーを出さないまま別のプロファイルが増えていきます。分裂の量と、3種類の対処の効き目を同じ条件で測った記録です。
API / SDK2026-08-08
打ち切りは失敗の合図ではありませんでした — ブロッキング挙動を伴う関数呼び出しの設計
呼び出しが返るまで待つ種類のツールをエージェントに持ち込むと、並列化と打ち切りの常識が反転します。サンドボックスで実測した数値とともに、再試行を観測へ振り替える設計をまとめました。
API / SDK2026-08-02
environment hooks に置いた門番の実測 — 判定は46マイクロ秒、起動は23ミリ秒
Managed Agents の environment hooks に破壊的コマンドのガードを置くまでの記録です。正規表現の denylist が20件中9件を素通りさせた実測から、argv 分解による検出率100パーセントまでの3段階と、判定より500倍重い起動コストの内訳をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →