Chatbots wie der beliebte ChatGPT verwenden große Sprachmodelle (LLMs - Large Language Models) wie GPT, um Antworten zu generieren. Dadurch können sie leicht unsere Fragen (prompts) beantworten, indem sie auf die Daten zurückgreifen, auf die sie trainiert wurden. Ich persönlich würde sie daher eher als digitale Enzyklopädien bezeichnen, die Informationen aus einem umfangreichen Wissensspeicher abrufen.
Tatsächlich sind sie sehr praktisch, wenn es darum geht, bei allem möglichen zu helfen - von der Generierung von Rezepten, der Planung von Reisen bis hin zur Lösung kniffliger mathematischer Probleme.
Die regelmäßige Verwendung von ChatGPT hat die Bedeutung der Erstellung unserer Anregungen hervorgehoben. Ein gut formulierter Prompt führt zu einer genaueren Antwort des LLMs. Mit dem richtigen Prompt kann man sogar Daten visualisieren und Diagramme erstellen lassen.
In unserem Prompting Kurs zeigen wir, wie professionelle Prompts erstellt werden: Mastering Chat-GPT. Erstellen von wirkungsvollen Prompts für bessere Interaktionen und zielorientierte Ergebnisse.
Diese einfachen Chatbots auf Basis von LLMs haben zwei Hauptnachteile:
Ich denke, es lohnt sich, das Hauptkonzept von RAG aus dem Abstract des Artikels [1] zu teilen, um ein klareres und umfassenderes Verständnis zu ermöglichen:
Large pre-trained language models have been shown to store factual knowledge in their parameters, and achieve state-of-the-art results when fine-tuned on downstream NLP tasks. However, their ability to access and precisely manipulate knowledge is still limited, and hence on knowledge-intensive tasks, their performance lags behind task-specific architectures.
Additionally, providing provenance for their decisions and updating their world knowledge remain open research problems.
Pre-trained models with a differentiable access mechanism to explicit non-parametric memory can overcome this issue, but have so far been only investigated for extractive downstream tasks.
We explore a general-purpose fine-tuning recipe for retrieval-augmented generation (RAG) — models which combine pre-trained parametric and non-parametric memory for language generation.
Jetzt, da wir eine allgemeine Vorstellung von den wichtigsten Aspekten von RAG-basierten Chatbots haben, sollten wir versuchen, einen zu erstellen und einzusetzen! Hierfür verwenden wir LangChain und Databutton.
Ein großes Dankeschön an Open-Source-Plattformen wie LangChain und LlamaIndex - sie haben die Orchestrierungsebene und die Integration mit LLMs durch ihre Tools immens vereinfacht.
Da unsere externen Datenquellen PDF-Dateien von Endbenutzern sind, sollten wir damit beginnen, einige Funktionen zum Einlesen dieser Daten zu schreiben. Wir analysieren jedes hochgeladene PDF, teilen den Text auf und erstellen eine Liste von Dokumenten. Beachten Sie: Wir stellen sicher, dass alle Informationen der Metadaten gut erhalten bleiben.
Natürlich können wir an dieser Stelle jede beliebige Daten- bzw. Wissensbasis für die Verwendung mit unserem Chatbot einbinden: unternehmensweite Sharepoint-Server, SQL- und noSQL Datenbanken, Web-APIs, Externe Dokumenten, Websites, etc.
Eine Vektordatenbank speichert und arbeitet nicht direkt mit Texten. Daher ist es wichtig, Texte in vektorisierter Form darzustellen. Dieser Schritt wird oft als Anwendung von Embeddings bezeichnet - dies erfasst die semantischen und kontextuellen Informationen der Daten. Wir verwenden das Python-Paket FAISS, um diesen Schritt durchzuführen. Die bewährte Methode besteht darin, Embeddings in einer Vektordatenbank zu speichern. Eine Vektordatenbank ist unglaublich leistungsstark und erleichtert die Arbeit mit vektorisierten Daten. Beliebte Vektor-Speicher sind Pinecone oder Weaviate.
Lassen Sie uns gleichzeitig den Frontend-Bereich aufbauen, in dem wir dem Endbenutzer normalerweise ermöglichen, eine beliebige PDF-Datei hochzuladen, sie zu indexieren und schließlich damit zu chatten! Als nächstes müssen wir eine Funktion schreiben, die eine Vektordatenbank basierend auf dem Inhalt der hochgeladenen PDF-Dateien erstellt, sie indiziert und als Sitzungszustand speichert. Ich empfehle jedoch dringend, eine Vektordatenbank zur Speicherung solcher Vektorembeddings zu verwenden.
Wann immer ein Prompt vom Endbenutzer eingeht, interagiert das System zuerst mit externen Datenbanken wie Vektordatenbanken, anstatt sie direkt über das LLM weiterzugeben. Daher ist es wichtig, einen gut formulierten individualisierten Prompt zu erstellen, der darauf ausgelegt ist, weiteren Kontext aufzunehmen (d.h. wir erweitern hier unsere Anregung)!
Als nächstes geben wir den Prompt und die verschiedenen Kontexte an das LLM zurück, um auf der Grundlage der Anfrage des Endbenutzers eine relevante Antwort zu generieren. Außerdem geben wir die generierten Antworten vom LLM weiter, um eine Chat-GPT-ähnliche Atmosphäre zu schaffen!
Herzlichen Glückwunsch! Gemeinsam haben wir einen Chatbot entwickelt, der mit RAG (Retrieval-Augmentation-Generation) verbessert wurde.
Kurz gesagt bestehen die Bausteine solcher RAG-basierten Chatbots typischerweise aus:
a) Abrufen von Daten aus vektorisierten Benutzerinformationen
b) Kontextbasierte Erweiterung von Prompts basierend auf den Anfragen der Endbenutzer
c) Generierung zuverlässigerer Antworten auf die Anfragen der Endbenutzer
Die Integration solcher RAG-basierten Ansätze für individualisierte LLM-basierte Produkte erhöht die Chance, kontexterreichere und präzisere Informationen zu erhalten und sicherzustellen, dass die Antworten auf spezifische Benutzeranfragen zugeschnitten sind. Insgesamt einfach eine bessere Chatbot-Erfahrung.
[1] https://arxiv.org/abs/2005.11401
images: Image by vectorjuice on Freepik