
既存コードにAIを馴染ませる文脈の渡し方|実務の型
AIに「このコードベースに機能を足して」と頼んだら、たしかに動くものが返ってきた。 でも、よく見ると命名のクセが違う。エラーの扱い方も、ファイルの置き場所も、チームの流儀とどこか浮いている。レビューで「うちの書き方じゃないね」と言われ、結局あちこち直す——そんな経験、ありますよね。
原因は、AIの実力不足とは限りません。 多くの場合、AIがあなたの既存コードベースを「見えていない」だけです。新規にゼロから書かせるのは得意でも、すでにあるコードの流儀・依存・構造を察してそろえる、というのはAIにとって一番苦手な部類。だから、ここを人が言葉にして渡せているかで、生成コードが馴染むかどうかが大きく変わります。
この記事は、AIに既存コードへ手を入れさせるとき、どの文脈を、どの粒度で、どう要約して渡すかの型をまとめたものです。コードを全部貼ればいい、という話ではありません。
なお「渡す」のやり方は、いまは1つではありません。①必要なコードを直接貼る ②Claude Code・Cursor・GitHub Copilot のようなエージェント型ツールに、リポジトリや対象ファイルを自分で読みに行かせる ③CLAUDE.md やルールファイル(AIに常時読ませる、約束事を書いた設定ファイル)に常設しておく——この記事の「渡す」は、この3つを総称した言い方です。手段は変わっても、そのタスクに効く文脈を選んで効かせるという中身は同じ。少し長めですが、一度に全部やる必要はないので、効く所から一緒に見ていきましょう。
結論:既存コードベースにAIを馴染ませるには、コードを丸ごと渡すのではなく、①このコードの「流儀」(命名・書き方・エラー処理の約束事)→ ②似た既存実装を1〜2例(お手本として)→ ③触ってよい範囲と触らない範囲 → ④依存とデータの流れ(何を使い、何を返すか)→ ⑤置き場所と完成の判断基準を、短い言葉と少量のお手本コードで渡します。全部を毎回そろえる必要はなく、その依頼でAIが迷いそうな所だけを埋めれば十分。これだけで生成コードが既存になじみ、レビューの「うちの書き方じゃない」がぐっと減ります。最後にコピーして使えるテンプレを置きました。
大きなコードベースを全部読ませようとしなくて大丈夫です。リポジトリを自分で読みに行けるエージェント型ツールでも、これは変わりません——読めることと、要点に注意を向けられることは別だからです。 AIに必要なのは全量ではなく、そのタスクに効く一握りのお手本と約束事。それを選んで効かせるのが、ここでの仕事です。
なぜ「動くのに浮く」が起きるのか

AIは、目の前の依頼文と、渡された範囲のコードだけを手がかりに書きます。 あなたの頭の中にある「うちはこう書く」「ここはこの関数を通す」といった暗黙の了解は、渡さないかぎりAIには存在しないのと同じです。だから、一般的には正しくても、あなたのコードベースの中では浮いたものが返ってきます。
ありがちなズレは、だいたい次のどれかです。
- 命名のクセ:変数や関数の付け方、単数複数、英語か日本語ローマ字か
- 書き方の約束:エラー処理の流儀、ログの出し方、非同期の書き方
- 置き場所:どのディレクトリ・どの層に書くか、1ファイルの粒度
- 依存の使い方:自前のユーティリティがあるのに標準APIを直に呼ぶ、など
- 流れ:データがどこから来てどこへ返るか、既存の入り口を通すか
裏を返せば、この5種類のズレを起こさないための情報を先に渡せば、馴染む確率は大きく上がるということ。やることは難しい技術ではなく、「察してほしい部分を、言葉とお手本にして渡す」だけです。順に見ていきます。
渡し方1:このコードの「流儀」を短い言葉にする
最初に渡したいのは、コードそのものより「このコードベースの約束事」です。長文の規約集はいりません。AIが迷いそうな所を、箇条書きで数行渡すだけで効きます。
たとえば、こんな粒度です。
- 命名:関数はキャメルケース、定数は大文字スネーク。真偽値は
is/hasで始める - エラー:例外を投げず、
Result型で返すのがこのコードの約束 - ログ:
console.logではなく自前のloggerを使う - 非同期:コールバックではなく
async/awaitで統一
ポイントは、「正しい書き方」ではなく「うちの書き方」を渡すこと。 世間の正解ではなく、あなたのチームのローカルルールこそAIが知りようのない情報です。ここを3〜5行渡すだけで、返ってくるコードの第一印象が大きく変わります。
渡し方2:似た既存実装を1〜2例、お手本として渡す
言葉での説明より速くて正確なのが、「これと同じノリで書いて」と既存コードを1〜2例見せることです。AIは説明文よりも、実物のコードからパターンを写し取るのが得意です。
- 今回作るものに一番近い既存の関数・モジュールを選ぶ
- そのまるごと1つ(短ければ2つ)を渡し、「この書き方・構成に合わせて」と添える。コードを貼ってもいいし、エージェント型ツールなら「
src/product/register.tsを読んで、同じ構成で」とファイルを名指しして読みに行かせるのでもいい - 命名・エラー処理・コメントの粒度など、真似てほしい点を一言書く
たとえば「ユーザー登録の処理を、この既存の『商品登録』処理と同じ構成で書いて」と頼むと、層の分け方も、バリデーションの置き方も、お手本に寄せてくれます。 お手本は多すぎないのがコツ。一番効く1例を名指しするほうが、たくさん見せる(読ませる)より馴染みます。
なお現場には「典型コードが汚い」「お手本にできるきれいな実装が無い」こともあります。きれいな1例が無ければ、せめて命名とエラー処理だけ近いファイルを渡す。それも無ければ、無理にお手本を探さず流儀メモ(渡し方1)だけで代替して構いません。お手本探しで手が止まるくらいなら、進めたほうが早いです。
渡し方3:触ってよい範囲・触らない範囲を決める
次に、「どこまで手を入れていいか」の線を引きます。ここが曖昧だと、AIは親切心で関係ない所まで書き換えたり、共通部分に手を入れて他に影響を出したりします。
- 触ってよいファイル・関数はどれか
- 触ってほしくない共通モジュール・設定はどれか
- 既存の関数シグネチャ(引数・戻り値)は変えていいのか、固定か
- 新規追加だけか、既存の修正も含むのか
「この関数の中身だけ直して、外から見た引数と戻り値は変えないで」のように、動かしてよい箱の大きさを先に渡す。 範囲が明確だと、レビューで見る場所も狭くなり、思わぬ巻き込み事故も防げます。これは安全に小さく試すための線引きでもあります。
ただし、線を引いてもAIが結局共通部分に手を入れてしまうことはあります。線引きは守られないことがある前提で、受け取り側のガードも一つ持っておきましょう。差分(diff/PR)で「実際にどこを触ったか」を最初に確認する——これだけで、机上の線引きで終わらず、はみ出しにその場で気づけます。
渡し方4:依存とデータの流れを伝える
AIが既存の部品を無視して車輪の再発明をしないよう、「何を使い、何を通すか」を渡します。
- このタスクで使ってほしい既存のユーティリティ・共通関数(自前の
formatDateがある、など) - データがどこから入って、どこへ返るのか(既存の入り口・出口を通すか)
- 外部とのやり取り(DB・API)は、既存のどの層を経由する約束か
- 使ってよいライブラリと、入れてほしくないライブラリ
ここを渡さないと、AIは「一般的にはこう書く」で、標準APIを直に呼んだり新しいライブラリを勝手に足したりします。 「日付整形は自前の formatDate を使って。新しいライブラリは追加しないで」の一言が、後の依存まわりのレビューを丸ごと減らします。
渡し方5:置き場所と「完成の判断基準」を添える
最後に、「どこに置き、どうなれば完成か」を渡します。出力の受け取り方まで決めておくと、差分やPRを確認してからの手戻りが減ります。
- 新しいコードはどのディレクトリ・どのファイルに置く想定か
- 1ファイル・1関数の粒度はどのくらいか(既存に合わせる)
- どうなれば「できた」か(既存のどのテストを通す、どの観点を満たす)
- 既存のテストやリンターの形式に合わせてほしいか
「完成の判断基準」は、AIに自己チェックさせる材料にもなります。テストを自分で実行できるエージェント型ツールなら、ここを渡しておくと書く→テストを走らせる→直すまで自走させやすく、あなたは差分やPRの確認に集中できます。 「既存の user.test と同じ形式でテストも書いて」と添えると、テストの流儀までそろい、後から書き直す手間が減ります。
そもそも既存テストが薄い・無い現場も多いはず。その場合は「テストを通す」にこだわらなくて大丈夫です。手で叩いて確かめる手順を1つ、あるいは「ここだけは確認すべき」という観点を1つ渡すだけでも、完成の判断基準として十分に効きます。最低ライン一つでも示せれば、AIの自走の的が定まります。
大きいコードベースを全部は渡せないとき
「文脈が大事なのはわかったけど、コードベースが大きすぎて全部は渡せない」——当然です。そして、全部渡す必要はありません。AIに要るのは全量ではなく、そのタスクに効く一握りです。
- まず、今回いじる周辺だけに絞る(呼び出し元・呼び出し先・型定義)
- 全体像は、コードではなく短いことばの地図で渡す(「3層構成で、入口・処理・データの順」など)
- 共通の約束事は、毎回貼らずに短いメモを使い回す(渡し方1の数行をテンプレ化)。エージェント型ツールを使うなら、この数行を
CLAUDE.mdやルールファイルに常設しておけば、依頼のたびに貼らなくても毎回効くようになる - 似た実装1例+触る範囲、で足りることが多い。足りなければ、AIに「判断に必要な情報があれば先に質問して」と促す
要点は、「AIが迷う所だけを、ピンポイントで渡す」こと。 広く薄く全部渡すより、狭く濃く効く所を渡すほうが、生成コードはよく馴染みます。
明日からやること(小さく始める3つ)
全部を一度にそろえようとすると重いので、まずこの3つから。
- 「うちの書き方」メモを3〜5行作る:命名・エラー処理・ログの約束を箇条書きに。一度作れば次から使い回せます(渡し方1)。
- 一番近い既存実装を1つ選んで一緒に渡す:「この書き方に合わせて」と添えるだけ。説明文より速く馴染みます(渡し方2)。
- 触ってよい範囲を一言そえる:「この関数の中身だけ、引数と戻り値は固定で」。巻き込み事故を防げます(渡し方3)。
既存コードに馴染ませる文脈チェックリスト
依頼を出す前に、その依頼で迷いが生まれそうな所だけ埋めれば十分です。全部チェックする必要はありません。
各カテゴリの先頭に ★最低ここだけ を付けました。時間が無ければ ★の3つ(命名一言/一番近い実装1つ/触る範囲一言)だけで構いません。これは「明日からやること」の3つと同じで、現場で本当に回る最低ラインです。残りは余裕があれば埋める任意項目だと思ってください。
渡し方1:流儀
- ★最低ここだけ:命名のルールを一言で渡したか
- (任意)エラー処理・ログの約束を渡したか
- (任意)「正解」ではなく「うちの書き方」を渡せているか
渡し方2:お手本
- ★最低ここだけ:今回に一番近い既存実装を1例選んだか(きれいな1例が無ければ流儀メモで代替可)
- (任意)「この書き方に合わせて」と真似てほしい点を添えたか
- (任意)お手本を増やしすぎていないか(一番効く1例に絞れたか)
渡し方3:範囲
- ★最低ここだけ:触ってよいファイル・関数を一言で指定したか
- (任意)触ってほしくない共通部分を伝えたか/差分で触った範囲を確認する段取りがあるか
- (任意)引数・戻り値を変えてよいか固定かを決めたか
渡し方4:依存と流れ
- (任意)使ってほしい既存ユーティリティを指定したか
- (任意)データの入口・出口(通す層)を伝えたか
- (任意)追加してよい/したくないライブラリを伝えたか
渡し方5:置き場所と完成基準
- (任意)どこに置くか・1ファイルの粒度を伝えたか
- (任意)「どうなれば完成か」を渡したか(テストが無ければ手で叩く手順1つ/確認観点1つでも可)
- (任意)既存のテスト・リンターの形式に合わせるよう伝えたか
最後に
AIに書かせたコードが既存から浮くのは、あなたの説明が下手だからではありません。 チームの流儀は、長く一緒にやってきた人にしか見えない暗黙知で、それをAIが知らないのは当たり前です。それを少しだけ言葉とお手本にして渡せる人が、いまそのコードベースで一番頼りになる人です。

5つ全部でなくても、今日ひとつ「うちの書き方メモ」を作れたなら、それはもう次の依頼から効いてきます。 コードを全部読ませようとしなくて大丈夫。AIが迷う所だけ、少しずつ言葉にしていきましょう。
なお、依頼そのものの組み立て方はAIにコードを書かせる前に渡す前提と制約の型に、書かせた後の確認はAI生成コードのレビュー・検証チェックリストにまとめています。あわせてどうぞ。