Mit den eigenen Dokumenten sprechen? Passenden Antworten wie in dem Film Ironman mit J.A.R.V.I.S. erhalten? Alles Science-Fiction?
Nicht mehr!
Mit Large Language Modellen (LLMs) ist es jetzt möglich Menschen-Ähnliche Gespräche zu führen. Und das beste auch direkt über die eigenen Daten. In diesem Blogpost schauen wir uns das mal genauer an. Und heute gibt es auch mal einige Emoticons (weil ich die einfach klasse finde)
Dies ist eine beispiellose Innovation, die Chatbots vor 2024 überflüssig gemacht hat. Tatsächlich haben wir mit Systemen wie ChatGPT deutliche Verbesserungen erlebt, wie verbesserte sprachliche Fähigkeiten (einschließlich Grammatik, Syntax und Schreibstil), Gesprächsgedächtnis und ein umfangreiches Wissen über viele Themen.
Trotz dieser großartigen Funktionen haben diese Systeme jedoch ihre Grenzen, wenn es darum geht, Fragen zu sehr technischen Themen (wie im eigenen Unternehmen oder mit eigenen Dokumenten) zu beantworten, aktuelle Daten zu verarbeiten, die sie in der Trainingsphase nicht kennengelernt haben, oder auf private Dokumente zuzugreifen, zu denen sie normalerweise keinen Zugang haben.
Um dieses letzte Problem zu lösen, zeige ich Ihnen in diesem Beitrag, wie Sie einen personalisierten Chatbot entwickeln können, der sich mit Ihren Datenquellen verbindet und Fragen zu Ihrer internen Wissensdatenbank beantwortet. Wir werden uns die Gesamtarchitektur und die Bausteine ansehen und alles im Beispiel durchgehen.
Warum ist es wichtig einen eigenen Chatbot zu bauen? 🤔
Es geht immer im Präzision und um die damit verbundenen Produktivität!
Der Aufbau eines Frage-Antwort-Systems (QA) über interne Daten ist heutzutage für die meisten Unternehmen von großem Interesse, da dies unbestreitbare Vorteile bietet:
Genauigkeit: Wenn Sie den Bot so einstellen, dass er Antworten liefert, die sich ausschließlich auf die bereitgestellten Daten stützen, können Sie sicher sein, dass er keine Fehlinformationen verbreitet oder Dinge erfindet. Dies ist besonders wichtig, wenn Ihre Daten bereichsspezifisch sind. Stellen Sie sich vor, Sie haben eine Dartscheibe, bei der jeder Pfeil, der geworfen wird, exakt ins Zentrum trifft. Genau so präzise und zielgenau sollte Ihr QA-System mit Ihren internen Daten umgehen.
Produktivität: Die Interaktion mit einem QA-Chatbot macht die Informationsbeschaffung nahezu augenblicklich und spart den Nutzern erheblich Zeit und Aufwand. Es ist, als hätten Sie einen digitalen Assistenten, der blitzschnell die richtige Information aus einem riesigen Datenpool, ähnlich wie der perfekte Wurf auf eine Dartscheibe, herausfiltert.
Wartbarkeit: Wenn sich Ihre Wissensbasis im Laufe der Zeit vergrößert oder aktualisiert, können Sie dies während der Datenaufnahme berücksichtigen (mehr dazu weiter unten) und den Bot entsprechend aktualisieren. Es ist vergleichbar mit der Erweiterung eines Dartspiels, bei dem neue Elemente oder Herausforderungen hinzugefügt werden, um es interessant und relevant zu halten.
Erweiterbarkeit: Wenn Sie eine neue Datenquelle aufnehmen müssen (z.B. eine Datenbank mit PDF-Dateien oder einen Dump von E-Mails), ist dies so einfach wie das Konfigurieren eines neuen Dokumentenladers (weitere Details im Code-Abschnitt unten). Dies ist wie das Hinzufügen neuer Ziele auf Ihrer metaphorischen Dartscheibe – es erweitert die Bandbreite der Fragen, auf die Ihr System antworten kann.
Volle Kontrolle und Datenschutz: Wenn Sie Ihren personalisierten Chatbot mit Open-Source-LLMs (Large Language Models) und Vektor-Datenbanken erstellen und bereitstellen, können Sie ihn vollständig auf Ihrer Infrastruktur verwalten und Systemausfälle oder schlechte Service-Level-Agreements vermeiden. Es ist, als hätten Sie Ihre eigene Dartscheibe zu Hause, anstatt sich auf die Verfügbarkeit und Qualität einer öffentlichen Einrichtung verlassen zu müssen.
Die Architektur
Es gibt viele Möglichkeiten, ein benutzerdefiniertes Frage-Antwort-System (QA) über einen Satz von Dokumenten zu erstellen und zu gestalten.
In diesem Beitrag betrachten wir eine Architektur, die mehrere Komponenten kombiniert.
Um Ihnen zu helfen zu verstehen, wie die einzelnen Teile zusammengefügt werden, folgen wir Schritt für Schritt diesem Arbeitsablauf:
0 — Datensammlung
Beginnen Sie damit, die Daten aufzunehmen, die Ihre Wissensbasis repräsentieren. Diese können natürlich aus verschiedenen Quellen stammen: PDF-Dateien, E-Mails, Exporte aus Confluence oder Notion, Webdaten usw.
1 — Vorverarbeitung der Dokumente
Sobald Ihre Dokumente gesammelt sind, teilen Sie sie in Abschnitte auf (mit oder ohne Überschneidungen). Dies ist besonders nützlich, um später Token-Limits, die von vielen großen Sprachmodellen (LLMs) beim Einbetten auferlegt werden, zu vermeiden.
In manchen Situationen ist es nötig unstrukturierte Dokumente zu verarbeiten. Das kann mit Hilfe von Einsatz von Natural Language Processing (NLP) zur automatischen Extraktion von relevantem Wissen aus unstrukturierten Texten durchgeführt werden. Dabei werden die unstrukturierten Daten verarbeitet.
2 — Einbettung der Dokumente
Verwenden Sie ein Einbettungsmodell aus einer Open-Source-Quelle (z. B. LLama2, Falcon) oder einen Dienst eines Drittanbieters (OpenAI, Cohere, Anthropic), um die zuvor erstellten Abschnitte in Vektoren umzuwandeln (auch bekannt als Einbettungen).
Schritte zur Einbettung:
1. Auswahl eines geeigneten Einbettungsmodells: Wählen Sie ein Einbettungsmodell basierend auf Ihren spezifischen Anforderungen. Jedes Modell hat seine eigenen Stärken und Einsatzbereiche, sei es hinsichtlich der Sprachverarbeitungskapazitäten oder der Art der Daten, mit denen es am besten umgehen kann.
2. Transformation der Textabschnitte: Verwandeln Sie die Textabschnitte in hochdimensionale Vektoren. Diese Vektoren repräsentieren die semantischen und syntaktischen Merkmale der Texte, ähnlich wie ein Dartscheibe verschiedene Punkte darstellt, die zusammen ein Gesamtbild ergeben.
3. Berücksichtigung der Modellgrenzen: Beachten Sie die Beschränkungen des gewählten Modells, wie z. B. Token-Limits. Stellen Sie sicher, dass Ihre Textabschnitte diese Grenzen nicht überschreiten, um eine effektive Verarbeitung zu gewährleisten.
4. Qualitätssicherung: Überprüfen Sie die Qualität der Einbettungen. Gute Einbettungen sollten den Inhalt und Kontext der Originaltexte genau wiedergeben. Führen Sie gegebenenfalls Anpassungen durch, um die Genauigkeit zu verbessern.
5. Speicherung der Vektoren: Speichern Sie die generierten Vektoren in einer Datenbank oder einem ähnlichen Speichersystem. Diese Vektoren werden später vom QA-System verwendet, um auf Benutzeranfragen zu reagieren.
6. Skalierbarkeit berücksichtigen: Stellen Sie sicher, dass Ihr Einbettungsprozess skalierbar ist, um mit der wachsenden Menge und Vielfalt Ihrer Daten umgehen zu können. Wie bei einem Dartscheiben-Set, das für verschiedene Spielniveaus angepasst werden kann, sollte auch Ihr System flexibel genug sein, um sich an veränderte Anforderungen anzupassen.
3 — Indexierung der Einbettungen in einer Vektordatenbank
Sobald die Einbettungen berechnet sind, speichern Sie sie in einer Vektordatenbank wie Chroma, Deeplake oder Pinecone.
Vektordatenbanken sind nützlich, um hochdimensionale Daten zu speichern und Vektorähnlichkeiten zu berechnen.
Schritte zur Indexierung in einer Vektordatenbank:
1. Auswahl der geeigneten Vektordatenbank: Wählen Sie eine Vektordatenbank, die Ihren spezifischen Anforderungen entspricht. Berücksichtigen Sie Faktoren wie Skalierbarkeit, Geschwindigkeit der Abfrageausführung und Integration in Ihre bestehende Infrastruktur.
2. Übertragung der Einbettungen in die Datenbank: Importieren Sie die erstellten Einbettungen in die ausgewählte Vektordatenbank. Stellen Sie sicher, dass die Datenstruktur und das Format mit den Anforderungen der Datenbank kompatibel sind.
3. Organisation und Strukturierung der Daten: Strukturieren Sie die Daten in der Vektordatenbank sinnvoll. Dies kann das Hinzufügen von Indizes, Tags oder anderen Metadaten umfassen, um die Suche und Abfrage zu vereinfachen.
4. Abfrageoptimierung: Optimieren Sie die Datenbank, um effiziente und schnelle Abfragen zu ermöglichen. Dies ist entscheidend, um die Leistung Ihres QA-Systems zu maximieren. Denken Sie an die Vektordatenbank wie an ein organisiertes Dartboard, auf dem Sie schnell und präzise auf den gewünschten Bereich zielen können.
5. Sicherstellung der Datenintegrität: Überwachen und warten Sie die Integrität Ihrer Daten regelmäßig. Stellen Sie sicher, dass die Einbettungen aktuell bleiben und die Datenbank korrekt funktioniert.
6. Implementierung von Ähnlichkeitssuchen: Nutzen Sie die Fähigkeiten Ihrer Vektordatenbank, um Ähnlichkeitssuchen durchzuführen. Diese Suchen ermöglichen es Ihrem QA-System, die relevantesten Einbettungen (und damit die relevantesten Dokumentenabschnitte) für eine gegebene Anfrage zu finden.
4 — Eine Frage stellen
Sobald die Dokumente eingebettet und in einer Vektordatenbank indiziert sind, können Sie Ihre Anfrage über eine Chat-Schnittstelle senden.
Schritte zum Stellen einer Frage:
1. Integration einer Chat-Schnittstelle: Richten Sie eine Benutzeroberfläche ein, die es den Benutzern ermöglicht, Fragen in natürlicher Sprache zu stellen. Diese Schnittstelle kann in bestehende Systeme wie Websites, interne Tools oder mobile Anwendungen integriert werden.
2. Formulierung der Anfrage: Benutzer stellen ihre Fragen in der Chat-Schnittstelle. Diese Fragen sollten klar und präzise formuliert sein, um die Genauigkeit der Antworten zu erhöhen.
3. Übertragung der Anfrage an das Backend: Die gestellte Frage wird vom Frontend an das Backend übertragen, wo sie verarbeitet wird. Dieser Schritt ist vergleichbar mit dem Werfen eines Darts auf eine Dartscheibe – der Pfeil repräsentiert die Anfrage und die Dartscheibe das QA-System.
4. Umwandlung der Anfrage in eine Einbettung: Im Backend wird die Anfrage in eine Einbettung umgewandelt, ähnlich wie die Dokumente zuvor. Dies ermöglicht es dem System, die Frage mit den eingebetteten Dokumenten in der Vektordatenbank zu vergleichen.
5. Suche nach der besten Antwort: Das System verwendet die Vektordatenbank, um die Einbettung der Anfrage mit den vorhandenen Dokumenteneinbettungen zu vergleichen. Es identifiziert die am besten passenden Dokumente oder Abschnitte, die potenzielle Antworten enthalten könnten.
6. Bereitstellung der Antwort: Die relevanteste Information wird extrahiert und dem Benutzer als Antwort über die Chat-Schnittstelle präsentiert. Dieser Schritt ist der “Treffer” auf der Dartscheibe, wo das Ziel erreicht wird – in diesem Fall die Bereitstellung einer genauen und nützlichen Antwort.
5 — Fragestellung des Users einbetten
Verwenden des selben Einbettungsmodells, um die Abfrage in einen Vektor umzuwandeln.
6 / 7 — Relevante Dokumente zur Anfrage finden
Verwenden Sie die Vektordatenbank, um die Dokumentenabschnitte zu finden, die Ihrer Anfrage am ähnlichsten sind. (Wie Sie vielleicht erwarten, wird das Ähnlichkeitsmaß über die Einbettungen berechnet).
Diese Abschnitte sind nicht die endgültige Antwort, die Sie suchen, aber sie stehen in Bezug dazu: Sie enthalten im Grunde Elemente der Antwort und bieten Kontext.
Schritte zur Identifizierung relevanter Dokumente:
1. Durchführung einer Ähnlichkeitssuche: Starten Sie in Ihrer Vektordatenbank eine Suche, um die Einbettungen zu finden, die der Einbettung Ihrer Anfrage am nächsten kommen. Dieser Schritt ist vergleichbar mit dem Verwenden eines Detektors, um die relevantesten Bereiche auf einer Dartscheibe zu identifizieren.
2. Auswahl der relevantesten Abschnitte: Basierend auf den Ähnlichkeitswerten wählen Sie die Dokumentenabschnitte aus, die am wahrscheinlichsten nützliche Informationen für die Beantwortung der Anfrage enthalten. Diese Abschnitte sind wie die am dichtesten beieinander liegenden Punkte auf der Dartscheibe, die auf eine hohe Treffergenauigkeit hinweisen.
3. Bewertung der Kontextrelevanz: Bewerten Sie, wie relevant jeder ausgewählte Abschnitt im Kontext der gestellten Frage ist. Dies erfordert möglicherweise ein tieferes Verständnis der Inhalte und wie sie sich auf die Anfrage beziehen.
4. Extraktion von Schlüsselinformationen: Extrahieren Sie wichtige Informationen aus den relevanten Abschnitten. Diese Informationen stellen die Bausteine der endgültigen Antwort dar, ähnlich wie die einzelnen Pfeile, die auf der Dartscheibe landen und zum Gesamtergebnis beitragen.
5. Zusammenstellung einer zusammenhängenden Antwort: Kombinieren Sie die extrahierten Informationen zu einer kohärenten und umfassenden Antwort. Dies kann eine Synthese verschiedener Informationsquellen erfordern, um eine vollständige und genaue Antwort zu bieten.
6. Überprüfung auf Vollständigkeit und Genauigkeit: Stellen Sie sicher, dass die zusammengestellte Antwort vollständig und genau ist und den Kern der gestellten Frage trifft. Dies ist wie das Überprüfen, ob alle geworfenen Pfeile die richtigen Bereiche der Dartscheibe getroffen haben, um ein zufriedenstellendes Ergebnis zu erzielen.
8 — Erstellen eines Prompts
Verwenden Sie die zuvor extrahierten ähnlichen Dokumente als Kontext in einem Prompt.
Dieser Prompt hat die folgende Struktur, kann aber angepasst werden, um Ihren spezifischen Anforderungen gerecht zu werden:
Beantworte die folgende Frage {Frage}
Verwende nur diesen Kontext, um die Antwort zu konstruieren: %KONTEXT% {Kontext}
Schritte zur Erstellung des Prompts:
1. Formulierung der Frage: Beginnen Sie den Prompt mit einer klaren Formulierung der Benutzeranfrage. Diese sollte so präzise wie möglich sein, um dem Modell die richtige Richtung zu geben. Zum Beispiel: “Beantworte die folgende Frage: Wie verbessert man die Effizienz in automatisierten Produktionsprozessen?”
2. Einbindung des Kontexts: Fügen Sie den zuvor extrahierten Kontext direkt in den Prompt ein. Dieser Kontext sollte die relevanten Informationen aus den ähnlichsten Dokumentenabschnitten enthalten, die zur Beantwortung der Frage beitragen können.
3. Kennzeichnung des Kontextbereichs: Verwenden Sie eine klare Kennzeichnung, um den Bereich des Kontexts im Prompt zu definieren. Sie könnten beispielsweise %KONTEXT% vor und nach dem tatsächlichen Kontext setzen, um dem Modell deutlich zu machen, wo der Kontext beginnt und endet.
4. Anpassung des Prompts: Passen Sie das Format des Prompts an Ihre spezifischen Bedürfnisse an. Berücksichtigen Sie dabei die Art der Frage, die Länge des Kontexts und die erwartete Antwortform.
5. Überprüfung der Klarheit und Relevanz: Stellen Sie sicher, dass der Prompt klar und relevant ist. Der Kontext sollte eng mit der Frage verknüpft sein und Informationen enthalten, die zur Erstellung einer präzisen Antwort beitragen.
6. Einsatz in Ihrem QA-System: Verwenden Sie den erstellten Prompt in Ihrem QA-System, um Antworten auf Benutzeranfragen zu generieren. Das System wird den Prompt verwenden, um die relevanten Informationen im Kontext zu analysieren und eine zusammenhängende Antwort zu formulieren.
9 — Generieren der Antwort
Wenn der Prompt (die Frage) vom User gestellt wurde, wird diese an das LLM übergeben damit eine passende Antwort recherchiert werden kann.
Die gesamte Wissensmanagement KI Architektur
Hier noch die Übersicht über die gesamte Architektur.
Wie verwenden wir bei IT-P diese Architektur und was macht sie so besonders?
Der hier genutzte Ansatz ist der sogenannte RAG Ansatz. Retrieval-Augmented Generation ist https://blogs.nvidia.com/blog/what-is-retrieval-augmented-generation/