Skip to content

Gemini 連携(プロンプトの渡し方)

関連: メール取込 / アーキテクチャ

前提

Gemini API に Cursor Skills / Gemini Gems 相当の「Skills」機能はない。
代わりに、次を組み合わせて再現する。

仕組み 役割
system instruction 役割・禁止事項・会計ルール
Structured Output (JSON schema) 返答形式を固定
few-shot examples 速報 / 明細 / 無視の見本
プロンプトファイル リポジトリ内で版管理(Git)
Context caching(任意) 固定指示が長くなったときの最適化

運用 Bot は Cursor 契約ではなく、別途 GEMINI_API_KEY を使う。

推奨モデル

  • MVP デフォルト: gemini-3.5-flash(環境変数 GEMINI_MODEL
  • フォールバック: GEMINI_MODEL_FALLBACKS(カンマ区切り)。未設定時は gemini-3.1-flash-lite,gemini-1.5-flash
  • 安さ・量: gemini-3.1-flash-lite / gemini-1.5-flash
  • より新しい Flash: gemini-3.6-flash
  • 分類・抽出・短文コメント用途。個人用途なら無料枠で足りる想定
  • 家計データの学習利用が気になる場合は有料(従量)へ

呼び出しの分け方

プロンプトを1本に詰め込みすぎない。

呼び出し 目的 入力 出力
email_classify_extract メール種別+抽出 件名+本文 構造化 JSON
discord_manual_extract 手動テキスト/画像から抽出 文言 + 任意画像 構造化 JSON
notify_coach Discord 用厳し目文 抽出済み支出 短文テキスト
weekly_review(後) 週次レビュー 集計 JSON 短文テキスト

画像は Gemini の multimodal(Vision)入力として渡す(Discord 添付は実装済み)。
スクショから読めない金額・明細は捏造しない(メールと同じルール)。

追加フィールド(Discord 解釈):

フィールド 意味
occasion 時間帯・店種からの場面推定(夕食 / 遊び など)
occasion_reason 推定根拠の短文
line_items レシート明細(読めるときだけ)

リポジトリ上の置き場(予定)

prompts/
  email_classify_extract.system.md
  email_classify_extract.schema.json
  email_classify_extract.examples.json
  discord_manual_extract.system.md
  discord_manual_extract.schema.json
  notify_coach.system.md
  • system.md … 役割・ルール(「金額を捏造しない」等)
  • schema.json … Gemini structured output 用スキーマ
  • examples.json … few-shot(個人情報が載らないよう匿名化した例)

コードはこれらのファイルを読んで API に渡す。
「Skills」の代わりに ファイルとして版管理された指示セット を使う。

API に渡すイメージ

system_instruction  ← prompts/email_classify_extract.system.md
response_schema     ← prompts/email_classify_extract.schema.json
contents            ←
  [example_1 user/model]
  [example_2 user/model]
  [example_3 user/model]
  [実際のメール: 件名 + 本文]

ポイント:

  • 毎回「よしなに」とだけ書かない
  • スキーマで必須フィールドを固定する
  • 例で速報 / 明細 / ignore を見せる
  • 本文にない金額を作らない、と system に明記する

system 指示に必ず入れるルール(メール)

  • 出力はスキーマ以外出さない
  • 本文から読めない金額・店名は捏造しない(不明なら null / ignore)
  • キャンペーン・お知らせは kind=ignore
  • 利用速報は flash、明細・請求まとめは statement
  • PayPay チャージ相当・資金移動っぽいものは is_expense=false(判定できないなら notes に書く)

アプリ側との役割分担

Gemini: 読む・分類する・候補を抜く
App:    保存する・検証する・重複を除く・Discord/Grafana に出す

検証に失敗したら Gemini の結果をそのまま信じない(メール取込)。

秘密情報

  • GEMINI_API_KEY はサーバ env のみ
  • プロンプトファイルに実メールや実トークンを入れない
  • few-shot は匿名化サンプルだけ