Здравствуй, искушенный читатель. Недавно я выкатил на Хабре статью про сравнение 21 подхода к сбору контекста для ИИ-агентов (habr.com/ru/articles/1042880/). Тема экономии токенов сейчас дико популярна, и мы с ребятами в Гильдии AI-инженеров знатно её пообсуждали. Напомню краткую суть: там связка Serena (LSP) + Semble (векторные эмбеддинги) + Ripgrep (поиск координат) показала себя абсолютным топом для точечной навигации.
Но в комментариях и личке мне тут же начали советовать: «Нахлобучь сверху еще rtk для сжатия вывода терминала и context-mode для полнотекстового индекса репозитория! Тема прокси-экономии сейчас на пике хайпа, сэкономишь еще больше!».
Я решил провести душный менеджерский аудит. Взял популярный open-source проект supermemory (~180 файлов, JS/TS) и замерил: действительно ли добавление rtk + context-mode дает реальный профит поверх моего текущего сетапа, или это просто карго-культ и оверхед, который утянет бюджет в минус?
1. Слоеный пирог: как они работают вместе
Чтобы понять, есть ли смысл в надстройке, разделим зоны ответственности инструментов.
|
Слой / Инструмент |
Роль в системе |
Что принимает на вход |
Что отдает ИИ-агенту |
Когда включается |
|---|---|---|---|---|
|
rtk |
CLI-прокси |
Сырой вывод терминала (git, ls, grep) |
Отфильтрованный текст без мусора и лишних строк |
После выполнения команды |
|
context-mode |
FTS5-поиск |
Текстовый поисковый запрос (например, |
Небольшие текстовые сниппеты с контекстом |
Вместо чтения всего файла |
|
Semble |
Векторный поиск |
Семантический запрос (по смыслу) |
Куски кода, близкие по значению |
Вместо чтения всего файла |
|
Serena |
LSP-сервер |
Запрос сигнатуры символа или структуры |
Чистые тела функций и граф зависимостей |
Вместо чтения всего файла |
|
Ripgrep |
Быстрый поиск |
Регулярное выражение (поиск по маске) |
Имена файлов и номера строк |
До начала чтения кода |
-
Базовый слой (Serena + Semble + rg) — хирургический инструмент. Serena знает структуру кода (функции, типы, связи), Semble ищет по смыслу через векторную базу, rg моментально локализует строки по регуляркам. Они работают на этапе до вызова тяжелых операций, помогая агенту не читать лишнего.
-
rtk — CLI-прокси. Он перехватывает команды терминала (
git,grep,ls) и фильтрует их вывод после выполнения, вырезая мусор перед отправкой в LLM. -
context-mode — локальный текстовый индекс (FTS5). Он делит файлы на мелкие сниппеты и отдает их вместо полных исходников при текстовом поиске.
2. Глубокий разбор инструментов: Архитектура, Схемы, Боли
Для понимания целесообразности интеграции разберем каждый инструмент под капотом, схемы их работы и слабые места.
2.1. rtk (Rust Token Killer)
CLI-прокси, написанный на Rust. Встраивается между ИИ-агентом и командной оболочкой (shell).
Shellrtk (Proxy)AgentShellrtk (Proxy)AgentПарсинг вывода, удаление пробелов,вырезание ханков кода, сбор статистикиКоманда (например, git diff)Вызов сырой команды git diffСырой вывод (30,000 токенов)Сжатый вывод (5,000 токенов)
Проблемы и боли:
-
Lossy-слепота (сжатие с потерями). rtk сжимает
git diffиgit log -p, безжалостно вырезая ханки кода (оставляя только статистику изменений). Если агенту нужно проанализировать логику правок, он слепнет и делает повторные запросы. -
Паразитный оверхед. На простых утилитах вроде
npm lsилиpip listrtk пытается на лету переформатировать дерево зависимостей, раздувая вывод в 2.5 раза. -
Платформозависимость. На Windows unix-команды (
ls,grep,wc) вызывают ошибки «command not found» из-за отсутствия родных бинарников в PATH.
Замеры rtk на проекте supermemory:
|
Команда |
ДО (сырой вывод) |
ПОСЛЕ (rtk) |
Снижение (Δ) |
Качество |
|---|---|---|---|---|
|
|
22 376 |
174 |
−99.2% |
⚠️ Lossy |
|
|
31 385 |
5 277 |
−83.2% |
⚠️ Lossy |
|
|
60 |
9 |
−85.0% |
✅ Lossless |
|
|
10 530 |
5 011 |
−52.4% |
✅ Lossless |
|
|
2 665 |
293 |
−89.0% |
✅ Lossless |
|
|
756 |
1 862 |
+146% ❌ |
ХУЖЕ |
2.2. context-mode
Полнотекстовый текстовый индекс кодовой базы на SQLite FTS5 с алгоритмом BM25.
Проблемы и боли:
-
TF-IDF/BM25 слепота к смыслу. В отличие от Semble, context-mode не использует векторные эмбеддинги. Это жесткий текстовый поиск по токенам. Если агент ищет
user authentication, а в коде написаноSecuritySessionManager, context-mode ничего не найдет. -
Оверхед схем MCP. При использовании как MCP-сервер, он скармливает агенту ~7.4k токенов JSON-описаний своих инструментов при каждом старте сессии.
-
Старение индекса. Требует регулярного запуска индексации (
context-mode index) при изменении файлов.
Замеры context-mode (поиск useAuth на 180 файлов):
-
Без context-mode (полное чтение): 324 453 токена.
-
С context-mode (3 сниппета): 471 токен (экономия −99.85%).
2.3. Serena
MCP-сервер на базе Language Server Protocol (LSP). Извлекает AST-дерево проекта и строит граф символов.
Проблемы и боли:
-
Зависимость от LSP. Если в проекте сломаны типы, не настроен
tsconfig.jsonили падает языковой сервер, Serena перестает видеть сигнатуры функций. -
Слепота к не-коду. Бесполезна для поиска в markdown-документации,
.env-файлах, JSON-конфигах или логах.
2.4. Semble
Легковесный локальный векторный поисковик по эмбеддингам кода.
Проблемы и боли:
-
Ресурсоемкость. Генерация эмбеддингов требует мощностей CPU/GPU и времени при первом запуске.
-
Промах мимо точных названий. Из-за семантической природы может вернуть концептуально близкий код вместо конкретного метода с точным совпадением имени.
3. Лестница стоимости: сколько стоит один запрос
Сравним все инструменты на одной задаче: найти и прочитать функцию useAuth в проекте supermemory.
|
Инструмент |
Токенов |
Что получает агент |
|---|---|---|
|
Полное чтение |
1 476 |
Весь файл целиком |
|
|
471 |
3 текстовых сниппета с контекстом |
|
Semble (Векторный поиск) |
180 |
Релевантный кусок кода из базы эмбеддингов |
|
Serena |
83 |
Чистое тело функции (7 строк) |
|
Ripgrep |
38 |
Имя файла и номера строк |
Полный read файла ▏████████████████████████████████████████ 1476 tokcontext-mode search▏████████████ 471 tokSemble search ▏█████ 180 tokSerena find_symbol ▏██ 83 tokripgrep locate ▏█ 38 tok
4. Парадокс оверхеда: почему экономия уходит в минус
Главный подводный камень ИИ-проксирования — налог на схемы инструментов.
Замеры общего расхода токенов за стандартную сессию ИИ-агента (решение 1 средней задачи):
-
Чистая база (Serena + Semble + rg): 12 323 токена.
-
База + rtk (через CLI): 16 406 токенов.
-
База + rtk + context-mode (как MCP): 35 737 токенов ❌.
none (чистая база) 12 323 ████████████integrated (rtk + хуки) 16 406 ████████████████+ rtk only 25 649 █████████████████████████+ context-mode MCP 34 199 ██████████████████████████████████Оба вместе 35 737 ████████████████████████████████████
Подключение context-mode в качестве активного MCP-сервера добавляет ~7.4k токенов схем на каждом старте сессии.
Если ваша задача решается за 2-3 шага, стартовый оверхед гарантированно перекроет всю экономию от сжатия. Экономия токенов через прокси — это инвестиция с высоким порогом входа: она окупается только на длинных дистанциях (от 10-15 шагов агента).
5. Итоговый вывод: как собрать идеальный стек
Скрещивать rtk + context-mode + Semble + ripgrep + Serena в один мега-стек — это худшее, что вы можете сделать. Вы получите монстра Франкенштейна, который:
-
Сожрет до 15–20k токенов на старте сессии только на системные промпты и JSON-схемы MCP-инструментов.
-
Запутает агента. Имея 5 разных поисковиков, модель начинает метаться между ними, совершая лишние «пристрелочные» вызовы и тратя ваши деньги.
Вместо этого соберите один из трех прагматичных стеков под вашу задачу:
Сценарий А: «Точечный скальпель» (Semble + Serena + ripgrep)
-
Для чего: Сложные проекты с ООП, жесткой типизацией и активной кодогенерацией (TS/JS, Python, Go, Java).
-
Почему это работает:
Sembleищет по смыслу (векторный поиск),ripgrepмгновенно дает точные координаты строк, аSerenaчерез LSP вытаскивает чистые сигнатуры и тела функций. Оверхед минимальный, точность ювелирная.context-modeздесь абсолютно лишний — он дублирует поиск и забивает контекст.
Сценарий Б: «Легкий вездеход» (context-mode CLI + ripgrep)
-
Для чего: Проекты без строгой типизации, монорепозитории с кучей Markdown-документации, JSON/YAML-конфиги или языки без качественной поддержки LSP (где
Serenaбесполезна). -
Почему это работает: Нет тяжелых LSP-серверов и оверхеда на генерацию эмбеддингов.
context-mode(строго в CLI-режиме, без MCP-схем!) нарезает файлы на сниппеты, аripgrepнаходит координаты. Быстро, просто, дешево.
Сценарий В: Дополнение «Git-фильтр» (rtk)
-
Для чего: Длинные сессии отладки (от 10+ шагов), где агент постоянно анализирует историю коммитов.
-
Правило настройки: Подключайте
rtkк любому стеку, но строго для фильтрации git-команд (git diff,git log,git status). Обязательно исключите из его области видимости чтение файлов и менеджеры пакетов (npm, pip). -
Фикс для Windows: Чтобы rtk не ломал стандартные unix-команды в PowerShell, пропишите утилиты Git в конец пользовательского PATH:
$p = [Environment]::GetEnvironmentVariable("Path","User")[Environment]::SetEnvironmentVariable("Path","$p;C:\\Program Files\\Git\\usr\\bin","User")
Главный вердикт: Один тип поиска на одну сессию. Либо семантический векторный (Semble), либо текстовый индекс сниппетов (context-mode). Сочетание обоих чистый оверхед, карго-культ и неоправданные траты.
А как вы экономите контекст при работе с ИИ-агентами? Какой стек у вас полетел в продакшене, а какой оказался оверхедом? Жду ваших мнений и кейсов в комментариях.
ссылка на оригинал статьи https://habr.com/ru/articles/1043774/