単純Grepの暴走(Grep Doom Loop)によるコンテキスト崩壊とセマンティック検索設計
1. 概要
AIエージェントがプロジェクト全体の構造を把握し、コードの定義元や参照先を探す際、最も手軽に利用されるのが grep(ripgrep等)ツールである。 しかし、LSP(Language Server Protocol)やAST(抽象構文木)解析などの「セマンティック(意味的)な目」を持たないエージェントがグローバル検索を実行すると、無関係なビルド生成物や依存ファイルを大量に読み込み、コンテキストウィンドウを一瞬で満杯にしてハルシネーションを引き起こす「Grep Doom Loop(Grepの破滅的ループ)」が発生する。 本稿では、このGrep暴走のメカニズムを整理し、shiori が採用している「SQLite + universal-ctags による構造化セマンティック検索」の優位性について解説する。
2. インシデントの分析:Grepの暴走(Grep Doom Loop)
2.1. 曖昧なキーワード検索と依存ファイルの巻き込み
AIエージェントが「update や handle などの一般的な名前を持つ関数」の定義元を探そうとする際、単純なプロジェクト内 grep を実行すると、以下のファイルが大量にマッチする。
node_modules/やvendor/などの膨大なサードパーティ依存ライブラリdist/やbuild/などの自動生成された巨大なコンパイル済コードpackage-lock.jsonやyarn.lockなどの数十万行に及ぶ依存管理JSON/YAMLファイル- アプリケーションが吐き出した数メガバイトのデバッグログファイル
2.2. ファイルの「無差別丸読み」とコンテキスト崩壊
AIエージェントは、どのファイルが「本物のソースコード」で、どのファイルが「ノイズ(ビルド成果物やキャッシュ)」であるかをパスの文字列だけでは厳密に判断できないことが多い。 結果として、マッチした package-lock.json や自動生成ファイルのコンテンツを「中身を確認するため」に丸ごとコンテキストに読み込んでしまい、モデルのコンテキスト制限(Token Limit)に達してクラッシュする、あるいは前述の「セッションゾンビ化(即死)」を引き起こす。 これを防ぐために .gitignore や独自の除外設定ルールをAIにプロンプトで教え込む対策が取られるが、エージェントが焦って探索を繰り返すうちに、除外ルールを忘れて再び巨大ファイルを踏み抜く脆弱性が常に残る。
3. shiori にみる「セマンティック・インデックス」による解決
これらのGrep暴走トラップに対し、shiori(リポジトリRAGシステム)は、AIに対してグローバルな生ファイルGrepをさせない「データベース化されたインデックス検索」を設計している。
3.1. universal-ctagsによるセマンティック(意味的)パース
shioriは、インジェスト時にプロジェクト全体のファイルをuniversal-ctags(およびASTパーサー)にかけ、すべての「関数(Functions)」「クラス(Classes)」「変数(Variables)」「型定義(Types)」を意味的に抽出する。- これにより、単なる「文字列の一致」ではなく、「それがコード上の『定義』であるか、単なる『コメントや文字列内の出現』であるか」を事前に切り分ける。
3.2. SQLiteデータベースによる Out-of-Band(帯域外)検索
- 抽出されたシンボル情報は、SQLiteデータベースに厳格に構造化されて格納される。
- AIエージェントは、生の
grepコマンドで全ファイルを走査する代わりに、shiori_keyword_searchツールを実行し、SQLiteから「目的のシンボルが定義されているファイルパスと行番号(ポインター)」だけをミリ秒単位で取得する。 - 探索プロセス全体がデータベースクエリ(Out-of-Band)で完結するため、AIが不要な
node_modulesやdistファイルの本体をコンテキストに読み込んで暴走するリスクを、構造レベルで100%シャットアウトする。
4. 結論
AIエージェントにプロジェクトのグローバルな grep 権限を無防備に与えることは、巨大なログや依存ファイルを踏み抜いてコンテキストを即死させる「Grep Doom Loop」の引き金を引くことに等しい。 shiori が提供する 「universal-ctagsによるセマンティック抽出 + SQLiteによる構造化ポインター検索」 の設計は、AIから無差別なファイル探索の必要性を奪い、極限までクリーンかつ最小限のトークン消費で大規模コードベースを自律横断させるための、極めて先進的な情報アーキテクチャであるといえる。
5. 参考文献 / 一次情報
- 巨大ファイル読み込みによるコンテキスト即死: anthropics/claude-code#12133
- Grep/検索ツール暴走時の部分読み込み要求: anthropics/claude-code#11616