
2026/05/18 0:37
【Show HN】Semble:エージェント向けのコード検索。grep より約 98% 少ないトークン数で実現。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された要約: Semble は、GPU、外部 API、高価なトランスフォーマーを必要とせず、AI エージェントが entire リポジトリから直ちに関連するコードを検出することを可能にする、高速で CPU だけのライブラリです。137M パラメータモデルの検索品質の約 99% を達成しながら、索引化は 200 倍高速、クエリ処理は 10 倍高速です。本ツールは完全にローカルで動作し、フルファイルの読み込みを回避することで従来の「grep-and-read」手法に比べてトークン使用量を約 98% 削減します。Semble は Model2Vec エンベディングと BM25 テキスト一致を融合させたハイブリッドランキングシステムを採用しており、相互順位フージョンと適応的加重によって強化されています。インストール方法として MCP サーバー(Claude Code などのツール向け)または pip/uv 経由のいずれもをサポートし、CLI(
semble search、semble find-related)および Python API を直接提供します。主な機能には、ローカルファイルが変更された際の自動再索引化、ローカルパスおよび Git リポジトリの両方のサポートが含まれ、重量型 LLM ベースのコード検索ツールに対する軽量で低レイテンシーな代替手段となります。本文
Semble はエージェント向けに設計されたコード検索ライブラリです。必要なコード断片を瞬時に返し、grep+read に比べてトークン数を約 98% 削減し、各ステップの遅延時間を短縮します。完全なコードベースのエンドツーエンドでのインデックス作成および検索には 1 秒以下しかかからず、コード特化型トランスフォーマーと比較してインデックス化速度は約 200 倍高速でクエリ速度も約 10 倍高速化し、かつ検索品質の 99% を達成しています(ベンチマーク参照)。すべての処理は CPU 上で実行され、API キーや GPU、外部サービスの利用は不要です。MCP サーバーとして動作させるか、AGENTS.md を経由してシェルから呼び出すことで、Claude Code、Cursor、Codex、OpenCode などあらゆるエージェントがリポジトリの任意の箇所に瞬時にアクセスできるようになります。
クイックスタート
あなたのエージェントは、コードを検索する必要があるたびに自動的に Semble を使用します。キーワードで grep 検索し完全なファイルを読み取る代わりに、自然言語でクエリを行います(例: "認証はどのように実装されていますか?")そして、関連するコンテキストのみを返されます。Semble は MCP サーバーまたは Bash ツールとして設定できます:
MCP
Claude Code に Semble を追加します(uv のインストールが必要):
claude mcp add semble -s user -- uvx --from "semble[mcp]" semble
他のエージェントハンデスを使用している場合は、Codex、OpenCode、Cursor およびその他の MCP クライアント向けのセットアップ手順については MCP サーバー セクションを参照してください。
Bash / AGENTS.md
まず Semble をインストールし、次に
AGENTS.md または CLAUDE.md にコード検索スニペットを追加します:
pip install semble # pip を使ってインストール uv tool install semble # または uv を使ってインストール
注記:Claude Code や Codex CLI サブエージェントの場合、MCP ではなく Bash インテグレーションを使用するか、併用してください。
Semble の更新については Updating を参照してください。
Semble がどれだけのトークン节省をもたらしたか気になった場合は、
semble savingsを実行して確認できます。詳細については Savings をご覧ください。
メイン機能
- 高速: 平均的なリポジトリをインデックス化するのに約 250ms かかり、クエリへの回答には約 1.5ms です(すべて CPU で動作)。
- 正確: ベンチマークにおける NDCG@10 は 0.854 で、コード特化型トランスフォーマーモデルと同水準でありながら、サイズとコストはfractionに過ぎません。
- トークン効率的: 関連する断片のみを返し、grep+read に比べて約 98% トークンを削減します。
- セットアップ不要: API キー、GPU、または外部サービスの必要なく、CPU だけで動作します。
- MCP サーバー: Claude Code、Cursor、Codex、OpenCode およびその他の MCP 互換エージェント向けのドロップインツールです。
- ローカルおよびリモート: ローカルパスまたは Git URL を渡すことができます。
MCP サーバー
Semble は MCP サーバーとして動作し、エージェントがあらゆるコードベースを直接検索できるようにします。リポジトリは必要な時にクローンされインデックス化され、インデックスはセッションのlifetime 동안 キャッシュされます。ローカルパスはファイル変更を監視し、自動的に再インデックスされます。
セットアップ
uv のインストールが必要です。
Claude Code
claude mcp add semble -s user -- uvx --from "semble[mcp]" semble
Codex
~/.codex/config.toml に追加:
[mcp_servers.semble] command = "uvx" args = ["--from", "semble[mcp]", "semble"]
OpenCode
~/.opencode/config.json に追加:
{ "mcp": { "semble": { "type": "local", "command": ["uvx", "--from", "semble[mcp]", "semble"] } } }
Cursor
~/.cursor/mcp.json またはプロジェクト内の .cursor/mcp.json に追加:
{ "mcpServers": { "semble": { "command": "uvx", "args": ["--from", "semble[mcp]", "semble"] } } }
ツール
| ツール | 説明 |
|---|---|
| 自然言語またはコードクエリでコードベースを検索します。リポジトリをローカルディレクトリパスまたは https:// Git URL として渡します。 |
| ファイルパスと行番号が与えられた場合、その位置のコードに意味的に類似する断片を返します。 |
Bash インテグレーション
MCP の代替手段として、Semble を Bash を介して呼び出すことができます。Claude Code および Codex CLI 用のサブエージェントにとっては、MCP ツールを直接呼び出せないため(トップレベルのエージェントのみで遅延読み込みを行う)、これが唯一の選択肢です。
Bash サポートを追加するには、以下の内容を
AGENTS.md または CLAUDE.md の末尾に追加します:
## コード検索 grep 代わりにコードを記述してその動作やシンボル/識別子を指定することで `semble search`を使用してコードを検索します: ```bash semble search "認証フロー" ./my-project semble search "save_pretrained" ./my-project semble search "モデルをディスクに保存" ./my-project --top-k 10
既知の位置に類似したコードを発見するために
semble find-related を使用します(直前の検索結果からの file_path と line を渡す):
semble find-related src/auth.py 42 ./my-project
path は省略された場合は現在のディレクトリがデフォルトとなり、Git URL も受け付けられます。
semble が $PATH に存在しない場合、代わりに uvx --from "semble[mcp]" semble を使用してください。
ワークフロー
- 関連する断片を見つけるために最初により
を使用します。semble search - 返された断片が十分なコンテキストではない場合のみ完全なファイルを確認します。
- お勧めの結果の
とfile_path
を使ってオプションでline
を使用して、関連実装を発見します。semble find-related - 網羅的な文字一致が必要であるか正確な文字列の確認を素早く行う場合にのみ grep を使用します。
Claude Code サブエージェント
Claude Code は専用のサブエージェントもサポートしています。プロジェクトのルートディレクトリで一度実行します:
semble init # または semble が $PATH に存在しない場合: uvx --from "semble[mcp]" semble init
これは
.claude/agents/semble-search.md を書きます。
CLI
Semble は MCP 以外での使用のためにスタンドアロンの CLI としても提供されています。スクリプトや MCP セッションなしで検索結果が必要な場所などで便利です。
# ローカルリポジトリを検索 semble search "認証フロー" ./my-project # シンボルまたは識別子を探索 semble search "save_pretrained" ./my-project # リモートリポジトリを検索(必要に応じてクローン) semble search "モデルをディスクに保存" https://github.com/MinishLab/model2vec # 既知の位置に類似したコードを発見(以前の検索結果からの file_path と line を使用) semble find-related src/auth.py 42 ./my-project
path は省略された場合は現在のディレクトリがデフォルトとなり、Git URL も受け付けられます。
sembl が $PATH に存在しない場合、代わりに
を使用してください。uvx --from "semble[mcp]" semble
トークン節約額
semble savings は、Semble によって保存されたトークンの数をすべての検索に基づいて示します:
semble savings # 期間別のサマリー semble savings --verbose # クールタイプ別の詳細も表示
出力例:
Semble トークン節約額 ========================== 期間 呼び出し 節約額 ─────────────────────────────────────── 今日 42 [███████████████░] ~58.4k トークン (95%) 過去 7 日 287 [██████████████░░] ~312.4k トークン (90%) 全体的 1.4k [██████████████░░] ~1.2M トークン (89%)
節約額の計算方法: 各呼び出しごとに、返された断片を含むユニークファイルの総文字数と返された断片の文字数が記録されます。推定保存トークンは (ファイル文字 - スニペット文字) / 4(1 トークンあたり 4 文字)です。これは保守的な推定であり、基準はマッチしたファイルを完全に読み取るものであり、コーディングエージェントがしばしば新しいコードを探索する方法です。
統計データは
~/.semble/savings.jsonl に保存されます。
アップデート
Semble を最新バージョンにアップデート/アップグレードするには:
pip install --upgrade semble # pip 使用時 uv tool upgrade semble # uv 使用時 uv cache clean semble # MCP ユーザー向け(MCP クライアントを再起動してください)
Python API
Semble はプログラマティックアクセスのために Python ライブラリとしても使用でき、カスタムツールの構築または検索を直接自分のコードに統合する際に便利です。
from semble import SembleIndex # ローカルディレクトリをインデックス化 index = SembleIndex.from_path("./my-project") # リモート Git リポジトリをインデックス化 index = SembleIndex.from_git("https://github.com/MinishLab/model2vec") # インデックスを検索(自然言語またはコードクエリ) results = index.search("モデルをディスクに保存", top_k=3) # 特定の結果に類似したコードを見つける related = index.find_related(results[0], top_k=3) # 各結果はマッチされた断片を公開 result = results[0] result.chunk.file_path # "model2vec/model.py" result.chunk.start_line # 127 result.chunk.end_line # 150 result.chunk.content # "def save_pretrained(self, path: PathLike, ..."
仕組みについて
Semble は Chonkie を使用して各ファイルをコード意識のある断片に分割し、その後各クエリに対して静的 Model2Vec エンベッディング(コード特化型
potion-code-16M モデルによる意味的類似性)と BM25(識別子および API 名前における語彙的一致)の 2 つの補完的な検索器でスコア付けを行います。2 つのスコアリストは相互ランクフュージョン (RRF) で融合されます。
融合後、結果はコード意識のあるシグナルのセットを使用して再ランク付けされます:
ランキングシグナル
- 適応的ウェイト: シンボルのようなクエリ(
,Foo::bar
,_private
)には語彙的ウェイトが与えられ、自然言語クエリは意味的検索器と語彙的検索器の間のバランスを保ちます。getUserById - 定義ブースト: クエリされたシンボルを定義する断片(クラス、
,def
など)は、それを単に参照している断片よりも優先されます。func - 識別子ステム: クエリトークンはステム化され、断片内の識別子ステムと一致するため、それらを保持する断片には追加のウェイトが与えられます。例えば、
をクエリすると、parse config
,parseConfig
,ConfigParser
を含む断片がブーストされます。config_parser - ファイル整合性: クエリに一致する複数の断片が同じファイルから来る場合、そのファイルはブーストされ、トップの結果が単一の文脈外断片ではなく広範なファイルレベルの関連性を反映します。
- ノイズペナルティ: テストファイル、
シム、サンプルコード、およびcompat//legacy/
宣言stub はランクダウソされますので、正統的な実装が最初に現れます。.d.ts
エンベッディングモデルは静的でありクエリ時にトランスフォーマー前進行がないため、すべて CPU で数ミリ秒で動作します。
ベンチマーク
私たちが約 1,250 クエリを対象に、63 リポジトリの 19 カ国語ですべての手法について品質と速度をベンチマークしました。横軸は総遅延(インデックス + 最初のクエリ)、縦軸は NDCG@10 です。マーカーサイズはモデルパラメータ数を反映します。
| 方法 | NDCG@10 | インデックス時間 | クエリ p50 |
|---|---|---|---|
| CodeRankEmbed ハイブリッド | 0.862 | 57 秒 | 16 ミリ秒 |
| sembra | 0.854 | 263 ミリ秒 | 1.5 ミリ秒 |
| CodeRankEmbed | 0.765 | 57 秒 | 16 ミリ秒 |
| ColGREP | 0.693 | 5.8 秒 | 124 ミリ秒 |
| BM25 | 0.673 | 263 ミリ秒 | 0.02 ミリ秒 |
| grepai | 0.561 | 35 秒 | 48 ミリ秒 |
| probe | 0.387 | — | 207 ミリ秒 |
| ripgrep | 0.126 | — | 12 ミリ秒 |
Semble は 1.37 億パラメータの CodeRankEmbed ハイブリッドのパフォーマンスの 99% を達成し、インデックス化は 218 倍高速でクエリ応答は 11 倍高速です。言語別の結果、アブレーション、および方法論についてはベンチマークを参照してください。
トークン効率
grep+read を使用しているエージェントは、コンテキスト予算の大部分を関連性の低いコードに費やします。Semble はマッチする断片のみを返し、高リコールでもトークン使用量を低く保ちます。
Semble は平均で 98% の少ないトークンを使用し、2k トークンの予算ですべての回復率が 94% に達しますが、grep+read では 100k コンテキストウィンドウ全体が必要で 85% しか達成しません。詳細についてはベンチマークを参照してください。
ライセンス
MIT
引用
Semble を研究で使用する場合、以下のようにつ記してください:
@software{minishlab2026semble, author = {{van Dongen}, Thomas and Stephan Tulkens}, title = {Semble: Fast and Accurate Code Search for Agents}, year = {2026}, publisher = {Zenodo}, doi = {10.5281/zenodo.19785932}, url = {https://github.com/MinishLab/semble}, license = {MIT} }