Read in:
Русский

Экономия токенов: замер на этом сайте

Коротко: прочитать одну нужную секцию заметки дешевле, чем вывалить её целиком, — на этих вопросах по медиане в 15 раз. Числа ниже сняты с живого сервера этого сайта — это MCP, интерфейс, через который ИИ-агент читает документацию. Внизу страницы есть короткий скрипт без зависимостей: скопируй, запусти, получи свою таблицу.

Что сравнивали

Агент задаёт вопрос и получает ответ из базы знаний. Прочитать его можно двумя способами — мы замерили оба:

  • Вся заметка — антипример. Агент находит заметку и грузит её целиком по идентификатору: note_html(pid). Платит за весь текст, даже если ответ — один абзац.
  • Нужная секция — как надо. Результат поиска уже несёт toc_path — указатель прямо на нужный заголовок. Агент читает только эту секцию: note_html(pid, toc_path=[...]).

Маршрут короткий: searchnote_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-сервер — все методы и доступ