AIエージェントのための複雑な検索パイプラインを、シンプルなgitコマンドで置き換える

複雑なパイプラインからシンプルなgitコマンドへ
AIエージェント向けのgitベースメモリシステム「DiffMem」を構築していた開発者は、検索レイヤーが不必要に複雑であることに気づきました。彼らは、コサイン類似度スコアリングを行うsentence-transformers、キーワード検索のためのrank-bm25、クエリを蒸留して結果を合成する2段階のLLMパイプライン、そして依存関係としてscikit-learnとnumpyを使用していました。これにより、3GBのDockerイメージ(sentence-transformersがPyTorch全体を取り込む)、約10%の確率で発生する高負荷ユーザーへのタイムアウト、そして毎回メモリ内BM25インデックスを再構築するコールドスタートが発生していました。
気づき:LLMはすでにgitを知っている
重要な洞察は、UnixコマンドがどのLLMのトレーニングデータにおいても最も密度の高いツール使用パターンであることを認識したことから得られました。何十億ものREADMEファイル、CIスクリプト、Stack Overflowの回答には、grep、git log、catコマンドが溢れています。LLMは、その周りに構築されたカスタム検索パイプラインを必要としません。LLMはすでにシェルコマンドの言語を話しているのです。
単一ツールによる解決策
彼らは複雑なシステム全体を、たった一つのツールに置き換えました:
{
"name": "run",
"description": "メモリリポジトリで読み取り専用コマンドを実行する",
"parameters": {
"command": "シェルコマンド(|、&&、||、; による連結をサポート)"
}
}
以上です。一つの関数だけです。エージェントは、教えられることなくgrep、git diff、headなどのUnixユーティリティをすでに知っており、シェルコマンドを記述します。
エージェントの動作方法
エージェントは、そのターン全体で固定されたプロトコルに従います:
- エンティティマニフェストを読み取る
- コミットログに対して時間的プローブを実行する
- 調査を単一のツール呼び出しにまとめる
- 検索計画を出力する
- 停止する
エージェントはコンテンツではなく、ポインタを返します。エージェントはターン中に軽量なシグナルを読み取り(構造のためのhead -30、キーワードのためのgrep -n、最近の変更のためのgit diff HEAD~3..)、その後、コードに何を取得すべきかを指示します。コードがポインタを解決し、エージェントのコンテキストを軽量に保ちます。
実世界の例
ユーザーが仕事のプレッシャーで孤独を感じているという誕生日のメッセージを送ったとき、エージェントは以下を実行しました:
git log --format='%h %ad' --date=relative --name-only -15
これにより、wife.mdとcompany.mdが同じセッションで変更され、重要な同僚が直近3セッションのうち2つに現れたことが明らかになりました。ユーザーのメッセージは仕事について何も言及していませんでした。BM25ではcompany.mdを見つけられず、「誕生日に孤独を感じる」という意味的類似性でも到達できません。しかし、コミット履歴での共起が、実際に重要な関連性を明らかにしたのです。
ターン3では、エージェントはセミコロンで連結された9つのコマンドを含む1つのツール呼び出しを構成しました:
git diff HEAD~2.. -- memories/people/wife.md; git log --stat -5 -- memories/people/wife.md; head -30 memories/people/wife.md; grep -n "birthday|surgery|stress" memories/people/wife.md; tail -50 timeline/2026-03.md; git diff HEAD~3.. -- timeline/2026-03.md; grep -n "project|deliverable" memories/contexts/company.md; git diff HEAD~2.. -- memories/contexts/company.md; git diff HEAD~1.. -- memories/people/colleague.md
最終的な出力は、特定のgit diff、優先度レベル、トークン見積もりを含むJSON検索計画でした。コンテンツではなく、ポインタです。その後、コードがコマンドを実行し、トークン予算に対してコンテキストを組み立てました。
結果
このアプローチにより、rank-bm25、sentence-transformers、scikit-learn、numpyを削除することができました。Dockerイメージは約3GB減少しました。サーバーの起動が速くなり、メモリ使用量が大幅に削減され、コールドスタート時のBM25インデックスもなくなりました。10%のタイムアウト率は消えました。Cloud Runでの実際のユーザーロードにおいて、これはわずかな改善ではなく、異なるクラスのデプロイメントとなりました。
残ったもの:requests、openai、gitpython。
📖 完全なソースを読む: r/LocalLLaMA
👀 See Also
バックオフィスシミュレーター:手動データ入力へのWebGLオマージュ
ブラウザベースのゲームで、手動によるバックオフィスのデータ入力をシミュレートします。WebGL 2とJavaScriptで構築されており、AIが廃れさせつつあるタスクの種類に対する風刺的な作品です。

新しい構造化データAPIがLLMエージェント向けにサブスクリプション価格を提供
開発者が、ストリーミングプラットフォーム、ライドシェアサービス、デートアプリ、その他のサブスクリプションベースのプラットフォームにわたるサブスクリプション価格を正規化する構造化データAPIをリリースしました。このAPIは、一貫したJSONスキーマ、利用可能な場合は地域対応の価格設定、およびスクレイピングなしでLLMエージェントが利用できるMCP互換エンドポイントを提供します。

各セッションでClaude Codeに再教育するのをやめよう:永続設定を使う
Redditユーザーが、Claude Code用の永続的な設定ファイルを作成することで、毎回のセッションで20分を節約し、33%高速な完了を実現した方法を説明しています。

agentcontract v0.0.1: AIコーディングエージェントのためのポータブルJSON権限レイヤー
agentcontract v0.0.1 は、AIエージェント向けのポータブルなJSON権限レイヤーを導入します。ブラウザベースのUIでツール呼び出しの編集、検証、ドライランが可能です。