Semble: поиск по коду для AI-агентов за миллисекунды

Логотип Semble

Semble — библиотека поиска по коду, созданная для агентов. Она мгновенно возвращает именно те фрагменты кода, которые нужны агенту, расходуя примерно на 98% меньше токенов, чем связка grep+read. Полная индексация и поиск по кодовой базе занимают меньше секунды: индексирование выполняется примерно в 200 раз быстрее, а запросы — в 10 раз быстрее, чем у специализированных трансформерных моделей, при этом качество поиска составляет 99% от их уровня (см. бенчмарки). Всё работает на CPU без API-ключей, GPU и внешних сервисов. Запустите Semble как MCP-сервер или вызывайте из командной строки через AGENTS.md — и любой агент (Claude Code, Cursor, Codex, OpenCode и другие) получит мгновенный доступ к любому репозиторию.

Быстрый старт

Агент обращается к Semble на естественном языке (например: "How is authentication handled?") и получает в ответ только релевантные фрагменты кода — без grep и без чтения файлов целиком.

Semble поддерживает три взаимодополняющих способа настройки. Рекомендуется использовать все три, но можно выбрать только нужные:

  • MCP-сервер: MCP-сервер для вашего агента.

  • AGENTS.md: сниппет для AGENTS.md с инструкциями по вызову Semble через CLI.

  • Sub-agent: выделенный суб-агент semble-search для окружений, которые его поддерживают.

MCP

Зарегистрируйте Semble как нативный инструмент через MCP — тогда агент сможет вызывать его напрямую. Добавьте в Claude Code (требуется uv):

claude mcp add semble -s user -- uvx --from "semble[mcp]" semble

Настройка для других окружений (Cursor, Codex, OpenCode и др.) описана в разделе MCP-сервер ниже.

AGENTS.md

Добавьте инструкции по использованию Semble в контекст агента, чтобы он знал, когда и как вызывать CLI. Установите CLI Semble, затем добавьте приведённый ниже сниппет в файл AGENTS.md или CLAUDE.md:

uv tool install semble   # Установка через uv (рекомендуется)
pip install semble       # Или через pip

Сниппет для AGENTS.md / CLAUDE.md:

## Code Search

Use `semble search` to find code by describing what it does or naming a symbol/identifier, instead of grep:

```bash
semble search "authentication flow" ./my-project
semble search "save_pretrained" ./my-project
semble search "save model to disk" ./my-project --top-k 10
```

The index is built on first run (and cached for subsequent runs) and invalidated automatically when files change.

Use `--content docs` to search documentation and prose, `--content config` for config files (yaml, toml, etc.), or `--content all` to search code, docs, and config:

```bash
semble search "deployment guide" ./my-project --content docs
semble search "database host port" ./my-project --content config
semble search "authentication" ./my-project --content all
```

Use `semble find-related` to discover code similar to a known location (pass `file_path` and `line` from a prior search result):

```bash
semble find-related src/auth.py 42 ./my-project
```

`path` defaults to the current directory when omitted; git URLs are accepted.

If `semble` is not on `$PATH`, use `uvx --from "semble[mcp]" semble` in its place.

### Workflow

1. Start with `semble search` to find relevant chunks. The index is built and cached automatically.
2. Use `--content docs` for documentation, `--content config` for config files, or `--content all` for everything.
3. Inspect full files only when the returned chunk does not give enough context.
4. Optionally use `semble find-related` with a promising result's `file_path` and `line` to discover related implementations.
5. Use grep only when you need exhaustive literal matches or quick confirmation of an exact string.

Суб-агент

Если ваше окружение поддерживает суб-агентов, установите выделенный суб-агент semble-search, чтобы поиск выполнялся в собственном контексте (требуется CLI):

semble init   # Claude Code → .claude/agents/semble-search.md

Настройка для других окружений (Cursor, Codex, OpenCode и др.) описана в разделе Настройка суб-агента ниже.

Обновление Semble:

uv tool upgrade semble         # через uv
uv cache clean semble          # для пользователей MCP (после этого перезапустите MCP-клиент)
pip install --upgrade semble   # через pip

Основные возможности

  • Быстро: индексирует средний репозиторий примерно за 250 мс, отвечает на запросы примерно за 1,5 мс — всё на CPU.

  • Точно: NDCG@10 равен 0,854 на наших бенчмарках — сопоставимо со специализированными трансформерными моделями для кода, но значительно меньше по размеру и стоимости.

  • Экономит токены: возвращает только релевантные фрагменты, расходуя примерно на 98% меньше токенов, чем grep+read.

  • Не требует настройки: работает на CPU без API-ключей, GPU и внешних сервисов.

  • MCP-сервер: совместим с Claude Code, Cursor, Codex, OpenCode, VS Code и любым другим MCP-совместимым агентом.

  • Локально и удалённо: принимает локальный путь или git URL.

MCP-сервер

Semble может работать как MCP-сервер (сервер Model Context Protocol), позволяя агентам напрямую искать по любой кодовой базе. Репозитории клонируются и индексируются по требованию. Индексы сохраняются в системную папку кэша и переиспользуются между сессиями; локальные пути отслеживаются на предмет изменений файлов и переиндексируются автоматически.

Настройка

Требуется установленный uv.

Claude Code:

claude mcp add semble -s user -- uvx --from "semble[mcp]" semble

Cursor — добавьте в ~/.cursor/mcp.json (или в .cursor/mcp.json в вашем проекте):

{
  "mcpServers": {
    "semble": {
      "command": "uvx",
      "args": ["--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"]
    }
  }
}

VS Code — добавьте в .vscode/mcp.json в вашем проекте (или в mcp.json профиля пользователя):

{
  "servers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

GitHub Copilot CLI — добавьте в ~/.copilot/mcp-config.json:

{
  "mcpServers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

Windsurf — добавьте в ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

Gemini CLI — добавьте в ~/.gemini/settings.json:

{
  "mcpServers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

Kiro — добавьте в ~/.kiro/settings/mcp.json (или в .kiro/settings/mcp.json в вашем проекте):

{
  "mcpServers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

Zed — добавьте в ~/.config/zed/settings.json (или в .zed/settings.json в вашем проекте):

{
  "context_servers": {
    "semble": {
      "command": "uvx",
      "args": ["--from", "semble[mcp]", "semble"]
    }
  }
}

Инструменты

Инструмент Описание

search

Поиск по кодовой базе по запросу на естественном языке или по фрагменту кода. Параметр repo принимает путь к локальной директории или git URL вида https://.

find_related

По заданному пути к файлу и номеру строки возвращает фрагменты, семантически схожие с кодом в этом месте.

По умолчанию MCP-сервер индексирует только файлы с кодом. Чтобы также индексировать документацию, конфигурационные файлы или всё сразу, добавьте --content docs, --content config или --content all к команде сервера — либо их комбинацию, например --content code docs. Пример для Claude Code: claude mcp add semble -s user — uvx --from "semble[mcp]" semble --content all.

Настройка суб-агента

Claude Code, Gemini CLI, Cursor, OpenCode, GitHub Copilot CLI и Kiro поддерживают выделенный суб-агент для поиска через Semble. Достаточно один раз выполнить semble init в корне проекта:

semble init                      # Claude Code  → .claude/agents/semble-search.md
semble init --agent gemini       # Gemini CLI   → .gemini/agents/semble-search.md
semble init --agent cursor       # Cursor       → .cursor/agents/semble-search.md
semble init --agent opencode     # OpenCode     → .opencode/agents/semble-search.md
semble init --agent copilot      # Copilot CLI  → .github/agents/semble-search.md
semble init --agent kiro         # Kiro         → .kiro/agents/semble-search.md

Если semble не находится в $PATH, добавьте перед командой префикс uvx --from "semble[mcp]".

CLI

Semble также поставляется как самостоятельный инструмент командной строки (CLI). Это удобно в скриптах или везде, где нужны результаты поиска без MCP-сессии.

# Поиск в локальном репозитории (индекс строится и кэшируется автоматически)
semble search "authentication flow" ./my-project

# Поиск в удалённом репозитории (клонируется по требованию)
semble search "save model to disk" https://github.com/MinishLab/model2vec

# Ограничить количество результатов
semble search "save model to disk" ./my-project --top-k 10

# Искать в документации/конфигах/везде, а не только в коде
semble search "deployment guide" ./my-project --content docs   # или: config, all

# Найти код, похожий на код в заданном месте
semble find-related src/auth.py 42 ./my-project

--content принимает значения code (по умолчанию), docs, config или all. Параметр path по умолчанию равен текущей директории; принимаются git URL. Если semble не находится в $PATH, используйте uvx --from "semble[mcp]" semble.

Управление индексируемыми файлами

Semble читает файлы .gitignore и .sembleignore, чтобы определить, какие файлы индексировать. Оба файла используют стандартный синтаксис gitignore, их правила объединяются. .sembleignore позволяет добавлять специфичные для Semble правила, не затрагивая .gitignore. Правила применяются рекурсивно: .sembleignore в поддиректории распространяется на всё её поддерево.

Исключение файлов — добавляйте шаблоны так же, как в .gitignore:

# .sembleignore
generated/     # исключить директорию generated
*.pb.go        # исключить Go protobuf-файлы

Добавление нестандартных расширений — используйте префикс !, чтобы принудительно включить файлы, которые Semble не индексирует по умолчанию:

# .sembleignore
!*.proto       # включить Protobuf-файлы
!*.cob         # включить COBOL-файлы

Кроме того, Semble всегда пропускает набор широко известных директорий, не являющихся исходным кодом, — независимо от файлов игнора: например, node_modules/, .venv/, dist/, build/, pycache/ и подобные.

Статистика экономии

semble savings показывает, сколько токенов Semble сэкономил за всё время использования:

semble savings           # сводка по периодам
semble savings --verbose # также показать разбивку по типам вызовов
  Semble Token Savings
  ════════════════════════════════════════════════════════════════
  Period        Calls   Savings
  ────────────────────────────────────────────────────────────────
  Today         42      [███████████████░]  ~58.4k tokens (95%)
  Last 7 days   287     [██████████████░░]  ~312.4k tokens (90%)
  All time      1.4k    [██████████████░░]  ~1.2M tokens (89%)

Экономия вычисляется следующим образом: для каждого вызова Semble фиксирует суммарное количество символов в уникальных файлах, содержащих возвращённые фрагменты, и количество символов в самих возвращённых фрагментах. Оценка сэкономленных токенов: (символов в файлах − символов в фрагментах) / 4 (4 символа на токен). Это консервативная оценка: в качестве базы берётся чтение найденных файлов целиком — именно так агенты для написания кода обычно изучают незнакомый код.

Статистика хранится в системной папке кэша: ~/Library/Caches/semble/ на macOS, ~/.cache/semble/ на Linux, %LOCALAPPDATA%\semble\Cache\ на Windows.

Использование как библиотеки

Semble можно использовать и как Python-библиотеку для программного доступа — это удобно при создании собственного инструментария или при интеграции поиска непосредственно в ваш код.

from semble import ContentType, SembleIndex

# Индексировать локальную директорию (только код, по умолчанию)
index = SembleIndex.from_path("./my-project")

# Индексировать документацию и текст (markdown, rst и т.д.)
index = SembleIndex.from_path("./my-project", content=ContentType.DOCS)

# Индексировать всё (код, документацию и конфиги)
index = SembleIndex.from_path("./my-project", content=[ContentType.CODE, ContentType.DOCS, ContentType.CONFIG])

# Индексировать код и документацию вместе
index = SembleIndex.from_path("./my-project", content=[ContentType.CODE, ContentType.DOCS])

# Индексировать удалённый git-репозиторий
index = SembleIndex.from_git("https://github.com/MinishLab/model2vec")

# Поиск по индексу на естественном языке или по фрагменту кода
results = index.search("save model to disk", 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, ..."

Бенчмарки

Мы оцениваем качество и скорость на ~1 250 запросах по 63 репозиториям на 19 языках программирования (слева), а также эффективность использования токенов по сравнению с grep+read при эквивалентном уровне полноты выборки (recall) (справа).

График скорости и качества поиска
График токенной эффективности: полнота выборки против числа токенов

Бенчмарк качества (слева) сопоставляет качество поиска (NDCG@10) с общей задержкой: Semble достигает 99% качества 137-миллионного гибридного CodeRankEmbed, при этом индексируя в 218 раз быстрее. Бенчмарк токенной эффективности (справа) показывает, сколько токенов каждый метод тратит для достижения заданного уровня полноты выборки: Semble в среднем использует на 98% меньше токенов и достигает 94% полноты при всего 2 тысячах токенов, тогда как grep+read для достижения 85% требует контекстное окно в 100 тысяч токенов. Подробные результаты по языкам, анализ вариантов и полная методология — в разделе benchmarks.

Как это работает

Semble разбивает каждый файл на фрагменты (chunks) с учётом синтаксиса кода, используя tree-sitter, а затем оценивает каждый запрос относительно этих фрагментов двумя взаимодополняющими методами извлечения (retrieval): статические эмбеддинги (embeddings) Model2Vec на базе специализированной для кода модели potion-code-16M для семантического сходства и BM25 для лексического совпадения идентификаторов и названий API. Два списка оценок объединяются с помощью метода Reciprocal Rank Fusion (RRF).

После объединения результаты переранжируются с учётом набора сигналов, специфичных для кода:

Сигналы ранжирования:

  • Адаптивное взвешивание. Запросы в стиле символов (Foo::bar, _private, getUserById) получают больший лексический вес, тогда как запросы на естественном языке сохраняют баланс между семантическим и лексическим методами.

  • Буст определений. Фрагмент, в котором запрошенный символ определяется (class, def, func и т.д.), ранжируется выше фрагментов, где он лишь упоминается.

  • Стемминг идентификаторов. Токены запроса приводятся к основе (стеммируются) и сопоставляются с основами идентификаторов в фрагменте, давая дополнительный вес фрагментам, которые их содержат. Например, запрос parse config поднимает фрагменты с parseConfig, ConfigParser или config_parser.

  • Когерентность файла. Если несколько фрагментов из одного файла совпадают с запросом, файл получает буст, так что верхний результат отражает общую релевантность файла, а не единственный вырванный из контекста фрагмент.

  • Штрафы за шум. Тестовые файлы, прослойки совместимости (compat//legacy/), примеры кода и стабы объявлений .d.ts понижаются в рейтинге, чтобы каноническая реализация оказывалась на первых позициях.

Поскольку модель эмбеддингов является статической и не выполняет прямого прохода через трансформер во время запроса, всё это работает за миллисекунды на CPU.

Индексы автоматически кэшируются на диск при первом поиске. При последующих запусках Semble обходит файловое дерево и сравнивает времена модификации: если какой-либо файл был добавлен, удалён или изменён, индекс полностью перестраивается. В режиме MCP за изменениями следит файловый наблюдатель (file watcher): он обнаруживает изменения и запускает перестройку автоматически, так что индекс всегда актуален в рамках текущей сессии.

Благодарности

Благодарим Greptile за предоставление бесплатного доступа к их платформе проверки кода на базе искусственного интеллекта.

Лицензия

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}
}
© 2026 meganuke