Discourse AI Persona, Upload-Unterstützung

Sie können jetzt große Textmengen in Ihre KI-Personas aufnehmen!

Dies bietet mehrere Vorteile:

  1. Sie können benutzerdefinierten KI-Bots große Textmengen hinzufügen, die in den Trainingsdaten der Modelle fehlen. (z. B. interne Schulungsdokumente, interne Berichte)

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

  1. Erstellen Sie eine neue Persona über die Benutzeroberfläche /admin/plugins/discourse-ai/ai-personas/.

  2. Laden Sie die Textdateien hoch, die Sie in Ihre Persona aufnehmen möchten.

:information_source: Fügen Sie vor dem Hochladen von Dateien die relevanten Erweiterungen (.md und .txt) über die Site-Einstellung authorized extensions hinzu, damit sie von der Persona verwendet werden können.

  1. 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.

:warning: 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 :hugs:

24 „Gefällt mir“

Wäre es möglich, zusätzlich zu manuell hochgeladenem Text Forenbeiträge einzubeziehen, die ausgewählten Kriterien entsprechen?

Wie zum Beispiel:

  • in einer bestimmten Kategorie
  • einen bestimmten Tag hat (oder nicht hat)
  • Teil eines als gelöst markierten Themas ist (alternativ, speziell ein Lösungsbeitrag ist)
  • der OP des Themas ist, keine Antwort
  • von einem Benutzer in einer bestimmten Gruppe gepostet wurde
  • vor oder nach einem bestimmten Datum liegt

Oder vielleicht anstelle von Kontrollkästchen mit diesen Dingen einfach “eines der Top-N-Themen für eine gegebene Forensuche” ist?

1 „Gefällt mir“

All das ist heute mit einem benutzerdefinierten Suchbefehl machbar:

  • Gegebene Kategorie kann im Filter ausgewählt werden
  • Tag
  • Gelöst
  • Nur OP (ich glaube, das ist machbar)
  • Gegebene Gruppe
  • Vor und nach Datum

:hugs:

5 „Gefällt mir“

Hmmm, vielleicht verstehe ich etwas falsch. Macht es dasselbe, wenn ich das für die Persona verfügbar mache?

Ich habe es versucht, und meistens bringe ich Mistral dazu, Topic-Titel zu erfinden und auf völlig zufällige Post-Nummern zu verlinken. :slight_smile:

1 „Gefällt mir“

Ist Mistral wirklich gut genug für diese Aufgaben? Ich denke, das könnte die Halluzinationen verursachen. Sam hat Recht, indem man die Basisabfrage ändert, kann man all die Dinge tun, die Sie in der OP erwähnt haben.

1 „Gefällt mir“

Und, ich habe gepostet, bevor ich meine Gedanken beendet hatte. Die Frage war: Bewirkt die Angabe des Suchbefehls und der Parameter dasselbe wie die Angabe von hochgeladenen Dateien?

Aber ja, Mistral ist vielleicht nicht gut genug.

1 „Gefällt mir“

Nur um hier ein wenig zu erweitern:

https://chat.lmsys.org/?leaderboard

Mistral gibt es in vielen Varianten … es gibt Mistral 7b, Mixtral 8x7b (das, das Sie haben) und das brandneue mistralai/Mixtral-8x22B-Instruct-v0.1 · Hugging Face - dieses und weitere 5/6 Modelle, die sie veröffentlichen, darunter einige Closed-Source-Modelle.

Man muss vorsichtig sein mit einem “Mistral ist nicht gut genug” und immer klären.

Ich würde sagen, Mixtral-8x7b ist einfach keine gute Wahl für die Tool-Unterstützung, es weicht zu sehr ab.

Ich würde sagen, es ist

  1. Ziemlich gut für die “Upload”-Unterstützung
  2. Sehr gut bei der Unterstützung benutzerdefinierter Personas
  3. Schwach bei der Tool-Unterstützung

Wir versuchen zu sehen, ob wir auf 8x22b aufrüsten können (es wird mit guter Tool-Unterstützung geliefert), das Problem ist, dass die Speicheranforderungen ziemlich hoch sind und wir das Modell quantisieren müssten, um es gut auf unsere Server zu bekommen.

Aber wirklich … wenn Sie eine Datenschutzvereinbarung mit Amazon haben, würde ich Bedrock dringend empfehlen, das Ihnen Zugang zu Claude 3 Opus und Haiku verschaffen würde.

Ich verstehe die Spannung zwischen Open-Source-Modellen und Closed-Source-Modellen. Es ist schwierig, die Closed-Source-Modelle sind im Moment einfach ziemlich weit voraus.

2 „Gefällt mir“

Sie haben Recht, ich hätte mich besser ausdrücken sollen. Ich habe tatsächlich angedeutet, dass Closed-Source-Modelle im Allgemeinen besser sind.

2 „Gefällt mir“

Das gleichzeitige Hochladen mehrerer .txt-Dateien funktioniert nicht richtig: Sie erscheinen schnell, aber dann wird nur eine angezeigt, danach reagiert der Button „Datei hinzufügen“ nicht mehr.

Außerdem denke ich, dass die Unterstützung von .md-Dateien eine großartige Ergänzung wäre.

1 „Gefällt mir“

Oh, Mist … gut bemerkt, @Roman wird sich das ansehen.

Das sollte gut funktionieren, es wird bereits unterstützt, Sie müssen nur die Erweiterung aktivieren.

3 „Gefällt mir“

Ich habe einen Fix für den Multi-File-Bug eingereicht:

4 „Gefällt mir“

2 Beiträge wurden in ein neues Thema aufgeteilt: Verbesserung der Qualität von Suchfiltern in Discourse AI

Hallo Sam, ich frage mich, wie das genau funktioniert. Es wird der KI mitteilen, dass es sich um Daten über Katzen oder Hunde handelt, aber wie wirkt es sich auf Chunks aus, wenn diese bereits auf eine feste Anzahl von Tokens (sagen wir 2000) eingestellt sind? Wird es einen Chunk abschneiden, wenn es eine Zeile wie [[metadata about dogs]] sieht und einen neuen Chunk beginnen?

1 „Gefällt mir“

Ja, es wird frühzeitig abgebrochen

2 „Gefällt mir“

Oh, Mist, ich habe das \u003cmeta\u003econtent\u003c/meta\u003e-Format verwendet, das für die meisten LLM-Modelle funktioniert. Gibt es einen Grund, warum Sie die [[Klammern]]-Methode gewählt haben? Funktionieren \u003ctags\u003e immer noch oder ist es besser, die Klammermethode in Discourse zu verwenden?

1 „Gefällt mir“

Dies wird überhaupt nicht vom LLM verarbeitet (wir analysieren und verarbeiten Metadaten) und wollte einen Trenner, der unwahrscheinlich ist, in indizierten Daten aufzutauchen.

2 „Gefällt mir“

Dies zum Text hinzugefügt

1 „Gefällt mir“

Befinden sich diese Embeddings, die für KI-Personas erstellt werden, in derselben Vektordatenbank? Und werden tatsächlich alle für Discourse generierten Embeddings in derselben Vektordatenbank gespeichert?

1 „Gefällt mir“

Alles in Postgres mit derselben DB

2 „Gefällt mir“

Kann mir jemand sagen, was mit den hochgeladenen Textdateien in den Personas passiert, wenn sie aus der Liste der hochgeladenen Dateien gelöscht werden? Ich verstehe, dass sie für RAG verwendet werden, aber wenn ich die Datei lösche, wird sie dann aus dem Index gelöscht? Ich frage mich, ob es möglich ist, das, was indiziert wurde, zu bearbeiten, indem man eine Textdatei löscht, seine Anpassungen vornimmt und sie erneut hochlädt?

1 „Gefällt mir“