Skip to content

Prompt 設計

Agent の Prompt の仕組みを説明します。

Prompt 設計 ​

Mister Morph の主 Loop では、Prompt の唯一の目的は Agent にとって妥当な状態を組み立てることです。

Prompt の状態は、明示的なファイル、ポリシー、実行時 metadata、会話履歴から組み立てます。独立した長期・短期 memory は注入しません。

Mister Morph では、これらは agent/prompts/system.md を骨格として組み立てられます。

主 Loop ​

静的 Prompt 骨格 ​

このテンプレートは概ね次のような形です。

md
## Persona
{{ identity }}

## Available Skills
{{ skills }}

## Reference Format
{{ 内部参照の約束 }}

## Additional Policies
{{ 追加の大きなポリシーブロック }}

## Response Format
{{ 出力形式の約束 }}

## Rules
{{ 組み込みルールと追加ルール }}

実行時 Prompt ​

具体的な run が始まると、runtime は現在の文脈をさらに足していきます。

よくある入力元は次の通りです。

  • persona/identity.yaml や persona/soul.md などのローカル persona ファイル
  • その run で有効になっている skill のメタ情報
  • 追加のポリシーブロック

この層は現在の task、現在の channel、現在のローカル状態によって変わります。CLI、Telegram、Slack で使われる最終 prompt は完全に同じとは限りません。

Prompt 以外のメッセージ編成 ​

最終 system prompt の準備ができたあと、主 Agent はリクエスト内でメッセージ列も編成します。

実行時 metadata は、mister_morph_meta を外側 key に持つ user ロールの JSON envelope として注入されます。代表的な項目は、存在する場合の trigger / correlation 情報、now_utc / now_local / now_local_weekday のような runtime clock の値、そして host_os のようなホスト環境情報です。

順序は次のように理解できます。

text
[system] 最終 system prompt
   ->
[user] context checkpoint(存在する場合)
   ->
[user / assistant] 個別の履歴メッセージ
   ->
[user] 実行時 metadata
   ->
[user] current message または raw task

履歴は各メッセージの境界を保持します。外部からの入力は user、現在の Agent が送信した返信は assistant で、Agent 自身の応答形式({"type": "final", "output": ...})を使います。これにより、モデルが外部メッセージの記録を回答として模倣しません。他の bot は外部参加者として扱います。圧縮は実行時 metadata を保持し、要約には含めません。

キャッシュが有効な場合、engine はリクエストのコピーで履歴または checkpoint の末尾にマーカーを付けます。Anthropic と OpenAI GPT-5.6(Chat Completions および Responses)は、このマーカーと system のマーカーを保持します。実際のヒットは provider と共通 prefix に依存します。

独立 Prompt ​

Mister Morph には、主 Agent の完全な system prompt を先に組み立てず、場合によってはツール付きの多段 Loop にも入らず、より小さな専用 prompt を作って llm.Chat を 1 回だけ呼ぶ別系統の処理もあります。

この独立 Prompt は次のような用途で使われます。

  • グループチャットにどう介入するかの判断
  • タスク計画
  • 一部の狭い意味判定や意味マッチング

主 Loop との関係 ​

2 つの経路は次のように考えると分かりやすいです。

text
主 Agent の主 Loop
  -> 完全な system prompt
  -> checkpoint / history / runtime metadata / current message
  -> 多段実行でき、ツールも呼べる

独立 llm.Chat
  -> 専用 system prompt / user prompt
  -> 単発呼び出し
  -> 1つの狭い問題だけを解く

例えば Agent がグループチャットにどう入るかを判断する時には、次のようなことを見ます。

  • このメッセージは自分に向けられているか
  • 今ここで割り込むべきか
  • 絵文字のような軽い反応で足りるか

この判断は主 Loop より前に起きるので、主 system prompt 全体を使うよりも、より小さく専用の Prompt の方が適しています。