Русский
Экономия токенов: замер на этом сайте
Коротко: прочитать одну нужную секцию заметки дешевле, чем вывалить её целиком, — на этих вопросах по медиане в 15 раз. Числа ниже сняты с живого сервера этого сайта — это MCP, интерфейс, через который ИИ-агент читает документацию. Внизу страницы есть короткий скрипт без зависимостей: скопируй, запусти, получи свою таблицу.
Что сравнивали
Агент задаёт вопрос и получает ответ из базы знаний. Прочитать его можно двумя способами — мы замерили оба:
- Вся заметка — антипример. Агент находит заметку и грузит её целиком по идентификатору:
note_html(pid). Платит за весь текст, даже если ответ — один абзац. - Нужная секция — как надо. Результат поиска уже несёт
toc_path— указатель прямо на нужный заголовок. Агент читает только эту секцию:note_html(pid, toc_path=[...]).
Маршрут короткий: search → note_html(toc_path). Обходить дерево заголовков не нужно — указатель из совпадения ведёт сразу в цель. Когда хочется сперва осмотреть структуру, между ними встаёт expand, но для замера это лишний шаг.
Вопросы. Восемь настоящих запросов к этой документации — про вебхуки, публикацию в Telegram, свой домен, мультиязычность, синхронизацию, шаблоны, подписки и лимиты Telegram. Не подобранные под красивый результат, а те, что реально задают.
Токены. Считаем простым прозрачным способом — слова плюс знаки препинания (\w+|[^\w\s]). Это не тот счётчик, что внутри Claude, поэтому абсолютные числа приблизительны. Но оба способа меряются одной линейкой, поэтому отношение — во сколько раз дешевле — честное.
Результаты
| Вопрос | Вся заметка | Нужная секция | Экономия |
|---|---|---|---|
| шаблоны | 7668 | 206 | 37.2× |
| свой домен | 2698 | 155 | 17.4× |
| публикация в Telegram | 3108 | 201 | 15.5× |
| двусторонняя синхронизация | 2529 | 163 | 15.5× |
| вебхуки | 4654 | 302 | 15.4× |
| мультиязычность | 2234 | 185 | 12.1× |
| лимиты Telegram | 3108 | 277 | 11.2× |
| подписки | 920 | 248 | 3.7× |
Медиана — 15.4×. Выигрыш растёт с размером заметки. Длинные заметки экономят больше всего: страница про шаблоны — 7668 токенов целиком против 206 в нужной секции, это 37×. Короткие экономят меньше: заметка про подписки и так на 920 токенов, тут всего 4×. Логика простая — чем толще заметка, тем больше текста ты пропускаешь.
Важная оговорка про базу сравнения. 15× — это против наивного дампа всей заметки, а не против тонко настроенного RAG. Если у агента уже хороший chunk-retrieval, разрыв меньше. Мы меряем то, что делает агент без подсказок: нашёл заметку — прочитал целиком.
Числа живые — их снимают с текущего хранилища заметок, поэтому со временем плывут: документация растёт, заметки толстеют, отдельные строки в таблице меняются. График выше — снимок от 22 июня 2026. Медиана около 15× держится.
А почему не grep по файлам?
Резонный вопрос: зачем вообще MCP, если по заметкам можно искать обычным grep? Мы замерили и это — отдельный ИИ-агент искал ответ grep'ом по локальным .md и читал найденные файлы.
Те же 8 вопросов, тот же счёт токенов. Вышло так:
| Способ | Токенов на ответ | Вызовов тулов |
|---|---|---|
| MCP, нужная секция | ~200 | 2 |
| MCP, вся заметка | ~2 700 | 2 |
| grep по файлам + чтение | ~4 600 | 3 |
Grep по файлам — в 23 раза дороже нужной секции и даже в 1.7 раза дороже, чем тянуть через MCP всю заметку. Причём дело не в числе запросов: их почти поровну, 3 против 2. Дело в объёме. grep находит файлы, но не границы секций, поэтому агент читает файл целиком — одна заметка dev/obsidian_sync.md весит 6 144 токена. Каждый вызов MCP возвращает ответ; каждый grep возвращает список файлов, которые ещё надо вычитать.
Честно про сам замер: это наивный grep, который читает файлы целиком, один прогон, локальный репозиторий с дублями en+ru — не лабораторная чистота. Умелый человек сузил бы: grep -n, потом прочитать нужные строки, а не весь файл — и разрыв упал бы. Мы и не говорим «grep плохой».
Важно, кто платит. Тебе grep по локальным заметкам быстр и не требует настройки. Но агент платит за каждый токен — и 23× превращаются в деньги и замусоренный контекст. А когда база большая, общая или удалённая, grep до неё просто не дотянется: там MCP не альтернатива, а единственный путь. Подробнее — expand.
Лёгкая половина и трудная
Сэкономить токены — лёгкая половина, она почти очевидна: читай меньше — платишь меньше. Трудная и интересная половина — попасть точно в нужную секцию.
Наугад секцию не угадать: совпадение по строке часто лежит не там, где живёт ответ. Поэтому в trip2g у каждого фрагмента в индексе есть цепочка заголовков — она и служит точным toc_path. Поиск возвращает не «где-то здесь», а конкретный путь в дереве.
Насколько точно? Проверили: из шести вопросов, где есть что сверять, фокус-секция содержала размеченные термы ответа в четырёх. Два промаха — это подсвеченное служебное слово («set» из «set up») и случай, где указатель сел на соседнюю секцию. Ответ не терялся, но это и есть трудная половина: попасть ровно в нужную секцию, а не рядом.
Как устроен этот указатель — в Fuzzy Pointer. Как осмотреть структуру заметки и спуститься вглубь вручную — в expand. Зачем вообще тянуть кусок, а не файл целиком, — в Token Economy.
Проверь сам
Не нужно клонировать репозиторий и искать какой-то скрипт. Скопируй блок ниже в файл te_check.py — нужен только Python 3 и интернет, никаких pip install:
#!/usr/bin/env python3
# Token-economy check: focused section vs whole note, against a live trip2g MCP endpoint.
# Pure Python 3 standard library — no pip install. Run: python3 te_check.py
import json, re, statistics, urllib.request
ENDPOINT = "https://trip2g.com/_system/mcp" # point this at any trip2g instance
QUERIES = [
"what templates are available",
"how do webhooks work",
"how do i publish a post to telegram",
"telegram post types and limits",
"set up a custom domain for my site",
"two way sync between obsidian and the site",
"how to use multiple languages on my site",
"accept paid subscriptions and monetization",
]
TOK = re.compile(r"\w+|[^\w\s]", re.UNICODE)
def tokens(text): # rough, tokenizer-independent — same count for both arms
return len(TOK.findall(text or ""))
def mcp(name, args): # one MCP tool call over JSON-RPC 2.0
body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": name, "arguments": args}}).encode()
req = urllib.request.Request(ENDPOINT, data=body,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(req, timeout=30) as r:
return json.loads(r.read())["result"]
def note_html(res):
content = res.get("content") or []
return content[0]["text"] if content else ""
ratios = []
print(f"{'question':42}{'whole':>7}{'section':>9}{'saved':>8}")
for q in QUERIES:
results = (mcp("search", {"query": q}).get("structuredContent") or {}).get("results") or []
if not results:
print(f"{q[:42]:42} (no match)"); continue
top = results[0]
pid = top["note_id"]
toc_path = (top.get("matches") or [{}])[0].get("toc_path") # search points straight at the section
whole = tokens(note_html(mcp("note_html", {"pid": pid})))
section = tokens(note_html(mcp("note_html", {"pid": pid, "toc_path": toc_path}))) if toc_path else whole
ratios.append(whole / section)
print(f"{q[:42]:42}{whole:7d}{section:9d}{whole / section:7.1f}x")
print(f"\nmedian: {statistics.median(ratios):.1f}x (whole note / focused section)")
Запуск:
python3 te_check.py
Что увидишь — таблицу с английскими заголовками whole, section, saved — вся заметка, секция и экономия, плюс медиану в конце:
question whole section saved
what templates are available 7668 206 37.2x
how do webhooks work 4654 302 15.4x
...
median: 15.4x (whole note / focused section)
Если все строки печатают (no match) или скрипт падает с сетевой ошибкой — проверь, что ENDPOINT открывается в браузере и не просит вход.
Свой инстанс — поменяй ENDPOINT на адрес своего MCP-сервера. Свои вопросы — отредактируй список QUERIES.
Этот скрипт меряет только экономию токенов. Полная версия дополнительно проверяет, что нужная секция и правда содержит ответ, и умеет ходить по дереву заголовков через expand — она в репозитории: scripts/expand_check.py.
Связанное
- Token Economy — зачем тянуть секцию, а не файл целиком
- Fuzzy Pointer — как поиск находит точный
toc_path - expand — послойная навигация по оглавлению
- MCP-сервер — все методы и доступ