PDF-Unterstützung in Discourse AI

:bookmark: Dieser Leitfaden erklärt, wie PDF-Verarbeitungsfunktionen in discourse-ai implementiert und genutzt werden können, einschließlich grundlegender Textextraktion und erweiterter Verarbeitung mit LLM-Unterstützung.

:person_raising_hand: Erforderliches Benutzerniveau: Administrator

Zusammenfassung

Das discourse-ai-Plugin unterstützt die PDF-Verarbeitung für RAG (Retrieval-Augmented Generation) in zwei verschiedenen Modi:

  1. Grundlegende Textextraktion
  2. Erweiterte Verarbeitung mit LLM-Analyse

Grundlegende Textextraktion

Dieser Modus bietet grundlegende PDF-Verarbeitungsfunktionen:

  • Extrahiert Textinhalte mit dem pdf-reader-Gem
  • Unterstützt Dateien bis zu 100 MB
  • Funktioniert sofort nach der Plugin-Installation
  • Verarbeitet nur Textinhalte (ignoriert visuelle Elemente)

Erweiterte Verarbeitung mit LLM-Verbesserungen

:information_source: Dieser Modus erfordert eine spezifische Konfiguration und bietet fortschrittlichere Funktionen.

Voraussetzungen:

  • Abonnement eines Enterprise-Plans oder selbst gehostetes Discourse
  • ImageMagick mit Ghostscript-Unterstützung im Container installiert
  • ai_rag_images_enabled-Site-Einstellung aktiviert

Funktionen:

  • Interpretiert Bilder, Diagramme und Grafiken
  • Bietet Kontext aus visuellen Elementen
  • Verarbeitet PDFs Seite für Seite
  • Behält das Dateigrößenlimit von 100 MB bei

Implementierungsdetails

Verarbeitungsspezifikationen

  • Auflösung der Seitenverarbeitung: 300 DPI
  • Maximale Verarbeitungszeit: 600 Sekunden (10 Minuten)
  • Automatische Bereinigung temporärer Dateien
  • Vollständige Integration mit RAG-Dokument-Embeddings

Verarbeitungsworkflow

  1. PDF-Upload und Validierung
  2. Inhaltsextraktion (Basis- oder erweiterter Modus)
  3. Text-Chunking mit konfigurierbarem Überlapp
  4. Chunk-Embedding und -Speicherung
  5. Fortschrittsverfolgung über MessageBus

Einschränkungen

:warning: Beachten Sie diese Einschränkungen bei der Implementierung der PDF-Verarbeitung:

  • Dateigrößenbeschränkungen:
    • 100 MB für die bestehende PDF-Verarbeitung
    • 20 MB für neue Uploads über die Admin-Oberfläche
  • Der erweiterte Modus erfordert zusätzliche Systemressourcen
  • Komplexe PDF-Layouts werden möglicherweise nicht perfekt interpretiert
  • Die erweiterte Verarbeitung erhöht die Verarbeitungszeit erheblich
11 „Gefällt mir“

Das sind wirklich erstaunliche Nachrichten. Danke, Team! Ich kann es kaum erwarten, bis die verbesserte Verarbeitung abgeschlossen ist. Das wird entscheidend sein für die Forschung zu LLMs und wissenschaftlichen Papieren.

[Zitat=“Sam Saffron, Beitrag:22, Thema:335804, Benutzername:sam”]
Diejenigen, die auf die verbesserte Verarbeitung warten, gebt uns ein paar Wochen
[/Zitat]

Außerdem, gibt es einen Plan, um das RAG “chat-mit-deinen-PDFs”-Feature zu ermöglichen, indem man PDFs in einem KI-BOT-PM oder einem Thema/Post hochlädt und den Bot erwähnt?

1 „Gefällt mir“

@sam Können Sie ein einfaches Video bereitstellen, um diese großartige Option zu erklären, da das, was Sie erwähnt haben, nicht klar genug ist, um es umzusetzen

Wo kann ich diese Einstellung finden

Es ist eine versteckte Einstellung, Sie müssen die Konsole verwenden, aber Sie müssen auch den Container konfigurieren. Es wird empfohlen, noch ein paar Wochen zu warten.

3 „Gefällt mir“

Vielen Dank, ich schätze Ihre fantastische Arbeit

Auf meiner Website (Arabisches Forum) habe ich einen Test auf Arabisch durchgeführt, indem ich Gesetzestexte in den ersten Beitrag (“Thema”) eingefügt und dann Fragen mit KI gestellt habe. Die Antworten waren jedoch nicht korrekt, und ich glaube, das liegt daran, dass kein kontextbezogenes RAG (Retrieval-Augmented Generation) verwendet wird.

Entschuldigung, aber so funktioniert es nicht. Sie müssen eine Persona oder ein Tool definieren und dann den Upload dort hinzufügen.

Es gab einige Diskussionen über die Unterstützung von „Upload and Ask“ hier: Upload and discuss pdfs in composer, aber es wird noch nicht unterstützt.

1 „Gefällt mir“

Zuerst einmal vielen Dank für Ihre großartige Arbeit. Sie gefällt mir sehr gut.

Nachdem ich mit den Einstellungen herumgespielt und das KI-Modell auf Gemini-Flash-2.0 umgestellt hatte, funktionierte es für mich hervorragend. Hier ist die Situation, die ich habe:

Wir sind eine Gemeinschaft von Wirtschaftsprüfern, Steuerberatern und Steuerberatern und benötigten ein Werkzeug, um relevante Gesetze zu teilen und Diskussionen darüber anzustoßen. Diese Diskussion sollte für Besucher sehr nützlich sein, da wir Fachleute auf unserem Gebiet sind. Wir zielen darauf ab, dass das KI-Modell Gesetzestexte prüft und analysiert und unsere Fragen beantwortet. Das große Experiment führte zu dem Schluss, dass wir den im ersten Beitrag hinzugefügten Kontext wirklich diskutieren können und, wenn das KI-Modell intelligent genug ist, unsere Fragen mit sehr hochwertigen Ergebnissen beantworten wird.

Vielen Dank nochmals und ich freue mich auf die PDF-Unterstützung, da sie Discourse zur besten Forensoftware machen wird.

3 „Gefällt mir“

Neuestes Bild von Discourse unterstützt den erweiterten Modus, falls jemand testen möchte

2 „Gefällt mir“

Muss es über die Konsole aktiviert werden? Ich sehe keine erweiterten Modusoptionen über die Benutzeroberfläche.

Außerdem erhalte ich einen Fehler, wenn ich versuche, diese PDF-Datei hochzuladen. Sie ist 34 MB groß, aber meine maximale Anhangsgröße ist auf 100 MB eingestellt (sowohl in den Admin-Einstellungen als auch in app.yml). Seltsam ist, dass ich eine komprimierte Version habe, die 16 MB groß ist und problemlos hochgeladen wird. Aber vielleicht ist die größere PDF-Datei im Moment einfach zu komplex? Es gibt viele Bilder, Gleichungen usw.

Ja, Sie müssen SiteSetting.ai_rag_images_enabled = true in der Rails-Konsole eingeben, um es zu aktivieren.

1 „Gefällt mir“

Ich vermute, dass hier auch einige Nginx-Einstellungen im Container geändert werden müssen, damit diese nicht ablehnt.

1 „Gefällt mir“

Hallo @sam
Ich habe derzeit Probleme beim Hochladen und Indizieren der PDFs mit diesem Fehler: Job exception: undefined method `length’ for nil.

Ich frage mich, ob der Fehler mit den oben besprochenen Einstellungen zusammenhängt.
Die Benutzeroberfläche bleibt bei der Indizierung bei 0 % hängen und bewegt sich nicht.
Die Ausnahmedetails sind wie folgt:

/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 „Gefällt mir“

Danke für dieses erstaunliche Update,
ich habe nur eine Frage: Beträgt das 100-MB-Limit für jeden Persona AI-Bot oder für alle Personas?

Ich bin neu bei Discourse AI, aber ein alter Hase bei Discourses im Allgemeinen.

Ich bin wirklich daran interessiert, dies in diesem Stadium in Demoform für einen bestimmten Anwendungsfall auszuprobieren.

Ich habe die versteckte Website-Einstellung aktiviert.

Ich sehe nichts in SideKiq. Wie kann ich sehen, ob es überhaupt funktioniert?

Mir ist bewusst, dass dies eine Vorabversion ist und noch nicht für den breiten Einsatz bereit ist, aber es wäre großartig, sie erleben und ausprobieren zu können.

Ich bin wirklich an Hinweisen, Tipps, Screenshots oder Rezepten von Leuten interessiert, die dies ausprobieren.

Ich erhalte diese Fehlermeldung, wenn ich den Bot bitte, den Inhalt einiger PDFs auf meiner Website zusammenzufassen. Ich habe die erweiterte Verarbeitung nicht aktiviert und verwende GPT 4.1. Haben Sie eine Idee, was ich falsch mache?

Entschuldigung, es scheint, dass unser System bei dem Versuch, zu antworten, auf ein unerwartetes Problem gestoßen ist.

Fehlerdetails

{
„error“: {
„message“: „Eine Assistentennachricht mit ‚tool_calls‘ muss von Tool-Nachrichten gefolgt werden, die auf jede ‚tool_call_id‘ antworten. Die folgenden tool_call_ids hatten keine Antwortnachrichten: call_nrDCba5mt83oavbXfPq2BtEV“,
„type“: „invalid_request_error“,
„param“: „messages.[2].role“,
„code“: null
}
}”}

Darf ich nach dem aktuellen Stand der PDF-Unterstützung fragen? :face_with_peeking_eye:

1 „Gefällt mir“

Wenn Sie Upload-Größen in app.yml konfigurieren, gilt dies für die gesamte Website und somit für jede Persona.

1 „Gefällt mir“