Подготовка обзоров научных PDF с помощью GPT в WordPress
Задача
Редакторы Research Feed готовили обзоры научных публикаций для специалистов. Исходным материалом служил PDF статьи, а итоговый текст нужно было оформить в структуре сайта: описать предмет исследования, выборку, основные результаты и практические выводы, затем подготовить краткий анонс и данные для публикации. Ручное извлечение материала и перенос его между отдельными инструментами занимали время и разрывали редакторский процесс.
Нужен был встроенный в WordPress инструмент. На экране редактирования записи редактор выбирает PDF из медиатеки, при необходимости меняет подготовленный prompt, запускает обработку и получает результат в поле этой же записи. Система должна была готовить черновик обзора, а не публиковать медицинские выводы или ставить диагнозы: фактическая проверка по исходной статье и окончательное решение о публикации остаются за редактором.
Роль и объём
Разработал серверную интеграцию WordPress с OpenAI API и встроил её в ACF-интерфейс типа записей Research Feed. В работу вошли модальное окно выбора PDF, редактируемый шаблон задания из глобальных настроек, извлечение текста через smalot/pdfparser, контролируемая подготовка контекста, запрос к настроенной модели OpenAI, проверка ответа и заполнение поля gpt_output.
Отдельно спроектировал проверку доступа и файла, ограничения контекста, защиту от повторного запуска, безопасное хранение ключа и диагностику без содержимого статьи и ответа модели.
Ограничения
- PDF приходит из медиатеки WordPress, но один идентификатор вложения не подтверждает право на его обработку, тип файла или принадлежность к редактируемой записи.
- Научные статьи различаются по объёму и качеству текстового слоя. Скан без OCR может не содержать извлекаемого текста, а большой документ может не помещаться в контекст модели.
- Внешний API может вернуть транспортную ошибку, ограничение частоты, HTTP-ошибку, некорректный JSON или формально успешный ответ без текста.
- Повторный клик или повтор браузерного запроса не должен создавать несколько дорогостоящих обработок одного документа.
- Ответ модели нельзя считать проверенным научным материалом. Перед сохранением и публикацией редактор сверяет его с PDF и при необходимости исправляет.
- PDF, API-ключ, полный prompt и сгенерированный текст могут содержать чувствительные данные и не должны попадать в диагностический журнал.
Архитектура
Редактор → запись Research Feed в WordPress
├── PDF из медиатеки
├── Prompt из ACF Options с возможностью правки
└── Состояние: готово / обработка / ошибка / результат
│
▼
Защищённый AJAX-обработчик
├── Nonce и право редактировать конкретную запись
├── Проверка attachment ID и связи с записью
├── Тип, сигнатура, размер и путь PDF
└── Идентификатор операции против повторной отправки
│
▼
Извлечение и подготовка текста
├── smalot/pdfparser
├── Нормализация и проверка непустого текста
├── Лимит документа и бюджета контекста
└── Контролируемая обработка крупных файлов частями
│
▼
OpenAI API — настроенная модель
├── Ключ только в серверной конфигурации
├── Тайм-аут и ограниченные безопасные повторы
└── Проверка HTTP, JSON и структуры ответа
│
▼
ACF-поле gpt_output
├── Подстановка черновика в текущую форму
├── Ручная сверка и правка редактором
└── Сохранение штатным механизмом WordPress
Интеграция не создаёт отдельную систему публикации. Она сокращает путь от загруженной статьи до редактируемого черновика внутри уже существующего процесса Research Feed.
Реализация
На вкладке ChatGPT Feeding добавил модальное окно выбора одного PDF через стандартную медиатеку. Prompt заполняется значением prompt_research_feed из ACF Options, но его можно уточнить для конкретной статьи. Интерфейс показывает отсутствие файла, обработку, успех и ошибку. На время запроса кнопка отключается, а идентификатор операции не позволяет двойному клику создать параллельную обработку или запоздавшему ответу перезаписать новый результат.
AJAX-обработчик проверяет nonce и право редактировать конкретную запись Research Feed. Перед чтением файла он сверяет attachment ID, доступ пользователя и допустимую связь вложения с записью. На сервере повторно проверяются MIME-тип, расширение, сигнатура %PDF, размер и принадлежность пути каталогу загрузок WordPress. Неподходящий файл отклоняется до запуска парсера.
Текст извлекается через smalot/pdfparser, нормализуется и проверяется на минимальный полезный объём. Для PDF без текстового слоя интерфейс просит версию с распознаваемым текстом. Бюджет контекста учитывает системную инструкцию, prompt и запас под ответ.
Большой документ не обрезается молча: текст делится по страницам и абзацам, части обрабатываются в заданном бюджете, а промежуточные результаты объединяются в итоговый черновик. Число частей и общий объём ограничены. Если PDF превышает предел, редактор получает явный отказ; частичный текст не выдаётся за полный обзор.
Ключ OpenAI хранится только в серверной конфигурации. Сервер обращается к Chat Completions API с настроенной моделью, ограниченным тайм-аутом и числом попыток. С задержкой повторяются только транспортный сбой до получения ответа, HTTP 429 и временные ошибки 5xx; ошибки авторизации, запроса и контекста не повторяются.
Успех фиксируется после проверки WP_Error, HTTP-статуса, JSON, ошибки API и непустого текста ожидаемой структуры. Для ответа задан предел длины. В интерфейс возвращается стабильный код и безопасное сообщение, а не внешний текст ошибки как готовый HTML.
Полученный текст подставляется в ACF-поле gpt_output текущей формы как редактируемый черновик. Он не публикуется автоматически. Редактор сверяет тезисы, числа и формулировки с исходным PDF, исправляет результат и сохраняет запись штатной кнопкой WordPress. При сохранении повторно проверяется право на запись, а значение проходит обработку как содержимое текстового поля; ответ модели не исполняется как разметка или скрипт.
Сбои и диагностика
Ошибки разделены по этапам: выбор и проверка PDF, извлечение текста, превышение лимита, временный отказ сервиса и неподходящий ответ. После сбоя кнопка снова доступна, а файл и prompt остаются в форме для повторной попытки.
Серверный журнал содержит категорию, идентификаторы записи, вложения и запроса, длительность этапа, номер попытки, HTTP-статус и безопасный код ошибки. В него не попадают API-ключ, заголовок авторизации, текст PDF, полный prompt, тела запросов и ответов или сгенерированный обзор. Успех фиксируется как прохождение этапов, а не копией результата модели.
границы решения
Инструмент работает только в административном редакторе Research Feed и доступен пользователям, которым разрешено изменять конкретную запись. Он обрабатывает PDF из доверенного контура медиатеки после повторной серверной проверки и не принимает произвольный путь или внешний URL.
Извлечение через smalot/pdfparser рассчитано на документы с текстовым слоем. OCR, анализ изображений, таблиц как визуальных объектов и восстановление сложной вёрстки в задачу не входят. Разбиение крупного документа помогает удерживать запросы в пределах контекста, но не отменяет ручную сверку: промежуточное сжатие также может потерять существенную деталь.
Модель формирует вспомогательный редакторский черновик по предоставленному тексту. Она не ставит диагнозы, не заменяет клиническую оценку и не подтверждает достоверность выводов публикации. Автоматическая публикация исключена; ответственность за итоговый материал остаётся в редакционном процессе.
Результат
Редактор обрабатывает научную статью на том же экране, где готовит запись Research Feed: выбирает PDF, уточняет задание и получает структурированный черновик в gpt_output. Общий шаблон prompt управляется через ACF Options, а особенности конкретной публикации можно учесть перед запуском.
Интеграция ограничивает доступ и объём обработки, контролирует крупные документы, различает сбои PDF и внешнего API, не дублирует запросы и не переносит секреты или научный текст в журнал. Результат остаётся редактируемым материалом с обязательной ручной проверкой.
Стек
PHP · WordPress · ACF · AJAX · JavaScript · OpenAI API · GPT · smalot/pdfparser · PDF
Есть похожая задача?
Расскажите о текущей системе и нужных изменениях — обсудим следующий шаг.
Следующий кейс: Сбор научных публикаций и организация PDF для исследовательской команды