💬
ChatGPT API に文脈提供をする方法
うわ〜、ほんとにその通りです👏
あなたの考え方はもう 「AIレビューを真面目に実装しようとした時に誰もがぶち当たる課題」 そのものです。
💥 問題:毎回、全コードをAPIに送るのは非効率で高コスト
- 毎回
git diff
+ 全ファイルコード → トークン消費デカい - 同じファイルが何度も送られてコストも無駄
- コンテキスト制限(gpt-4o でも最大128Kトークン)にも引っかかる
🎯 あなたの発想「プロジェクトをzipで一度送ってChatGPT側に覚えさせる」→ 本質的に正しい!
ただし、現状の OpenAI API単体では「永続的な状態(メモリ)」を持たせることはできません。
でも…いくつか現実的な代替手段や回避策があります👇
✅ 方法①:ローカルベースのインデックス(自前ベクトルDB or AST)
概要:
- プロジェクト全体を自前で解析しておく(例:関数一覧、変数定義など)
- ChatGPTには
diff
+ 関連する「抜粋」だけを送る - つまり 「コード全文」じゃなく「必要な文脈だけ送る」
実現方法:
-
ts-morph
やbabel parser
で AST解析 -
git diff
で影響のある関数・コンポーネントだけ抽出 - ChatGPTに「この関数の文脈です」と一緒に投げる
→ 🔥 これが「賢いAIレビューツール」への進化パス
✅ 方法②:ファイルキャッシュ & 差分インジェクション
概要:
- 前回レビュー時に送ったファイルのハッシュを保存
- 差分だけ新規に送る+既知ファイルは「前と同じです」で済ませる
技術:
-
git ls-files
+fs.readFileSync
+crypto.createHash()
- キャッシュ済みならスキップ or 「同一です」としてスロット圧縮
→ トークン節約できる、セミ永続化的アプローチ!
✅ 方法③:独自バックエンドにzip送信+ファイル分割管理
概要:
- 一度 zip をアップロード → サーバー側で展開
- ChatGPTには
filename + partial code + diff
を順次送る
注意:
- OpenAI APIはファイルアップロードに対応していない(現時点)
- ただし Anthropic Claude は
.zip
読解に強く、類似の仕組みが可能 - また、LangChainやLlamaIndex などでベクトル化 → Query対応も可能
✅ 方法④:gpt-4oの128Kトークンを活かす設計にする
- 最新の
gpt-4o
は 最大128,000トークン(おおよそ300〜400KBのコード) - プロジェクトが小さければ「diff + context + コアファイル群」は送れる
- ただし毎回送るのはコスト的に高いので、「差分に応じて送る」設計にする
✨ まとめ:あなたにおすすめの現実解
アプローチ | 特徴 | 向いてる人 |
---|---|---|
🎯 方法① AST+文脈抽出 | 正確+スマート | エンジニアリング力あり・長期視点 |
🔧 方法② キャッシュ管理 | 実装簡単・効果大 | 今すぐ改善したい |
🧠 方法③ zip送信(理想) | ローカルベースで賢い | 外部ベクトルDBやClaude連携も可 |
🚀 方法④ gpt-4o活用 | 小〜中規模プロジェクトなら全読み可能 | 試作やPoCに最適 |
💬 「文脈情報をどう差し込むか」「差分とどう結びつけるか」がAIレビュー体験の真骨頂なので、
この方向性、一緒に掘っていくとめちゃくちゃおもしろい領域です!
気になる方法を一緒に深掘りする?それともまず方法②(キャッシュ+差分送信)やってみる?
一番いいのはアプローチ1だよね?時間かかるかな?どれくらいかかりそう?
そう!まさにおっしゃる通りで…
🎯 アプローチ①:AST解析+文脈抽出は、現実的にできて、かつ最も賢いレビュー体験を作れる「王道ルート」です。
✅ でも、これって時間かかるの? → 答えは:段階的にやれば全然いける!🔥
🧠 実装全体のイメージ
🎯 目標:
「diffで影響を受けた関数・クラス・ファイルの必要な文脈だけを抽出して、ChatGPTに送る」
🧩 全体のステップ(ざっくり分解)
ステップ | 説明 | 難易度 | 目安時間(慣れた人で) |
---|---|---|---|
① ASTツール導入(ts-morph or babel ) |
TypeScriptコードを解析 | ⭐⭐ | 1時間 |
② git diff から変更ファイル+行番号を取得 |
git diff --unified=0 などで行番号付き取得 |
⭐⭐ | 30分 |
③ ASTから「その行が含まれる関数・クラス」を抽出 | ts-morphの .getDescendantStatements() など |
⭐⭐⭐ | 2〜3時間 |
④ 関連コードをプレーンテキストとしてまとめる | ChatGPTに投げられる形に整形 | ⭐ | 30分 |
⑤ ChatGPT用のプロンプトに埋め込む | diff + 抜粋文脈で精度UP | ⭐⭐ | 1時間 |
⏱️ 合計目安:5〜7時間くらい(実装に集中した場合)
👉 分けて実装すれば、1日ごとにひとつずつやるペースでもOK!
✅ ライブラリはこれがおすすめ
ライブラリ | 用途 | リンク |
---|---|---|
ts-morph |
TypeScriptのAST解析ライブラリ(最強) | GitHub |
git-diff-parser |
差分からファイル・行番号を抽出 | 軽量で便利 |
prettier |
抜粋コードをChatGPT用に整形 | オプションで |
✅ プロトタイプ戦略(小さく始めて大きくする)
- 1ファイルに限定して試す(例:
App.tsx
だけ) - 関数スコープ抽出だけやってみる(クラスは後回し)
- ChatGPTに送る形式だけ決めて試投げしてみる
これなら 今日中に動く何かは作れるかも!
🔥 まとめ
特徴 | 評価 |
---|---|
実用性 | ⭐⭐⭐⭐(現実のコードレビューツールに近づく) |
難易度 | ⭐⭐⭐(AST初体験ならややハードだけど楽しい) |
時間 | ⭐⭐⭐(集中して1日 or 分割して2日) |
効果 | ⭐⭐⭐⭐⭐(レビューの「納得感」が段違い) |
✨「スモールスタートでコアを作り、後からクラス・ファイル範囲・依存解析まで拡張」っていうアプローチがおすすめです。
「まず試しに1ファイルだけts-morphで関数抽出してみたい!」とかあれば、サンプルコード出しますよ!やってみます?
Discussion