Teilen

10. Juni 2024

aktualisiert am 10. Juni 2024

Optimierung eines RAG-Chat-Bot-Systems

Derzeit gibt es großes Interesse an "RAG-Systemen" (Retrieval Augmented Generation). Diese Systeme holen Informationen aus einer (meist unveröffentlichten) Datenquelle, um die Antworten von Sprachmodellen wie ChatGPT zu verbessern. In einem aktuellen Projekt haben wir ein solches System entwickelt und möchten unsere Erfahrungen teilen.

Ausgangslage

Unsere Aufgabe war es, in kürzester Zeit einen „Proof-of-Concept“ für einen deutschsprachigen Chat-Bot zu entwickeln, der basierend auf einer vorhandenen „Knowledge-Base“ Fragen interner User beantworten kann.

Die Knowledge-Base bestand aus zwei Hauptquellen:

  1. Aus öffentlich verfügbaren und sehr gut strukturierten schweizerischen Gesetzestexten auf kantonaler und Bundesebene im PDF-Format.

  2. Aus internen Kundendokumenten (Weisungen), ebenfalls im PDF-Format. Diese internen Dokumente waren weniger gut strukturiert als die Gesetzestexte und enthielten mehr Grafiken. Zusätzlich gab es noch interne Glossare in tabellarischer Form.

Im Rahmen des Projektes stellten sich insbesondere folgende Fragen:

  • Wie können wir ein Basis-RAG-System ausgehend von den voreingestellten Default-Einstellungen und -Parametern mit begrenztem Mitteleinsatz optimieren?

  • An welchen „Stellschrauben“ können wir überhaupt drehen und was sind deren Auswirkungen?

  • Wann ist das System „gut genug“ für die Anwender?

Den Chat-Bot haben wir als «RAG-System» konzipiert.

Architektur

  • Den Chat-Bot haben wir als „RAG-System“ konzipiert. In einem ersten, vorgelagerten Schritt, der sogenannten „Ingestion“, wird der Inhalt als Text aus den Dokumenten der Knowledge-Base extrahiert.

  • Der Inhalt wird dann in kleinere „Schnipsel“, sogenannte „Chunks“, zerteilt.

  • Diese Text-Chunks werden mittels eines Embedding-Modells in numerische Vektoren (Embeddings) umgewandelt und im Such-Index abgelegt.

  • Stellt der User dem Bot dann zur Laufzeit eine Frage, wird die Frage ebenfalls in Vektoren umgewandelt.

  • Das System sucht aus dem Such-Index die beispielsweise fünf Schnipsel heraus, die dem Frage-Vektor am ähnlichsten sind.

  • Frage, Kontext-Schnipsel und gegebenenfalls auch die Chat-Historie werden zuletzt an ein Sprachmodell wie z. B. GPT-4 als Prompt weitergereicht, welches dann die Antwort generiert.

Parameter

Die Tabelle links zeigt die gewählten Default-Einstellungen.

Basierend auf diesem Setup haben wir dann «Stellschrauben» identifiziert, mit welchen sich das System optimieren lassen würde, ohne jedoch das Sprachmodell selbst fine-tunen zu müssen.

Letzteres war aufgrund des hohen Aufwands und der damit verbundenen Kosten in diesem Projekt nicht möglich.

Die Tabelle rechts zeigt die identifizierten Stellschrauben.

Stellschrauben

Da die Zeit sehr knapp und das Budget begrenzt waren, konnten wir nur wenige Experimente zu diesen Stellschrauben tatsächlich durchführen. Als Entscheidungskriterien berücksichtigten wir den geschätzten Umsetzungsaufwand und das geschätzte Verbesserungspotential der Stellschrauben. Unsere Wahl fiel so auf:

  • Die Extraktion der PDF-Dokumente in das Markdown-Format anstatt HTML,

  • Die Berücksichtigung der Textstruktur,

  • Die Übersetzung ins Englische sowie

  • Die Verwendung einer semantischen Suche.

Jedes durchgeführte Experiment bestand dann aus den nötigen Anpassungen am System mit einer anschliessenden, möglichst objektiven, Evaluation der Ergebnisse.

Evaluation

Für die Evaluation der Experimente verwendeten wir den RAGAS-Score. RAGAS ist ein OpenSource-Framework, das basierend auf der Anfrage, der vom System gelieferten Antwort sowie der tatsächlich korrekten Antwort die Qualität der generierten Antworten bewertet.

Um die Evaluation durchführen zu können, hatten wir zuvor mit Fachexperten unseres Kunden einen Fragenkatalog mit den jeweils „korrekten“ bzw. gewünschten Antworten erarbeitet.

Das RAGAS-Framework bewertet das Auffinden des Kontextes (sog. Context Retrieval) und die Generierung der Antwort (Answer Generation) mit je zwei Metriken:

  • Context Precision: Bewertet mit verschiedenen Modellen, wie gut der gefundene Kontext zur Frage passt (sog. Signal to Noise Ratio).

  • Context Recall: Ermittelt, wie viele Sätze in der korrekten Antwort sich auf den gefundenen Kontext zurückführen lassen.

  • Faithfulness: Überprüft, wie viele Aussagen in der Antwort aus dem Kontext abgeleitet werden können.

  • Answer Relevancy: Mit einem Sprachmodell werden aus der Antwort weitere Fragen generiert und dann berechnet, wie ähnlich diese der ursprünglichen Frage sind.

Mit unserer Auswahl der Stellschrauben haben wir also vor allem versucht, das Context Retrieval zu verbessern.

Experimente

Markdown-Format

In der Basisversion wurden die PDF-Dokumente mit dem „FormRecognizerService“ von Microsoft vor der Weiterverarbeitung in das HTML-Format extrahiert. Wir vermuteten jedoch, dass eine Extraktion in das Markdown-Format zu einer besseren Leistung des RAG-Systems führen würde.

Für das Experiment verwendeten wir den „DocumentIntelligenceClient“ von Microsoft in der neuesten Version, wobei wir Markdown als Output-Format wählten. Im Ergebnis erbrachte die Verwendung von Markdown allein jedoch keine messbare Verbesserung gegenüber der Basisversion.

Berücksichtigung der Text-Struktur

In der Basisversion wurden die aus den Dokumenten extrahierten Texte anhand gängiger Satzzeichen wie „.“, „!“, „?“, „;“, „:“ usw. in Schnipsel mit der vorgegebenen Größe von 1024 Tokens zerteilt. Dies hatte zur Folge, dass der Text unabhängig von der Struktur des jeweiligen Dokumentes gesplittet wurde: Der zusammengehörende Inhalt eines Textabschnitts, der aus mehreren Sätzen besteht, wurde so unter Umständen auf verschiedene Schnipsel aufgeteilt, was suboptimal erschien.

Wir wählten deshalb ein Vorgehen, bei dem der Text zunächst nach den Überschriften der Abschnitte und erst in einem zweiten Schritt bei den dann noch zu großen Chunks nach den gängigen Satzzeichen gesplittet wird. Zu kleine Schnipsel setzten wir hierbei wieder bis zur Zielgröße zusammen.

Dieses Experiment erwies sich als erfolgreich und erzielte einen um sechs Prozentpunkte höheren RAGAS-Score als die Basisversion.

Übersetzung nach Englisch

Wir vermuteten, dass das für die Antwort-Generierung verwendete GPT-4-Modell besser mit englischsprachigen Anfragen und Dokumenten umgehen könnte als mit unseren deutschsprachigen. Deshalb erwogen wir eine Übersetzung der Anfragen und Dokumente ins Englische sowie eine Rückübersetzung der Antworten ins Deutsche. Da dies jedoch aufwändige Anpassungen erfordern und die Übersetzungen auch einen Qualitätsverlust bewirken könnten, entschieden wir uns schließlich gegen die Übersetzung.

Stattdessen fanden wir heraus, dass Deutsch mittlerweile von der Lucene-Suche im Azure AI Search Index unterstützt wird, wenn man die Felder entsprechend konfiguriert. Folglich wählten wir diesen Weg und kombinierten ihn mit einer Anpassung in der Suchmethodik, wie im Folgenden beschrieben.

Semantische Suche

Standardmäßig werden bei RAG-Systemen sowohl die Anfrage als auch die in der Datenbank gespeicherten Dokumentschnipsel in numerische Vektoren (sogenannte Embeddings) umgewandelt. Das RAG-System sucht dann die für die Anfrage relevanten Schnipsel, indem es diejenigen Schnipsel-Vektoren mit der geringsten „Distanz“ zum Anfrage-Vektor identifiziert.

Wir haben uns gefragt, ob eine semantische Lucene-Suche in deutscher Sprache besser abschneiden würde als die Standard-Vektorsuche, da das standardisierte Embedding-Modell von OpenAI möglicherweise für unsere Dokumente und den Kontext nicht optimal sein könnte.

Diese Vermutung erwies sich als zutreffend und unser Experiment erzielte einen um sechs Prozentpunkte höheren RAGAS-Score als die Basisversion.

Fazit

Unsere Experimente haben gezeigt, dass es sich lohnen kann, je nach genauer Aufgabe und Kontext, Anpassungen an der Default-Konfiguration der vorhandenen Basis-RAG-Systeme durchzuführen. Mit der Kombination unserer Experimente konnten wir einen Anstieg im RAGAS-Score von gut zehn Prozentpunkten erzielen.

Wir bieten umfangreiche Unterstützung im Bereich Artificial Intelligence & Machine Learning an. Wenn Sie an einer Optimierung Ihrer Systeme oder an anderen AI- und ML-Projekten interessiert sind, stehen wir Ihnen gerne zur Verfügung.

Weitere Blogposts zum Thema