Поддержка PDF в Discourse AI (RAG)

:bookmark: Это руководство объясняет, как реализовать и использовать возможности обработки PDF в плагине discourse-ai, включая как базовое извлечение текста, так и расширенную обработку с помощью LLM.

:person_raising_hand: Требуемый уровень пользователя: Администратор

Краткое содержание

Плагин discourse-ai поддерживает обработку PDF для RAG (Retrieval-Augmented Generation) в двух различных режимах:

  1. Базовое извлечение текста
  2. Расширенная обработка с анализом LLM

Базовое извлечение текста

Этот режим предоставляет основные возможности обработки PDF:

  • Извлекает текстовое содержимое с использованием gem pdf-reader
  • Поддерживает файлы размером до 100 МБ
  • Работает сразу после установки плагина
  • Обрабатывает только текстовое содержимое (игнорирует визуальные элементы)

Расширенная обработка с улучшениями LLM

:information_source: Этот режим требует специальной конфигурации и предоставляет более продвинутые возможности.

Требования:

  • Подписка на план Enterprise или самохостинг Discourse
  • Установленная в контейнере поддержка ImageMagick с Ghostscript
  • Включенная настройка сайта ai_rag_images_enabled (скрытая — должна быть установлена через консоль Rails)
  • Настроенная RAG-модель LLM на агенте или инструменте AI

Возможности:

  • Интерпретирует изображения, диаграммы и схемы
  • Предоставляет контекст из визуальных элементов
  • Обрабатывает PDF постранично
  • Сохраняет ограничение на размер файла в 100 МБ
  • Разрешает загрузку файлов изображений (png, jpg, jpeg) для индексации RAG через извлечение текста на основе LLM

Детали реализации

Спецификации обработки

  • Разрешение обработки страниц: 300 DPI
  • Тайм-аут конвертации изображения на страницу: 30 секунд
  • Автоматическая очистка временных файлов
  • Полная интеграция с векторными вложениями документов RAG

Рабочий процесс обработки

  1. Загрузка и валидация PDF
  2. Извлечение содержимого (базовый или расширенный режим)
  3. Разбиение текста на фрагменты с настраиваемым перекрытием
  4. Векторизация фрагментов и сохранение
  5. Отслеживание прогресса через MessageBus

Ограничения

:warning: Обратите внимание на следующие ограничения при реализации обработки PDF:

  • Ограничения размера файла:
    • 100 МБ для существующей обработки PDF
    • 20 МБ для новых загрузок через административный интерфейс
  • Расширенный режим требует дополнительных системных ресурсов
  • Сложные макеты PDF могут интерпретироваться не идеально
  • Расширенная обработка значительно увеличивает время обработки

См. также:

11 лайков

Это действительно замечательная новость. Спасибо, команда! Не терпится дождаться завершения улучшенной обработки. Это будет критически важно для подачи исследовательских статей в большие языковые модели (LLM).

Также есть ли планы разрешить выполнение RAG («чат с вашими PDF-файлами») путём загрузки PDF-файлов в личные сообщения бота ИИ или в тему/сообщение с упоминанием бота?

2 лайка

@sam Можете ли вы предоставить простое видео, объясняющее эту отличную возможность, так как то, что вы упомянули, недостаточно понятно для реализации

1 лайк

Где я могу найти эту настройку?

Это скрытая настройка: нужно использовать консоль, но также потребуется настроить контейнер. Рекомендуем подождать ещё несколько недель.

4 лайка

Спасибо, я высоко ценю вашу фантастическую работу

На моем веб-сайте (арабский форум) я провел тест на арабском языке, добавив законодательство в первом посте («тема»), а затем задал вопросы с помощью ИИ. Однако ответы оказались неточными, и я думаю, что это связано с тем, что не используется контекстная обработка (Context RAG).

Извините, но это не так работает. Вам нужно определить персонажа или инструмент, а затем добавить загрузку туда.

Вокруг поддержки функции «загрузить и задать вопрос» здесь уже велись обсуждения: Upload and discuss pdfs in composer, но пока она не поддерживается.

1 лайк

Прежде всего, большое спасибо за вашу отличную работу. Мне это очень нравится.

После того как я поэкспериментировал с настройками и изменил модель ИИ на Gemini-Flash-2.0, всё заработало отлично. Вот моя ситуация:

Мы — сообщество аудиторов, бухгалтеров и налоговых консультантов, и нам нужен инструмент для обмена соответствующими законами и обсуждения их. Эти обсуждения должны быть очень полезны для посетителей, поскольку мы являемся профессионалами в своей области. Мы настроили модель ИИ на проверку и анализ законодательства, а также на ответы на наши вопросы. Удачный эксперимент привёл к выводу, что мы действительно можем обсуждать контекст, добавленный в первом сообщении, и если модель ИИ достаточно умна, она будет отвечать на наши вопросы с очень высоким качеством.

Ещё раз большое спасибо, и с нетерпением ждём поддержки PDF, так как это сделает Discourse лучшим форумным программным обеспечением.

3 лайка

Последний образ Discourse поддерживает расширенный режим, если кто-то захочет протестировать

2 лайка

Должно ли это быть включено через консоль? В интерфейсе я не вижу никаких опций расширенного режима.

Кроме того, при попытке загрузить этот PDF возникает ошибка. Его размер составляет 34 МБ, но максимальный размер вложений установлен на 100 МБ (и в настройках администратора, и в app.yml). Странно то, что у меня есть сжатая версия на 16 МБ, которая загружается без проблем. Но, возможно, этот более крупный PDF пока слишком сложен? В нём много изображений, уравнений и т. д.

Да, вам нужно выполнить SiteSetting.ai_rag_images_enabled = true в консоли Rails, чтобы включить эту функцию.

1 лайк

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

1 лайк

Привет, @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'
1 лайк

Спасибо за это потрясающее обновление!
У меня только один вопрос: ограничение в 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? :face_with_peeking_eye:

1 лайк

При настройке размеров загрузки в файле app.yml эти параметры применяются ко всему сайту, то есть они действуют для каждой персоны.

1 лайк

Есть ли какие-либо новости по этому вопросу? Я прикрепляю PDF-файл при начале разговора с ИИ, но он, похоже, всё ещё его не распознаёт. В данный момент я использую GPT. Возможно, стоит рассмотреть использование другой модели, специально предназначенной для обработки PDF-файлов?

1 лайк