5 Punkte von GN⁺ 2023-10-25 | 1 Kommentare | Auf WhatsApp teilen
  • Embeddings wandeln Inhalte wie Text, Bilder oder Code in Arrays aus Gleitkommazahlen fester Länge um, sodass semantisch ähnliche Elemente per Distanzberechnung gefunden werden können
  • In einem vom selben Modell erzeugten Vektorraum lassen sich verwandte Dokumente, ähnliche Bilder oder Code-Snippets per Kosinus-Ähnlichkeit vergleichen, ohne die Bedeutung einzelner Zahlen zu kennen
  • In einem Beispiel, bei dem 472 TIL-Artikel mit OpenAI text-embedding-ada-002 als 1.536-dimensionale Vektoren gespeichert wurden, dauerte eine Suchabfrage nach verwandten Artikeln etwa 400 ms; die Kosten für das Embedding aller 402.500 Tokens lagen bei rund 0,04 $
  • Schon mit lokalen Modellen und kleinen Tool-Kombinationen lassen sich README-Suche, Codesuche, Bildsuche, Clustering und RAG umsetzen; als Beispiele werden LLM, llm-sentence-transformers, Symbex, CLIP und E5-large-v2 verwendet
  • Embedding-basierte semantische Suche ist nicht auf exakte Wortübereinstimmungen angewiesen und wird damit zu einem zentralen Mittel in RAG-Szenarien wie Frage-Antwort-Systemen für interne Unternehmensdokumente, bei denen relevante Auszüge in den LLM-Prompt eingefügt werden

Grundkonzept von Embeddings

  • Ein Embedding ist eine Methode, ein einzelnes Stück Inhalt in ein Array aus Gleitkommazahlen umzuwandeln
    • Unabhängig von der Länge des Inhalts ist die Array-Länge immer gleich
    • Die Array-Länge wird durch das verwendete Embedding-Modell bestimmt; Beispiele sind 300, 1.000 oder 1.536 Zahlen
  • Dieses Array kann man sich wie Koordinaten in einem mehrdimensionalen Raum vorstellen
    • Die Position im Raum repräsentiert die Bedeutung des Inhalts, wie sie das Embedding-Modell verstanden hat
    • Eigenschaften des Inhalts wie Farbe, Form oder Konzepte können darin abgebildet sein
  • Auch ohne die Bedeutung jeder einzelnen Zahl vollständig zu verstehen, lassen sich über Positionsbeziehungen nützliche Aufgaben erledigen, etwa das Finden nah beieinanderliegender Elemente

Empfehlungen verwandter Inhalte: Beispiel eines TIL-Blogs

  • Für eine TIL-Site mit 472 Artikeln wurde mit dem OpenAI-Modell text-embedding-ada-002 für jeden Artikel ein 1.536-dimensionaler Embedding-Vektor berechnet
    • Die Vektoren werden in der SQLite-Datenbank der Site gespeichert
    • Verwandte Artikel werden gefunden, indem die Kosinus-Ähnlichkeit zwischen dem Vektor des Zielartikels und allen anderen Artikelvektoren berechnet und die 10 nächsten zurückgegeben werden
  • Die Top-Ergebnisse für den Beispielartikel „Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg“ bestehen aus Artikeln zu SQLite, SpatiaLite, GDAL und räumlichen SQL-Abfragen
    • Die Ähnlichkeit mit sich selbst beträgt 1.0
    • sqlite_geopoly.md kommt auf 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md kommt auf 0.8813094978399854
  • Die Abfrage zur Berechnung verwandter Artikel dauerte etwa 400 ms, daher wurden für alle Artikel die Top-10-Ähnlichkeiten vorab berechnet und in einer Tabelle similarities gespeichert
  • Die Kosten der OpenAI Embeddings API lagen für die TIL-Site bei etwa 402.500 Tokens zu einem Tarif von 0,0001 $ pro 1.000 Tokens, also bei 0,04 $
  • Proprietäre Modelle erfordern im Betrieb Vorsicht
    • OpenAI hat in der Vergangenheit einige ältere Embedding-Modelle eingestellt
    • Wenn viele Embeddings mit einem bestehenden Modell gespeichert wurden, müssen sie für neue Inhalte möglicherweise auf Basis eines unterstützten Modells neu berechnet werden
    • OpenAI hat zugesagt, die Kosten für das Re-Embedding mit neuen Modellen zu übernehmen, doch das Risiko der Abhängigkeit von proprietären Modellen bleibt bestehen
  • Modelle mit offener Lizenz können auf eigener Hardware ausgeführt werden und vermeiden so das Risiko einer Modelleinstellung

Vektorräume am Beispiel von Word2Vec

  • Efficient Estimation of Word Representations in Vector Space von Google Research ist das am 16. Januar 2013 veröffentlichte Word2Vec-Paper
  • Word2Vec ist ein frühes Embedding-Modell, das ein einzelnes Wort in ein Array aus 300 Zahlen umwandelt
  • turbomaze.github.io/word2vecjson ist eine Demo, mit der sich 10.000 Wörter und die jeweiligen 300-Zahlen-Arrays erkunden lassen
    • Nahe an „france“ liegen Wörter wie french, belgium, paris, germany, italy, spain
  • Auch Vektoroperationen machen Beziehungen sichtbar
    • Addiert man den Vektor „paris“ zum Vektor „germany“ und zieht „france“ ab, liegt der Ergebnisvektor „berlin“ am nächsten
    • Das zeigt, dass das Modell Nationalitäts- und Geografiebeziehungen im Vektorraum erfasst hat
  • Word2Vec wurde mit Inhalten im Umfang von 1,6 Milliarden Wörtern trainiert; heutige Embedding-Modelle werden mit deutlich größeren Datensätzen trainiert und erfassen reichhaltigere Beziehungen

Embeddings mit dem LLM-Tool berechnen

  • LLM ist ein Kommandozeilen-Tool und eine Python-Bibliothek für den Umgang mit großen Sprachmodellen
    • Es kann mit pip install llm oder brew install llm installiert werden
    • Standardmäßig kann es mit der OpenAI API verwendet werden
  • Durch die Installation von Plugins lassen sich neue Sprachmodelle oder Embedding-Modelle hinzufügen
  • Das Plugin llm-sentence-transformers kapselt die Bibliothek SentenceTransformers
    • Das Modell all-MiniLM-L6-v2 kann von Hugging Face heruntergeladen und lokal verwendet werden
    • Der Befehl llm embed gibt einen einzelnen Satz als JSON-Zahlenarray aus
  • Ein Embedding ist als bloßes Zahlenarray allein wenig aussagekräftig; nützlich wird es, wenn es gespeichert und verglichen wird
  • llm embed-multi kann mehrere Inhalte auf einmal einbetten und in einer SQLite-Tabelle namens Collection speichern
    • Der Beispielbefehl sucht alle README.md-Dateien unterhalb des Home-Verzeichnisses und speichert sie in der Collection readmes
    • Die Option --store speichert auch den Originaltext in der SQLite-Tabelle
    • Das Ergebnis waren 16.796 gespeicherte README.md-Dateien; auf einem lokalen Computer dauerte das etwa 30 Minuten

Semantische Suche und „vibes-based search“

  • Der Befehl llm similar findet in einer gespeicherten Embedding-Collection Elemente, die einem Eingabesatz ähnlich sind
  • Sucht man in der Collection readmes mit dem Satz sqlite backup tools, erscheinen README-Dateien zu SQLite-Backups oder verwandten Projekten wie sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history und sqlite-utils oben in den Ergebnissen
  • Es gibt keine Garantie, dass das Ergebnisdokument das Wort „backups“ direkt enthält
    • Wenn der Inhalt der Suchanfrage semantisch ähnlich ist, kann er als Ergebnis erscheinen
  • Diese Methode ist semantische Suche; im Original wird sie vibes-based search genannt
  • Da sich das Gesuchte nicht immer allein über exakte Textübereinstimmungen finden lässt, ist sie für viele Suchmaschinen über unterschiedliche Inhalte hinweg nützlich

Code-Embeddings: Symbex und Datasette

  • Symbex ist ein Tool zum Erkunden von Symbolen in Python-Codebasen
    • Es wurde entwickelt, um Python-Funktionen und -Klassen schnell zu finden und an ein LLM zu übergeben
    • Später wurde es möglich, Embeddings für alle Funktionen einer Codebasis zu berechnen und daraus eine Codesuchmaschine zu bauen
  • Symbex kann gefundene Symbole als JSON oder CSV ausgeben; dieses Format kann als Eingabe für llm embed-multi genutzt werden
  • Ein Beispiel zum Einbetten aller Funktionen und Klassenmethoden des Datasette-Projekts verwendet das Modell gte-tiny
    • gte-tiny ist eine 60-MB-Datei
    • symbex '*' '*:*' --nl gibt Funktionen und Klassenmethoden im aktuellen Verzeichnis als newline-delimited JSON aus
    • llm embed-multi ... --format nl nimmt diese Ausgabe direkt als Eingabe entgegen und erzeugt Embeddings
  • Anschließend kann mit Datasette und dem Plugin datasette-llm-embed eine semantische Codesuche per SQL ausgeführt werden
  • SQLite dient als Integrationspunkt, der mehrere Tools verbindet
    • Funktionen werden aus dem Code extrahiert
    • Sie werden durch ein Embedding-Modell geschickt
    • Die Ergebnisse werden in SQLite geschrieben
    • Die Suche erfolgt per SQL

Text und Bilder mit CLIP in denselben Raum einbetten

  • CLIP ist ein im Januar 2021 von OpenAI veröffentlichtes Modell, das sowohl Text als auch Bilder einbetten kann
  • Der Kernpunkt ist, dass Text und Bilder in denselben Vektorraum gelegt werden
    • Die Embedding-Position des Strings „dog“ und die Embedding-Position eines Hundefotos liegen im selben Raum nahe beieinander
    • Man kann per Text passende Bilder finden oder per Bild passenden Text
  • Die im Browser laufende CLIP-Demo wurde als Observable Notebook erstellt und führt das CLIP-Modell im Browser aus
    • Die Seite lädt 158 MB an Ressourcen
    • Das CLIP-Textmodell ist 64,6 MB groß, das Bildmodell 87,6 MB
  • Es gibt ein Beispiel, bei dem Ähnlichkeitswerte für verschiedene Texte zu einem Strandfoto berechnet werden
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • Entscheidend ist weniger, die Ähnlichkeit eines beliebigen Fotos mit einem einzelnen Wort abzufragen, sondern darauf eine Suchoberfläche aufzubauen

Faucet Finder: CLIP-basierte Bildsuche

  • Faucet Finder ist ein maßgeschneidertes Such-Tool zum Finden von Fotos von Badarmaturen
  • Drew Breunig sammelte 20.000 Armaturenfotos von einem Armaturenanbieter und berechnete CLIP-Embeddings
    • Für die Implementierung wurden LLM und das Plugin llm-clip verwendet
    • Bereitgestellt wurde es mit Datasette
  • Das Tool ermöglicht es, andere Armaturen zu finden, die einer bestimmten Armatur visuell ähnlich sind
    • Wenn einem eine teure Armatur gefällt, kann man visuell ähnliche, günstigere Alternativen finden
  • Drews Demo nutzt vorab berechnete Embeddings und zeigt ähnliche Ergebnisse an, ohne das CLIP-Modell auf dem Server auszuführen
  • Später wurde ein serverseitiges CLIP-Modell auf Fly.io bereitgestellt und eine Observable-Notebook-Demo erstellt, die eine API für Text-String-Embeddings mit einer API für die Armaturen-Embedding-Tabelle kombiniert
    • Mit Suchbegriffen wie „gold purple“ lassen sich Armaturenbilder semantisch suchen

Clustering und 2D-Visualisierung

  • Embeddings lassen sich neben Empfehlungen verwandter Inhalte und semantischer Suche auch für Clustering verwenden
  • llm-cluster ist ein Plugin, das Clustering mit sklearn.cluster aus scikit-learn implementiert
  • Mit der GitHub Issues API und paginate-json kann man Issue-Titel des Repositories simonw/llm als Collection llm-issues erstellen und daraus 10 Cluster erzeugen
  • Die Option llm cluster llm-issues 10 --summary übergibt die Clustertexte an ein LLM, um beschreibende Namen zu generieren
    • Beispielnamen sind „Log Management and Interactive Prompt Tracking“ und „Continuing Conversation Mechanism and Management“
  • Hochdimensionale Räume sind schwer zu visualisieren, daher kann man die Dimensionen per Hauptkomponentenanalyse (PCA) reduzieren
    • Matt Webb erstellte OpenAI-Embeddings aus Episodenbeschreibungen des BBC-Podcasts In Our Time und erzeugte mit PCA eine 2D-Visualisierung
    • Selbst wenn 1.536 Dimensionen auf 2 Dimensionen reduziert werden, erscheinen Episoden zu historischen Kriegen oder modernen wissenschaftlichen Entdeckungen nahe beieinander

Sätze über Durchschnittspositionen klassifizieren

  • Embeddings lassen sich auch zur Klassifikation verwenden
    • Zuerst wird die Durchschnittsposition einer Gruppe von Embeddings berechnet, die auf eine bestimmte Weise klassifiziert wurden
    • Danach wird verglichen, welcher dieser Positionen das Embedding neuer Inhalte am nächsten liegt, um eine Kategorie zuzuweisen
  • Amelia Wattenbergers Getting creative with embeddings ist ein Beispiel dafür, Sätze danach zu bewerten, ob sie konkret oder abstrakt sind
  • Es werden Beispielsätze für konkrete und abstrakte Sätze erstellt und für jede Gruppe die Durchschnittsposition berechnet
  • Ein neuer Satz erhält abhängig davon, wo er zwischen den beiden Durchschnittspositionen liegt, einen Score
  • Dieser Score kann auch in eine Farbe übersetzt werden, die grob ausdrückt, wie abstrakt oder konkret ein Satz ist

RAG: Frage-Antwort-Systeme für persönliche und interne Dokumente

  • Wer ChatGPT ausprobiert hat, fragt sich oft, wie man Fragen auf Basis persönlicher Notizen oder interner Unternehmensdokumente beantworten lassen kann
  • Die Antwort kann statt teurem Training eines Custom-Modells die Kombination aus einem Standard-LLM und Retrieval-Augmented Generation (RAG) sein
  • Der grundlegende Ablauf von RAG ist einfach
    • Der Nutzer stellt eine Frage
    • In den persönlichen Dokumenten wird nach Inhalten gesucht, die für die Frage relevant erscheinen
    • Unter Einhaltung der Größenbeschränkung des LLM werden relevante Auszüge und die ursprüngliche Frage in den Prompt eingefügt
    • Das LLM antwortet auf Basis der bereitgestellten zusätzlichen Inhalte
  • Typische Größenbeschränkungen liegen im Bereich von 3.000 bis 6.000 Wörtern
  • Der schwierige Teil bei RAG ist, die besten Auszüge für den Prompt zu finden
    • Embedding-basierte semantische Suche eignet sich gut, um potenziell relevante Inhalte zusammenzutragen

Offline-Q&A auf Blogbasis mit E5-large-v2 umsetzen

  • Das RAG-Beispiel auf Basis von Blog-Inhalten verwendet E5-large-v2
  • Fragen und Antwortsätze haben unterschiedliche Grammatik, daher werden Fragen nicht immer als semantisch nah an Dokumenten erkannt, die die Antwort enthalten
  • E5-large-v2 unterstützt zwei Arten von Inhalten
    • factual sentence wird als phrase eingebettet
    • question wird als query eingebettet
    • Das ähnelt dem Ansatz von CLIP, Bilder und Text in denselben Raum zu legen
  • 19.000 Absätze des Blogs werden als phrase eingebettet, die Frage als query, um Absätze nahe an der Antwort zu finden
  • Das Beispiel implementiert RAG als einzeiliges Bash-Skript
    • llm similar findet relevante Absätze
    • jq extrahiert die Inhalte
    • Die Frage und die Absätze werden an das lokal auf einem Notebook laufende Modell Llama 2 Chat 7B übergeben
  • Auf die Frage What is shot-scraper? erzeugt es die Antwort, dass shot-scraper ein Python-Utility ist, das Playwright kapselt und über eine Kommandozeilenschnittstelle sowie einen YAML-basierten Konfigurationsfluss Screenshots von Webseiten und JavaScript-basiertes Scraping automatisiert
  • Die generierte Antwort war keine exakte Satzübereinstimmung mit den bestehenden Blog-Inhalten

In der Praxis anpassbare Stellschrauben

  • LangChain ist ein Framework zur Implementierung von Funktionen auf LLMs, und RAG ist eine seiner Kernfunktionen
    • Dieselbe Funktionalität ließe sich auf LangChain aufbauen, doch das Verständnis von LangChain erfordert beträchtliche Einarbeitung
    • Hier wird eine Sammlung kleiner, kombinierbarer Tools einem einzelnen Framework vorgezogen, das alles lösen soll
  • Als Distanzfunktion wird standardmäßig Kosinus-Ähnlichkeit verwendet
    • Andere Distanzfunktionen wurden noch nicht ausprobiert
    • RAG hat viele anpassbare Elemente, darunter Distanzfunktion, Embedding-Modell, Prompt-Strategie und LLM
  • Die Beispiele hatten einen Umfang von bis zu etwa 20.000 Embeddings; in dieser Größenordnung liefert selbst eine brute-force-Berechnung der Kosinus-Ähnlichkeit über alle Embeddings in vertretbarer Zeit Ergebnisse
  • Bei größeren Datenmengen, etwa einer Milliarde Objekten, werden Vektordatenbanken oder Erweiterungen bestehender Datenbanken zu Optionen
  • Erwartete künftige Entwicklungen sind multimodale Modelle und kleinere Modelle
    • Facebook ImageBind lernt gemeinsame Embeddings für sechs Modalitäten: Bild, Text, Audio, Tiefe, Wärme und IMU-Daten
    • Kleiner werdende Modelle wie das 60 MB große gte-tiny erhöhen die Chancen, sie auf eingeschränkten Geräten oder im Browser auszuführen

Weitere Lektüre

1 Kommentare

 
GN⁺ 2023-10-25
Hacker-News-Kommentare
  • Nachdem ich diesen Artikel veröffentlicht hatte, habe ich noch ein paar weitere nützliche Materialien gefunden, um Embeddings auf einer niedrigeren Ebene zu verstehen
    Mein Artikel war absichtlich sehr übergeordnet und vor allem auf Anwendungen fokussiert
    Cohere: Text Embeddings Visually Explained: https://txt.cohere.com/text-embeddings/
    Das Tool Tensorflow Embedding Projector: https://projector.tensorflow.org/
    Sehenswert ist auch Vicki Boykis’ What are embeddings?: https://vickiboykis.com/what_are_embeddings/
    Ich werde das unten auf der Seite unter „further reading“ ergänzen

    • Ich habe vor einiger Zeit fast dieselbe Idee ausprobiert: https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      Ich habe Embeddings verwendet, um das Engagement bei verwandten Artikeln zu erhöhen, und persönlich halte ich Embeddings für ein unterschätztes, leistungsstarkes Werkzeug
      Man kann damit anhand von Ähnlichkeit zwischen Dokumenten oder Auszügen navigieren oder umgekehrt einzigartige Inhalte finden, und es ist ziemlich „sicher“, weil man sich keine Sorgen über Halluzinationen machen muss
    • Mir gefällt, dass es so geschrieben ist, dass auch Menschen mit wenig Erfahrung in AI, Machine Learning und LLMs gut herankommen
      Interessant könnte auch sein, wie Embeddings erzeugt werden. Zum Beispiel durch das Abschneiden der Klassifikationsschicht nach dem Training oder durch Ansätze wie EfficientNet
    • Ich frage mich, ob es Material gibt, das die Geschichte von Embeddings und ihren Einsatz in Informatik und LLMs behandelt
      Sie werden gerade zu einer zentralen Grundlage des Machine Learning
  • In Computer Vision und visuellen SLAM-Algorithmen sind Embeddings zur faktischen Standardmethode für Place Recognition geworden, und das ist dem Inhalt dieses Artikels sehr ähnlich
    Das wird „bag-of-word place recognition“ genannt und heute in fast allen Open-Source-Bibliotheken verwendet
    Im Kern wird jedes Bild durch eine Pipeline zur Merkmalsextraktion und Deskriptorerzeugung geschickt und in einen Vektor „eingebettet“, der die obersten N Merkmale enthält
    Während sich die Kamera bewegt, wird eine Bilddatenbank aus sogenannten Keyframes aufgebaut, und die Bilder werden als Vektoren mit deutlich geringerer Dimensionalität gespeichert
    Danach wird die Datenbank mit allen Bildern abgefragt und per Vektordatenbank der beste Treffer mit Verfahren wie Kosinus-Ähnlichkeit gefunden
    Wenn es ein Match gibt, kann man die Stereo-Nebenbedingungen zwischen dem Abfragebild und dem passenden Bild berechnen und damit die Karte aktualisieren
    Das Originalpapier ist [1], und die bekannteste Implementierung ist https://github.com/dorian3d/DBoW2
    [1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • Ein hervorragendes Einsteiger-Referenzmaterial
    Ich habe früher selbst eine iOS-Notizen-App gebaut, und das Hinzufügen von Embeddings zur bestehenden Volltextsuche war 1) erstaunlich einfach und 2) viel leistungsfähiger, als ich anfangs erwartet hatte
    Ich wusste zwar, dass bei einer Suche nach „dog“ auch Notizen mit „canine“ auftauchen würden, aber erst als ich Suchanfragen wie „Haustiere, die mir gefallen könnten“ ausprobierte und dabei verschiedene Tiernotizen mit positiver Stimmung gefunden wurden, hatte ich diesen ersten großen „Aha“-Moment
    Das war mein erster großer „Aha“-Moment
    Damals war der DocsGPT-PR von Supabase als Beispielcode nützlich: https://github.com/supabase/supabase/pull/12056

    • Die Formulierung „zur bestehenden Volltextsuche hinzugefügt“ ist stillschweigend wichtig. Embeddings liefern semantische Suche als Ergänzung zu traditionellen Suchalgorithmen
      Viele Anwendungen hängen stark von Namen oder Eigennamen ab und haben oft wenig Kontext
      Wenn man einen Hund nur beim Namen nennt und ohne Beschreibung, erkennt ein bestimmtes Embedding-Modell das womöglich nicht
      Eigennamen wie Personen-, Orts- oder Straßennamen können sehr wichtig sein, um personalisierte oder domänenspezifische Suche zuverlässig zu machen, aber ein allgemeines Sprachmodell kennt sie nicht
      Ich frage mich, ob es konkrete Methoden gibt, um dieses Problem zu behandeln
    • Ich arbeite an etwas Ähnlichem auch für Logseq-Notizen
      Meine größte Frage im Moment ist, wie viel Text man zu einem einzigen Embedding machen sollte
      Ob man das für jeden Satz macht oder den gesamten Satzblock einer einzelnen Seite in der Notizen-App als eins behandelt
    • Ich frage mich, ob für die Erzeugung der Embeddings eine externe API verwendet wird und ob die Suche auf dem Gerät erfolgt
  • Ein typisches Beispiel für Wort-Embeddings ist das berühmte King - Man + Woman = Queen
    Im Vektorraum funktioniert das gut, aber projiziert in 2D ist es visuell nicht besonders eingängig
    Meiner Erfahrung nach gilt das gleichermaßen für PCA, MDS und t-SNE: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    Das ist ein JupyterLite-Notebook, das Wort-Embeddings im Browser ausführt; auf dem Smartphone sollte man es besser nicht starten
    Ich frage mich, ob jemand eine gute Möglichkeit kennt, dieses klassische Beispiel für Wort-Embeddings anschaulich zu visualisieren

    • Wenn ich es richtig verstanden habe, kann man es in 2D visualisieren, indem man „king“ in den Ursprung setzt, die X-Achse als „king“-„man“ und die Y-Achse als „king“-„woman“ definiert
      Wenn man echte Orthogonalität will, kann man Gram-Schmidt verwenden
      In 3D könnte man noch eine Z-Achse als „king“-„queen“ hinzufügen, und die orthogonalisierte Version liegt näher an dem Distanzbegriff, den das Modell verwendet
      In 2D kann man zwar nicht zeigen, wie weit „king“-„man“+„woman“ von „queen“ abweicht, aber alle übrigen Distanzen bekommt man korrekt
      In 3D sollte man exakte Distanzen angeben können
      „queen“ wird normalerweise gewählt, weil es das Wort mit dem Embedding ist, das X="king"-"man"+"woman" am nächsten liegt
      Man könnte in einem 2D-Diagramm auch die paar nächstliegenden Wörter anzeigen und bei jedem Wort den orthogonalen Abstand zur 2D-Ebene dazuschreiben
      Dann sollte „queen“ das Wort sein, bei dem die Summe aus der quadrierten Distanz zu X und der quadrierten orthogonalen Distanz zur Ebene am kleinsten ist, sodass man es auch visuell einigermaßen prüfen kann
    • UMAP wäre einen Versuch wert
    • Ich habe nach einem Mathematikerwitz zum Visualisieren hoher Dimensionen gesucht und ChatGPT gefragt; statt eines bei Google auffindbaren Witzes hat es einen im Stil von Richard Feynman erfunden
      Er ging ungefähr so: „Die 4. Dimension kann man nicht visualisieren … zumindest ich nicht. Ich habe nur drei brane.“ – ein Wortspiel mit branes und brains
      Später hat ChatGPT zugegeben, dass es das erfunden hatte, und sich entschuldigt
      Danach lieferte es noch Zitate von John von Neumann, H. G. Wells und Ian Stewart und endete schließlich mit etwas wie: „Um 4D zu visualisieren, visualisiere einfach 3D und sage dann ‚n+1‘“; das kam der Erinnerung an den Witz am nächsten, war aber weniger lustig
      Also bat ich es, halluzinierte Zitate im Stil von Deepak Chopra über die Visualisierung hochdimensionaler Räume zu erzeugen, woraufhin es plausibel klingende Fake-Zitate mit Ausdrücken wie septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle und Shannon entropy ausspuckte
  • Ein häufiger Fehler in der praktischen Trigonometrie ist es, Quadratwurzeln zu berechnen, obwohl sie nicht nötig sind
    Im Beispielcode sind magnitude_a = sum(x * x for x in a) * 0.5 und magnitude_b = sum(x * x for x in b) * 0.5 das *0.5 nicht nötig
    Wenn man Kosinuswerte vergleichen will, kann man auch die quadrierten Werte vergleichen und so die teure Wurzelberechnung vermeiden
    Ähnlich verschiebt man in der Elliptic-Curve-Kryptografie teure Operationen wie die Berechnung von Inversen möglichst weit nach hinten, oder man vermeidet die Berechnung standardisierter Werte ganz, wenn man nur zwei Punkte miteinander vergleichen will

    • Dieser Code ist so geschrieben, dass er leicht verständlich ist
      Sonst hätte ich ihn durch Low-Level-SIMD-Code ersetzt
  • dot_product = sum(x * y for x, y in zip(a, b)) — da fragt man sich schon, warum man das so macht und nicht vektorisierte numpy-Operationen verwendet
    Als ich die Stelle las, dass „mehrere Versionen von Cosine-Similarity-Code von ChatGPT geschrieben wurden“, ergab das Sinn

    • Es gibt dafür zwei Gründe
      Erstens finde ich, dass numpy-Syntax beim Erklären für Menschen eher ablenkt
      Zweitens ist numpy nicht gerade die leichtgewichtigste Abhängigkeit
      Wenn ich Performance brauche, verwende ich es, aber ich möchte es nicht zur Standardwahl machen
  • Wenn man aus Show-HN-Posts, ProductHunt-Startups, YC-Firmen und Github-Repositories Dinge zum Thema LLM-Embeddings sehen möchte, kann man sie schnell in einem gerade veröffentlichten LLM-Embeddings-Based Search Engine MVP finden
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • Nicht schlecht
      Ich hatte erwartet, dass die Suchergebnisse sofort aktualisiert werden, wenn man verschiedene Filter-Buttons anklickt, und wusste nicht, dass man erneut suchen muss
      Ich verstehe aber, warum es so umgesetzt wurde
    • Mein Show-HN-Post ist hier: https://news.ycombinator.com/item?id=38011802
  • Das ist mit Abstand das Interessanteste, was ich in den letzten Monaten zum Thema „AI“ gelesen habe
    Jedes Mal, wenn ich in einer Liste Embedding-Modelle sah, fragte ich mich, was das eigentlich ist, und ebenso, warum alle von Vektor-Datenbanken sprechen
    Mir fällt sofort ein, wie ich das auf ein lang laufendes Side-Project anwenden könnte
    Wenn es für alle Dokumente Embeddings gibt, könnte eine nützliche Clusterbildung von Nutzerdaten vielleicht tatsächlich praktikabel werden

  • Ich frage mich, ob jemand Embeddings tatsächlich schon für etwas anderes als Approximate Nearest Neighbors und Clustering eingesetzt hat.
    Mögliche Anwendungen, die mir einfallen, wären Projektion, Indexierung und Sortierung entlang beliebiger Achsen. Zum Beispiel Achsen wie „heiß-kalt“, „glücklich-traurig“, „SF-Realismus“ oder „literarisch-kommerziell“.
    Es dürfte auch Möglichkeiten geben, Embeddings direkt zu lernen, statt nur SVM-artige Klassifikation im Embedding-Raum zu machen, word2vec-artige Schlüsse wie woman-man+king=queen zu ziehen oder einfach eine Schicht aus einem LLM herauszulösen.
    Kontrastives Lernen wird zwar verwendet, aber es scheint auch andere Ansätze zu geben, die sich zu erkunden lohnen, etwa Embeddings zusammen mit einem Funktionsnetzwerk zu lernen und Funktionalgleichungen zu erzeugen, um einen Mean-Squared-Error-Loss zu berechnen.
    Es überrascht mich, dass der Fokus so stark auf semantischer Suche liegt; es scheint klar, dass es noch andere interessante Anwendungen geben müsste.

    • Ich bin etwas verwirrt, weil alle genannten Beispiele nach relativ gängigen Aufgaben aussehen.
      Das erste und das dritte sind im Grunde genommen dasselbe.
      In Computer Vision möchte man Bilder manchmal semantisch verändern, etwa einer Person auf einem Foto eine Brille hinzufügen, und vieles von dem, was man in Google-Werbung sieht, ist ein Beispiel dafür.
      Solche Aufgaben finden im latenten Raum statt.
      Bei Normalizing Flows ist das besonders deutlich, weil der Raum in einen gaußschen Raum transformiert wird.
      Diffusionsmodelle machen etwas Ähnliches mit approximativen Methoden, sind aber nicht invertierbar, auch wenn man zurückgehen kann.
      Man projiziert das zu manipulierende Bild, den Satz oder die Daten, verändert sie im gaußschen Raum und überführt sie dann zurück in den Zielraum.
      Allerdings kann es auch einfach daran liegen, dass das Wort Embedding ein überladener Begriff mit zu vielen Bedeutungen ist und man deshalb aneinander vorbeiredet.
      Vielleicht ist nur der erste Block gemeint, der diskrete Integer-Tokens in kontinuierliche Gleitkommazahlen umwandelt.
      Aber auch dieses Embedding wird gelernt; selbst wenn es wie eine Lookup-Tabelle aussieht, ist es weiterhin ein neuronaler Prozess.
      Man verwendet in diesem Raum auch SVMs.
      Er ist dem latenten Raum ähnlich, aber etwas abstrakter.
      Zumindest sollte ein Embedding injektiv sein. Mathematisch jedenfalls ...
    • SVM-artige Klassifikation im Embedding-Raum ist eine absolut grundlegende Technik in industrieller NLP und im Machine Learning.
      Embeddings direkt zu lernen ist buchstäblich das ursprüngliche Embedding-Modell, nämlich Word2Vec.
    • Ich habe auch einmal einen word2vec-Embedding-Raum auf Basis von PubMed-Abstracts erstellt.
      Dabei habe ich viele Varianten und Abkürzungen gefunden, etwa Schreibweisen chemischer und biochemischer Namen mit Bindestrich, ohne Bindestrich oder mit Leerzeichen.
      Wahrscheinlich hätte man daraus auch ein Fachglossar erstellen können.
      Ich weiß nicht, wie weit man bis hin zu Definitionen gekommen wäre, aber auch wenn reine Vektoren Grenzen haben, sind sie ein guter Ausgangspunkt.
      Wahrscheinlich haben auch andere auf diese Weise Glossare aufgebaut.
    • Kreuzsprachige Embeddings, bei denen für jede der beiden Sprachen ein Embedding-Raum erzeugt und dieser mit einem Seed-Wörterbuch ausgerichtet wird, haben reale oder potenzielle Anwendungen in mehrsprachiger Suche und maschineller Übersetzung.
    • Man kann sie auch zur Deduplizierung von Daten verwenden.
  • Ich habe mit Embeddings gearbeitet und auch einige produktive Anwendungsfälle gebaut; sie sind ein großartiges Werkzeug, das viele spannende Anwendungen ermöglicht.
    Wenn man jedoch in einer bestimmten Domäne etwas entwickelt, stößt man auf die Grenzen vortrainierter Embedding-Modelle.
    Solche Modelle haben viele Dimensionen, aber manche davon sind für Klassifikation, Inhaltsähnlichkeit oder Clustering in meiner Anwendung wichtig, andere dagegen nicht.
    Anders gesagt: Zwei Vektoren können nah beieinander liegen, weil sie in Dimensionen ähnlich sind, die mich gar nicht interessieren.
    Ich hoffe auf bessere Werkzeuge und mehr Literatur zum Fine-Tuning von Embedding-Modellen.

    • Zur Lösung dieses Problems das gesamte Sprachmodell feinzujustieren, ist wie mit einem großen Hammer auf einen Nagel zu schlagen.
      Solche Werkzeuge gibt es schon lange; man kann zum Beispiel ein paar Daten labeln und dann einen SVM-Klassifikator auf dem Embedding-Raum trainieren.
    • sentence-transformers bringt dafür bereits ziemlich gute Werkzeuge mit.