Sie können jetzt große Textmengen in Ihre KI-Personas aufnehmen!
Dies bietet mehrere Vorteile:
-
Sie können benutzerdefinierten KI-Bots große Textmengen hinzufügen, die in den Trainingsdaten der Modelle fehlen. (z. B. interne Schulungsdokumente, interne Berichte)
-
Sie können eine Persona besser mit konkreten Daten verankern (auch wenn diese im Trainingsdatensatz des Modells vorhanden sind), was dem Modell helfen kann, spezifische Informationen korrekt zu zitieren und die Qualität der Ergebnisse zu verbessern.
So fügen Sie Uploads hinzu:
-
Erstellen Sie eine neue Persona über die Benutzeroberfläche
/admin/plugins/discourse-ai/ai-personas/. -
Laden Sie die Textdateien hoch, die Sie in Ihre Persona aufnehmen möchten.
Fügen Sie vor dem Hochladen von Dateien die relevanten Erweiterungen (
.mdund.txt) über die Site-Einstellungauthorized extensionshinzu, damit sie von der Persona verwendet werden können.
- Passen Sie die Indizierungsoptionen nach Bedarf an.
Voraussetzungen
Damit die Option funktioniert, müssen ai_embeddings_enabled und ein ai_embeddings_model konfiguriert sein.
Discourse AI unterstützt eine sehr große Anzahl von Embedding-Modellen.
Unsere gehosteten Kunden erhalten kostenlosen Zugang zum hochmodernen bge-large-en Modell.
Selbst-Hosters oder Personen, die mehr Auswahl wünschen, können ein Embedding-Modell selbst hosten oder Modelle von Open AI, Google (Gemini) und anderen verwenden.
Ist das RAG?
Die Implementierung unserer Upload-Unterstützung ist tatsächlich Retrieval-Augmented Generation.
Im Wesentlichen suchen wir jedes Mal, wenn wir eine LLM bitten, eine Benutzerfrage zu beantworten, nach hochrelevanten Informationen, die auf dem von Ihnen eingegebenen Text basieren, und fügen diese in den System-Prompt ein.
Erklärung der verschiedenen Indizierungsoptionen
Was ist ein Token? Tokens sind Primitive, die von großen Sprachmodellen verwendet werden, um Text aufzuteilen. Eine großartige visuelle Erklärung finden Sie unter: https://platform.openai.com/tokenizer
Die Upload-Implementierung von Discourse AI bietet die folgenden Schalter:
Upload Chunk Tokens: Nachdem Dateien hochgeladen wurden, teilen wir sie in Stücke auf. Dies ermöglicht es Ihnen, die Größe der Stücke zu steuern. Wenn ein Stück zu groß für Ihr Embedding-Modell ist, wird das Embedding abgeschnitten (nur ein Teil der Tokens wird verarbeitet).
Upload Chunk Overlap Tokens: Dies ist die Anzahl der Tokens aus dem vorherigen Chunk, die im aktuellen enthalten sind. Je größer diese Zahl ist, desto mehr doppelte Informationen werden in Ihrem Index gespeichert.
Search Conversation Chunks: Dies steuert, wie viele “Chunks” von Tokens basierend auf ihrer Relevanz bedingungslos in den Completion-Prompt aufgenommen werden. Je größer die Zahl, desto mehr Kontext erhält die LLM (und desto teurer werden die Aufrufe). Zum Beispiel: Wenn dieser Wert auf 10 gesetzt ist und Upload Chunk Tokens auf 200 gesetzt ist, hat jede Completion einen zusätzlichen Overhead von 2000 Tokens.
Wie teilt Discourse AI Textkörper auf?
Discourse verwendet einen Recursive Character Text Splitter, der versucht, Absätze, dann Zeilen und schließlich Wörter beim Aufteilen zusammenzuhalten.
Zusätzlich bietet Discourse Ihnen zusätzliche Kontrolle darüber, wie Ihr Text aufgeteilt wird.
Der Trenner [[metadata YOUR METADATA HERE]] kann verwendet werden, um große Textkörper aufzuteilen und hervorzuheben, was jeder Abschnitt abdeckt.
Zum Beispiel:
[[metadata about cats]]
a long story about cats
[[metadata about dogs]]
a long story about dogs
Dies ermöglicht es einem einzigen Textdokument, eine große Vielfalt an Inhalten abzudecken und schützt Sie vor “Chunk-Kontamination”. Sie sind garantiert, dass nur Daten über Katzen in Katzen-Chunks und Hunde in Hunde-Chunks enthalten sind.
Klingt kompliziert, wie debugge ich das?
Discourse AI verfügt über die Site-Einstellung ai bot debugging enabled groups. Benutzer in dieser Gruppe haben Zugriff auf AI-Debugging:
Die AI-Debugging-Bildschirme können Ihnen einen Einblick in die Informationen geben, die wir an die KI senden.
Garbage in - Garbage out Wenn Sie einer LLM nutzlose oder vage Informationen zur Verfügung stellen, kann sie diese nicht magisch in nützliche Informationen umwandeln.
Dieser Bildschirm kann Ihnen helfen, besser zu entscheiden, wie groß Ihre Chunks sein sollten oder ob Sie zu viele oder zu wenige Chunks einschließen.
Funktioniert das überhaupt?
Ein reales Beispiel ist die Aufteilung der HAProxy-Dokumentation und die Einspeisung in eine Persona:
System-Prompt:
Sie sind ein Bot, der sich auf die Beantwortung von Fragen zu HAProxy spezialisiert hat.
Sie leben in einem Discourse-Forum und rendern Discourse-Markdown.
Geben Sie bei Antworten immer Links zur HAProxy-Dokumentation an.
Zum Beispiel, so würden Sie auf Abschnitt 10.1.1 verlinken. Beachten Sie, dass Sie auf einen Abschnitt oder eine Option darin verlinken können.
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)Seien Sie großzügig mit Links, sie sind sehr hilfreich.
Upload-Inhalte:
processed-haproxy-2.txt (1,2 MB)
Generiert mit dem folgenden Skript:
file_content = File.read("configuration.txt")
title = nil
body = nil
last_line = nil
sections = []
file_content.each_line do |line|
if line.strip.match?(/^[-]+$/)
section_number, title = title.to_s.split(" ", 2)
sections << {
section_number: section_number,
title: title,
body: body.to_s.strip
}
title = last_line
body = nil
last_line = nil
else
body = body.to_s + last_line.to_s
last_line = line
end
end
section_number, title = title.to_s.split(" ", 2)
sections << { section_number: section_number, title: title, body: body }
section_names =
sections.map { |section| [section[:section_number], section[:title]] }.to_h
sections[4..-1].each do |section|
title = []
current = +" "
section_number = section[:section_number]
section_number
.split(".")
.each do |number|
current << number
current << "."
title << section_names[current].to_s.strip
end
title = title.join(" - ")
body = section[:body]
next if body.strip.empty?
puts "[[metadata section=\"#{section_number}\" title=\"#{title.strip}\"]]"
puts body
end
Sowohl Claude Opus als auch GPT-4 können bei komplexen Fragen ziemlich daneben liegen. Das ist verständlich, da sie von allen Tokens im Internet gespeist werden. 50 verschiedene Versionen der HAProxy-Dokumentation und alle Diskussionen der Welt darüber fließen in ihr Gehirn ein, was sie sehr verwirren kann:
Beispiele für verwirrte GPT-4 und Claude 3 Opus
Beide sind objektiv nicht annähernd so gut wie die fein abgestimmte Antwort, die Discourse RAG liefert:
Beispiele für weniger verwirrte GPT-4 und Claude Opus
Die Zukunft
Wir freuen uns auf Ihr Feedback. Einige Ideen für die Zukunft könnten sein:
- Unterstützung für PDF/DOCX/XLS usw., damit Sie nicht in Text konvertieren müssen
- Intelligentere Aufteilung für Quellcode / HTML
- Intelligente Transformationen eingehender Daten vor der Indizierung
Lassen Sie uns wissen, was Sie denken!
Vielen Dank an @Roman für die Implementierung dieser Funktion ![]()



