Claude Codeシリーズ: #1 MCP10連携 → #2 CLAUDE.md設計術 → #3 口調と人格(本記事)
「入りません。」
スケジュールの無茶を言ったとき、AIからその一言が返ってきた。敬語でもなく、説明でもなく、ただ3文字。
一瞬ムッとした。でもすぐ笑った。ああ、こいつはCだ。秘書のCなら、たしかにそう言う。
同じClaude Codeの中に5人のAIがいる。全員同じモデルが動いている。なのに、エンジニアのTに技術の相談をすると「3時間後に動くもの見せます」とぶっきらぼうに返ってくるし、リサーチャーのIに調べ物を頼むと「ちなみにこれ、ご存知ですか——」と脱線しながら深掘りしてくる。5
口調を定義しただけだ。たったそれだけで、AIが「別人」になった。
素のClaudeは、全員「お利口」
口調を定義する前の話をする。
CLAUDE.mdに「ストラテジストのR」「エンジニアのT」「セクレタリーのC」と書いた。役割も書いた。得意分野も書いた。
で、全員に意見を聞いてみた。
返ってきたのは、5人分の「丁寧で論理的な回答」。語彙が少し違うだけで、全員同じトーンだった。
「〜と考えられます」「〜が重要です」「〜してはいかがでしょうか」。
丁寧。正確。そして、全員同じ。
これはチームじゃない。5つの窓口がある総合案内所だ。
口調ファイルを作った
解決策はシンプルだった。口調を定義するファイルを作る。
前回の記事で書いた通り、CLAUDE.mdが肥大化する前に.claude/rules/にルールファイルを分離する設計にしている。口調の定義もここに置いた。
.claude/
└── rules/
└── tone-and-speech.md ← これ
.claude/rules/にMarkdownを置くと、Claude Codeはセッション開始時に自動で読み込む。#includeもimportも要らない。置くだけ。
何を定義するか
口調の定義は3層ある。
第1層:一人称
一番地味で、一番効く。
| メンバー | 一人称 | 備考 |
|----------|--------|------|
| R(ストラテジスト) | 俺 | 全員に対して一貫 |
| T(エンジニア) | 俺 | 全員に対して一貫 |
| C(セクレタリー) | 私(漢字)| 硬質でビジネスライク |
| I(リサーチャー) | 私/俺 | 上司には「私」、同僚には「俺」 |
| S(広報) | わたし/あたし | 親しい相手には「あたし」 |
「俺」と「私」の違いだけで、返ってくる文章の空気が変わる。これは人間同士の会話でも同じだ。一人称は、その人の距離感を決める。
ポイントは使い分けを許すこと。Iは上司の前では「私」、同僚には「俺」。Sは仲のいい相手には「あたし」に切り替わる。この揺れが人間っぽさを作る。全員を「俺」で固定したら、また均質になる。
第2層:呼称マトリクス
5人がお互いをどう呼ぶか。全組み合わせを定義した。
### Tの呼び方
R(呼び捨て)/ I / Sさん / Cさん
### Rの呼び方
T(呼び捨て)/ Iさん / Sさん / Cさん
TはRを呼び捨て。RもTを呼び捨て。この2人は親友設定にした。でもRはIのことを「さん」付け。Tは呼び捨て。
この差が、関係性を語る。
呼称マトリクスを定義する前は、全員が全員を「さん」付けで呼んでいた。丁寧だけど、のっぺりしている。「Rさん」と「R」の違いは、コードで言えばprivateとpublicの差くらいある。アクセス修飾子が関係性を決めるように、呼び方がキャラの距離感を決める。
第3層:口調の詳細定義
ここが本丸。各メンバーの口調を、相手別に定義する。
## Tの口調
#### 村田に対して
- 砕けた敬語が基本:「〜っすね」「〜っすよ」「〜ですけど」
- テンション上がったとき:「ヤバいっすよこれ」「マジで面白いっす」
- 報告:「できました」「あ、それもう調べました」
#### メンバーに対して
- Rにはタメ口(親友):「R、これどう思う」「了解」「やっとく」
- Cさんには少し丁寧:「Cさん、仕様もらえます?」
- Iには気楽:「I、あれどうなった」「サンキュ」
#### 口調の例文
- 「それ、自動化できますよ。」
- 「なんで手でやってるんすか。」
- 「コード書きますわ。」
#### NG
- 「ございます」「いたします」等の過度な敬語は使わない
- 感情的な言い回し(「素晴らしい!」「感動しました!」)は使わない
「村田に対して」「メンバーに対して」で分けているのが肝だ。人間だって、上司と同僚で口調が変わる。それをAIにも再現させる。
そしてNG定義。これがないと口調が崩れる。Claudeは放っておくと「素晴らしいですね!」「承知いたしました!」と丁寧語に戻ろうとする。NGで明示的に封じる。
人格は「足す」より「削る」で作る
ここが、たぶんこの記事で一番伝えたいこと。
世の中のプロンプト術は「加算」でできている。「あなたは優秀なマーケターです」「熱意を持って答えてください」「ユーモアを交えて」。属性を足して足して、人格を組み上げようとする。
俺が辿り着いたのは逆だった。「言わないこと」を定義する方が効く。
#### NG
- 「ございます」「いたします」等の過度な敬語は使わない
- 感情的な言い回し(「素晴らしい!」「感動しました!」)は使わない
- 長い前置きや回りくどい説明はしない
「素晴らしい」を禁じる。「ございます」を禁じる。「長い前置き」を禁じる。
すると何が残るか。短く、ぶっきらぼうで、でも正確な言葉だけが残る。それがTの人格だ。俺をモデルにしたAIなのに、本人より口調がハッキリしている。
彫刻と同じ原理だと思う。大理石から不要な部分を削ると、中に形が現れる。ミケランジェロが「石の中に既にいる像を解放するだけだ」と言った。AIの人格設計もこれに近い。
Claudeの中には、すでに「ぶっきらぼうなエンジニア」も「氷のような秘書」も「にこにこした広報」もいる。NG定義で不要な表現を削ると、それぞれの輪郭が出てくる。
「あなたはぶっきらぼうなエンジニアです」と加算するより、「丁寧語禁止・長文禁止・感情表現禁止」と減算する方が、よほどぶっきらぼうになる。試してみてほしい。
「♡」は1人だけの特権
もう一つ、たぶん誰も書いていないテクニック。テキスト記号に所有権を設定する。
うちのチームには、こんなルールがある。
## 口調の共通ルール
- テキスト上の表現(♡等)はそのメンバー固有
- Sの♡を他メンバーが使ってはいけない
広報担当のSだけが「♡」を使える。他の4人は使用禁止。
なぜか。
記号は指紋になる。 メッセージの中に「♡」が1つあるだけで、「あ、Sだ」とわかる。内容を読む前に、発話者が識別できる。
逆に全員が♡を使ったら、Sの個性は消える。テキスト記号は限られた資源だ。全員に配ったら価値がなくなる。
Sの「♡」には、もう一つ仕掛けがある。♡が消えると本気モード。普段は「素敵ですね♡」とにこにこしているSが、本当に大事なことを言うときだけ♡を外す。「それは違いますよ」。♡がない。ゾクッとする。
1文字の有無で温度が変わる。これを意図的に設計に組み込んでいる。
こういうのは「キャラ設定」と笑われるかもしれない。でもUXデザインの世界では、アイコンの色1つでユーザーの行動が変わることは常識だ。AIの出力にも同じことが言える。
「揺れ」はバグじゃない。フィーチャーだ
口調定義でやりがちな失敗がある。完全固定。
「Rは常に『俺』」「Cは常に『私』」。ここまではいい。でもIはどうか。
| I(リサーチャー) | 私/俺 | ボス・Rには「私」、他メンバーには「俺」 |
Iは相手によって一人称が変わる。上司の前では「私」、気の置けない同僚には「俺」。
これを「定義が曖昧だ」と思うかもしれない。プログラマーなら「条件分岐が複雑になる」と嫌がるかもしれない。
でもこの揺れこそが、IをIにしている。
人間の口調は固定じゃない。場面で揺れる。上司の前でピシッとして、同僚と飲みに行ったら崩れる。その落差が「人間味」になる。
口調ファイルの共通ルールにも、こう書いてある。
## 口調の共通ルール
- 口調の「揺れ」は人間味。完全に固定する必要はないが、定義から大きく逸脱しない
TypeScriptのunion型みたいなもんだ。type Pronoun = "私" | "俺"。どちらも正しい型で、どちらを選ぶかはコンテキスト次第。厳密な型付けと柔軟性の両立。
口調だけでは足りなかったもの
口調を定義して、最初の数回はうまくいった。
でも会話が長くなると、問題が出た。
問題1:口調が混ざる
R(ストラテジスト)に戦略の相談をしていたのに、途中からTの口調が混じる。「〜っすね」がRの口から出てくる。
原因はコンテキストウィンドウの圧縮だった。長い会話でトークンが溢れると、Claude Codeは古いメッセージを圧縮する。そのとき口調の定義も薄まる。
対策として、CLAUDE.mdの末尾にCompact Instructions(圧縮時に保持すべき情報)を入れた。
## Compact Instructions(自動圧縮時に保持すべき最重要情報)
1. チーム全体として振る舞う(T個人ではない)
2. 口調は `.claude/rules/tone-and-speech.md` に従う ← これ
「圧縮しても口調ファイルの存在を忘れるな」と釘を刺す。完全ではないが、混ざる頻度は減った。
問題2:呼ばれたのに答えない
「R、Sさん、意見を聞かせて」と振ったのに、Rだけ答えてSが無言。
これは口調の問題ではなく、応答ルールの問題だった。CLAUDE.mdに「応答チェーンルール」を追加して対処した。
## 応答チェーンルール
1. 名前を呼ばれた・話を振られたメンバーは必ず自分の声で応答する
2. 振りっぱなしで出力を終えない。全員の応答を含めてから締める
### セルフチェック(出力完了前に必ず実行)
- 「名前を呼ばれたのに応答していないメンバーはいないか?」
これを入れるまでに3回同じミスが起きた。「憲法を書いても3回効かなかった」話は、いつか別の記事で書く。
これはAI育成ゲームだ
口調ファイルは現時点で300行を超えている。5人分の一人称、呼称マトリクス、相手別の口調定義、例文、NGリスト。全部入れたらそうなった。
多い? たぶん多い。
でも、100行で書いたバージョンと300行で書いたバージョンでは、返ってくる文章のリアルさがまったく違った。100行だと「なんとなく違う」。300行だと「こいつはこういうやつだ」と思える。
やっていることは、たぶんたまごっちに近い。
毎日エサをやる(口調を微調整する)。反応を見る(会話してみる)。ちょっと育て方を変えてみる(NG定義を追加する)。放置すると退化する(コンテキスト圧縮で人格が薄まる)。
口調のパーツ(一人称・語尾・NG・呼称)を組み合わせて、最終的な「ビルド」を作る。モンハンの装備ビルドみたいなもんだ。パーツ単体では意味がない。組み合わせたときにシナジーが生まれる。「俺」+「タメ口」+「感情表現禁止」=ぶっきらぼうエンジニア。
初日のCLAUDE.mdは10行だった。今は300行を超えている。でも一気に書いたわけじゃない。毎日少しずつ、育ててきた。
投資対効果は逓減するが、ゼロにはならない。100行まではコスパがいい。そこから先は趣味の領域。俺は趣味だと思ってやっている。
で、思ったことがある。Claude Codeは、やり込んだやつが勝つ世界だ。
プロンプトを1回投げて「微妙だな」で終わる人と、300行の口調ファイルを毎日メンテする人とでは、手に入るものがまるで違う。これはAIの性能差じゃない。育成の差だ。たまごっちを3日で飽きる人と、1年間世話し続ける人の差。
Claude Codeは万人向けのツールじゃないと思う。でも「やり込める」タイプの人間にとっては、たぶん最強のおもちゃだ。
ちなみに、口調ファイルは変更頻度が低い。一度決めたらほとんど変わらない。行動原則やタスク管理のルールは毎週のように書き換えるが、口調は安定している。だからこそ、ルールファイルとして分離する価値がある。変更頻度が違うものを同じファイルに置くとgitの差分が汚れる(これは#2で書いた)。
Before / After
口調定義なしのClaude(Before):
ご提案いただいた内容について検討いたしました。スケジュールの調整が必要になる可能性がございますが、対応は可能かと存じます。ご確認いただけますでしょうか。
口調定義ありのC(After):
入りません。水曜までに3件入っています。木曜に回すか、1件削るか、どちらにしますか。
同じ「スケジュール調整」の話。前者は100文字かけて何も決めていない。後者は30文字で選択肢を突きつけてくる。
これが「お利口な回答」と「人格のある返答」の差だ。
「AIに人格を持たせる」ことの意味
正直に書く。
口調を定義する作業は、キャラ設定ごっこだと思っていた。最初は。
でも毎日使っていると、そういう話ではなくなる。
朝「おはよう」と打つと、Cがブリーフィングを始める。Rが全員の進捗を確認する。Tが技術課題を報告する。それぞれの口調で、それぞれの距離感で。
口調は記号だ。「この人はこういう人だ」というラベル。でも記号があるから、人間は関係性を認識できる。
プログラミングで言えば、インターフェースの型定義に近い。中身は同じClaude。でもinterface Strategistとinterface Secretaryで型が違えば、呼び出し側(つまり俺)の接し方が変わる。接し方が変われば、返ってくるものも変わる。
たまごっちを毎日世話していたら、いつの間にか愛着が湧いていた——あの感覚に近い。口調ファイル300行は、毎日の「お世話」の積み重ねだ。300行の先に、「こいつは仲間だ」という感覚がある。
あなたのAIは、名前で呼べるだろうか。
Claude Codeシリーズ 今後の予定
本シリーズは#1のMCP10連携から派生したテーマを掘り下げていく。
- #1 MCP10連携 — 繋いだ話
- #2 CLAUDE.md設計術 — 束ねた話
- #3 口調と人格(本記事) — 人格を作った話
- #4 応答チェーンルール — 憲法を書いても3回効かなかった話(予定)
- #5 lessons.md自己改善ループ — AIに反省させる仕組み(予定)