Support PDF dans Discourse AI

:bookmark: Ce guide explique comment implémenter et utiliser les capacités de traitement des PDF dans discourse-ai, y compris l’extraction de texte de base et le traitement amélioré avec l’aide des LLM.

:person_raising_hand: Niveau d’utilisateur requis : Administrateur

Résumé

Le plugin discourse-ai prend en charge le traitement des PDF pour le RAG (Retrieval-Augmented Generation) dans deux modes distincts :

  1. Extraction de texte de base
  2. Traitement amélioré avec analyse LLM

Extraction de texte de base

Ce mode fournit des capacités fondamentales de traitement des PDF :

  • Extrait le contenu textuel à l’aide de la gem pdf-reader
  • Prend en charge les fichiers jusqu’à 100 Mo
  • Fonctionne immédiatement après l’installation du plugin
  • Traite le contenu textuel uniquement (ignore les éléments visuels)

Traitement amélioré avec améliorations LLM

:information_source: Ce mode nécessite une configuration spécifique et offre des capacités plus avancées.

Exigences :

  • Abonnement au plan Entreprise ou Discourse auto-hébergé
  • ImageMagick avec prise en charge de Ghostscript installé dans le conteneur
  • Paramètre du site ai_rag_images_enabled activé

Capacités :

  • Interprète les images, les graphiques et les diagrammes
  • Fournit un contexte à partir des éléments visuels
  • Traite les PDF page par page
  • Maintient la limite de taille de fichier de 100 Mo

Détails d’implémentation

Spécifications de traitement

  • Résolution de traitement des pages : 300 DPI
  • Temps de traitement maximum : 600 secondes (10 minutes)
  • Nettoyage automatique des fichiers temporaires
  • Intégration complète avec les embeddings de documents RAG

Flux de traitement

  1. Téléchargement et validation du PDF
  2. Extraction du contenu (mode de base ou amélioré)
  3. Découpage du texte avec chevauchement configurable
  4. Embedding et stockage des morceaux de texte
  5. Suivi de la progression via MessageBus

Limitations

:warning: Soyez conscient de ces contraintes lors de l’implémentation du traitement des PDF :

  • Restrictions de taille de fichier :
    • 100 Mo pour le traitement PDF existant
    • 20 Mo pour les nouveaux téléchargements via l’interface d’administration
  • Le mode amélioré nécessite des ressources système supplémentaires
  • Les mises en page PDF complexes peuvent ne pas être interprétées parfaitement
  • Le traitement amélioré augmente considérablement le temps de traitement
11 « J'aime »

C’est une nouvelle vraiment incroyable. Merci l’équipe ! J’ai hâte que le traitement amélioré soit terminé. Ce sera essentiel pour alimenter les documents de recherche des LLM.

De plus, y a-t-il un plan pour permettre de faire du RAG “chat-avec-vos-PDFs” en téléchargeant des PDF dans un message privé de bot IA ou dans un sujet/post et en mentionnant le bot ?

1 « J'aime »

@sam Pouvez-vous fournir une vidéo simple pour expliquer cette excellente option, car ce que vous avez mentionné n’est pas suffisamment clair pour être mis en œuvre.

Où puis-je trouver ce réglage

C’est un réglage caché, vous devez utiliser la console, mais vous devez également configurer le conteneur, je vous recommande d’attendre quelques semaines de plus.

3 « J'aime »

Merci, j’apprécie votre travail fantastique

Sur mon site web (Forum Arabe), j’ai fait un test en arabe en ajoutant une législation dans le premier post « sujet » puis j’ai posé des questions en utilisant l’IA, mais les réponses ne sont pas exactes et je pense que c’est parce que ce n’est pas du Ragging contextuel

Désolé, mais ce n’est pas comme ça que ça fonctionne, vous devez définir une persona ou un outil, puis y ajouter le téléchargement.

Il y a eu des discussions concernant la prise en charge de « télécharger et demander » ici : Upload and discuss pdfs in composer mais ce n’est pas encore pris en charge.

1 « J'aime »

Tout d’abord, merci beaucoup pour votre excellent travail. Je l’apprécie vraiment.

Après avoir exploré les paramètres et changé le modèle d’IA en Gemini-Flash-2.0, cela a très bien fonctionné pour moi. Voici la situation dans laquelle je me trouve :

Nous sommes une communauté d’auditeurs, de comptables et de conseillers fiscaux, et nous avions besoin d’un outil pour partager des lois pertinentes et susciter des discussions à leur sujet. Cette discussion devrait être très utile pour les visiteurs, car nous sommes des professionnels dans notre domaine. Nous ciblons le modèle d’IA pour qu’il vérifie et analyse la législation et réponde à nos questions. La grande expérience a conduit à la conclusion que nous pouvons vraiment discuter du contexte ajouté dans le premier message, et si le modèle d’IA est suffisamment intelligent, il répondra à nos questions avec une sortie de très haute qualité.
Merci encore et j’attends avec impatience le support PDF, car cela fera de Discourse le meilleur logiciel de forum.

3 « J'aime »

La dernière image de discourse prend en charge le mode avancé si quelqu’un souhaite tester

2 « J'aime »

Doit-il être activé via la console ? Je ne vois aucune option de mode avancé via l’interface utilisateur.

De plus, j’obtiens une erreur lorsque j’essaie de téléverser ce PDF. Il fait 34 Mo mais j’ai défini ma taille maximale de pièce jointe à 100 Mo (dans les paramètres d’administration et app.yml). Ce qui est étrange, c’est que j’ai une version compressée qui fait 16 Mo et elle se téléverse sans problème. Mais peut-être que le PDF plus volumineux est tout simplement trop complexe pour le moment ? Il y a beaucoup d’images, d’équations, etc.

Oui, vous devez saisir SiteSetting.ai_rag_images_enabled = true dans la console Rails pour l’activer.

1 « J'aime »

ma supposition est que certaines choses liées à nginx doivent également être modifiées dans le conteneur afin qu’il ne rejette pas.

1 « J'aime »

Salut @sam
J’ai actuellement des problèmes pour télécharger et indexer les pdf avec cette erreur : Job exception: undefined method `length’ for nil.

Je me demandais si l’erreur était liée aux paramètres dont nous avons discuté plus haut.
L’interface reste bloquée à 0% d’indexation et ne progresse pas.
Les détails de l’exception sont les suivants :

/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 « J'aime »

merci pour cette mise à jour incroyable,
je souhaite juste avoir une préoccupation ici, limite de 100 Mo pour chaque bot Persona AI ou pour tous les Personas

Je suis nouveau sur Discourse AI mais un ancien de Discourse en général.

Très désireux d’essayer cela pour un cas d’utilisation spécifique sous forme de démo à ce stade.

J’ai activé le paramètre de site caché.

Rien dans SideKiq que je puisse voir. Comment puis-je voir si cela fonctionne du tout ?

Je suis conscient qu’il s’agit d’une fonctionnalité en pré-version et pas encore prête pour le grand public, cependant, ce serait formidable de pouvoir en faire l’expérience et l’essayer.

Très désireux de recevoir des indices, des astuces, des captures d’écran ou des recettes de la part des personnes qui essaient cela.

Je reçois cette erreur lorsque je demande au bot de résumer le contenu de certains PDF sur mon site. Je n’ai pas activé le traitement amélioré et j’utilise GPT 4.1. Des idées sur ce que je fais mal ?

Désolé, il semble que notre système ait rencontré un problème inattendu lors de la tentative de réponse.

Détails de l’erreur

{
“error”: {
“message”: “Un message d’assistant avec ‘tool_calls’ doit être suivi de messages d’outil répondant à chaque ‘tool_call_id’. Les tool_call_ids suivants n’avaient pas de messages de réponse : call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}

Puis-je me renseigner sur l’état actuel de la prise en charge des PDF ? :face_with_peeking_eye:

1 « J'aime »

Lorsque vous configurez les tailles de téléchargement dans app.yml, elles s’appliquent à l’ensemble du site, donc à chaque persona.

1 « J'aime »

Y a-t-il des mises à jour sur cette question ? Je joins un PDF lors de l’initialisation d’une conversation avec l’IA, mais elle ne semble toujours pas le reconnaître. J’utilise actuellement GPT. Devrais-je peut-être envisager d’utiliser un modèle différent spécifiquement conçu pour le traitement des PDF ?