Chatverlauf und Folgefragen

Das oben beschriebene Verfahren funktioniert gut, wenn die Benutzer nur eine einzige Frage stellen können. Diese Anwendung ermöglicht aber auch Nachfragen, was einige zusätzliche Komplikationen mit sich bringt. Beispielsweise ist es notwendig, alle vorherigen Fragen und Antworten zu speichern, damit diese als zusätzlicher Kontext bei der Übermittlung der neuen Frage an den LLM einbezogen werden können.

Der Chatverlauf in dieser Anwendung wird über die Klasse ElasticsearchChatMessageHistory verwaltet, eine weitere Klasse, die Teil der Elasticsearch-Integration mit Langchain ist. Jede Gruppe zusammengehöriger Fragen und Antworten wird in einem Elasticsearch-Index unter Angabe der verwendeten Sitzungs-ID gespeichert.

Möglicherweise ist Ihnen im vorherigen Abschnitt aufgefallen, dass, obwohl die Antwort des LLM in Blöcken an den Client gestreamt wird, eine Variable answer mit der vollständigen Antwort generiert wird. Dies dient dazu, die Antwort zusammen mit der dazugehörigen Frage nach jeder Interaktion der Historie hinzuzufügen:

Sendet der Client ein session_id -Argument in der Abfragezeichenfolge der Anfrage-URL, so wird davon ausgegangen, dass die Frage im Kontext aller vorherigen Fragen innerhalb derselben Sitzung gestellt wird.

Der Ansatz dieser Anwendung für Folgefragen besteht darin, mithilfe des LLM eine komprimierte Frage zu erstellen, die das gesamte Gespräch zusammenfasst und für die Abrufphase verwendet wird. Der Zweck dieser Vorgehensweise besteht darin, eine Vektorsuche in einer potenziell großen Historie von Fragen und Antworten zu vermeiden. Hier ist die Logik, die diese Aufgabe ausführt:

Dies weist viele Ähnlichkeiten mit der Art und Weise auf, wie die Hauptfragen behandelt werden, aber in diesem Fall besteht keine Notwendigkeit, die Streaming-Schnittstelle des LLM zu verwenden, daher wird stattdessen die invoke() -Methode verwendet.

Um die Frage zu verkürzen, wird eine andere Aufforderung verwendet, die in der Datei **api/templates/condense_question_prompt.txt` gespeichert ist:

Diese Eingabeaufforderung zeigt alle Fragen und Antworten aus der Sitzung sowie die neue Folgefrage am Ende an. Der LLM wird angewiesen, eine vereinfachte Frage zu formulieren, die alle Informationen zusammenfasst.

Um dem LLM in der Generierungsphase so viel Kontext wie möglich zu bieten, wird der Hauptaufforderung die vollständige Gesprächshistorie zusammen mit den abgerufenen Dokumenten und der Folgefrage hinzugefügt. Hier ist die endgültige Version der Eingabeaufforderung, wie sie in der Beispielanwendung verwendet wird:

Beachten Sie bitte, dass die Verwendung der Kurzform der Frage an Ihre Bedürfnisse angepasst werden kann. Möglicherweise stellen Sie fest, dass es bei einigen Anwendungen besser funktioniert, die komprimierte Frage bereits in der Generierungsphase zu senden, wodurch sich auch die Anzahl der Tokens reduziert. Oder vielleicht erzielt man bessere Ergebnisse, wenn man gar keine Kurzfrage stellt, sondern immer den gesamten Chatverlauf sendet. Ich hoffe, Sie haben nun ein gutes Verständnis davon, wie diese Anwendung funktioniert, und können mit verschiedenen Eingabeaufforderungen experimentieren, um herauszufinden, was für Ihren Anwendungsfall am besten geeignet ist.

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus