Что делает языковая модель в проекте, для каких задач её позвали, как она встроена в систему и что с ней происходит сейчас. Без жаргона; технические имена вынесены мелким шрифтом для разработчика.
LLM в Хорике — это наёмный читатель меню. Ей показывают фотографию, страницу сайта или PDF, а она возвращает аккуратную таблицу: раздел, блюдо, цена, вес. Всё остальное — сопоставление с каталогом, цены, документы 1С, расчёт НДС — делает обычный детерминированный код. Модель ничего не «решает» за менеджера и не придумывает: если не уверена, пропускает.
Цель продукта — по меню заведения понять, какие продукты оно закупает, и предложить себя как поставщика. Значит, меню нужно превратить из «как получилось» в структуру. А меню в реальности выглядят по-разному: фотографии страниц в Яндекс.Картах, сайт на конструкторе, PDF-файл, иногда скан. Ни один набор правил не покрывает это разнообразие — каждый сайт свёрстан по-своему, на фото мелкий шрифт и разная разметка.
Языковая модель умеет то, что нужно ровно здесь: читать текст и картинки и отвечать в заданном формате. Ей не нужно объяснять, как выглядит цена на конкретном сайте. Поэтому её поставили на «входе» конвейера — там, где сырой хаос превращается в данные. Дальше по цепочке модель почти не участвует.
У каждого задания своя инструкция (промпт), своя модель и свой формат ответа. Все пять требуют ответ строго в виде JSON — так его читает программа, а не человек.
Модель получает текст страницы и список ссылок с неё и отвечает на два вопроса: «это страница с меню?» и «если нет — куда идти дальше?». Это заменило хрупкий поиск по словам «меню / прайс / каталог» в ссылках.
Из карточки заведения приходят десятки фото. Модель смотрит на них пачками по шесть и каждому ставит метку: страница меню, блюдо, интерьер или мусор — с оценкой уверенности. Дальше в работу идут только «меню».
Главное и самое дорогое задание. Из фото страницы меню, текстового блока сайта или PDF модель собирает разделы и позиции: название, описание, цена, вес. Большой текст режется на куски и читается параллельно; PDF сначала пробуют прочитать как текст, и только сканы отправляют как картинки.
Чтобы сопоставить «Борщ с говядиной» с каталогом поставщика, нужно знать, что в нём свёкла, говядина, капуста. Модель просят об этом только для блюд, которых нет в кэше: сначала смотрят готовый словарь из 126 тысяч рецептов, затем простые правила, и лишь остаток — «длинный хвост авторских блюд» — уходит в модель. Ответ кладётся в кэш навсегда.
Необязательный шаг. Когда меню извлечено, модель получает список позиций (до 150) и бриф — число гостей, бюджет, формат мероприятия — и подбирает набор с количествами плюс два предложения обоснования. Менеджер видит это как кнопку «AI-черновик» в редакторе КП или как автоматически созданный черновик после разбора сайта. Дальше всё правится руками.
Логика простая: там, где ответ можно вычислить, модель не нужна — она дороже, медленнее и менее предсказуема.
Один диспетчер, три провода. Все пять заданий идут через одну точку входа. Она смотрит на настройку «транспорт» и решает, по какому каналу отправить запрос. Каналы взаимозаменяемы, переключаются из интерфейса без пересборки.
Официальный API Claude. Инструкция кэшируется на стороне провайдера — повторные вызовы с тем же промптом стоят в разы дешевле. Нужен собственный ключ.
Запускает claude -p как программу на машине разработчика. Работает по подписке, без ключа и без затрат по счётчику. Медленно: запросы идут по очереди.
Посредник: один ключ на много моделей разных вендоров. Быстрый, параллельный, можно дешёвую модель на сортировку и сильную на извлечение. Так настроен стенд, запросы идут через прокси.
Модели оплачиваются по объёму текста и картинок: отдельно за то, что ей отправили, и отдельно за то, что она написала в ответ. Фотографии дороже текста. Поэтому весь механизм экономии — отправлять меньше и выбирать модель по задаче.
Учёт. После каждого вызова система считает его стоимость по таблице цен и накапливает на заведении. Итог виден в карточке задачи и в поле заведения. Потолок. Перед каждым дорогим шагом проверяется, не исчерпан ли лимит на это заведение; если да — шаг пропускается с пометкой «бюджет исчерпан», а обход сайта останавливается посередине. Целевая цифра из реестра требований — около доллара на сайт, и такой лимит теперь выставлен на стенде.
Сколько выходит на практике. Разбор заведения с одной страницей меню обошёлся в три копейки, с меню на двенадцати фотографиях — в тридцать три. Сортировка десяти фотографий стоит примерно полторы копейки. То есть в целевой доллар на заведение система укладывается с большим запасом.
| Задание | Через OpenRouter (стенд) | Напрямую в Anthropic | Почему так |
|---|---|---|---|
| Провести по сайту | gemini-2.5-flash | claude-haiku-4-5 | Много вызовов, ответ простой — нужна дешёвая и быстрая. |
| Отсортировать фото | gemini-2.5-flash | claude-haiku-4-5 | Четыре метки, картинок много — дешёвая с поддержкой изображений. |
| Вытащить позиции | claude-sonnet-4 | claude-sonnet-4-6 | Мелкий шрифт, цены, веса — нужна сильная, ошибки дорого обходятся. |
| Разложить блюдо | gemini-2.5-flash | claude-haiku-4-5 | Короткие списки продуктов, кэшируется навсегда. |
| Черновик КП | claude-sonnet-4 | claude-sonnet-4-6 | Осмысленный подбор набора — дороже, но вызов редкий. |
| Модель | Отправлено, $ | Получено, $ | Роль |
|---|---|---|---|
| gemini-2.5-flash | 0.30 | 2.50 | Дешёвая рабочая лошадка на стенде |
| claude-haiku | 1 | 5 | Дешёвая при прямом подключении |
| claude-sonnet | 3 | 15 | Сильная, для извлечения и КП |
| claude-opus | 5 | 25 | Не используется |
Повторное чтение закэшированной инструкции считается по 0,1 от цены, запись в кэш — по 1,25. Неизвестная модель для осторожности считается по цене Sonnet.
Причин отказа было две, одна маскировала другую. Сервис не пускает российские адреса, и он же отвечал 403, когда у ключа кончились деньги. Запросы пущены через прокси, взят рабочий ключ из соседнего проекта. Проверено на живых меню: сортировка фото и извлечение позиций работают.
Что пришлось починить по дороге. Прокси оказался капризным на установке соединения: первая попытка зависала на две минуты, а немедленный повтор проходил за секунду. Из-за этого картинки не доходили, хотя текст доходил. Добавлены короткое ожидание подключения и повторы, после чего сбои прекратились. Ответы сервиса вроде «деньги кончились» при этом не повторяются: это не сбой связи, повторять бессмысленно.
Все шесть прокси, через которые система ходит по сайтам заведений, не проходят проверку связи. Браузер всегда берёт первый из них и поэтому не открывает вообще ничего, даже простейшую тестовую страницу. Без прокси тот же браузер работает: две площадки из трёх открылись нормально. Пока это не решено, конвейер начинается не с адреса сайта, а с уже собранных ранее фотографий.