ここは あなたOS の「意味レイヤー → 構造レイヤー」変換を Gemini にどう指示するかという核心部分になる。
Flask バックエンドで使うことを前提に、実運用で安定するプロンプトを「3段階構造」で設計する。

アプリ側のプロンプト設計に集中するね。


🎯 全体方針:あなたOS の 3 レイヤーをそのままプロンプトにする

あなたOS の構造は:

  1. 一次解釈(分類)
  2. 二次変換(特許請求項 IR)
  3. 出力整形(ブログ用)

Gemini のプロンプトもこの 3 レイヤーに分けると安定する。


🧠 レイヤー1:ニュース分類プロンプト(事故/警鐘/失敗)

🔹 system_prompt(Flask サーバ側で固定)

あなたはニュース記事を「事故」「警鐘」「失敗」「その他」に分類する専門家です。
分類は記事の事実に基づき、推測を最小限にしてください。
出力は必ず JSON のみとし、余計な文章は書かないでください。

🔹 user_prompt(記事本文を渡す)

以下の記事を分類してください。

【記事本文】
{{content}}

出力形式:
{
  "category": "事故 | 警鐘 | 失敗 | その他",
  "reason": "分類理由を1〜3文で"
}

✔ これで得られるもの

  • あなたOS の「意味レイヤー」
  • JSON なので Flask → DB にそのまま保存できる
  • Gemini の暴走を防ぐ(余計な文章を出させない)

🧠 レイヤー2:特許請求項生成プロンプト(技術特許/政策特許)

あなたの「政策特許 OS」をそのまま Gemini に教える。

🔹 system_prompt

あなたはニュースから問題点を抽出し、
それを解決するための「技術特許」または「政策特許」を
請求項形式で生成する専門家です。

請求項は必ず「請求項1」「請求項2」…の形式で書き、
抽象度は「再現可能なレベル」を保ってください。

出力は JSON のみ。

🔹 user_prompt

以下のニュース記事と分類結果に基づき、
{{kind}}(技術特許 または 政策特許)を生成してください。

【記事】
{{title}}
{{content}}

【分類】
{{category}}(理由: {{reason}})

出力形式:
{
  "summary": "特許の要約",
  "claims": [
    "請求項1: ...",
    "請求項2: ...",
    "請求項3: ..."
  ]
}

✔ これで得られるもの

  • あなたOS の「構造レイヤー(IR)」
  • 技術特許/政策特許の切り替えが容易
  • JSON なので DB にそのまま保存可能

🧠 レイヤー3:ブログ本文生成プロンプト(はてな/Ameba 両対応)

ここは「あなたのブログOSのテンプレート」を固定化する。

🔹 system_prompt

あなたはブログ記事の構造化編集者です。
入力された特許請求項を、ブログ記事として読みやすい形に整形します。
文章は簡潔で、事実と提案を明確に分けてください。
出力は JSON のみ。

🔹 user_prompt

以下の情報をもとに、ブログ記事のタイトルと本文を生成してください。

【ニュース】
{{title}}
{{url}}

【分類】
{{category}}

【特許要約】
{{summary}}

【請求項】
{{claims}}

出力形式:
{
  "title": "記事タイトル",
  "body": "本文(Markdown可)"
}

✔ これで得られるもの

  • はてなブログ用の XML にそのまま流し込める
  • Ameba にも流用可能
  • あなたOS の「Skeleton → Final」構造を保てる

🧩 Flask 側での呼び出し例(構造だけ)

from google import genai

client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

def classify_news(content):
    response = client.models.generate_content(
        model="gemini-2.0-flash",
        system_instruction=system_prompt_classify,
        contents=user_prompt_classify.format(content=content)
    )
    return json.loads(response.text)

def generate_patent(news, classification, kind):
    response = client.models.generate_content(
        model="gemini-2.0-pro",
        system_instruction=system_prompt_patent,
        contents=user_prompt_patent.format(
            title=news.title,
            content=news.content,
            category=classification.category,
            reason=classification.reason,
            kind=kind
        )
    )
    return json.loads(response.text)

def generate_blog_draft(patent, news, classification):
    response = client.models.generate_content(
        model="gemini-2.0-flash",
        system_instruction=system_prompt_blog,
        contents=user_prompt_blog.format(
            title=news.title,
            url=news.url,
            category=classification.category,
            summary=patent.summary,
            claims="\n".join(patent.claims)
        )
    )
    return json.loads(response.text)

✨ あなたOS 的まとめ

  • レイヤー1:意味抽出(分類)
  • レイヤー2:構造化(特許請求項 IR)
  • レイヤー3:出力整形(ブログ記事)

この 3 段階プロンプトは、あなたの OS の思想と完全に一致している。


次に進むなら

  1. Flask の API ルーティング設計
  2. Gemini 呼び出しの非同期化(高速化)
  3. はてなブログ AtomPub 投稿モジュールの実装
  4. Ameba 投稿クライアントの抽象化
  5. Review UI のワイヤーフレーム

どこを進めたい?