Abenteuer Chatbot

Text: Claudia Sistig Katharina Udemadu

Wie lassen sich die Inhalte einer Technischen Dokumentation mit Hilfe eines Chatbots Benutzern leichter zugänglich und erfassbar machen? Dieser Artikel beschreibt die Schritte zum eigenen Chatbot sowie eine Strategie für die regelmäßige Aktualisierung der Inhalte.

Inhaltsübersicht

Lesedauer: 12:00 Minuten

Die Suche nach Informationen in der Benutzerdokumentation komplexer Produkte kann selbst mit der besten Technischen Dokumentation eine Herausforderung und ungeliebte Pflichtaufgabe für Anwenderinnen und Anwender sein. Das trifft auch auf die Softwaredokumentation zu, zum Beispiel der Compart GmbH, Böblingen. Aus diesem Grund hat sich das Unternehmen für die Entwicklung eines Doku-Chatbots entschieden.

Als Spezialist für Software im Bereich Kundenkommunikation bietet die Compart GmbH maßgeschneiderte Omnichannel-Kommunikationslösungen für unterschiedliche Zielgruppen, inklusive einer umfassenden Produktdokumentation. Monatlich werden rund 112 Dokumente in den Kernsprachen Deutsch, Englisch und Französisch veröffentlicht. Darüber hinaus werden Dokumentationen für weitere Produkte in längeren Intervallen publiziert, meist alle drei bis sechs Monate. Viele dieser Dokumente sind sehr umfangreich.

Das Hauptziel des Doku-Chatbots bestand daher von Anfang an darin, sowohl internen als auch externen Benutzern den Zugang zur Dokumentation zu erleichtern. Benutzer können in natürlicher Sprache Fragen zu den Produkten formulieren. Der Chatbot durchsucht die hinterlegten Dokumente und beantwortet die Fragen dann auf Grundlage der Benutzerdokumentation. Aber wie kann die Benutzerdokumentation als Datenquelle mit dem Chatbot verknüpft werden?

Option 1: Modell trainieren

Eine Option wäre, ein eigenes Modell anhand der vorhandenen Dokumentation zu trainieren. Auf dem Weg zum eigenen KI-Modell gibt es gerade für Unternehmen mittlerer Größe, wie Compart, allerdings einige Hindernisse. So stellen nicht nur die Bereitstellung der benötigten Hardware und der Ausgleich der initialen und fortlaufenden Kosten, sondern nicht zuletzt auch der Zeitaufwand und die speziellen Anforderungen an die Datenaufbereitung gewaltige Herausforderungen dar. Daher wurde der Aufbau eines eigenen KI-Modells als Option ausgeschlossen.

Option 2: vorhandenes Modell

Eine weitere Möglichkeit wäre der Feinschliff eines vorhandenen Modells. OpenAI bietet das „Fine-Tunen“ eines GPT-Modells als zusätzliche Leistung an (Inf. 01). [1]

Da der Doku-Chatbot das Ziel hat, die Benutzerdokumentation als einzige Grundlage für die generierten Antworten zu verwenden, wäre das Fine-Tunen für unseren Zweck nicht zielführend. Schließlich würden die Antworten des Chatbots auf Grundlage aller verfügbaren Daten aus dem Training und dem Fine-Tunen generiert. Wenn der Benutzer also fragt, welchen Port ein bestimmtes Produkt verwendet, kann die Antwort auch auf Grundlage von „Fremdinformationen“ erzeugt werden, die beim Training verwendet wurden. Darüber hinaus müsste das aufwendige Fine-Tunen des Modells für jede Aktualisierung der Benutzerdokumentation wiederholt werden. Dieser Lösungsweg kommt daher nicht infrage.

Was bedeutet Fine-Tunen?

Ein großes Sprachmodell (Large Language Modell oder LLM) wird auf Grundlage einer riesigen Datenmenge trainiert. Durch das Fine-Tunen kann das Modell anschließend auf einer kleineren, spezifischen Datenmenge nachtrainiert werden, um es für bestimmte Aufgaben oder Stilrichtungen zu optimieren. Beim Fine-Tunen handelt es sich also um eine Verfeinerung des bereits vorhandenen „Wissens“ des Modells.

Inf. 01

Option 3: Kontextinformationen

Als dritte Option bleibt das Prompt-Engineering, bei dem der gewünschte Kontext (hier die Compart Benutzerdokumentation) in den Prompts bereitgestellt wird. Das GPT-Modell kann allerdings nur eine beschränkte Anzahl an Wörtern (bzw. Token, Inf. 01) im Prompt verarbeiten. Dies macht es unmöglich, dem Modell den gesamten Kontext (die gesamte Benutzerdokumentation) im Prompt bereitzustellen.

Da sich die Preisgestaltung von OpenAI an der Anzahl der Token orientiert, wäre dieses Vorgehen zudem teuer. So entstand die Idee, einen Algorithmus zu nutzen, um die Benutzerdokumentation zu durchsuchen und nur die (für die Anfrage des Benutzers) relevanten Informationen herauszufiltern. Diese Informationen sollten dann zusammen mit der Texteingabe (Frage) des Benutzers an das GPT-Modell weitergegeben werden. Genau diese Funktion bietet „LlamaIndex“ an, ein Daten-Framework. Es erlaubt das Verknüpfen benutzerdefinierter Datenquellen mit großen Sprachmodellen (LLMs).

Ansatz für die Implementierung

Für die Implementierung wurde eine Kombination aus unterschiedlichen Frameworks ausgewählt. Die relevanten Auszüge aus der Technischen Dokumentation werden mit Hilfe von LlamaIndex als Kontextinformation an das OpenAI Modell geliefert. Als zusätzliches Framework wird „LangChain“ für das Prompt-Engineering verwendet. Neben dem OpenAI Sprachmodell und den beiden Frameworks wird „Gradio“ eingesetzt, um die Benutzeroberfläche zu erstellen. Abbildung 01 zeigt eine Übersicht des Modells.

Übersicht über Ablauf und Elemente der Kommunikation im Doku-Chatbot.
Abb. 01 Kommunikationsdiagramm für den Doku-Chatbot. Quelle Claudia Sistig.

Realisierung der Idee

Vor der eigentlichen Implementierung mussten die Voraussetzungen geklärt werden, etwa zu den Nutzungsbedingungen. Nur registrierte API-Kunden haben bei OpenAI im Kundenbereich die Möglichkeit, einen API-Schlüssel zu generieren. Der API-Schlüssel erlaubt den Zugriff auf die API-Funktionen des gewünschten Modells. Daher musste Compart zunächst ein OpenAI-Abonnement abschließen, bevor ein gültiger OpenAI API-Schlüssel generiert werden konnte. Der API-Schlüssel wird in den Skripten angegeben, um die Funktionen der GPT-Modelle von OpenAI nutzen zu können.

Eine weitere Voraussetzung bestand in der Auswahl der Technischen Dokumentation. Um sicherzustellen, dass keine internen Informationen oder unfertige Versionen der Dokumentation durch den Chatbot zugänglich gemacht werden, wurde entschieden, nur die zuletzt veröffentlichten Versionen der Benutzerdokumentation als Grundlage für den Index zu verwenden. Diese Dokumentationen liegen als PDF-Dokumente oder im HTML-Format vor.

Bei der Implementierung des Chatbots wurde anfangs auf öffentlich zugängliche Skripte aus dem Internet zurückgegriffen. Die Idee war, die Skripte nur an die speziellen Anforderungen von Compart anzupassen. Der Ansatz stieß allerdings schnell an seine Grenzen. Einige Skripte konnten nur Textdateien („TXT“) verarbeiten. Andere hatten bereits bekannte Probleme, für die es noch keine Lösungen gab. Da sich die verfügbaren Skripte als problematisch erwiesen, fiel die Entscheidung auf eigene, von Grund auf neue Skripte im Python-Format.

Für den Compart Arbeitsablauf werden drei Skripte verwendet.

Die Skripte im Detail

Das erste Skript (Abb. 02) lädt Dokumente aus einem angegebenen Verzeichnis (dem Eingabeverzeichnis) und verwendet LlamaIndex, um die Eingabedokumente zu indexieren. Die Indexdaten werden anschließend im angegebenen Indexverzeichnis gespeichert.

Auszug aus einem Python-Skript.
Abb. 02 Python-Skript "CreateIndex.py". Quelle Clauda Sistig

Dazu importiert das Skript zunächst einige Pakete (Bibliotheken), die in den nachfolgenden Abschnitten verwendet werden. Das Paket „ChatOpenAI“ ermöglicht die Interaktion mit dem OpenAI Modell. Die importierten Klassen und Funktionen aus „llama_index“ sind für das Arbeiten mit Indexierungen und Vorhersagen des „langchain LLM“-Systems erforderlich. Das Standard-Python-Modul „os“ unterstützt das Setzen einer Umgebungsvariable. Dieser Variablen wird der API-Schlüssel für OpenAI als Wert zugewiesen.

Anschließend wird die Funktion „index_documents“ definiert. Diese Funktion wird verwendet, um die Eingabedaten (Dokumente) zu laden und zu indexieren. Bei der Indexierung wandelt LlamaIndex die Inhalte der Benutzerdokumentation in einen Vektor-Index um. Dieser kann schnell nach Ähnlichkeiten durchsucht werden.

Der Prompt-Parameter „max_input_size“ legt die maximale Anzahl von Token fest, die im Eingabetext für das Modell erlaubt sind. Der Parameter „num_outputs“ gibt die Anzahl der vom Modell zu generierenden Ausgabe-Token an und bestimmt damit die Länge der vom Chatbot zurückgelieferten Antwort.

Der Parameter „max_chunk_overlap“ regelt die maximal zulässige Überschneidung zwischen aufeinanderfolgenden Textabschnitten, auch Chunks genannt. Wenn der Eingabetext die im Parameter „max_input_size“ angegebene Anzahl von Token überschreitet, wird er in mehrere Chunks aufgeteilt, die separat verarbeitet werden. Der Wert 0.2 bedeutet, dass es zwischen aufein­anderfolgenden Chunks eine Überschneidung von bis zu 20 Token geben kann. Auf diese Weise kann das Modell auch dann kohärente Antworten generieren, wenn der Eingabetext in einzelne Chunks aufgeteilt wird. Der Parameter „chunk_size_limit“ legt die maximale Größe für die einzelnen Chunks fest. Der hier verwendete Wert von 600 stellt sicher, dass die Größe der Chunks die Verarbeitungsgrenzen des Modells nicht überschreitet.

Nach der Parameter-Konfiguration wird eine Instanz der PromptHelper-Klasse erstellt, um die Parameterwerte für die Prompt-Konfiguration zu verwenden. Anschließend kommt eine Instanz der LLMPredictor-Klasse zum Einsatz, um die Einstellungen für das OpenAI Chat-Modell zu definieren. Der Parameter „temperature“ legt fest, wie deterministisch die generierten Antworten sein sollen. Standardmäßig sind OpenAI-Modelle nicht-deterministisch. Daher können identische Eingaben (Fragen des Anwenders) unterschiedliche Ausgaben (Antworten des Chatbots) erzeugen. Der Parameter „temperature“ mit dem Wert 0 legt fest, dass die generierten Antworten größtenteils deterministisch sein sollen. Damit werden möglichst reproduzierbare Resultate erzielt. Es kann aber dennoch zu geringen Abweichungen in den generierten Antworten kommen.

Anschließend werden Dokumente aus dem übergebenen Verzeichnis „folder“ gelesen. Die geladenen Dokumentdaten werden in der Variable „documents“ gespeichert. Mithilfe der Klasse „GPTVectorStoreIndex“ entsteht anschließend ein Index auf Basis der geladenen Dokumente. Das Index­objekt wird in der Variable „index“ gespeichert. Das generierte Indexobjekt wird in einem bestimmten Verzeichnis gespeichert. Das Verzeichnis gibt der Parameter „persist_dir“ an. In der letzten Zeile des Skripts wird die „index_documents“-Funktion aufgerufen und das Verzeichnis mit den zu indexierenden Eingabedokumenten als Argument übergeben.

Das zweite und dritte Skript

Das zweite Skript (Abb. 03) definiert eine Funktion namens „query_with_index“. Innerhalb dieser Funktion wird zunächst auf das Verzeichnis zugegriffen, in dem die Indexdateien gespeichert sind. Anschließend wird die Funktion „load_index_from_storage“ verwendet, um das gespeicherte Indexobjekt zu laden. Schließlich wird eine Abfrage-Engine erstellt, der die Frage als Argument „query_str“ übergeben wird. Das Ergebnis der Abfrage wird als Zeichenkette gespeichert und zurückgeliefert.

Auszug aus einem Python-Skript.
Abb. 03 Pyhton-Skript "LoadIndex.py". Quelle Claudia Sistig

Das dritte Skript (Abb. 04) konzentriert sich auf die Erstellung der Benutzeroberfläche. Wenn ein Benutzer eine Frage an den Chatbot richtet, wird die „query_with_index“-Funktion aus dem Skript „LoadIndex.py“ aufgerufen, um eine Abfrage an den Index zu richten und die Antwort zu erhalten. Die Antwort wird dann im Chatbot-Feld der Benutzeroberfläche angezeigt. Das Skript verwendet das Gradio-Framework, um die Benutzeroberfläche zu erstellen und die Interaktionen zu verwalten.

Auszug aus einem Python-Skript.
Abb. 04 Python-Skript "Skript chatBotUI.py". Quelle Claudia Sistig

Die importierte Funktion „query_with_index“ aus dem Skript „LoadIndex.py“ richtet eine Abfrage an den Index und liefert das Ergebnis zurück. Im Anschluss wird das Aussehen und Verhalten der Benutzeroberfläche für den Chatbot definiert. Dazu wird zunächst ein vordefiniertes Thema ausgewählt, das für das Design der Elemente verwendet werden soll. Alternativ können für jedes einzelne Element benutzerdefinierte Farbwerte angegeben werden. Anschließend werden innerhalb des „block“-Objekts unterschiedliche GUI-Elemente erstellt, darunter ein Chatbot-Feld, ein Textfeld für Benutzernachrichten und eine Schaltfläche zum Löschen des Chatverlaufs.

Zum Verwalten der Benutzeraktionen werden drei Funktionen definiert:

  • Die Funktion „user“ nimmt die Texteingabe eines Benutzers entgegen und trägt sie in die Chat-Historie ein.
  • Die Funktion „bot“ liest die Benutzernachricht aus der Chat- Historie und ruft mit dieser Nachricht die Funktion „query_with_index“ auf, die den Index durchsucht und eine Antwort liefert. Die zurückgelieferte Antwort wird im Chatbot-Feld angezeigt. Dabei wird die Antwort Zeichen für Zeichen in die „history“-Liste eingefügt, als ob der Bot tatsächlich in Echtzeit schreiben würde. So bekommt der Benutzer schneller eine Rückmeldung.
  • Die Funktion „clear“ löscht den Chat-Verlauf.

Probleme bei der Implementierung

Zu Beginn des Projekts lautete das Ziel, einen allgemeinen Chatbot für die gesamte Produktdokumentation zu entwickeln. Allerdings zeigten die ersten Praxistests, dass die Antwortzeiten des Chatbots über einer Minute lagen. Das war für den praktischen Einsatz im Arbeitsumfeld deutlich zu langsam. Als Lösung für dieses Problem beschloss man, statt eines universellen Chatbots vier spezialisierte Chatbots zu entwickeln. Jeder deckt einen der großen Themenbereiche von Compart ab. Durch diese Aufteilung konnte die effektive Reaktionszeit auf 20 bis 30 Sekunden verkürzt werden.

Eine weitere Schwierigkeit während der Entwicklung stellten die Vorabversionen von LlamaIndex (in der aktuellen Version 0.8.x) und LangChain (derzeit in Version 0.0.3xx) dar. Da die Entwicklung kontinuierlich voranschreitet, änderten sich die Bezeichnungen und Datenstrukturen verfügbarer Variablen sowie die unterstützten Methoden und deren Parameter oft sogar wöchentlich. Dies führte dazu, dass umfangreiche Recherchen erforderlich wurden, um die Funktionsfähigkeit des Chatbots sicherzustellen.

Kurz zusammengefasst

Die aktuell implementierte Chatbot-Lösung besteht aus vier separaten Chatbots, die jeweils einen der vier großen Compart-Themenbereiche abdecken. Dieses Design ermöglicht eine effiziente Interaktion mit den Nutzern in möglichst kurzer Zeit. Ein Beispiel zeigt der Screenshot (Abb. 05).

Screenshot eines Dialogs mit dem Doku-Chatbot.
Abb. 05 Dialog des Chatbots mit dem Nutzer. Quelle Claudia Sistig.

Die Datengrundlage des Chatbots wird monatlich aktualisiert. So ist sichergestellt, dass die Informationsbasis des Chatbots stets auf dem neuesten Stand ist. Durch die Aktualisierung lässt sich auch die Richtigkeit und Vollständigkeit der verwendeten Daten gewährleisten. Bei der Aktualisierung werden die Indizes erneuert und ausschließlich die zuletzt offiziell veröffentlichten Dokumentationen integriert.

Die Update-Funktion von LlamaIndex kann nur die Dokumente innerhalb eines Index aktualisieren, deren Inhalt sich geändert hat. Die Möglichkeit, den einmal erstellten Index zu aktualisieren, erschien anfangs sehr interessant, da die Aktualisierung weniger Zeit und Token erfordert als die Neuerstellung des Index. In der Praxis hat sich jedoch gezeigt, dass die Aktualisierung der Compart-Benutzerdokumentation alle Dokumente im Index betrifft. Etwa weil sich einige Elemente wie die Liste der Änderungen, die Versionsnummern, aber auch die verwendete Terminologie immer von der Vorgängerversion unterscheiden. Nach eingehenden Tests wurde daher festgestellt, dass das Aktualisieren des Index keinen signifikanten Vorteil hinsichtlich der Token- oder Zeitersparnis gegenüber der Neuerstellung des Index bietet. Daher wird jeden Monat ein neuer Index erstellt.

Ein weiterer wichtiger Aspekt der Lösung ist die Kostenkontrolle. Durch die Nutzung der OpenAI-Oberfläche ist es möglich, den Verbrauch und die damit verbundenen Kosten kontinuierlich zu überwachen. Der „Usage“-Bereich der Oberfläche bietet detaillierte Einblicke in die Verwendungsmuster und die angefallenen Kosten.

Monatlich ein neuer Index

Für die inhaltliche Aktualisierung der Chatbots wurde ein monatlicher Update-Workflow etabliert. Die Inhalte für alle vier Doku-Chatbots werden über konfigurierbare Skripte in den jeweils aktuellen Versionen in Verzeichnisse zur Aktualisierung der Chatbots gesammelt. Anschließend erhalten alle Chatbots die aktuellen Inhalte.

Der monatliche Rhythmus gewährleistet, dass die Chatbots jeweils auch die neuesten Informationen zu den Produktgruppen bereitstellen. Gleichzeitig wird die Aktualisierung eines einzelnen Chatbots unmittelbar nach einem Produktrelease vermieden.

Umfangreiches Testprogramm

Momentan sind die Chatbots noch nicht für Kunden freigegeben. Vor der Veröffentlichung werden sie zunächst intern in mehreren Phasen durch unterschiedliche interne Zielgruppen getestet:

  • Technische Redaktion
  • Test
  • Entwicklung und Support
  • alle Interessierten

Neben dem Zugriffslink bekommen alle Teilnehmenden erste Informationen über die Chatbots und eine kurze Einführung in das Erstellen von Prompts. Die Rückmeldungen zu weiteren Anforderungen und Wünschen aus jeder Testphase werden gesammelt und analysiert. So lassen sich Möglichkeiten zur weiteren Optimierung der Chatbots und der enthaltenen Inhalte identifizieren.

Erfahrungswerte und Perspektive

Die Planung, Entwicklung und Implementierung der Doku-Chatbots repräsentiert bei Compart einen neuen Ansatz, um internen und externen Benutzern einen schnellen, komfortablen und gewohnt zuverlässigen Zugang zu dokumentierten Informationen zu ermöglichen. Nach intensiven Tests entstand eine Strategie, die Indizes auf Grundlage der jeweils zuletzt veröffentlichten Dokumentationsversionen monatlich neu zu generieren. Das stellt sicher, dass die Informationen auf dem neuesten Stand sind.

Die Chatbots zeigen, dass sie zuverlässig fachlich korrekte Informationen auf Fragen zu den Dokumentationsinhalten liefern. Nach Abschluss der internen Testphase werden die Chatbots sicherlich dazu beitragen, den Arbeitsalltag der Benutzer zu vereinfachen. Darüber hinaus zeigen die Chatbots auch dann eine hohe Nutzerfreundlichkeit und Zuverlässigkeit, wenn Fragen gestellt werden, die sich nicht auf den Dokumentationsinhalt beziehen. Statt irreführende Informationen zu liefern, reagieren die Chatbots mit Antworten wie „Diese Frage kann ich auf Grundlage des Kontexts nicht beantworten“ – was die Verlässlichkeit des Systems auch für die Benutzer sichtbar macht.

Die ersten Rückmeldungen der Tester sind positiv, was das Potenzial dieser Technik untermauert. Dennoch bleibt die Kostenfrage ein wichtiger Gesichtspunkt. Durch jeden Aufruf des Chatbots entstehen Kosten. Diese Situation führt zu einer kritischen Betrachtung der Wirtschaftlichkeit des Systems. Deswegen wird bereits über Alternativen nachgedacht, beispielsweise über die Verwendung eines „Open-Source LLM“ (Large Language Model) oder die Implementierung von „localGPT“. So lässt sich eine kosteneffizientere Lösung finden, die die Vorteile der Chatbots aufrechterhält.

Die rasante Entwicklung im Bereich der Künstlichen Intelligenz (KI) führt dazu, dass vorhandene Frameworks ständig aktualisiert und regelmäßig neue Tools und Lösungen entwickelt werden. Für den Doku-Chatbot bedeutet das, dass die aktuellen Entwicklungen ständig verfolgt werden müssen, um effizientere, kostengünstigere oder leistungsfähigere Alternativen zu identifizieren. Die vorhandene Lösung ist in dieser Hinsicht sehr flexibel. Sie sollte ständig überprüft und aktualisiert werden, um den Benutzerinnen und Benutzern auch langfristig ein optimales Erlebnis zu bieten und gleichzeitig die Wirtschaftlichkeit des Systems zu gewährleisten. Dies unterstreicht die Notwendigkeit einer agilen Entwicklungsstrategie. Mit ihr ist es möglich, schnell auf Neuerungen im Bereich der Künstlichen Intelligenz zu reagieren und die Doku-Chatbots kontinuierlich zu verbessern.

Link zum Beitrag

[1] https://openai.com/pricing

Außerdem

https://platform.openai.com/docs/models/gpt-3-5

https://www.gradio.app/docs/interface

https://api.python.langchain.com/en/latest/langchain_api_reference.html (aktualisiert am 28.02.2024)

https://gpt-index.readthedocs.io/en/latest/understanding/indexing/indexing.html

https://bootcamp.uxdesign.cc/a-step-by-step-guide-to-building-a-chatbot-based-on-your-own-documents-with-gpt-2d550534eea5

Eine Hand hält ein Smartphone, auf dessen Display ein Chatverlauf mit einem Chatbot.