ここは あなたOS の「意味レイヤー → 構造レイヤー」変換を Gemini にどう指示するかという核心部分になる。
Flask バックエンドで使うことを前提に、実運用で安定するプロンプトを「3段階構造」で設計する。
アプリ側のプロンプト設計に集中するね。
🎯 全体方針:あなたOS の 3 レイヤーをそのままプロンプトにする
あなたOS の構造は:
- 一次解釈(分類)
- 二次変換(特許請求項 IR)
- 出力整形(ブログ用)
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 の思想と完全に一致している。
次に進むなら
- Flask の API ルーティング設計
- Gemini 呼び出しの非同期化(高速化)
- はてなブログ AtomPub 投稿モジュールの実装
- Ameba 投稿クライアントの抽象化
- Review UI のワイヤーフレーム
どこを進めたい?