Questa guida spiega come implementare e utilizzare le funzionalità di elaborazione dei PDF all’interno di discourse-ai, inclusa sia l’estrazione di testo di base che l’elaborazione avanzata con l’assistenza di LLM.
Livello utente richiesto: Amministratore
Riepilogo
Il plugin discourse-ai supporta l’elaborazione dei PDF per RAG (Retrieval-Augmented Generation) in due modalità distinte:
Estrazione di testo di base
Elaborazione avanzata con analisi LLM
Estrazione di testo di base
Questa modalità fornisce funzionalità di base per l’elaborazione dei PDF:
Estrae il contenuto testuale utilizzando la gemma pdf-reader
Supporta file fino a 100 MB
Funziona immediatamente dopo l’installazione del plugin
Elabora contenuti solo testuali (ignora gli elementi visivi)
Elaborazione avanzata con miglioramenti LLM
Questa modalità richiede una configurazione specifica e fornisce funzionalità più avanzate.
Requisiti:
Abbonamento al piano Enterprise o installazione self-hosted di Discourse
ImageMagick con supporto Ghostscript installato nel container
Impostazione del sito ai_rag_images_enabled abilitata
Capacità:
Interpreta immagini, grafici e diagrammi
Fornisce contesto dagli elementi visivi
Elabora i PDF pagina per pagina
Mantiene il limite di dimensione del file di 100 MB
Dettagli di implementazione
Specifiche di elaborazione
Risoluzione di elaborazione delle pagine: 300 DPI
Tempo massimo di elaborazione: 600 secondi (10 minuti)
Pulizia automatica dei file temporanei
Integrazione completa con gli embedding dei documenti RAG
Flusso di elaborazione
Caricamento e convalida del PDF
Estrazione del contenuto (modalità di base o avanzata)
Suddivisione del testo con sovrapposizione configurabile
Embedding e archiviazione dei chunk di testo
Monitoraggio dello stato di avanzamento tramite MessageBus
Limitazioni
Tieni presente questi vincoli quando implementi l’elaborazione dei PDF:
Restrizioni sulla dimensione del file:
100 MB per l’elaborazione PDF esistente
20 MB per i nuovi caricamenti dall’interfaccia di amministrazione
La modalità avanzata richiede risorse di sistema aggiuntive
Layout complessi dei PDF potrebbero non essere interpretati perfettamente
L’elaborazione avanzata aumenta significativamente il tempo di elaborazione
Questa è davvero una notizia fantastica. Grazie team! Non vedo l’ora che l’elaborazione potenziata sia terminata. Sarà fondamentale per alimentare gli LLM con articoli di ricerca.
Inoltre, c’è qualche piano per consentire di fare RAG “chattare-con-i-tuoi-PDF” caricando PDF in un PM di bot AI o in un argomento/post e menzionando il bot?
Nel mio sito web (Forum Arabo) ho fatto un test in arabo aggiungendo una legislazione nel primo post “argomento” e poi ho posto domande usando l’IA, ma le risposte non sono accurate e penso che sia perché non è Context Ragging
Prima di tutto, grazie mille per il vostro ottimo lavoro. Mi piace molto.
Dopo aver giocato con le impostazioni e aver cambiato il modello AI in Gemini-Flash-2.0, ha funzionato benissimo per me. Ecco la situazione che ho:
Siamo una community di Revisori, Commercialisti e Consulenti Fiscali, e avevamo bisogno di uno strumento per condividere leggi correlate e stimolare discussioni su di esse. Questa discussione dovrebbe essere molto utile per i visitatori, dato che siamo professionisti nel nostro campo. Stiamo puntando al modello AI per controllare e analizzare la legislazione e rispondere alle nostre domande. Il grande esperimento ha portato alla conclusione che possiamo davvero discutere il contesto aggiunto nel primo post, e se il modello AI è abbastanza intelligente, risponderà alle nostre domande con un output di altissima qualità.
Grazie ancora e non vedo l’ora che arrivi il supporto PDF, poiché renderà Discourse il miglior software per forum.
Deve essere abilitato tramite console? Non vedo opzioni di modalità avanzata tramite l’interfaccia utente.
Inoltre, ricevo un errore quando tento di caricare questo pdf. È di 34 MB ma ho impostato la mia dimensione massima di allegato a 100 MB (sia nelle impostazioni di amministrazione che in app.yml). Ciò che è strano è che ho una versione compressa che è di 16 MB e si carica senza problemi. Ma forse il PDF più grande è semplicemente troppo complesso per ora? Ci sono molte immagini, equazioni, ecc.
Ciao @sam
Sto riscontrando problemi nel caricamento e nell’indicizzazione dei PDF con questo errore: Job exception: undefined method `length’ for nil.
Mi chiedevo se l’errore fosse correlato alle impostazioni di cui abbiamo discusso sopra.
L’interfaccia si blocca all’indicizzazione dello 0% senza avanzare e
i dettagli dell’eccezione sono i seguenti:
/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'
Sono nuovo a Discourse AI ma ho molta esperienza con Discourse in generale.
Sono molto interessato a provare questo per un caso d’uso specifico in forma di demo in questa fase.
Ho abilitato l’impostazione del sito nascosta.
Non vedo nulla in SideKiq. Come posso vedere se sta funzionando?
Sono consapevole che questa è una funzionalità in pre-release e non ancora pronta per il grande pubblico, tuttavia sarebbe fantastico poterla sperimentare e provare.
Sono molto interessato a qualsiasi suggerimento, consiglio, screenshot o ricetta da parte di persone che la stanno provando.
Ricevo questo errore quando chiedo al bot di riassumere il contenuto di alcuni PDF sul mio sito. Non ho abilitato l’elaborazione avanzata e sto usando GPT 4.1. Avete qualche idea su cosa sto sbagliando?
Mi dispiace, sembra che il nostro sistema abbia riscontrato un problema imprevisto durante il tentativo di rispondere.
Dettagli dell’errore
{
“error”: {
“message”: “Un messaggio dell’assistente con ‘tool_calls’ deve essere seguito da messaggi dello strumento che rispondono a ciascun ‘tool_call_id’. I seguenti tool_call_ids non avevano messaggi di risposta: call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}