Technischer Ablauf

In diesem Artikel wird der technische Ablauf des Chatbots beschrieben und die Zusammenhänge erläutert. Der Chatbot folgt einem Ablauf, welches sich am Prinzip des RAG (Retrieval Augmented Generation) orientiert. Das Verständnis darüber, wie der Chatbot funktioniert, hilft dabei für diesen die optimalen Bedingungen zu schaffen.

Grundsätzlich besteht der Chatbot vereinfacht dargestellt aus drei Kern-Elementen, die miteinander agieren und für sich genommen optimal genutzt werden sollten, damit der Chatbot als Ganzes das bestmögliche Ergebnis liefern kann.

EGOCMS

Die Inhalte im EGOCMS stellen die Wissens-Basis dar. Dafür werden folgende Felder einer Seite verwendet:

  • Name
  • Titel
  • Kurzbeschreibung
  • Schlagwörter
  • Inhalt

Je genauer und ausführlicher die Informationen einer Seite beschrieben sind, desto besser kann die NLP (Natural Language Processing) Suche die relevanten Seiten finden.

NLP

Vereinfacht gesagt wandelt das NLP natürliche Sprache in "für Maschinen lesbare Sprache" um. Dabei wird das NLP an zwei Stellen im Zusammenhang mit dem Suchindex eingesetzt.

Indexierung

Bei der Indexierung wird der Text der relevanten Felder einer Seite in kleinere Teile (sogenannte Chunks) aufgeteilt.

Die Aufteilung in Chunks erfolgt alle 512 Multi-Bytes. Dabei wird bei jedem Chunk vorne und hinten zusätzlich 20% des Endes des vorherigen Chunks, bzw. des Anfangs des nächsten Chunks hinzugefügt (sogenanntes Overlapping). Das soll verhindern, dass Begriffe und Zusammenhänge abgeschnitten und später von der NLP Suche nicht gefunden werden können.

Diese Chunks werden über ein Model in Vektoren umgewandelt (sogenannte Embeddings), die jeweils eine Länge von 1024 haben (sogenannte Dimensionen). Diese Vektoren verwenden den Cosine Algorithmus, um Zahlen zwischen -1 und 1 zu liefern. Für die Berechnung wird das Model bge-m3 verwendet.

Im Elasticsearch Suchindex werden somit für jede Seite für jedes Feld und für jedes Chunk die Vektoren gespeichert.

Suche

Bei der Suche wird der gesamte Suchbegriff (bzw. Frage) ebenfalls in Vektoren umgewandelt. Dabei wird das selbe Model genutzt wie bei der Indexierung. Der Unterschied hier ist, dass der Suchbegriff in keine Chunks aufgeteilt werden muss.

Der eigentliche Suchbegriff wird vorher noch an das LLM (Large Language Model) gesendet und in ausführlicher Form umgeschrieben/erweitert (sogenanntes Rephrasing), so dass das LLM die optimale Fragestellung erhält (verbesserte Frage). Aber auch die Suche im Elasticsearch Suchindex profitiert vom Rephrasing.

Bei der Suche im Elasticsearch Suchindex werden nun die Vektoren des Suchbegriffs und die Vektoren allen Felder jeder Seite verglichen. Je näher diese Vektoren zueinander stehen, desto eher entsteht ein Suchtreffer (sogenanntes KNN, k-nearest neighbors). Dabei wird ebenfalls der Cosine Algorithmus verwendet, womit gilt:

  • 1: Maximale Übereinstimmung.
  • 0: Keine Übereinstimmung.
  • -1: Maximale Gegensätzlichkeit.

Die Suchanfrage an Elasticsearch setzt voraus, dass die einzelnen Felder mindestens eine Ähnlichkeit (sogenannte Similarity) von 0,5 besitzen müssen. Für das Feld, welches den Inhalt bereitstellt, wird mindestens eine Ähnlichkeit von 0,2 erwartet.

Zusätzlich werden für Name, Titel, Kurzbeschreibung und Schlagwörter nur jeweils die besten Treffer für die Auswertung verwendet. Nur für den Inhalt sind das die besten 10 Treffer, bzw. das maximal eingestellte Limit für die Suchergebnisse der Suchanfrage.

Die erhaltenen Suchtreffer beinhalten auch die Texte der Chunks, die beim Vergleich die beste Relevanz hatten. Dabei wird für jeden Text-Chunk die Chunks der vorigen und nächsten zwei Chunks hinzugefügt, um den gesamten Kontext des relevanten Text-Chunks zu erhöhen.

LLM

Die Suchtreffer werden als Quellen bezeichnet und die Texte der relevanten Chunks liefern den Kontext für das LLM. Dabei wird über einen umfangreichen Prompt eine Anfrage an das LLM gesendet, den abgegebenen Suchbegriff (bzw. Frage) auf Basis des angegebenen Kontexts zu beantworten.

Die Antwort des LLM wird als Stream erhalten und stückchenweise ausgegeben.

Folgend wird der technische Ablauf in Diagrammen veranschaulicht. Dabei wird in zwei Phasen unterschieden.

1. Phase: Inhalte in den Suchindex schreiben

Die EGOCMS Inhalte werden in den Suchindex geschrieben. Dabei werden die für das NLP relevanten Felder in Vektoren umgewandelt. Hierbei gilt, dass je nach Länge der Inhalte mehr oder weniger Chunks generiert werden.


	
		
	

2. Phase: Eine Frage stellen und eine Antwort erhalten

Wird eine Frage gestellt, wird diese zunächst über das LLM verbessert. Die verbesserte Frage wird dann ebenfalls für das NLP in Vektoren umgewandelt. Diese Vektoren werden nun im Suchindex mit allen verfügbaren Vektoren verglichen und die besten Quellen ermittelt (KNN). Der Kontext dieser Quellen, inklusive der verbesserten Antwort, werden an das LLM gesendet, welches die Antwort generiert. Der Kontext wird hierbei durch die Chunks bestimmt, die jeweils für den Suchtreffer relevant waren. Jeder relevante Chunk wird zusätzlich um die vorigen und nächsten zwei Chunks erweitert, um den Kontext zu erhöhen.

Sollte die eingehende Frage weniger als 3 Wörter beinhalten und somit nicht als aussagekräftiger Satz ausgewertet werden können, wird stattdessen die Standard Keyword-Suche ausgeführt. Die Frage wird unverarbeitet an das LLM weitergereicht und die erhaltenen Chunks beinhalten alle Inhalte der relevanten Felder im Klartext.