Soporte de PDF en Discourse AI

:bookmark: Esta guía explica cómo implementar y usar las capacidades de procesamiento de PDF dentro de discourse-ai, incluyendo tanto la extracción básica de texto como el procesamiento mejorado con asistencia de LLM.

:person_raising_hand: Nivel de usuario requerido: Administrador

Resumen

El plugin discourse-ai soporta el procesamiento de PDF para RAG (Generación Aumentada por Recuperación) en dos modos distintos:

  1. Extracción básica de texto
  2. Procesamiento mejorado con análisis de LLM

Extracción básica de texto

Este modo proporciona capacidades fundamentales de procesamiento de PDF:

  • Extrae contenido de texto usando la gema pdf-reader
  • Soporta archivos de hasta 100 MB
  • Funciona inmediatamente después de la instalación del plugin
  • Procesa contenido solo de texto (ignora elementos visuales)

Procesamiento mejorado con mejoras de LLM

:information_source: Este modo requiere una configuración específica y proporciona capacidades más avanzadas.

Requisitos:

  • Suscripción al plan Enterprise o Discourse autoalojado
  • ImageMagick con soporte Ghostscript instalado en el contenedor
  • El ajuste del sitio ai_rag_images_enabled habilitado

Capacidades:

  • Interpreta imágenes, gráficos y diagramas
  • Proporciona contexto de elementos visuales
  • Procesa PDF página por página
  • Mantiene el límite de tamaño de archivo de 100 MB

Detalles de implementación

Especificaciones de procesamiento

  • Resolución de procesamiento de página: 300 DPI
  • Tiempo máximo de procesamiento: 600 segundos (10 minutos)
  • Limpieza automática de archivos temporales
  • Integración completa con incrustaciones de documentos RAG

Flujo de trabajo de procesamiento

  1. Carga y validación de PDF
  2. Extracción de contenido (modo básico o mejorado)
  3. Segmentación de texto con superposición configurable
  4. Incrustación y almacenamiento de segmentos
  5. Seguimiento del progreso a través de MessageBus

Limitaciones

:warning: Ten en cuenta estas restricciones al implementar el procesamiento de PDF:

  • Restricciones de tamaño de archivo:
    • 100 MB para el procesamiento de PDF existente
    • 20 MB para nuevas cargas en la interfaz de administración
  • El modo mejorado requiere recursos adicionales del sistema
  • Los diseños de PDF complejos pueden no interpretarse perfectamente
  • El procesamiento mejorado aumenta significativamente el tiempo de procesamiento
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?

1 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

¿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.

3 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?