はじめに
複数アプリが絡み合う大規模なシステムを引き継いだとき、こう思ったことはありませんか。
「このコード、一体何をしているんだ」
ドキュメントはない。前任者はいない。ファイルは1800以上。5つのアプリが互いに依存し合っている。どこから読めばいいかすらわからない。お茶を飲みながらファイルツリーを眺め、そっとPCを閉じたくなる衝動。わかります。非常によくわかります。
そのとき「Claude Codeに投げればいいじゃないか」という天の声が聞こえてきます。確かに。でも社外秘のコードをクラウドに送れない状況もある。「このコード今どこにあるんだろう」という根源的な不安は消えない。そして個人プロジェクトでも、自分のスパゲッティコードを世界のどこかのサーバーに送るのはなんとなく恥ずかしい。コードの民はシャイなのです。
そこで作りました。LocalForge — Claude Codeにインスパイアされた、完全ローカルで動くAIコーディング・プロジェクト分析ツールです。
実際に 1800以上のファイル・5アプリ連携・1万行超のシステム を読み込ませてQ&Aしたところ、ちゃんと答えてくれました。GPUなし、クラウドなし、Windows PC・32GBのRAMだけで。
- リポジトリ:
- 言語: Python 3.11.9 / Flask + pywebview (どうしてもflaskが使いたくてどうしてもdesktopアプリに見せかけたかった)
- LLMバックエンド: Ollama(クラウドAPI一切不要)
- ベクトル検索: ChromaDB +
nomic-embed-text
先に結果を見せます
「長い説明より結果を見せろ」というエンジニアの本能に応えます。
| 項目 | 環境・結果 |
|---|---|
| OS | Windows |
| メモリ | 32GB(GPUなし、フルCPU推論) |
| モデル |
qwen3-coder:30b(Ollama標準のまま) |
| プロジェクト規模 | 1800ファイル超・5アプリ連携・1万行超 |
| インデックス構築時間 | 約 4〜5時間 |
| Q&Aの精度 | アプリ間の依存関係を正しく辿って回答 |
「4〜5時間は遅い」という感想は理解します。ただこれはマシンタイムです。走らせて、夕飯を食べて、ドラマを1本見て、風呂に入って、寝て、起きたらできてる。人間が関与している時間はゼロ。PCは熱くなりますが、火事にはなりませんでした(個人の感想です)。
そして2回目以降はインクリメンタル更新なので、変更されたファイルだけ再処理されます。毎回4〜5時間かかるわけでは全くありません。ご安心ください。
なぜ1万行超でも答えられるのか
「1万行を全部LLMに食べさせるのか」と思った方、違います。それをやったら30Bモデルのコンテキストウィンドウが爆発四散します。
LocalForgeのアプローチはこうです。
「図書館の全蔵書を読んでから答える」のではなく、「関係する棚をすぐ特定して必要な本だけ持ってきてくれる優秀な司書」
具体的には:
- 全ファイルをスキャンしてファイルごとの要約をLLMが生成
- 要約をChromaDBにベクトル埋め込みとして保存
- 質問が来たら意味的に近いファイルだけを引っ張ってLLMに渡す(RAG)
5アプリ連携でも、質問に関係するファイルだけが選ばれるのでコンテキストが爆発しません。「どのアプリがどのAPIを叩いているか」「このエラーの影響範囲はどこか」といった、アプリをまたいだ質問にも正しく答えられた理由がここにあります。
3つのモード
Explain — 「このコード何してるの?」を解決するモード(今回のメイン)
フォルダを指定するとインデックスを構築し、11セクションの分析レポートを自動生成します。
- アーキテクチャ概要
- モジュールマップ
- エントリーポイントと起動フロー
- データフローとアプリ間の依存関係
- 潜在的な問題と技術的負債 ← 引き継ぎ時に一番ありがたくて一番怖いやつ
- このプロジェクトを拡張する方法
レポート生成後はそのままQ&Aモードに入れます。「このクラスどこで使われてる?」「このAPIのレスポンスはどこで処理される?」何でも聞けます。
Generate — ゼロからプロジェクトを生成する
「FlaskとSQLiteでTodoアプリ作って、認証もほしい、テストも、できればDockerfileも」みたいな欲張り仕様でもOKです。AIがファイル構成プランを生成し、承認後にファイルを順次生成。1ファイルごとに自動gitコミットするので、途中でPCが落ちてもResumeモードで続きから再開できます。
プランは承認前にJSONエディタで自由に編集できます。「このファイルいらない」「順番変えたい」を人間の手で調整できるのは、地味に重要です。AIに全部お任せしなくていい。
Resume — 人生いろいろある、プロジェクトも再開できる
生成が途中で止まっても(急に眠くなっても、Ollamaがクラッシュしても)、.localforge/ メタデータを見て自動的に状態を復元します。外部プロジェクトを読み込んだ場合も、インデックス済みならそのままQ&Aを続けられます。
実装の工夫: こだわりポイントを語らせてください
大きなファイルへのハイブリッド読み込み
200行を超えるファイルを丸ごとLLMに渡すのは、マラソン前日に百科事典を丸暗記させるようなものです。無駄だしトークン予算が死にます。
そこで先頭80行 + 末尾40行 + 構造的ランドマーク(PythonはASTでクラス・関数定義を抽出、JS/TSはexport/class/function行を収集)に圧縮してLLMに渡します。ファイルの骨格だけ見せれば、LLMはだいたい「何をするファイルか」を理解してくれます。
3段階のインデックス戦略
全ファイルをLLMに要約させると、package-lock.json や SVGアイコン1000枚の要約に貴重な時間を使う羽目になります。それは悲しい。
| Tier | 対象 | 処理 |
|---|---|---|
| Tier-0 |
.json, .svg, .lockなど |
パスとサイズだけ見て即決。ファイルすら開かない |
| Tier-1 | 空ファイル、自動生成コード、テストファイルなど | ヒューリスティック判定。LLMを呼ばない |
| Tier-2 | 本物のコード | バッチ処理でLLMに要約させる |
このおかげで、LLMが本当に必要なファイルだけにリソースを集中できます。
Thinkingモデルの思考を本文から分離
DeepSeek-R1やGemmaなどの「考えながら話すモデル」は、推論過程を <think>...</think> タグで出力します。これが本文に混ざると非常に読みにくい。
LocalForgeはこれを検知して思考トークンを画面右の「Ollamaライブパネル」に自動分離します。本文はスッキリ、思考過程は興味ある人だけ覗ける。両方楽しめます。
モデル切り替え時のRAM自動解放
30Bモデルを使った後に別のモデルに切り替えると、普通は両方がメモリに残ります。32GBのマシンで大型モデルを2つ抱えたら終わりです。
LocalForgeはモデル切り替え時に keep_alive: 0 をOllamaに送って前のモデルを即座にメモリから追い出します。地味ですが、これがないと「なんか急に重くなった」という謎の現象が起きます。
ベータ機能: ファイル編集(正直に言います、まだ荒削りです)
既存ファイルをSEARCH/REPLACEブロック形式で部分編集する機能があります。
<<<<<<< SEARCH
def calculate_total(items):
total = 0
for item in items:
total += item.price
return total
=======
def calculate_total(items: list) -> float:
"""合計金額を計算する(税込み10%)。"""
return sum(item.price * 1.1 for item in items)
>>>>>>> REPLACE
差分だけ適用するので速くて綺麗です。理屈の上では。
正直に言う既知の制限:
- LLMが行末の空白を省略すると一致失敗することがある(3段階フォールバックで救済を試みているが完璧ではない)
- 大きなファイルはチャンク分割されるため、チャンクをまたぐ変更は苦手
- 複雑な変更後は必ず
git diffで確認を(編集前に自動で.bakを作る保険はある)
「完全じゃないなら載せるな」という意見もわかりますが、方向性は正しいと信じているので載せました。改良のPRを心待ちにしています。該当コードは localforge/application/generation_service.py の _apply_search_replace_blocks() です。もっとうまいアプローチを知っている方、ぜひ教えてください。
インストール
ステップ1: Ollama(これが命です)
https://ollama.com からWindowsインストーラーをダウンロードしてインストール。その後:
# メインのLLMモデル(RAMが16GB以下なら7Bモデル推奨)
ollama pull qwen3-coder:30b
# RAG用の埋め込みモデル(必須!これを省くとQ&Aが弱くなります)
ollama pull nomic-embed-text:latest
ステップ2: LocalForge本体
git clone https://github.com/Rikiza89/LOCALFORGE.git
cd LOCALFORGE
# venvを使ってください。これは強くおすすめというより懇願です。
# chromadbの依存関係がヘビーなので、グローバルPythonに入れると
# 後でpip地獄が待っています。経験者は語る。
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.py
ネイティブウィンドウが開いたら成功です。「📁 フォルダを開く」から対象プロジェクトのフォルダを選択するだけ。初めて開くコードベースなら自動でExplainモードになります。
まとめ
「1800ファイル・5アプリ連携・1万行超のシステムをローカルLLMで理解させてQ&Aする」を、Windows・32GB RAM・GPUなしで実際にやってみた結果、ちゃんと動きました。
- ✅ コードは1行も外に出ない — 社外秘でも個人プロジェクトでもOK
- ✅ 32GB RAM・GPUなしのWindowsで1800ファイル・5アプリ連携を処理できた
- ✅ RAG + ChromaDBでアプリをまたいだQ&Aが現実的な精度で動く
- ✅ ゼロからの生成・途中再開・既存コード分析の3モード統合
- ⚠️ ファイル編集はベータ — PR歓迎
「引き継いだシステムが複雑すぎて読めない」「クラウドにコードを送れない」「ローカルLLMで実用的なことをやってみたい」という方に使ってみてほしいです。
⭐ Star、Issue、PR、すべて歓迎です。バグレポートは愛です。
「コードは手元に、知性はローカルに」— LocalForge