41 Punkte von xguru 2023-10-30 | 5 Kommentare | Auf WhatsApp teilen

Was sind Embeddings?

  • „Embedding“ bedeutet, Inhalte in ein „Array aus Gleitkommazahlen“ umzuwandeln
  • Das Entscheidende an diesem Array ist, dass die „Größe des Arrays“ immer gleich bleibt – unabhängig von der „Länge des Inhalts“
  • Die Größe des Arrays wird durch das verwendete Embedding-Modell bestimmt: 300, 1000, 1536 usw.
  • Am besten stellt man sich dieses Zahlen-Array als „Koordinaten in einem sehr seltsamen mehrdimensionalen Raum“ vor
  • Warum Inhalte in einem mehrdimensionalen Raum platzieren? Weil man aus der Position eines Inhalts – insbesondere anhand anderer Inhalte in seiner Nähe – interessante Informationen über ihn lernen kann
  • Die Position im Raum repräsentiert die „semantische Bedeutung (Semantic Meaning)“ des Inhalts entsprechend dem „seltsamen, größtenteils unverständlichen Verständnis der Welt“ des Embedding-Modells
  • Eingebettete Inhalte können Farben, Formen, Konzepte oder alle möglichen anderen Eigenschaften erfassen
  • Niemand versteht vollständig, was diese einzelnen Zahlen genau bedeuten, aber wir wissen, dass ihre Position genutzt werden kann, um nützliche Informationen über Inhalte zu finden

Mit Embeddings verwandte Inhalte finden

  • Das erste Problem, das ich mit Embeddings gelöst habe, war die Erstellung einer „Related Content“-Funktion für meinen TIL-Blog
  • Ich habe OpenAIs Modell text-embedding-ada-002 verwendet. Es ist über eine API verfügbar
  • Auf meiner Website gibt es derzeit 472 Beiträge, und ich habe für jeden Beitrag einen 1536-dimensionalen Embedding-Vektor (ein Array aus Gleitkommazahlen) berechnet und diesen Vektor in der SQLite-Datenbank meiner Website gespeichert
  • Um nun verwandte Beiträge zu einem bestimmten Beitrag zu finden, berechnet man die Cosine Similarity zwischen dessen Embedding-Vektor und den anderen Beiträgen in der Datenbank und gibt dann die 10 nächsten Treffer nach Distanz zurück
  • Der Python-Code, den ich für die Cosine Similarity verwendet habe, sieht so aus
def cosine_similarity(a, b):  
    dot_product = sum(x * y for x, y in zip(a, b))  
    magnitude_a = sum(x * x for x in a) ** 0.5  
    magnitude_b = sum(x * x for x in b) ** 0.5  
    return dot_product / (magnitude_a * magnitude_b)  
  • OpenAIs Embedding-API ist sehr günstig und einfach
    • Ich habe etwa 400.000 Tokens für meine TIL-Website eingebettet; bei $0.0001 pro 1.000 Tokens hat das insgesamt nur $0.04 gekostet
    • Man schickt einfach den Text zusammen mit einem API-Schlüssel per POST, und zurück kommt ein JSON-Array aus Gleitkommazahlen
  • Allerdings ist dies ein proprietäres Modell, und OpenAI hat vor einigen Monaten einige seiner Embedding-Modelle eingestellt
  • Das heißt: Wenn man eine große Anzahl von Embeddings mit diesem Modell gespeichert hat, muss man sie für ein neues Modell neu berechnen
  • OpenAI sagte zwar, dass die Kosten für das Re-Embedding mit einem neuen Modell erstattet würden, aber bei proprietären Modellen ist Vorsicht geboten
  • Das lässt sich mit leistungsfähigen offen lizenzierten Modellen vermeiden

Verstehen, wie diese Dinge im Word2Vec-Modell funktionieren

  • Google Research veröffentlichte vor 10 Jahren eine einflussreiche Arbeit, die ein frühes Embedding-Modell namens Word2Vec beschrieb
    • Die 2013 veröffentlichte Arbeit „Efficient Estimation of Word Representations in Vector Space“ weckte das Interesse an Embeddings
  • Word2Vec ist ein Modell, das ein einzelnes Wort nimmt und in eine Liste aus 300 Zahlen umwandelt. Diese Zahlenliste erfasst Informationen über die Bedeutung verwandter Wörter
  • Wenn man nach einem Wort sucht, kann man anhand der Cosine Distance seiner Word2Vec-Repräsentation ähnliche Wörter finden
  • Sucht man nach „france“, erhält man Werte wie „french : 0.70007~“, „belgium: 0.69331~“, „paris: 0.63349~“, „germany: 0.62707~“
  • Das ist eine Mischung aus dem Französischen und der Geografie Europas
  • Wirklich interessant wird es, wenn man mit diesen Vektoren Arithmetik betreibt
  • Addiert man zu dem Vektor für „germany“ den Vektor für „paris“ und subtrahiert den für „france“, liegt der Ergebnisvektor am nächsten bei „Berlin“
  • Das Modell erfasst also Vorstellungen von Nationalität und Geografie, mit denen sich durch Arithmetik zusätzliche Fakten über die Welt erkunden lassen
  • Word2Vec wurde mit 1,6 Milliarden Wörtern trainiert, und die Embedding-Modelle, die wir heute verwenden, werden auf noch viel größeren Datensätzen trainiert und erfassen ein weitaus reichhaltigeres Verständnis grundlegender Beziehungen

Mit meinen Tools Embeddings berechnen und durchsuchen

  • Ich entwickle eine CLI und Python-Bibliothek namens LLM
  • Sie kann als CLI für die Interaktion mit LLMs verwendet werden und unterstützt auch die OpenAPI-Integration
  • Vor einigen Monaten habe ich diesem Tool über Plugins auch die Möglichkeit hinzugefügt, Embedding-Modelle auszuführen (unter Nutzung der SentenceTransformers-Bibliothek)
  • Man kann eine Embedding-Sammlung auswählen und eine Vibes-basierte Suche nach Ähnlichkeiten durchführen
  • Ich entwickle außerdem ein Tool namens Symbex, das Symbole in Python-Codebasen finden kann. Damit lassen sich Embeddings für Funktionen im Code berechnen und Suchmaschinen für Code aufbauen
  • (Detaillierte Implementierungsdetails werden ausgelassen)

Mit CLIP Text und Bilder gemeinsam einbetten

  • Mein derzeit bevorzugtes Embedding-Modell ist CLIP
  • Es wurde von OpenAI im Januar 2021 veröffentlicht und kann sowohl „Text als auch Bilder“ einbetten, die dann im selben Vektorraum liegen
  • Gibt man „dog“ ein, erhält man eine Position in einem 512-dimensionalen Raum (je nach CLIP-Konfiguration unterschiedlich)
  • Wenn man ein Foto eines Hundes einbettet, erhält es eine Position im selben Raum, die der Position des Strings „dog“ räumlich nahe liegt
  • Das heißt: Man kann mit Text nach passenden Bildern suchen oder mit Bildern nach passendem Text
  • Gibt man ein Strandfoto ein, erhält man Ähnlichkeitswerte wie „beach: 26.946%“, „city: 19.839%“, „sunshine: 24.146%“

Mit CLIP Wasserhähne finden

  • Drew Breunig hat mit dem Plugin llm-clip eine Suchmaschine für Wasserhähne gebaut
  • Er nahm 20.000 Fotos von Wasserhähnen und ließ CLIP darauf laufen
  • So konnte er Wasserhähne finden, die anderen Wasserhähnen ähnlich sind, und darunter Optionen finden, die ähnlich, aber günstiger sind

Mit RAG Fragen beantworten

  • Die letzte Frage von allen, die ChatGPT ausprobiert haben, ist immer dieselbe
    „Wie kann ich es dazu bringen, Fragen zu meinen Notizen oder den Dokumenten unseres Unternehmens zu beantworten?“
  • Viele nehmen an, dass man dafür zu enormen Kosten ein Custom-Modell auf Basis dieser Inhalte trainieren muss,
  • tatsächlich ist das aber nicht nötig. Mit LLMs und RAG (Retrieval Augmented Generation) wird es möglich
  • Die Kernidee ist: „Der Nutzer stellt eine Frage“
    • Dann sucht man in den eigenen Dokumenten nach Inhalten, die für diese Frage relevant sind
    • Anschließend gibt man einen Auszug aus diesem Inhalt zusammen mit der ursprünglichen Frage an ein LLM
    • Dann kann das LLM die Frage auf Basis der zusätzlich bereitgestellten Inhalte beantworten
  • Dieser billige Trick ist erstaunlich effektiv
    • Allerdings ist es nicht einfach, die grundlegende Version, die das ermöglicht, zum Laufen zu bringen
    • Angesichts der unendlichen Menge möglicher Nutzerfragen muss man dafür sorgen, dass es möglichst gut funktioniert
  • Das Hauptproblem bei RAG besteht darin, die besten Inhaltsauszüge zu bestimmen, die in den Prompt für das LLM aufgenommen werden sollen
  • Von Embeddings angetriebene „Vibes-based“ semantische Suche ist die notwendige Fähigkeit, um hochrelevante Inhalte zu sammeln, die bei der Beantwortung der Frage eines Nutzers helfen können
  • Ich habe eine Version davon für die „Inhalte meines Blogs“ gebaut und veröffentlicht
    • Dadurch wurde RAG letztlich mit einem einzeiligen Bash-Script möglich

5 Kommentare

 
edunga1 2023-11-06

Ich habe es nach dem Lesen dieses Artikels am Wochenende ausprobiert. Ich habe zunächst ein koreanisches Modell versucht, aber die Einrichtung der Umgebung war nicht ganz einfach, deshalb habe ich ada v2 verwendet und insgesamt 0,03 Dollar ausgegeben. Wenn man ein neuer Nutzer ist, der ChatGPT noch nicht ausprobiert hat, sollten die 5 Dollar Gratisguthaben völlig ausreichen, um es einmal zu testen.

Ich habe sogar die Kosinus-Ähnlichkeit berechnet und verglichen, und die Ergebnisse waren nachvollziehbar. Danke fürs Teilen des Artikels.

 
laeyoung 2023-11-01

Das sollte ich am Wochenende einmal nachmachen.

 
donghemul11 2023-10-31

Danke~

 
seatbelts 2023-10-30

Ich glaube, ich verstehe es jetzt zumindest ein wenig.
Danke.

 
charo 2023-10-30

Ich habe viel über Bereiche gelernt, die mich schon länger interessiert haben, die ich aber nie richtig verstanden hatte. Vielen Dank wie immer für die großartigen Inhalte.