HH maczarr.de

Chatte mit deinen Dateien – factsChat

Chats mit sogenannten großen Sprachmodellen – Large Language Model (LLM) – sind nach wie vor ein interessantes Thema und werden derzeit in alle möglichen altbekannten Programme integriert, nachdem OpenAI mit ChatGPT den Hype losgetreten hat. Diese Modelle verfügen aber in der Regel nur über das Wissen mit dem sie trainiert wurden. Es gibt jedoch ein paar Möglichkeiten, wie man eigene Inhalt zur Verfügung stellen kann und dazu „ein Gespräch“ per Chat führen kann. Ich habe mir vor ein paar Monaten mal eine Variante angesehen, mit der man Fakten aus eigenen Dokumenten oder Webseiten abfragen kann und dieses Projekt auf GitHub zur Verfügung gestellt: factsChat.

Wie funktioniert das Ganze?

Dokumente (PDFs und Textdateien) werden von einer Software eingelesen und in kleinere Teile aufgebrochen. Diese kleinen Teile schicke ich dann an die OpenAI Embeddings-API und bekomme daraufhin sogenannte Embeddings zurück, die lokal auf meinem Rechner in einer Vektor-Datenbank gespeichert werden.
Möchte ich nun einen Chat beginnen wähle ich eine Vektor-Datenbank aus und schreibe meine Frage auf. Die Software nimmt nun meine Frage und sucht in der Vektor-Datenbank nach ähnlichem Inhalt – also einem Textteil, der eine Antwort zu meiner Frage beinhalten könnte. Gibt es mehrere Funde werden diese Textteile aus der Datenbank geholt und dann an OpenAIs GPT-API gesendet zusammen mit meiner ursprünglichen Frage. Die GPT-API bekommt nun also relevante Informationen aus meinen Dokumenten, die zu meiner Frage passen könnten mitsamt meiner Frage. Aus dem zur Verfügung gestellten Kontext erstellt es eine Antwort und die bekomme ich als Antwort auf meine Frage zurück mitsamt einer Quellenangabe, wo in meinen Dokumenten die Textteile für die Antwort hergenommen wurden. Wenn ich nun eine weitere Frage stelle geht der Prozess wieder von vorne los. Dieser Ansatz eignet sich – so wie er hier von mir zusammengebaut wurde – also nicht, um einen längeren Dialog zu dem Kontext zu führen.

Was sind Embeddings?

Embeddings sind Vektoren, die den textlichen Inhalt repräsentieren. Das Verfahren ist nicht neu und wird auch schon länger für andere Ähnlichkeitssuchen verwendet, hat aber gerade im letzten Jahr durch die LLMs wieder viel Aufwind erfahren. Embeddings sind besonders praktisch, da man damit eine große Menge lokaler Infos in einer Datenbank haben kann ohne an einen Dienst diesen gesamten Inhalt als Kontext mitschicken zu müssen – denn die mitgeschickte Menge an Kontext kostet Geld. Mit dieser Methode kann man den mitgeschickten Kontext auf das nötige Minimum reduzieren.

Wie hält man das Sprachmodell vom Halluzinieren ab?

Völlig ausschließen kann man das nicht, aber es gibt ein paar Möglichkeiten, wie man die Wahrscheinlichkeit verringern kann. Zum einen Prompt-Engineering. Das heißt die Konversation mit dem Sprachmodell beginnt damit, dass man ihm ein Beispiel gibt, wie es verfahren soll und darauf hinweist, dass es sich nur aus dem zur Verfügung gestellten Kontext bedienen soll. Zum Anderen reduziert man die Temperature auf 0.0 – das ist ein Wert, der angibt, wie frei das Sprachmodell seine Antwort textet bzw. wie Konsistent die Antworten sind, manchmal wird Temperature auch als „Kreativität“ umschrieben, aber das finde ich etwas schwierig als Definition, taugt jedoch für das Verständnis eventuell ganz gut als Metapher.
Zu guter Letzt soll das Sprachmodell laut Prompt-Engineering die Quelle der Antwort mit angeben, was ebenfalls nochmal die Möglichkeit gibt die bereitgestellte Antwort zu überprüfen.

Wieso kein lokales Sprachmodell?

Als ich dieses Projekt im Frühjahr geschrieben habe war gerade Llama draußen als verfügbares großes Sprachmodell, aber die Qualität der Antworten hatte mich nicht überzeugt, da kamen teils sehr krude Dinge zurück – gerade wenn man nicht auf Englisch als Sprache gesetzt hat. Daher setzte ich für dieses Projekt erstmal auf OpenAI und in dem Zuge dann auf die Embeddings-API von OpenAI. Da die Preise mittlerweile sehr moderat sind fällt das Geld nicht sonderlich ins Gewicht. Bleibt die Frage der Privatsphäre und da werden natürliche alle Fragen und Kontexte an OpenAI übertragen. Jedoch speichert OpenAI die Daten seit 01.03.2023 nur noch für 30 Tage und nutzt die Inhalte, die man per API sendet, nicht zum Training der eigenen Modelle.

Bei der Umsetzung habe ich jedoch stark auf Langchain gesetzt, sodass alle Komponente leicht auszutauschen sind. Das große Sprachmodell könnte gegen ein lokales Sprachmodell (z.B. Llama 2) ausgetauscht werden und auch für die Embeddings könnte eine lokale Software genutzt werden, sodass das ganze System offline funktionieren würde.

Fazit

Das kleine Programm zu schreiben hat Spaß gemacht und ich konnte mir vieles im Kontext von LLMs erschließen. Als ein Produkt ist meine Software jedoch keinesfalls zu verstehen, ich habe es vor allem veröffentlich, falls andere auch daran Interesse haben und mal drauf schauen oder sich so etwas selbst aufsetzen wollen.
Insgesamt finde ich die aktuellen Entwicklungen um LLMs sehr spannend und mache mir Gedanken um die Nutzbarkeit, aber das geht am besten, wenn man selbst mal damit etwas rumgespielt und ausgelotet hat, was geht. Als nächstes möchte ich mir OpenAIs Möglichkeit Funktionen aufzurufen anschauen – eine weitere Möglichkeit dem Sprachmodell Kontext zu geben, an den es von sich aus nicht dran käme. Mal schauen, ob das auch wieder ein kleines Projekt wird, das auf GitHub landet.