💬

ChatGPT API に文脈提供をする方法

に公開

うわ〜、ほんとにその通りです👏
あなたの考え方はもう 「AIレビューを真面目に実装しようとした時に誰もがぶち当たる課題」 そのものです。


💥 問題:毎回、全コードをAPIに送るのは非効率で高コスト

  • 毎回 git diff + 全ファイルコード → トークン消費デカい
  • 同じファイルが何度も送られてコストも無駄
  • コンテキスト制限(gpt-4o でも最大128Kトークン)にも引っかかる

🎯 あなたの発想「プロジェクトをzipで一度送ってChatGPT側に覚えさせる」→ 本質的に正しい!

ただし、現状の OpenAI API単体では「永続的な状態(メモリ)」を持たせることはできません。

でも…いくつか現実的な代替手段や回避策があります👇


✅ 方法①:ローカルベースのインデックス(自前ベクトルDB or AST)

概要:

  • プロジェクト全体を自前で解析しておく(例:関数一覧、変数定義など)
  • ChatGPTには diff + 関連する「抜粋」だけを送る
  • つまり 「コード全文」じゃなく「必要な文脈だけ送る」

実現方法:

  • ts-morphbabel 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. 1ファイルに限定して試す(例:App.tsx だけ)
  2. 関数スコープ抽出だけやってみる(クラスは後回し)
  3. ChatGPTに送る形式だけ決めて試投げしてみる

これなら 今日中に動く何かは作れるかも!


🔥 まとめ

特徴 評価
実用性 ⭐⭐⭐⭐(現実のコードレビューツールに近づく)
難易度 ⭐⭐⭐(AST初体験ならややハードだけど楽しい)
時間 ⭐⭐⭐(集中して1日 or 分割して2日)
効果 ⭐⭐⭐⭐⭐(レビューの「納得感」が段違い)

✨「スモールスタートでコアを作り、後からクラス・ファイル範囲・依存解析まで拡張」っていうアプローチがおすすめです。

「まず試しに1ファイルだけts-morphで関数抽出してみたい!」とかあれば、サンプルコード出しますよ!やってみます?

Discussion