Soporte para PDF en Discourse AI (RAG)

:bookmark: このガイドでは、基本的なテキスト抽出とLLM支援による高度な処理の両方を含む、discourse-ai内でのPDF処理機能の実装と使用方法について説明します。

:person_raising_hand: 必要なユーザーレベル: 管理者

概要

discourse-aiプラグインは、RAG(検索拡張生成)のために、次の2つの異なるモードでPDF処理をサポートします。

  1. 基本的なテキスト抽出
  2. LLM分析による高度な処理

基本的なテキスト抽出

このモードは基本的なPDF処理機能を提供します。

  • pdf-reader gemを使用したテキストコンテンツの抽出
  • 100MBまでのファイルをサポート
  • プラグインインストール直後から動作
  • テキストのみのコンテンツを処理(視覚要素は無視)

LLMの改善による高度な処理

:information_source: このモードは特定の設定が必要であり、より高度な機能を提供します。

要件:

  • エンタープライズプランのサブスクリプション、またはセルフホスト型Discourse
  • コンテナ内にインストールされたGhostscriptサポート付きのImageMagick
  • ai_rag_images_enabled サイト設定の有効化(非表示 — Railsコンソール経由で設定する必要がある)
  • AIエージェントまたはツールで設定されたRAG LLMモデル

機能:

  • 画像、チャート、図の解釈
  • 視覚要素からのコンテキスト提供
  • PDFのページごとの処理
  • 100MBのファイルサイズ制限の維持
  • LLMベースのテキスト抽出によるRAGインデックス作成のための画像ファイル(png、jpg、jpeg)のアップロードを有効化

実装の詳細

処理仕様

  • ページ処理解像度:300 DPI
  • ページごとの画像変換タイムアウト:30秒
  • 一時ファイルの自動クリーンアップ
  • RAGドキュメント埋め込みとの完全な統合

処理ワークフロー

  1. PDFのアップロードと検証
  2. コンテンツの抽出(基本モードまたは高度モード)
  3. 設定可能なオーバーラップを持つテキストのチャンク化
  4. チャンクの埋め込みと保存
  5. MessageBusを介した進捗追跡

制限事項

:warning: PDF処理を実装する際は、これらの制約に注意してください。

  • ファイルサイズ制限:
    • 既存のPDF処理の場合は100MB
    • 新しい管理者インターフェースからのアップロードの場合は20MB
  • 高度なモードは追加のシステムリソースを必要とする
  • 複雑なPDFレイアウトは完全に解釈されない場合がある
  • 高度な処理は処理時間を大幅に増加させる

関連項目:

11 Me gusta

Esta es una noticia realmente increíble. ¡Gracias equipo! No puedo esperar a que se termine el procesamiento mejorado. Eso será fundamental para alimentar los documentos de investigación de los LLM.

Además, ¿hay algún plan para permitir hacer RAG “chatear con tus PDFs” subiendo PDFs en un PM de bot de IA o en un tema/publicación y mencionando al bot?

2 Me gusta

@sam ¿Puedes proporcionar un video sencillo para explicar esta excelente opción, porque lo que mencionaste no está lo suficientemente claro para implementar

1 me gusta

¿Dónde puedo encontrar esta configuración?

Es una configuración oculta, necesitas usar la consola, pero también necesitas configurar el contenedor, te recomiendo esperar unas semanas más.

4 Me gusta

Gracias, aprecio tu fantástico trabajo

En mi sitio web (Foro Árabe) hice una prueba en árabe añadiendo legislación en la primera publicación “tema” y luego hice preguntas usando IA, pero las respuestas no son precisas y creo que esto se debe a que no es Context Ragging

Lo siento, pero no funciona así, necesitas definir una persona o herramienta y luego añadir la carga allí.

Ha habido cierta discusión sobre el soporte de “cargar y preguntar” aquí: Upload and discuss pdfs in composer pero aún no es compatible.

1 me gusta

En primer lugar, muchas gracias por su gran trabajo. Me gusta mucho.

Después de jugar con la configuración y cambiar el modelo de IA a Gemini-Flash-2.0, me funcionó muy bien. Aquí está la situación que tengo:

Somos una comunidad de auditores, contadores y consultores fiscales, y necesitábamos una herramienta para compartir leyes relacionadas y generar discusiones sobre ellas. Esta discusión debería ser muy útil para los visitantes, ya que somos profesionales en nuestro campo. Estamos apuntando al modelo de IA para que revise y analice la legislación y responda nuestras preguntas. El gran experimento llevó a la conclusión de que realmente podemos discutir el contexto agregado en la primera publicación y, si el modelo de IA es lo suficientemente inteligente, responderá nuestras preguntas con un resultado de muy alta calidad.
Realmente gracias de nuevo y espero con ansias el soporte de PDF, ya que hará de Discourse el mejor software de foro.

3 Me gusta

La última imagen de discourse soporta el modo avanzado si alguien quiere probarlo

2 Me gusta

¿Tiene que habilitarse a través de la consola? No veo ninguna opción de modo avanzado a través de la interfaz de usuario.

Además, estoy recibiendo un error al intentar cargar este PDF. Tiene 34 MB, pero tengo mi tamaño máximo de archivo adjunto establecido en 100 MB (tanto en la configuración de administrador como en app.yml). Lo extraño es que tengo una versión comprimida que tiene 16 MB y se carga sin problemas. ¿Pero quizás el PDF más grande es simplemente demasiado complejo por ahora? Hay muchas imágenes, ecuaciones, etc.

Sí, necesitas SiteSetting.ai_rag_images_enabled = true en la consola de Rails para habilitarlo.

1 me gusta

Mi suposición aquí es que algunas cosas de nginx también necesitan cambiar en el contenedor para que no rechace.

1 me gusta

Hola @sam
Actualmente tengo problemas para cargar e indexar los PDF debido a este error: Job exception: undefined method `length’ for nil.

Me preguntaba si el error está relacionado con la configuración que discutimos anteriormente.
La interfaz se queda atascada en indexando 0% y no avanza.
Los detalles de la excepción son los siguientes:

/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 me gusta

Gracias por esta increíble actualización,
sólo tengo una duda, ¿el límite de 100 MB es para cada bot de Persona AI o para todas las Personas?

Soy nuevo en Discourse AI, pero tengo mucha experiencia con Discourse en general.

Tengo muchas ganas de probar esto para un caso de uso específico en forma de demostración en esta etapa.

He habilitado la configuración oculta del sitio.

No veo nada en SideKiq. ¿Cómo puedo ver si está funcionando?

Soy consciente de que esta es una función de pre-lanzamiento y aún no está lista para el público, sin embargo, sería genial poder experimentarla y probarla.

Tengo muchas ganas de recibir cualquier pista, consejo, captura de pantalla o receta de las personas que la están probando.

Recibo este error cuando le pido al bot que resuma el contenido de algunos PDF en mi sitio. No he habilitado el procesamiento mejorado y estoy usando GPT 4.1. ¿Alguna idea de lo que estoy haciendo mal?

Lo siento, parece que nuestro sistema encontró un problema inesperado al intentar responder.

Detalles del error

{
“error”: {
“message”: “Un mensaje de asistente con ‘tool_calls’ debe ir seguido de mensajes de herramienta que respondan a cada ‘tool_call_id’. Los siguientes tool_call_ids no tuvieron mensajes de respuesta: call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}

¿Puedo preguntar sobre el estado actual de la compatibilidad con PDF? :face_with_peeking_eye:

1 me gusta

Cuando configuras los tamaños de carga en app.yml, es para todo el sitio, por lo que se aplica a cada persona.

1 me gusta

¿Hay alguna actualización sobre este asunto? Estoy adjuntando un PDF al iniciar una conversación con la IA, pero todavía no parece reconocerlo. Actualmente estoy utilizando GPT. ¿Debería considerar emplear un modelo diferente diseñado específicamente para el procesamiento de PDF?

1 me gusta