Was Embeddings sind und warum sie wichtig sind
(simonwillison.net)- 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-002als 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,CLIPundE5-large-v2verwendet - 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-002fü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.mdkommt auf 0.8817322855676049spatialite_viewing-geopackage-data-with-spatialite-and-datasette.mdkommt 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
similaritiesgespeichert - 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
- Nahe an „france“ liegen Wörter wie
- 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 llmoderbrew install llminstalliert werden - Standardmäßig kann es mit der OpenAI API verwendet werden
- Es kann mit
- Durch die Installation von Plugins lassen sich neue Sprachmodelle oder Embedding-Modelle hinzufügen
- Das Plugin
llm-sentence-transformerskapselt die Bibliothek SentenceTransformers- Das Modell
all-MiniLM-L6-v2kann von Hugging Face heruntergeladen und lokal verwendet werden - Der Befehl
llm embedgibt einen einzelnen Satz als JSON-Zahlenarray aus
- Das Modell
- Ein Embedding ist als bloßes Zahlenarray allein wenig aussagekräftig; nützlich wird es, wenn es gespeichert und verglichen wird
llm embed-multikann 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 Collectionreadmes - Die Option
--storespeichert 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
- Der Beispielbefehl sucht alle
Semantische Suche und „vibes-based search“
- Der Befehl
llm similarfindet in einer gespeicherten Embedding-Collection Elemente, die einem Eingabesatz ähnlich sind - Sucht man in der Collection
readmesmit dem Satzsqlite backup tools, erscheinen README-Dateien zu SQLite-Backups oder verwandten Projekten wiesqlite-diffable,sqlite-dump,sqlite-generate,sqlite-historyundsqlite-utilsoben 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-multigenutzt werden - Ein Beispiel zum Einbetten aller Funktionen und Klassenmethoden des Datasette-Projekts verwendet das Modell gte-tiny
gte-tinyist eine 60-MB-Dateisymbex '*' '*:*' --nlgibt Funktionen und Klassenmethoden im aktuellen Verzeichnis als newline-delimited JSON ausllm embed-multi ... --format nlnimmt 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/llmals Collectionllm-issueserstellen 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 Timeund 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
- Matt Webb erstellte OpenAI-Embeddings aus Episodenbeschreibungen des BBC-Podcasts
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 similarfindet relevante Absätzejqextrahiert 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, dassshot-scraperein 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
- Für SQLite gibt es sqlite-vss
- Für PostgreSQL gibt es pgvector
- Facebooks FAISS wurde ebenfalls in Experimenten verwendet; dafür gibt es das Datasette-Plugin datasette-faiss
- 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-tinyerhöhen die Chancen, sie auf eingeschränkten Geräten oder im Browser auszuführen
Weitere Lektüre
- What are embeddings? von Vicki Boykis
- Text Embeddings Visually Explained von Meor Amer für Cohere
- The Tensorflow Embedding Projector: ein interaktives Tool zum Erkunden von Embedding-Räumen
- Learn to Love Working with Vector Embeddings: Sammlung von Pinecone-Tutorials zu Vektor-Embeddings
1 Kommentare
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 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
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
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
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
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
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 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
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.5undmagnitude_b = sum(x * x for x in b) * 0.5das*0.5nicht nötigWenn 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
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 verwendetAls ich die Stelle las, dass „mehrere Versionen von Cosine-Similarity-Code von ChatGPT geschrieben wurden“, ergab das Sinn
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...
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
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.
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 ...
Embeddings direkt zu lernen ist buchstäblich das ursprüngliche Embedding-Modell, nämlich Word2Vec.
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.
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.
Solche Werkzeuge gibt es schon lange; man kann zum Beispiel ein paar Daten labeln und dann einen SVM-Klassifikator auf dem Embedding-Raum trainieren.