ki chat bots with large language models

Einen Multi-User Chatbot mit Langchain und Pinecone in Django/React erstellen

Die Entwicklung von Chatbots ist ein heißes Eisen, und seit der Veröffentlichung von ChatGPT gibt es eine große Anzahl von Chat-Anwendungen. Die Grundlage all dieser Anwendungen sind Large Language Models – der Motor des generativen KI-Zugs. Aber dieses Biest muss gezähmt werden – und das ist nicht immer eine leichte Aufgabe.

Da LLMs mittlerweile ein so wichtiger Bestandteil des Puzzles sind, gibt es einige Herausforderungen, die wir bewältigen müssen, um unsere Chatbots produktiv zu machen:

  1. Fundament – Standardmäßig können LLMs Antworten geben, die nichts mit der objektiven Realität zu tun haben. Wir nennen diese Antworten „Halluzinationen“ – sie können real und sogar überzeugend erscheinen, aber sie können auch völlig falsch sein. Wir müssen uns einen Mechanismus ausdenken, der das Gespräch auf eine Quelle der Wahrheit stützt, der wir vertrauen können.
  2. Abfragelimits – Wenn wir vorhandenes Wissen mit dem Kontext kombinieren, stoßen wir oft an die Abfragelimits, die vom LLM-Anbieter (z. B. OpenAI) festgelegt wurden.
  3. Konversationsspeicher – LLMs sind zustandslos, das heißt, sie haben kein Konzept für einen Speicher. Das bedeutet, dass sie die Konversationskette nicht eigenständig aufrechterhalten. Das kann dazu führen, dass sich die Konversation für die Nutzer ziemlich frustrierend anfühlt. Wir müssen einen Mechanismus entwickeln, der den Gesprächsverlauf aufrechterhält, der Teil des Kontexts für jede Antwort ist, die wir vom Chatbot zurückbekommen.
  4. Mehrere Nutzer – Unser Chatbot könnte mit mehreren Nutzern in Echtzeit interagieren. Das bedeutet, dass wir für jede Konversation einen eigenen Gesprächsspeicher und Kontext benötigen.
    Es gibt eine Reihe von Tools, die speziell dafür entwickelt wurden, Entwicklern die Arbeit mit LLMs bei der Erstellung von Conversational Agents zu erleichtern. Das wohl bekannteste dieser Tools ist Langchain. Es ermöglicht uns, verschiedene Arten von Abstraktionen zu definieren und mit ihnen zu interagieren, was den Aufbau leistungsstarker Chatbots erleichtert. Zusammen mit Pinecone können wir damit eine Wissensbasis aufbauen, mit der unser Bot interagieren und dem Nutzer kontextgenaue Informationen liefern kann.

In diesem Beispiel stellen wir uns vor, dass unser Chatbot Fragen über den Inhalt einer Website beantworten muss. Dazu brauchen wir eine Möglichkeit, diese Informationen zu speichern und darauf zuzugreifen, wenn der Chatbot seine Antwort erstellt. An dieser Stelle kommt die Wissensdatenbank ins Spiel. Die Wissensdatenbank ist eine Sammlung von Informationen, die von unserem Chatbot abgefragt werden können. Wir müssen auf diese Informationen semantisch zugreifen und werden einen LLM verwenden, um Einbettungen für unsere Textdaten zu erhalten und sie in Pinecone zu speichern. Die Textdaten stammen in unserem Fall von einer Website, die wir regelmäßig crawlen werden. Nachdem wir unseren Index erstellt haben, kann unser Chatbot seine Antworten auf die relevanten Inhalte zu den Fragen des Nutzers stützen.

Architektur

Hier ist die Architektur unseres Chatbots auf einer sehr hohen Ebene:

Chatbot

 

Es gibt drei Hauptkomponenten: Der Chatbot, der Indexer und der Pinecone-Index.

  • Der Indexer durchforstet die Quelle der Wahrheit, erzeugt Vektoreinbettungen für die gefundenen Dokumente und schreibt diese Einbettungen in Pinecone
  • Ein Nutzer stellt eine Anfrage an den Chatbot
  • Der Chatbot fragt Pinecone nach der Quelle der Wahrheit ab
  • Der Chatbot antwortet dem Nutzer.

 

Werfen wir einen genaueren Blick auf den Indexer:

 

Indexer-Architektur-Diagramm

Die Aufgabe des Indexers ist es, unsere Wahrheitsquelle zu crawlen, den Anbieter des Einbettungsmodells aufzurufen, um Einbettungen für jedes Dokument zu erzeugen, und diese Dokumente dann in Pinecone zu indexieren. Ein wichtiges Detail an dieser Stelle ist, dass die Qualität der Daten, die wir von unserem Crawler erhalten, sich direkt auf die Qualität der Ergebnisse auswirkt, die unser Chatbot produziert. Deshalb ist es wichtig, dass unser Crawler in der Lage ist, die Daten aus unserer Wahrheitsquelle so gut wie möglich zu bereinigen.

Als Nächstes sehen wir uns unseren Chatbot selbst an:

Chatbot-Architektur-Diagramm

  1. Wenn der Nutzer eine Eingabeaufforderung sendet, leiten wir sie an den Inquiry Builder weiter, der eine Anfrage erstellt, die auf dem Gesprächsverlauf basiert. So stellen wir sicher, dass unsere nachgelagerten Abfragen die Fragen berücksichtigen, die der Nutzer bereits gestellt hat. Wenn der Nutzer zum Beispiel gefragt hat: „Wo kann ich einen Computer kaufen?“ und dann „Wie viel wird er kosten?“, weiß der Anfrageersteller, wie er die Absicht des Nutzers interpretieren muss, indem er die letzte Anfrage „Wie viel wird der Computer kosten?“ formuliert.
  2. Jedes Mal, wenn eine neue Anfrage erstellt wird, speichern wir sie in unserem Gesprächsprotokoll.
  3. Wenn eine Anfrage gelöst ist, wird sie verwendet, um den Pinecone-Index abzufragen, der mit Dokumenten gefüllt ist, die von unserem Indexer eingefügt wurden. Dies führt zu einer Reihe von potenziellen Treffern, zu denen jeweils ein entsprechendes Dokument aus unserer Wahrheitsquelle gehört.
  4. Da diese Dokumente höchstwahrscheinlich sehr lang sind, verwenden wir eine Zusammenfassungskette, um lange Dokumente zusammenzufassen und eine endgültige Zusammenfassung zu erstellen, aus der wir die endgültige Antwort zusammensetzen. Der Summarizer kennt die Anfrage und versucht, so viele relevante Informationen wie möglich für diese Anfrage zu erhalten.
  5. Schließlich kombiniert unsere QnA-Kette das zusammengefasste Dokument, den Konversationsverlauf und die Anfrage, um eine endgültige Antwort auf die Frage des Nutzers zu erstellen.
    Wir müssen uns noch mit unserer Multi-User-Strategie befassen: Wir müssen sicherstellen, dass die Nutzer, die mit unserem Chatbot interagieren, sich nicht gegenseitig ihre Gesprächsspeicher verunreinigen und dass die Antworten vom Chatbot an den Nutzer zurückgesendet werden, der die Unterhaltung begonnen hat.

Diagramm der Multi-User-Architektur

Da wir nicht für jeden Nutzer, der sich mit unserem Chatbot verbindet, eine Authentifizierung verlangen, werden wir eine eindeutige ID (oder einen „Fingerabdruck“) festlegen, mit der wir die Nutzer anhand ihres Browsers identifizieren können. Unser Chatbot wird diese eindeutige ID verwenden, um den Gesprächsverlauf jedes Nutzers zu speichern und ihn so von den anderen Nutzern zu unterscheiden. Außerdem nutzt er die ID, um die Antworten unseres Chatbots über einen eindeutigen (und robusten) Streaming-Kanal zurückzusenden.

 

 

Comments are closed

e-laborat - © seit 2000 - Webagentur Berlin mit ♥