Article

Excel в LLM — это $2 за вопрос. Postgres + MD-схема — $0.01

Почему Claude хреново работает с большими Excel-файлами и почему правильный путь — Postgres + описание схемы в Markdown, а потом SQL-запросы.

AIData EngineeringPostgres16 мин
Мадияр Хамзанов
Мадияр Хамзанов
9 мая 2026
TL;DR

Я кинул в Claude Excel на 500 000 строк и сжёг $2.40 за один вопрос. Потом залил то же самое в Postgres, описал схему в одном Markdown-файле и теперь те же вопросы стоят $0.01 — в 240 раз дешевле и точнее. Причина не в магии: большой Excel забивает context window моделей миллионами числовых токенов, attention рассеивается, и модель буквально «теряет данные посередине» — об этом стэнфордское исследование Lost in the Middle. Правильный путь: нормализованная БД + schema.md + Text-to-SQL. Ниже — расчёты в токенах, BIRD-bench accuracy, две большие схемы для сравнения и рабочий пример с AmoCRM.

800k
токенов на 500k строк
забивает 80% контекста Sonnet 1M
$2.40
за один вопрос к Excel
при $3/1M input токенов
3k
токенов schema.md
одна загрузка → много вопросов
240×
экономия при SQL-подходе
$2.40 → $0.01 за вопрос

1. Сколько токенов жрёт Excel

Когда я говорю «Excel в Claude» — на практике речь о CSV или JSON-сериализации листа: Claude не парсит бинарный .xlsx напрямую, файл сначала превращается в текст. И вот тут начинается математика. По токенайзеру одна типовая ячейка с числом или строкой — это ~2-4 токена, плюс разделители (запятая или табуляция — по 1 токену каждый). У tiktoken и Anthropic counting API цифры близкие.

Берём типовую CRM-выгрузку: 20 колонок, 4 токена на ячейку в среднем, плюс 20 запятых между ячейками. Получается ~100 токенов на строку. Дальше арифметика:

Размер выгрузкиТокенов в Claude% от 200k% от 1M
10 000 строк~1.0M100%+ (не влезет)
100 000 строк~10Mне влезетне влезет
500 000 строк (типовой Excel экспорт CRM)~50Mне влезетне влезет
Если ужать (только цифры, без шапки)~2 токена/ячейка → 40% экономиивсё равно за лимитом на 1M

Важно: даже если технически файл «помещается», это не значит, что модель будет давать качественные ответы. По Lost in the Middle и Needle-in-a-Haystack тестам, точность падает в середине длинного контекста на 20-40 процентных пунктов. Окно — это технический потолок, но не гарантия качества.

По официальным тарифам Anthropic: Claude Sonnet — $3 за 1M input-токенов и $15 за 1M output. То есть один вопрос с прицепленным Excel в 800 тысяч токенов стоит $2.40 только на input. Следующий вопрос — снова $2.40, потому что у LLM нет «состояния» между сессиями: весь файл нужно перезагрузить.

2. Сценарий 1: Excel в Claude напрямую

Вот как выглядит «плохой путь» — та конфигурация, в которой я сам сидел до того, как сообразил, что делаю. Поток данных — слева направо, токен-метр заполняется почти полностью, деньги горят:

Антипаттерн: Excel напрямую
Excel
500k строк
~50 МБ CSV
Сериализация
~800k токенов
CSV → текст
Claude
контекст забит
lost-in-middle
Токен-метр (Sonnet 1M context)
800 000 / 1 000 000 (80%)
ПЕРЕГРЕВ
Цена 1 вопроса
$2.40
каждый вопрос — заново
Качество
↓ 20-40%
lost-in-middle, галлюцинации
Повторяемость
Нет
нельзя сохранить SQL

3. Lost in the Middle: атака на качество

Допустим, вы оптимист и используете Claude Sonnet 4.6 с полным 1M контекстом. Excel влез — ура. Но вот незадача: исследование Lost in the Middle (Liu et al., TACL 2024) показало, что у LLM есть U-образная кривая внимания: они запоминают начало и конец промпта, но проседают по точности на информации, расположенной в середине. Это особенно болезненно для табличных данных, где «нужная строка» с равной вероятностью может оказаться где угодно.

Точность ответа vs позиция данных в контексте (Liu et al., 2024)

Источник: arXiv:2307.03172 — multi-document QA на GPT-3.5 / Claude / LongChat. Падение точности до 53% при размещении ответа в центре против 76% на краях.

То же самое в более свежих работах: RULER (NVIDIA, 2024) и LongICLBench подтверждают: эффективная длина контекста, на которой модель реально работает на полную силу, обычно сильно меньше формального окна. Anthropic и сама признаёт это в блоге про prompting на длинном контексте — там прямым текстом: «помещайте ключевую информацию в начало или конец промпта».

У меня было реально: попросил Claude посчитать средний чек по Q1 в выгрузке на 400k строк. Он назвал цифру, которая отличалась от настоящей на 18%. Я не сразу заметил — в этом и проблема. LLM не говорит «я не уверен», он уверенно даёт хреновый ответ.
Автор

4. Сценарий 2: Postgres + MD-схема + SQL

Тот же набор данных, но теперь правильно. Сырые таблицы в Postgres (или ClickHouse — кому что нравится), рядом — Markdown-файл с описанием. Claude Code через Postgres MCP сервер читает schema, генерирует SQL, исполняет, получает агрегат — 12 строк вместо миллиона:

Правильный путь: Postgres + MCP
schema.md
~3k токенов
DDL + бизнес-смысл
Claude
генерит SQL
SELECT ... GROUP BY
Postgres
исполняет
возвращает 12 строк
Токен-метр (Sonnet 1M context)
~3 000 / 1 000 000 (0.3%)
Цена 1 вопроса
$0.01
×240 дешевле, чем Excel
Качество
↑ детерм.
SQL — чистая математика
Повторяемость
100%
сохрани SQL → ставь в cron

Ключевой инсайт: LLM в этой схеме — не «движок аналитики», а транслятор человеческого языка в SQL. Тяжёлую работу по агрегации делает Postgres — и делает её в миллион раз быстрее и дешевле, чем токенизированная нейросеть.

5. Пример: AmoCRM в 4 таблицах

Покажу на конкретике. Берём AmoCRM API — там есть стандартные сущности: сделки (deals), лиды (leads), контакты (contacts), активности (activities). Я выгружаю их регулярно и складываю в Postgres вот такой нормализованной схемой:

schema.sql — DDL для 4 таблиц
CREATE TABLE contacts (
  id            BIGINT PRIMARY KEY,
  name          TEXT NOT NULL,
  phone         TEXT,
  email         TEXT,
  created_at    TIMESTAMPTZ NOT NULL,
  responsible_user_id BIGINT
);

CREATE TABLE leads (
  id            BIGINT PRIMARY KEY,
  contact_id    BIGINT REFERENCES contacts(id),
  source        TEXT,           -- utm_source / канал
  status_id     INT NOT NULL,   -- этап воронки
  created_at    TIMESTAMPTZ NOT NULL
);

CREATE TABLE deals (
  id            BIGINT PRIMARY KEY,
  lead_id       BIGINT REFERENCES leads(id),
  amount        NUMERIC(12,2) NOT NULL,  -- сумма сделки в KZT
  pipeline_id   INT NOT NULL,
  status_id     INT NOT NULL,            -- 142 = выиграна, 143 = слита
  responsible_user_id BIGINT,
  closed_at     TIMESTAMPTZ
);

CREATE TABLE activities (
  id            BIGINT PRIMARY KEY,
  entity_type   TEXT,           -- 'lead' | 'deal' | 'contact'
  entity_id     BIGINT,
  type          TEXT,           -- 'call' | 'task' | 'note'
  created_at    TIMESTAMPTZ NOT NULL,
  user_id       BIGINT
);

А вот schema.md — то, что Claude видит в начале каждой сессии. Это не просто DDL: это бизнес-описание. Подход известен как dbt-style documentation и semantic layer:

schema.md — описание для LLM (~3000 токенов)
# AmoCRM Schema

## deals — сделки
- amount — сумма сделки в KZT (тенге)
- status_id — 142 = выиграна, 143 = слита,
  остальное = в работе
- pipeline_id — id воронки продаж
- closed_at — дата закрытия (NULL для открытых)

## leads — лиды (заявки до оформления сделки)
- source — utm_source / название канала
  (instagram, google_ads, organic, ...)
- status_id — этап в воронке лидов

## Типичные join'ы
- deals.lead_id → leads.id
- leads.contact_id → contacts.id
- activities.entity_id → deals.id
  (когда entity_type='deal')

## Бизнес-правила
- "выигранная сделка" = deals.status_id = 142
- "конверсия" = COUNT(won)/COUNT(*) на leads
- "средний чек" = AVG(amount) WHERE status=142
- "Q1 2026" = closed_at >= '2026-01-01'
                AND closed_at < '2026-04-01'

## Примеры запросов
1) Средний чек по менеджеру за Q1:
   SELECT responsible_user_id, AVG(amount)
   FROM deals
   WHERE status_id = 142
     AND closed_at >= '2026-01-01'
     AND closed_at < '2026-04-01'
   GROUP BY responsible_user_id;

Теперь представим, что я задаю вопрос: «Какая средняя сумма выигранной сделки в Q1 2026 у менеджера с id = 7382?» Вот что генерит Claude — буквально один SELECT, который выполнится за миллисекунды:

Сгенерированный SQL (~30 токенов)
SELECT
  AVG(amount)        AS avg_deal,
  COUNT(*)           AS deals_count,
  SUM(amount)        AS total_revenue
FROM deals
WHERE status_id = 142
  AND responsible_user_id = 7382
  AND closed_at >= '2026-01-01'
  AND closed_at <  '2026-04-01';

Postgres возвращает одну строку: avg_deal = 1 240 000 KZT, deals_count = 47, total_revenue = 58 280 000. Claude интерпретирует это человеческим языком — и контекст почти не расходуется. На следующий вопрос («а у менеджера 7383?») schema.md уже в кэше промпта (Anthropic поддерживает prompt caching), и стоимость падает ещё в 10 раз.

6. Точность Text-to-SQL в 2025-2026

Главный вопрос скептика: «А LLM-то правильный SQL пишет?». На это есть индустриальные бенчмарки. BIRD-bench — сейчас стандарт-де-факто. Это 12 751 вопрос на 95 базах данных из 37 предметных областей, метрика — execution accuracy (выполнили SQL → совпал результат с эталонным). Аналог попроще — Spider от Yale.

BIRD-bench execution accuracy (2025)

Источники: BIRD leaderboard, CHASE-SQL paper, разбор top systems.

Подход с пайплайнами вокруг LLM (DIN-SQL, DAIL-SQL, CHASE-SQL) даёт 73-82% точности — близко к человеческому baseline 92.96%. На простом Spider топовые модели уверенно держат 85-90%+. Это рабочая зона: для ad-hoc аналитики такая точность сильно лучше, чем «LLM смотрит в Excel и выдумывает цифры». Тем более что SQL — проверяемый: можно прочитать, прогнать на тестовом датасете, сохранить, повторить.

Учтите оговорку: исследование 2026 показало, что в самом BIRD ~32% разметки имеют ошибки, поэтому «реальная» точность топовых систем на чистых данных может быть ещё выше. Но даже консервативные 73% — это десятки запросов, которые LLM пишет идеально, плюс ещё четверть, которую можно поправить self-correction loop'ом.

7. Excel vs Postgres: сводная таблица

Сводная картина по семи метрикам, которые на практике действительно решают:

МетрикаExcel в ClaudePostgres + schema.md
Токенов на 500k строк~800 000~3 000 (только schema)
Цена 1 вопроса (Sonnet $3/1M)$2.40$0.01
Цена 100 вопросов$240$0.50 (с prompt caching)
Скорость ответа20-60 сек (TTFT растёт с контекстом)1-3 сек
Точность на агрегатахгаллюцинации, lost-in-middleдетерминированно (SQL)
Повторяемостьнет — каждый раз заново100% — сохрани SQL в cron
Аудит/проверканельзя проверитьSQL = читаемый код
Масштабируемостьпотолок ~1M строксотни миллионов строк

8. Графики: токены и деньги

Визуально: при Excel-подходе токены растут линейно по числу строк и быстро упираются в потолок контекстного окна. При SQL-подходе — линия плоская, потому что LLM видит только schema.md, а не сами данные.

Токены в промпте vs размер выгрузки (тыс. токенов)
Стоимость 1 вопроса в долларах (Sonnet $3 / 1M input)

Расчёт по Anthropic API pricing на май 2026.

за вопрос
Экономия на токенах
266×
800k → 3k токенов на промпт
−$2.39
Снижение цены
99.6%
$2.40 → $0.01 за один ответ
BIRD bench
Точность
73-82%
execution accuracy на real-world DB

9. Как это сделать у себя

Никакого космоса не нужно. Шаги конкретные:

  1. 1Развернуть Postgres. Самый дешёвый путь — Hetzner CAX21 с Coolify (€6.49/мес). Подробно расписал в статье Railway vs Hetzner. Альтернатива «бесплатно для старта» — Supabase Free Tier (managed Postgres, 500 MB) или Neon Free.
  2. 2Загрузить данные. Из Excel — через COPY FROM CSV, из API — через простой Python скрипт с psycopg или DuckDB → Postgres. Если данных совсем много — Airbyte или Fivetran автоматизируют выгрузку из CRM.
  3. 3Описать схему в schema.md. Не ленитесь добавить бизнес-смысл к каждой колонке: «status_id 142 = выиграна» — это то, чего нет в DDL, но критично для модели. Подход хорошо описан у Саймона Уиллисона и в посте MotherDuck про semantic layer.
  4. 4Подключить Postgres MCP к Claude Code. Anthropic поддерживает Model Context Protocol — открытый стандарт для подключения внешних систем. Готовые серверы: modelcontextprotocol/servers, Supabase MCP, pgEdge Postgres MCP. Прописываете в .mcp.json — и Claude Code умеет ходить в БД.
  5. 5Безопасность. Дайте MCP-серверу read-only учётку (CREATE ROLE ... WITH LOGIN; GRANT SELECT ON ALL TABLES). Это защитит от случаев SQL-инъекций через MCP — Datadog Security Labs описывал такой кейс. Если совсем параноик — подключайте через PgBouncer + ограничения по IP.
  6. 6Если вы новичок в дев-сетапе — у меня есть отдельный гайд: Dev Setup Guide для новичков — там про terminal, git, Docker, Postgres локально, всё с нуля.

Если данных очень много (десятки миллионов строк) и нужна агрегация на лету — берите ClickHouse вместо Postgres. Пишут SQL-диалект очень похожий, скорость — на порядок выше. Я об этом рассказывал в статье Data-to-Text без LLM — там я гоняю 50k отчётов прямо в ClickHouse SQL за 30 секунд.

10. Главный вывод

LLM — это переводчик с русского на SQL, а не аналитический движок. Когда вы суёте Excel в Claude напрямую, вы платите токенами за работу, которую Postgres делает бесплатно и в миллион раз быстрее. Когда вы даёте Claude schema.md — вы используете его по назначению: модель пишет запрос, БД считает, модель интерпретирует результат. Контекст почти не расходуется. Чек уменьшается в сотни раз. Точность — растёт, потому что вычисление детерминированное.

Главное правило по итогам всего, что я понял за последний год работы с агентами:

Bottom line

Сначала хранилище, потом долбить SQL-ками.

Excel — это инструмент для просмотра, а не для скармливания нейросети. Если данных больше пары тысяч строк — поднимайте Postgres, описывайте схему в Markdown, подключайте MCP. Это занимает один вечер, экономит сотни долларов в месяц и открывает совершенно другой уровень работы с данными — где LLM становится младшим аналитиком, а не золотым калькулятором.

И да: если у вас CRM на AmoCRM, Bitrix24 или Salesforce — у них всех есть API. Один Python-скрипт на 50 строк превращает их в нормализованные таблицы. Дальше всё, что описано выше — уже работает.