Chapter 5

第5章: システムプロンプト ─ エージェントの世界観と憲法

ChatGPT に「コードレビューして」と頼むと、丁寧に「ここはこう書くといいですよ」と 提案 を返してくる。 ところが Claude Code に同じことを頼むと、いきなり Read tool が走りGrep でテストを検索し始め、勝手に 作業計画 まで立てる。

中で動いている LLM は、どちらも Claude 系の同じモデル ── たとえば Claude Sonnet 4 だとしよう。 同じ脳みそが、なぜこれほど違う性格に見えるのか。

答えは「モデルを差し替えたから」ではない。 モデルの 目の前に置いてある “憲法” が違うからだ。

5.1 そもそも LLM に “人格” はあるか

身も蓋もない答えを先に書く。ない

本書冒頭で見たとおり、LLM 自体は人格も記憶も持たない。入力テキストにふさわしい続きを返すだけだ。

ところがその「ふさわしい続き」は、何を文脈として読ませるか で大きく変わる。

LLM の “人格” は、モデル本体ではなく 入力の冒頭に毎回挿入される指示文 によって作られている。 この冒頭の指示文を system prompt と呼ぶ。

ChatGPT の Claude Code っぽさのなさも、Claude Code の Claude Code っぽさも、ほとんど system prompt の差 で説明がつく。

5.2 system prompt とは何か

正式な定義を入れておく。

system prompt (システムプロンプト)

LLM のループの 最初に毎回挿入される、モデルへの根本指示。 役割設定、利用可能なツールリスト、出力フォーマット、安全上の制約、口調の指針などを含む。 ユーザー入力よりも 優先度が高い ものとして扱われるよう、API レベルで role: "system" というラベルが付けられている。

ここで前章 (第4章) で出てきた「ターンが進むたびに積み上がる入力」を思い出してほしい。

[system prompt]            ← どのターンでも先頭に必ず乗る
[user / assistant ターン1]
[user / assistant ターン2]
[user / assistant ターン3]
...

system prompt は 毎ターン頭に居座る。だから常に LLM の判断に影響し続ける。 これがエージェントの “性格” や “規律” を一貫させている仕組みだ。

5.3 role という仕組み ── system / user / assistant

system prompt を本当に理解するには、その隣にいる role という概念にも触れておく必要がある。

現代の LLM API(Anthropic、OpenAI どちらも)は、入力を単一のテキスト塊として受け取るのではなく、「誰の発言か」をラベル付きで 受け取る。

role

LLM API で各メッセージに付ける、発話者の種類を表すラベル。代表的なのは三種類:

  • system: モデルへの根本指示。最優先で従うべきもの
  • user: 人間(または上位のプログラム)からの入力
  • assistant: モデル自身の過去の応答

エージェントのループの入力は、典型的にはこういう列になる。

順番role中身
1system「あなたはコードエージェント。利用可能なツールは…」
2user「fibonacci.py のバグを直して」
3assistant「Read を呼びます」(tool_use 含む)
4user(Read の結果を tool_result として返す)
5assistant「Edit を呼びます」
6user(Edit の結果)

注目してほしいのは、ツールの実行結果も user role で渡る こと(厳密には tool_result という入れ子だが、外側は user メッセージ)。 LLM から見れば、「人間が言ったこと」と「道具の結果」は 同じ陣営からの入力 という扱いだ。

ハーネスがやっているのは、結局のところ 「assistant の出力を見て、tool 実行を挟んで、user メッセージとして結果を返す」 という、role 操作の編集作業。 LLM 本体は「続きを書く」だけで、role の組み立て はすべてハーネスの仕事。

5.4 Claude Code の system prompt には何が入っているか

公式に全文公開されているわけではないが、API トラフィックを観察した有志の報告や Anthropic の公式ドキュメント、そして体感から、Claude Code の system prompt にはおおむね次のような要素が入っているとされる。

要素役割
役割宣言「あなたは Claude Code、Anthropic 公式のコーディングエージェントです」
基本姿勢簡潔に答える、推測でファイルを作らない、既存ファイルの編集を優先、など
ツール定義Read / Edit / Write / Bash / Grep / Glob / Task / WebFetch… の全シグネチャと使い方
出力フォーマット装飾や前置きを抑える、必要なら markdown、絵文字は基本使わない
安全上の制約破壊的コマンドへの注意、秘密情報の扱い、ユーザー確認が必要な操作
環境情報作業ディレクトリ、現在日時、git の状態、OS 種別など

合計トークン数は 数千 〜 1 万トークン超。これが毎ターン入力の先頭に乗っている。

あなたが Claude Code を 1 回起動した瞬間、まだ何も話していないのに数千トークンの “前置き” がすでに机の上に広がっている。 これが prompt caching (前章)が必須になる理由でもある ── キャッシュしないと、毎ターンこの長文を計算し直すことになる。

5.5 図で掴む ── system が頂点に立つ階層

system / user / assistant の関係を、優先度のピラミッドとして整理しておこう。

system最優先・常駐user人間の指示 + 道具の実行結果外から来るもの全部assistantLLM が過去に言ったことtool_use を含むことも優先度: system > user > assistantこの3つを束ねて、LLM に毎ターン入力として渡す頂点底辺
図 5.1 — メッセージ role の階層。system が頂点で常駐し、user と assistant が積み上がる。LLM はこの 3 種類の入力を毎ターン読み直してから次を書く。

5.6 第1章の主張を、system prompt の角度から見直す

第1章で出した「Claude Code らしさはモデルよりハーネス側に宿る」という主張は、ここまで読んだ今、system prompt とツール定義に書き込まれている内容を見れば最も具体的に確認できる

Claude Code の「Claude Code らしさ」── 最初に環境を調べる、推測でファイルを作らない、テスト駆動で動く、簡潔に応答する ── は、モデル本体の性質ではなく、先頭に毎ターン差し込まれる system prompt とツール定義 という “条文” に書かれている。

裏返せば、同じ Claude モデルでも、この条文を差し替えれば全く別のエージェントになる

実際 Cursor の Composer も、Codex CLI も、Cline も、Continue も、内部で動いているモデルは Claude や GPT そのものだ。 差別化のほぼ全部は、ハーネス側 ── 特に system prompt と道具設計 で生まれている。

この視点は実用上も効く。エージェントの “個性” が条文側にあるということは ── 可搬性が高い ということでもある。良いプロンプト設計があれば、それは LLM の世代交代を超えて生き延びる。本書が「コマンドの暗記より骨格」を強調している理由のひとつだ。

5.7 ユーザーが触れる別チャネル ── 予告だけ

ここで察しのいい読者は気付いただろう。

system prompt は Anthropic が書いている。ということは、私たちユーザーは触れないのでは?」

その通り。基本の system prompt は閉じている。 ただし Claude Code は、ユーザーが system prompt の隣で指示を追加できる別チャネル を用意している。

チャネル何ができるか詳しくは
CLAUDE.mdプロジェクトごとの長期記憶。「このリポジトリの規約」「使う言語」「テストの流儀」を書き込む第8章
slash command (/init 等)コマンド実行で自動的に CLAUDE.md を生成・整備第Ⅱ部「コマンド: 設定とメモリ」グループ
/memory コマンド対話的にユーザー単位・プロジェクト単位の指示を保存第Ⅱ部「コマンド: 設定とメモリ」グループ
--system-prompt フラグCLI 起動時に system prompt の差し替え or 追加第Ⅱ部「コマンド: CLI フラグ」グループ

つまりユーザーは system prompt を直接書き換えるわけではない が、隣に 「私のプロジェクトの追加指示」 を差し込むことで、エージェントの振る舞いをカスタマイズできる。 この「公式憲法 (system) + ローカル法 (CLAUDE.md)」という二層構造は、Claude Code の運用設計の核になる発想だ。

私が Claude Code の設計で一番うまいと思うのは、ここだ。 system prompt を閉じる ことで一貫した品質を保証しつつ、CLAUDE.md という別チャネル でユーザーの介入余地を残した。

もし system prompt を完全に開放していたら、初心者が壊して動かないエージェントを量産していただろう。 逆に CLAUDE.md がなければ、エージェントは「自分のプロジェクトを知らない他人」のままだった。

この二層構造こそ、Claude Code が “現場で使えるツール” になった最大の設計判断だと思っている。

5.8 この章の振り返り

この章で読めるようになるツイート / ブログ

次章は、その system prompt の中で大きな顔をしている 「ツール定義」 に踏み込む。 Bash 一本あれば何でもできるはずなのに、Claude Code はなぜ Read / Edit / Write / Grep / Glob を わざわざ別々に 用意しているのか ── その設計判断の理由が、エージェントの賢さに直結する。