Сегодня расскажу, как научил сервис генерировать PDF-файлы, перенёс "мозги" с GPT-4.1-mini на GPT-5.1 с web search, добавил методику анализа в системный промпт, разобрался с Structured Model Output и собрал JSON-схему.

Теперь модель возвращает структурированный ответ, стабильно верстается HTML+jinja шаблон, и собирается PDF-документ.

Для примера проверил статью с Хабра про недоступность Roblox — получилось, на мой взгляд, неплохо для первой итерации (под спойлером).

Скрытый текст

Напомню суть эксперимента: все решения придумывает ChatGPT (Plus), а я лишь описываю логику работы, следую инструкциям и копирую-вставляю (код и логи ошибок для отладки).

Прошлый этап закончился так: удалось подружить бота с OpenAI, отправлять туда по API запросы, принимать ответы, показывать эти ответы юзеру бота. Все детали — в предыдущих статьях.

Генератор PDF

Сначала ChatGPT предложил связку xhtml2pdf и reportlab, но они не захотели дружить друг с другом, приложение не собиралось. Потом появилось решение с WeasyPrint, который умеет в CSS, страницы, таблицы, шрифты и т.д.

Получилось с третьей попытки из таких запчастей:

Новые "мозги"

Для экономии времени и денег бот был подключен к модели GPT-4.1-mini, которая не умеет "думать", ходить в интернет и отвечает на основе "знаний", ограниченных 1 июня 2024. Из-за этого даже на простые вопросы модель давала неправильные ответы, например, утверждала, что Джо Байден — действующий президент США.

ChatGPT подсказал решение: перейти на более "умную" модель, использовать Responses API и включить web search, скриншот из документации OpenAI:

Апдейт накатился с первого раза, и бот обзавёлся новыми мозгами в виде флагманской модели GPT-5.1, которой умеет ходить в интернет.

Системный промпт

Мозги мозгами, но ими ещё и пользоваться надо. Для этого отправляем модели системный промпт — инструкции и правила, которые она учитывает при обработке каждого пользовательского запроса:

Запрос Юзера + Системный Промпт = Полный Промпт

Загрузил в ChatGPT документ с методикой анализа и попросил собрать системный промпт, получились такие запчасти: metholodgy.md (подробная методика), rules.md (стиль и подача информации) и system_prompt.txt (структура ответа).

Не стал разбираться с разными форматами файлов (в каждом — текст, зачем разный формат), потому что приложение опять собралось с первого раза и отработало весь цикл: запрос, короткий ответ в боте, генерация PDF.

Видно, когда появился системный мега-промпт
Видно, когда появился системный мега-промпт

Для справки: за несколько дней тестов на старой модели ушло 3k токенов, а за 1 день на GPT-5.1 сгорело почти 600k токенов. Системный промпт и web search увеличили затраты примерно в 200 раз при сопоставимом количестве запросов.

Всё хорошо, только вот модель каждый раз отвечала творчески — это большая проблема, потому что такой ответ нереально стабильно разбирать на части для верстки отчета.

JSON-схема

Проблема решилась за счёт использования Structured Model Output, подход подробно описан в документации OpenAI. В частности в модель можно отправить JSON-схему, в соответствии с которой она и вернёт ответ — это мне и нужно.

Получилось вот так:

Полная схема ~350 строк
Полная схема ~350 строк

Шаблон отчёта

Честно говоря, не ожидал, что с шаблоном будет столько проблем: сначала сервис вообще не собирался, потом вылезли проблемы с генерацией PDF, потом в PDF плыла верстка, потому что WeasyPrint не умеет в динамику.

Примерно через 4 часа танцев с бубном ChatGPT предложил финальный фикс, и бот стал генерировать PDF на базе jinja+HTML шаблона:

Демка

Технически всё работает как надо: бот корректно классифицирует входящий запрос (текст, ссылка, пересланное сообщение), отправляет на анализ в GPT-5.1, мозги шевелятся, ответ приходит в JSON, корректно верстается HTML и собирается PDF-отчёт.

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

Бота можно найти в телеграме по названию (Фактометр) или юзернейму (FaktometrBot). Потыкайте, если интересно.

Дальнейшие планы

В импровизированном бэклоге: подключение платежей, тарифы, биллинг, бонусная система, и партнерская программа.

Спасибо всем, кто проявил любопытство:

Комментарии (0)