論文解説: CodeNib — コーディングエージェントにリポジトリの文脈を「配膳」する多ビューデータシステム
コーディングエージェントが毎タスクgrepで探し直す無駄を、リポジトリを「データベース」と見立てて解消するCodeNib(UCサンディエゴら)。字句・密・構造の3ビュー、差分更新、文脈配信ポリシーの実測を、限界まで含めて読み解く。
要点
- CodeNibはリポジトリをデータベースと見なし、コミットを不変のベースデータ、検索インデックスをそこから導出されるビューとして扱う。
- 字句・密・構造の3ビューは、リポジトリ相対のパス+行範囲という同じ住所形式に正規化され、マニフェストがコミットごとに状態を記録する。
- 編集時はビューを作り直さず壊れた部分だけ修理し、完全一致した遷移のみ高速化と数える。シンボル修理は中央値8.67倍、ベクトル更新は25.44倍。
- 静的インデックスは1,000リクエスト中632件(63.2%)でライブ言語サーバと一致し、一致分は中央値4.72倍速いが、参照検索は39.0%しか一致しない。
- 配膳ポリシーの比較では、5モデルすべてで品質を保ったままトークン使用量をgrep/read比49.9〜12.9%(50〜87%削減)にできた。
CodeNib: A Multi-View Data System for Serving Repository Context to Coding Agents
一次資料 — この記事の根拠
論文の発表 2026-07-28→この解説の公開 2026-08-12同月
CodeNib: A Multi-View Data System for Serving Repository Context to Coding AgentsZhongming Yu, Hengjia Yu, Boqin Yuan ほか · 2026-07-28 · v1arXiv:2607.25431論文ページ·PDF原文の要旨(Abstract)を読む
Coding agents repeatedly search, navigate, and retain context from evolving repositories, but disconnected indexes, language servers, and task-local histories force repeated discovery and obscure lifecycle costs. CodeNib builds reusable lexical, dense, and structural views per repository commit, maps outputs to repository-relative source ranges, maintains selected views across edits, and serves ranked search, symbol navigation, and bounded context through one runtime. Across 100 snapshots, we map quality-cost frontiers across the repository-context lifecycle. When outputs match an independent rebuild, graph and vector updates are $8.7\times$ and $25.4\times$ faster at the median. On the static-navigation subset matching normalized live-server locations (63% of 1,000 requests), the median per-request live/static latency ratio is $4.7\times$. Across five models, selected context policies preserve localization with 50--87% fewer trajectory tokens than paired grep/read. Together, these results support multi-view repository-context serving with explicit, operation-specific validity boundaries.
コーディングエージェントは毎回「初出社」している
優秀な新人が、毎朝記憶を失って出社するところを想像してください。腕は確かなのに、毎日オフィスの地図を書き直してから本題に取りかかる。
コーディングエージェント(LLMがgrepやファイル読み込みなどのツールでリポジトリを操作するプログラム)は、まさにこの状態です。タスクのたびに「あの関数はどこ?」を探し直し、集めた探索結果はタスクが終わると捨てられる。論文はこれを「切り離されたインデックス・言語サーバ・タスクローカルな履歴が、繰り返しの発見作業を強いている」と整理します(Abstract)。2026年7月28日公開のCodeNib(UCサンディエゴを中心とするチーム)は、これをデータベースの問題として捉え直した論文です。
発想の転換: リポジトリは「データベース」である
論文の核はシンプルな見立てです(§1)。コミットは不変のベースデータ、チャンク・転置リスト・埋め込み・シンボル関係はそこから導出されるビュー、エージェントの要求はビューごとのクエリ、プロンプトに入る文脈は上限つきの「配信結果」。
データベースには、集計結果を前計算して保存する実体化ビュー(materialized view)という古典技術があります。作るのは重いが問い合わせは速い、ただし元データが変わったら更新が要る。リポジトリの検索インデックスはコミットを元データとする実体化ビューそのものだ——これがCodeNibの直感で、課題も3つに整理されます(§1)。C1: 形の違うビューの結果を同じ位置に対応づける。C2: 編集は各ビューを別々に壊すので更新経路もビューごとに要る。C3: 前計算した証拠をコストが見える形でモデルの文脈に届ける。
3つのビューと「住所」の統一
CodeNibはソースコードを階層的な単位に切り出します(§4.1)。ファイルが 、クラスなどの型スコープが 、関数・メソッドなど呼び出し可能な定義が 。各単位はパス+行範囲という「住所」を持ち、その上に3つのビューが載ります(§5)。
- 字句ビュー: BM25の転置インデックス(任意でZoektのトライグラム索引)。キーワードや識別子で引く
- 密ビュー: または 単位を埋め込みベクトルにしてFAISSに格納。意味の近さで引く
- 構造ビュー: ファイル・スコープ・定義を「含む」「参照する」などの型付きの辺で結んだグラフ。定義ジャンプや参照検索に使う
密ビューの検索は、クエリを同じ空間のベクトルにして内積の大きい順に取り出す操作です(コードや文をベクトルに変える仕組み自体は埋め込みを1から理解するを下地にしてください)。内積は2本のベクトルの「向きの近さ」のものさしで、次の部品で体感できます。
3つのビューはバラバラに作られますが、どの検索結果もリポジトリ相対のパス+行範囲という同じ住所形式に正規化されます。そしてマニフェスト が、コミットごとに各ビューの保存場所・状態・できることを台帳として記録します(§5.4)。ベクトル索引の構築だけ失敗しても、BM25は生きたまま使える——ビューの独立性と台帳による発見可能性が設計の要です。
エージェント側の動きは擬似コードにするとこれだけです(論文Listing 1を要約)。
M = compile(checkout, ["bm25", "vector", "graph"]) # オフラインで構築し台帳に記録
views = load_views(M, needed) # 実行時は既存ビューを開くだけ。構築はしない
runner = AgentRunner(views, M) # 検索・定義・参照ツールとしてエージェントに公開
編集が来たら: 作り直すのではなく「修理」する
リポジトリは動き続けるので、コミットごとに全ビューを作り直すのは高くつく。CodeNibはGitの差分とLSP(エディタの補完などを支える言語サーバ)を組み合わせ、グラフ内のシンボルを削除・影響あり・行ずれのみ・無変更・追加の5種に分類して、壊れた部分だけ修理します(§6.4)。行がずれただけの関数は位置情報の書き換えで済み、ベクトル側は内容ハッシュが同じ埋め込みを再利用します。
ここで論文が偉いのは、速さの主張に正しさの条件を付けたことです。差分更新したビューを、独立にゼロから再構築した「正解」とオフラインで突き合わせ(§4.2)、完全一致した遷移だけを高速化として数えます。高速化率の定義は次の式です(§4.3)。
言い換えると「フル再構築の時間 ÷(差分更新の時間 + サーバ起動コストの頭割り)」です。 が作り直し、 が差分更新、 は言語サーバの起動・準備の時間で、 回の更新(実験では5回)で1回分を分担します。比が1を超えれば差分更新の勝ちです。
つまり、記号を外して読めば「壊れたところだけ直すのは、索引を捨てて作り直すより何倍速いか」という問いです。 という頭割りの項が誠実なところで、言語サーバの立ち上げはタダではないため、その費用を黙って無視せず、それを共有する更新回数に割り付けて計上しています。
結果(§9.5): シンボル単位の修理は33遷移中15で再構築と完全一致し、一致分の中央値で8.67倍高速。ベクトル更新は31中28(90.3%)が一致し中央値25.44倍。裏面も明確で、グラフ修理はRustとTypeScript/JavaScriptでは1件も全チェックを通りません(辺のF1は99%前後なのに厳密一致には届かない)。
検索の質とコスト: ミリ秒と秒の壁
100スナップショット(SWE-Bench Verified/Multilingual由来)での実測(§9.2–9.3)。
- 密検索は平均26〜295ミリ秒、上位10件にターゲットファイルが入る割合(File Recall@10)は0.705〜0.820
- リランカ(候補をLLMで採点し直す後段)を足すと0.858まで上がるが4.29秒。素の密検索(0.812・92ミリ秒)の約46.6倍の待ち時間
- グラフ展開(結果を参照辺で1ホップ広げる)は効果の95%信頼区間がすべてゼロをまたぎ、白黒つかず
- 近似最近傍(HNSW)はFAISS内の検索を33.9倍速くするが、構築が重くなるぶん約2,300回検索してやっと元が取れる。この規模なら全件スキャン(Flat)で十分
最後の点は計算量の直感で分かります。Flatは登録数に比例する線形スキャン、HNSWは構築に前払いして検索を軽くする取引です。
定義ジャンプはどうか(§9.4)。静的インデックスは1,000リクエスト中632件(63.2%)でライブ言語サーバと同じ場所を返し、一致した場合に限れば中央値4.72倍速い(0.62ms対2.26ms)。ただし内訳は定義87.4%・参照39.0%と偏り、論文自身が「4.72倍は条件付きの機会であって、達成されたワークロード高速化ではない」と明言します。だからCodeNibはライブLSPへの経路を残したままにします。
配膳の実験: grep/read・先渡し・一度だけの圧縮
最後が本丸のC3、エージェントへの文脈配信です(§7.4)。比べるのは3つのポリシー。
- grep/read: 候補なし。モデルが自力でツールを叩いて探す(従来型)
- Eager: 検索上位10件の コードブロックを最初からプロンプトに注入
- Eager+Compact: 同じ注入に加え、最初のファイル読み込みが成功した直後に履歴を一度だけ書き換える
Compactの書き換えは要約モデルを呼ばない決定論的な操作で、候補の山と探索の途中経過を捨て、読んだパス一覧・最新の読み込み結果・直前の方針メモだけを残します。以降のターンはこの短い接頭辞を伸ばすので、KVキャッシュも再利用できます(§7.4)。
結果(§9.7): 5モデル(Claude Haiku 4.5、Qwen3.5-9B/27B、Gemma 4-12B、Gemini 2.5 Flash)すべてで品質マージンを満たすポリシーが存在し、そのトークン使用量はgrep/read比49.9〜12.9%——50〜87%の削減で位置特定の精度(AnswerRecall@5)を保ちました。ただし圧縮は万能ではなく、HaikuではCompactでトークンがEager比123.3%に増え、GemmaではEager比27.9%まで縮む。最適な配膳はモデルごとに違うのです。
論文の限界と未検証な点
論文は境界の明示に紙幅を割いており、誇張せずそのまま受け取るべきです。
- 評価はリポジトリ内の位置特定まで。パッチ生成やイシュー解決の成功率は測っていない(§9)
- マニフェストはトランザクションではない。編集後に複数ビューが同時に正しくなる保証はなく、並行更新は今後の課題(§3.4, §10)
- 静的ナビゲーションはライブLSPの代替ではない。参照検索は39%しか一致しない(§9.4)
- 更新の正しさ照合はオフライン評価で、実行時のオラクルではない(§4.2)
- 品質判定のマージン(ε=0.05)は「報告上の閾値であって、事前登録された同等性検定ではない」(§4.3)
現場ではこう使う
誰がいつ: エージェントを製品や社内基盤として運用するプラットフォーム・開発者生産性チームが、持たせる検索ツール群を設計するとき。「コードベースにRAGは要るのか、grepで足りるのか」の議論の実測つき判断材料になります。
触るパラメータ・ツール: FAISSのインデックス型(IndexFlatIP/IndexIVFFlat/IndexHNSWFlatとnprobe・efSearch)、検索幅(論文のretrieve_top_kとrerank_candidate_top_kは役割が別物)、tree-sitter、SCIP系インデクサ(scip-python、scip-go、rust-analyzer、clangdならcompile_commands.jsonが必須)、MCPでのツール公開。
知らないと事故になる落とし穴:
- HNSWを反射で選ばない。論文の規模では約2,300回検索して初めて元が取れる。まずFlatで測る
- リランカをループ内で毎回呼ばない。ミリ秒が秒に化け、エージェントの体感を支配する
- 静的インデックスを黙ってLSPの代わりにしない。参照解決の不一致率は現実に高い
- 索引の鮮度を台帳で管理する。古い索引を無言で使い続けるのが最も怖い事故。CodeNibのマニフェストとスキーマ検証はその防波堤
- 履歴圧縮はモデルごとに実測する。Haikuの例のとおり一律導入は逆効果になり得る
まとめ
CodeNibの貢献は新モデルではなく、リポジトリ文脈を測定可能なサービング問題として枠づけたことです。ビューを一度作り、住所を揃え、壊れた分だけ直し、必要な分だけ配膳する。そして速さの主張すべてに「どの条件で成り立つか」の但し書きを付けた——数字以上に、この検証の作法が持ち帰る価値です。
エージェントの基本動作はLLMエージェント入門、検索して文脈に入れる枠組みはRAGの基礎が下地になります。
コメント
コメントにはログインが必要です