Сегодня расскажу, как научил сервис генерировать 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-схему, в соответствии с которой она и вернёт ответ — это мне и нужно.
Получилось вот так:

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

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

Что касается качества анализа — нужно работать дальше: дублируются утверждения, не всегда корректно работает логика обнаружения риторических приёмов и манипуляций, неглубоко анализируются и профилируются источники.
Бота можно найти в телеграме по названию (Фактометр) или юзернейму (FaktometrBot). Потыкайте, если интересно.
Дальнейшие планы
В импровизированном бэклоге: подключение платежей, тарифы, биллинг, бонусная система, и партнерская программа.
Спасибо всем, кто проявил любопытство:
