Это руководство объясняет, как реализовать и использовать возможности обработки PDF в плагине discourse-ai, включая как базовое извлечение текста, так и расширенную обработку с помощью LLM.
Требуемый уровень пользователя: Администратор
Краткое содержание
Плагин discourse-ai поддерживает обработку PDF для RAG (Retrieval-Augmented Generation) в двух различных режимах:
Базовое извлечение текста
Расширенная обработка с анализом LLM
Базовое извлечение текста
Этот режим предоставляет основные возможности обработки PDF:
Извлекает текстовое содержимое с использованием gem pdf-reader
Поддерживает файлы размером до 100 МБ
Работает сразу после установки плагина
Обрабатывает только текстовое содержимое (игнорирует визуальные элементы)
Расширенная обработка с улучшениями LLM
Этот режим требует специальной конфигурации и предоставляет более продвинутые возможности.
Требования:
Подписка на план Enterprise или самохостинг Discourse
Установленная в контейнере поддержка ImageMagick с Ghostscript
Включенная настройка сайта ai_rag_images_enabled (скрытая — должна быть установлена через консоль Rails)
Настроенная RAG-модель LLM на агенте или инструменте AI
Возможности:
Интерпретирует изображения, диаграммы и схемы
Предоставляет контекст из визуальных элементов
Обрабатывает PDF постранично
Сохраняет ограничение на размер файла в 100 МБ
Разрешает загрузку файлов изображений (png, jpg, jpeg) для индексации RAG через извлечение текста на основе LLM
Детали реализации
Спецификации обработки
Разрешение обработки страниц: 300 DPI
Тайм-аут конвертации изображения на страницу: 30 секунд
Автоматическая очистка временных файлов
Полная интеграция с векторными вложениями документов RAG
Рабочий процесс обработки
Загрузка и валидация PDF
Извлечение содержимого (базовый или расширенный режим)
Разбиение текста на фрагменты с настраиваемым перекрытием
Векторизация фрагментов и сохранение
Отслеживание прогресса через MessageBus
Ограничения
Обратите внимание на следующие ограничения при реализации обработки PDF:
Ограничения размера файла:
100 МБ для существующей обработки PDF
20 МБ для новых загрузок через административный интерфейс
Расширенный режим требует дополнительных системных ресурсов
Сложные макеты PDF могут интерпретироваться не идеально
Расширенная обработка значительно увеличивает время обработки
Это действительно замечательная новость. Спасибо, команда! Не терпится дождаться завершения улучшенной обработки. Это будет критически важно для подачи исследовательских статей в большие языковые модели (LLM).
Также есть ли планы разрешить выполнение RAG («чат с вашими PDF-файлами») путём загрузки PDF-файлов в личные сообщения бота ИИ или в тему/сообщение с упоминанием бота?
На моем веб-сайте (арабский форум) я провел тест на арабском языке, добавив законодательство в первом посте («тема»), а затем задал вопросы с помощью ИИ. Однако ответы оказались неточными, и я думаю, что это связано с тем, что не используется контекстная обработка (Context RAG).
Прежде всего, большое спасибо за вашу отличную работу. Мне это очень нравится.
После того как я поэкспериментировал с настройками и изменил модель ИИ на Gemini-Flash-2.0, всё заработало отлично. Вот моя ситуация:
Мы — сообщество аудиторов, бухгалтеров и налоговых консультантов, и нам нужен инструмент для обмена соответствующими законами и обсуждения их. Эти обсуждения должны быть очень полезны для посетителей, поскольку мы являемся профессионалами в своей области. Мы настроили модель ИИ на проверку и анализ законодательства, а также на ответы на наши вопросы. Удачный эксперимент привёл к выводу, что мы действительно можем обсуждать контекст, добавленный в первом сообщении, и если модель ИИ достаточно умна, она будет отвечать на наши вопросы с очень высоким качеством.
Ещё раз большое спасибо, и с нетерпением ждём поддержки PDF, так как это сделает Discourse лучшим форумным программным обеспечением.
Должно ли это быть включено через консоль? В интерфейсе я не вижу никаких опций расширенного режима.
Кроме того, при попытке загрузить этот PDF возникает ошибка. Его размер составляет 34 МБ, но максимальный размер вложений установлен на 100 МБ (и в настройках администратора, и в app.yml). Странно то, что у меня есть сжатая версия на 16 МБ, которая загружается без проблем. Но, возможно, этот более крупный PDF пока слишком сложен? В нём много изображений, уравнений и т. д.
Привет, @sam!
У меня возникли проблемы с загрузкой и индексацией PDF-файлов из-за следующей ошибки: исключение задачи: undefined method `length’ for nil.
Интересует, связана ли эта ошибка с настройками, которые мы обсуждали выше.
Интерфейс зависает на индексации 0% и не двигается дальше.
Детали исключения ниже:
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:81:in `chunk_document'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:40:in `block in execute'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:616:in `block in within_new_transaction'
activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:613:in `within_new_transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:361:in `transaction'
activerecord-7.2.2.1/lib/active_record/transactions.rb:234:in `block in transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in `with_connection'
activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in `with_connection'
activerecord-7.2.2.1/lib/active_record/transactions.rb:233:in `transaction'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:39:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'
Спасибо за это потрясающее обновление!
У меня только один вопрос: ограничение в 100 МБ применяется к каждому боту Persona AI отдельно или ко всем Персонам в совокупности?
Я новичок в Discourse AI, но уже опытный пользователь Discourse в целом.
Очень хочу попробовать это для конкретного сценария использования в виде демонстрации на данном этапе.
Я включил скрытую настройку сайта.
В SideKiq ничего не вижу. Как можно проверить, работает ли это вообще?
Я понимаю, что это функция предварительного выпуска и она ещё не готова к полноценному использованию, однако было бы здорово иметь возможность её оценить и протестировать.
Буду очень признателен за любые подсказки, советы, скриншоты или примеры от тех, кто уже пробует это.
Я получаю эту ошибку, когда прошу бота подытожить содержимое некоторых PDF-файлов на моём сайте. Я не включил расширенную обработку и использую GPT 4.1. Есть какие-нибудь идеи, что я делаю не так?
Извините, похоже, наша система столкнулась с неожиданной проблемой при попытке ответить.
Детали ошибки
{
"error": {
"message": "Сообщение помощника с 'tool_calls' должно сопровождаться сообщениями от инструментов, отвечающими на каждый 'tool_call_id'. У следующих tool_call_ids не было сообщений с ответами: call_nrDCba5mt83oavbXfPq2BtEV",
"type": "invalid_request_error",
"param": "messages.[2].role",
"code": null
}
}
Есть ли какие-либо новости по этому вопросу? Я прикрепляю PDF-файл при начале разговора с ИИ, но он, похоже, всё ещё его не распознаёт. В данный момент я использую GPT. Возможно, стоит рассмотреть использование другой модели, специально предназначенной для обработки PDF-файлов?