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.
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:
Extracción básica de texto
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
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
Carga y validación de PDF
Extracción de contenido (modo básico o mejorado)
Segmentación de texto con superposición configurable
Incrustación y almacenamiento de segmentos
Seguimiento del progreso a través de MessageBus
Limitaciones
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
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?
@sam ¿Puedes proporcionar un video sencillo para explicar esta excelente opción, porque lo que mencionaste no está lo suficientemente claro para implementar
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
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.
¿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.
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'
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
}
}
¿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?