Supporto PDF in Discourse AI

:bookmark: 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.

:person_raising_hand: Livello utente richiesto: Amministratore

Riepilogo

Il plugin discourse-ai supporta l’elaborazione dei PDF per RAG (Retrieval-Augmented Generation) in due modalità distinte:

  1. Estrazione di testo di base
  2. 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

:information_source: 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

  1. Caricamento e convalida del PDF
  2. Estrazione del contenuto (modalità di base o avanzata)
  3. Suddivisione del testo con sovrapposizione configurabile
  4. Embedding e archiviazione dei chunk di testo
  5. Monitoraggio dello stato di avanzamento tramite MessageBus

Limitazioni

:warning: 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
11 Mi Piace

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?

1 Mi Piace

@sam Puoi fornire un video semplice per spiegare questa ottima opzione, perché quello che hai menzionato non è abbastanza chiaro per implementarlo

Dove posso trovare questa impostazione?

È un’impostazione nascosta, devi usare la console, ma devi anche configurare il container, ti consiglio di aspettare qualche altra settimana.

3 Mi Piace

Grazie, apprezzo il tuo fantastico lavoro

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

Mi dispiace, ma non funziona così, devi definire una persona o uno strumento e poi aggiungere l’upload lì.

C’è stata una discussione sul supporto di “upload and ask” qui: Upload and discuss pdfs in composer ma non è ancora supportato.

1 Mi Piace

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.

3 Mi Piace

L’ultima immagine di discourse supporta la modalità avanzata se qualcuno vuole testare

2 Mi Piace

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.

Sì, è necessario impostare SiteSetting.ai_rag_images_enabled = true nella console Rails per abilitarlo.

1 Mi Piace

la mia ipotesi è che anche alcune cose di nginx debbano essere modificate nel container in modo che non faccia il rifiuto

1 Mi Piace

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'
1 Mi Piace

grazie per questo aggiornamento fantastico,
ho solo una preoccupazione, limite di 100MB per ogni persona AI o per tutte le persone

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
}
}

Posso chiedere qual è lo stato attuale del supporto PDF? :face_with_peeking_eye:

1 Mi Piace

Quando si configurano le dimensioni di caricamento in app.yml, queste sono valide per l’intero sito, quindi si applicano a ogni persona.

1 Mi Piace