Skip to Content
Erklärstück

Eine Karte

EmbeddingGemma 2 setzt Text, Bilder, Ton und Video in einen gemeinsamen Vektorraum und läuft ohne Grafikkarte. Wie es funktioniert, und was wir auf vier Prozessorkernen gemessen haben.

Diese Fallakte teilen← Alle Artikel

Montag. Ein Rohr platzt, ein Schlafzimmer steht unter Wasser, und am Abend hat der Auftrag seine Spur auf dem gemeinsamen Laufwerk hinterlassen: ein Bericht, eine Sprachnotiz, Fotos, ein gescannter Lieferschein, ein Video vom Gang durch die Wohnung.

Drei Wochen später will jemand nur eines wissen: Zeig mir alles zur Schlafzimmerdecke. Die Suche findet den Bericht, weil im Bericht die Wörter stehen. Im Foto der Decke steht kein einziges Wort.

Ein schwarzer Tisch mit einer Festplatte, einem Besichtigungsbericht mit dem Stempel FOUND, einem Tonbandgerät, einem Projektor, einem gescannten Lieferschein und dem Foto einer fleckigen Decke mit dem Stempel NOT FOUND und dem Etikett: no words in it

Am 6. Oktober 2026 hat Google DeepMind ein Modell veröffentlicht, das diese Lücke schließen soll: EmbeddingGemma 2. Dieser Artikel erklärt, was es ist und wie es funktioniert, und berichtet dann, was passiert ist, als wir es auf vier Prozessorkernen laufen ließen.

Was ein Embedding ist

Ein Embedding ist eine Liste von Zahlen, die für die Bedeutung von etwas steht. Am einfachsten stellt man es sich als Ort auf einer Karte vor. Ein Modell liest einen Satz und setzt ihn irgendwohin; Sätze, die dasselbe bedeuten, landen nah beieinander, auch wenn sie kein Wort gemeinsam haben. „A burst pipe“ und „Rohrbruch“ sind Nachbarn.

Suchen ist dann einfach. Man setzt die Frage auf dieselbe Karte und sieht nach, was in der Nähe liegt.

Ein Blatt Karopapier als Karte: „a burst pipe“, „Rohrbruch“, „water through the ceiling“ und „the joint under the sink failed“ liegen dicht beieinander in einem grünen Kreis um die Frage; „holiday rota“ und „van service record“ weit entfernt

Wie man Bilder und Ton bisher durchsucht hat

Jahrelang war diese Karte nur für Text da, also wurde alles andere zuerst in Text verwandelt. Ein Bild ging durch ein Programm, das nach Buchstaben sucht (OCR). Eine Aufnahme ging durch eine Transkription. Dann wurden die Wörter eingebettet.

Das funktioniert, und so arbeitet heute die meiste Dokumentensuche. Es hat zwei Preise. Es sind drei Maschinen hintereinander, jede mit ihren eigenen Fehlern. Und man findet nur, was eine von ihnen aufgeschrieben hat. Ein Fleck an der Decke schreibt nichts auf.

Drei Maschinen hintereinander: Ein Foto geht an eine Lupe mit der Aufschrift „a reader looks for letters“ und kommt als leeres Blatt mit dem Stempel NOTHING heraus; ein Tonbandgerät geht an eine Schreibmaschine und kommt als Abschrift heraus; nur die Abschrift erreicht die Karte

Dazwischen gab es Zwischenschritte. CLIP (2021) trainierte zwei Modelle nebeneinander, eines für Bilder und eines für Bildunterschriften, sodass ein Foto und seine Unterschrift am selben Ort landen. Das machte die Suche von Text nach Bild gut, für ein Paar von Formaten. ImageBind (2023) richtete sechs Formate an Bildern aus. Der neueste Ansatz ist ein Modell, das jedes Format selbst liest. Googles Gemini Embedding 2 arbeitet so, aber nur als API. EmbeddingGemma 2 ist dieselbe Idee mit offenen Gewichten, in einer Größe, die man selbst betreiben kann.

EmbeddingGemma 2

Veröffentlicht6. Oktober 2026, Google DeepMind
LizenzApache 2.0, offene Gewichte
Größe740 Millionen Parameter: 270 Mio. für Text, 170 Mio. für den Bild-Encoder, 300 Mio. für den Audio-Encoder
LiestText und Code, Bilder, Video, Audio und Mischungen daraus
LiefertEinen Vektor aus 768 Zahlen, egal was hineinkam
Fenster8.192 Tokens: etwa 29 Bilder, 58 Videobilder oder fünfeinhalb Minuten Ton

Ein Modell, das Text liest, kann keine Pixel lesen. Deshalb stehen zwei kleine Encoder davor. Der eine macht aus einem Bild Tokens, der andere tut dasselbe für Ton. Von da an ist alles eine Reihe von Tokens, durch ein gemeinsames Rückgrat. Standardmäßig kostet ein Foto 280 Tokens, ein Videobild 140 und eine Sekunde Ton 25.

Am Ende mittelt das Modell alles zu 768 Zahlen: ein Ort auf der Karte.

Ein Diagramm auf einem Tisch: Ein Foto geht in einen Kasten „vision encoder 170M“, ein Tonbandgerät in „audio encoder 300M“, ein Textstreifen läuft direkt weiter; alle drei kommen als Reihen von Tokens in einem Kasten „one shared backbone 270M“ an, heraus kommt ein Streifen mit 768 Zahlen, der auf einer kleinen Karte landet

Einen technischen Bericht zu diesem Modell selbst haben wir nicht gefunden. Zu seinem größeren Geschwister hinter der API, Gemini Embedding 2, gibt es ein Paper, und das beschreibt kontrastives Training in großem Maßstab: Man zeigt dem Modell Paare, die zusammengehören, ein Foto und seine Unterschrift, einen Clip und seine Abschrift, und trainiert es, jedes Paar zusammenzuziehen und alles andere wegzuschieben.

Zwei Entwurfsentscheidungen, die im Betrieb zählen

Kleinere Vektoren. Das Modell ist so trainiert, dass die ersten 512, 256 oder 128 Zahlen eines Vektors für sich als Vektor funktionieren (Matryoshka Representation Learning, nach den russischen Puppen). Bei 256 Zahlen speichert man ein Drittel. Der Haken steht in Googles eigener Tabelle:

Behaltene ZahlenText (MTEB multilingual)Bilder, Video, Dokumente (MMEB v2)
76861,3659,01
25660,4156,24
12857,8945,65

Auf 128 gekürzt verliert Text dreieinhalb Punkte; Bilder und Video verlieren dreizehn.

Sechs Steckpuppen über einem Zahlenstreifen, dessen erstes Drittel grün eingefärbt ist, und ein Blatt mit Googles Tabelle: bei 128 Zahlen erreicht Text 57,9 und Bilder und Video 45,7, beide markiert

Optionale Encoder. Bild- und Audio-Encoder kann man weglassen. Text allein sind 270 Millionen Parameter, und er landet auf derselben Karte. Man kann seine Fotos also einmal mit dem ganzen Modell indexieren und mit dem kleinen durchsuchen.

Drei Blöcke: vision, optional, plus 170M; audio, optional, plus 300M; text alone, 270M, in Grün. Fäden führen zu einer Karte: „index once, full model“ und „search, small model“

Betrieb auf einem Prozessor

Google sagt, das Modell sei für Laptops und Telefone gebaut. Wir wollten wissen, was das auf einem gewöhnlichen Serverprozessor ohne Grafikkarte bedeutet. Der Aufbau: ein Kubernetes-Cluster mit einem Knoten in Docker auf einem Apple M1 Pro, der Modell-Pod auf vier Kerne begrenzt, die auf 8 Bit quantisierten Gewichte.

Wo es heute läuft

Die erste Überraschung hatte nichts mit Tempo zu tun. Ollama ist der übliche Weg, solche Modelle zu betreiben, und in seiner Bibliothek steht embeddinggemma-2. In einem Linux-Container antwortete jedes Tag gleich:

Error: this model requires MLX support, but the MLX runtime is not available

Am 11. Oktober 2026 (Ollama 0.40.3) sind die Builds der Bibliothek nur für Apples MLX-Laufzeit gemacht. Ein Maintainer schrieb im Issue, Linux und Windows würden bald unterstützt. Die GGUF-Datei über Ollama zu laden half auch nicht: Das mitgelieferte llama.cpp kannte die Architektur noch nicht.

Der Server von llama.cpp selbst schon. Ein Container, die offizielle GGUF-Datei aus ggml-org/embeddinggemma-2-GGUF und ein Endpunkt im OpenAI-Format:

containers: - name: llama-server image: ghcr.io/ggml-org/llama.cpp:server args: - --hf-repo - ggml-org/embeddinggemma-2-GGUF:Q8_0 - --no-mmproj # nur der Text-Teil; weglassen, um die Encoder zu laden - --embedding - --ctx-size - "8192" - --parallel - "4" - --threads - "4"

Zwei Reiter auf einem Tisch. „Ollama 0.40.3, Linux“ mit dem Fehlertext und dem Stempel: Apple chips only. „llama.cpp, official GGUF“ mit „model loaded, POST /v1/embeddings, 768 numbers“ und dem Stempel: works

Wie schnell

EmbeddingGemma 2, 4 KerneEmbeddingGemma 2, 8 KerneMiniLM-L6, 2 Kerne
Eine Frage0,12 s0,11 s0,002 s
Abschnitte von 1.200 Zeichen pro Sekunde0,40,6 bis 0,75,9

MiniLM-L6 ist das kleine englische Modell, das wir bis dahin verwendet hatten (22 Millionen Parameter). Ein Abschnitt von 1.200 Zeichen sind etwa 300 Tokens.

Eine Suche ist also so schnell, dass es niemand merkt. Langsam ist der Aufbau des Index: Bei 0,4 Abschnitten pro Sekunde brauchen hunderttausend Abschnitte auf vier Kernen etwa drei Tage. Für ein Laufwerk mit ein paar tausend Dateien ist das ein Abend. Für ein Archiv ist es ein Grund, sich für das Indexieren eine Grafikkarte zu leihen und die CPU für das Suchen zu behalten.

Eine Stoppuhr, die Zahl 0,12 s für eine Frage, und zwei Balken für das Indexieren in Abschnitten pro Sekunde: EmbeddingGemma 2 auf vier Kernen 0,4, MiniLM auf zwei Kernen 5,9

Findet es etwas

Wir haben zehn Fragen zum Laufwerk geschrieben, jede mit den Dateien, die ein Mensch zurückbekommen möchte, und sie über dieselbe Suche mit drei Modellen gestellt.

ModellRichtige Datei an erster StelleMittlerer reziproker Rang
MiniLM-L6 (384 Zahlen, auf Englisch trainiert)5 von 100,64
EmbeddingGemma 2 auf vier Kernen6 von 100,78
Gemini Embedding 2 über die API (768 Zahlen)7 von 100,83

Zehn Fragen sind eine Demonstration, kein Benchmark. Der deutlichste Unterschied lag nicht in den Summen. „Flooded basement after heavy rain“, auf Englisch gefragt, brachte mit beiden Google-Modellen die deutsche Notiz Kellerüberflutung an erster Stelle. MiniLM lieferte sie überhaupt nicht.

Eine Anzeigetafel mit drei Reihen aus zehn Quadraten: MiniLM 5 von 10, EmbeddingGemma 2 6 von 10, Gemini Embedding 2 7 von 10; darunter die englische Frage „flooded basement after heavy rain“ und die deutsche Notiz, die sie gefunden hat, mit dem Stempel FIRST

Die Prompts, die man leicht übersieht

Eine Zeile in der Modellkarte entscheidet, ob man diese Zahlen bekommt. Das Modell will wissen, auf welcher Seite einer Suche ein Text steht:

task: search result | query: water coming through the bedroom ceiling title: none | text: Water has come through the ceiling over the bed…

Eine Bibliothek wie sentence-transformers setzt sie für einen. Ein nackter /v1/embeddings-Endpunkt bettet ein, was als Zeichenkette ankommt. Ohne die Prompts setzte dasselbe Modell auf denselben Abschnitten die richtige Datei fünfmal statt sechsmal an die erste Stelle (mittlerer reziproker Rang 0,70 statt 0,78): Kurze Zeichenketten, die der Frage nur ähnlich sahen, lagen vor dem Abschnitt, der sie beantwortet.

Zwei Papierstreifen: „task: search result | query:“ vor einer Frage und „title: none | text:“ vor einem Dokument; darunter zwei Reihen von Quadraten, mit Prompts sechs von zehn, ohne fünf

Das Foto selbst

Dann haben wir das ganze Modell geladen, samt Encodern, auf denselben vier Kernen, und ihm die Bilder selbst gegeben. Kein OCR, keine Bildunterschrift.

Zuerst eine Plausibilitätsprüfung: sechs Bildunterschriften gegen sechs Bilder. Jede Unterschrift erzielte ihren höchsten Wert beim eigenen Bild.

Ein Raster von sechs mal sechs Ähnlichkeitswerten zwischen sechs Bildunterschriften und sechs Bildern; die Diagonale, das jeweils eigene Bild, ist grün, von 0,67 bis 0,81

Dann ein Index mit 43 Dingen: die 35 Dateien, die Text haben, die sechs Bilder als Pixel und die zwei Sprachnotizen als Ton.

  • „Water coming through the bedroom ceiling“: Das Foto kam an dritter Stelle, die gesprochene Notiz an vierter.
  • „The pipe joint that failed under a sink“: Das Foto des Rohrs kam an erster Stelle.
  • „Schimmel im Schlafzimmer hinter dem Schrank“, auf Deutsch gefragt: Das Foto der schimmeligen Ecke kam an vierter Stelle.
  • Jede Sprachnotiz, als Ton eingebettet, lag am nächsten bei ihrer eigenen Abschrift (0,83 gegenüber 0,72 für die der anderen Notiz).

Das Foto der Decke neben einer Liste mit der Überschrift „43 things on one map, nearest first“: die Abschrift der Sprachnotiz, die Feuchtemessungen, dann grün markiert „the photograph, pixels“ mit 0,763, dann „voice memo, sound“

Der Preis ist Zeit. Ein Foto brauchte auf vier Kernen etwa eine Minute (53 bis 60 Sekunden), der A4-Scan fast vier Minuten, eine Notiz von 33 Sekunden 12 Sekunden. Das ist in Ordnung für ein paar hundert Bilder und aussichtslos für eine Million.

Wo wir es betrieben haben

Den Text-Teil haben wir in Classifyre laufen lassen. Es scannt eine Quelle, liest in Text, was sich lesen lässt, und indexiert den Text. Das Modell wird als OpenAI-kompatibler Endpunkt angeschlossen: eine Adresse im Cluster, kein Schlüssel, und die beiden Prompts.

Die Anbieter-Seite in Classifyre: Embedding-Modell eingeschaltet, 768 Dimensionen, ein Dokument-Prompt „title: none | text:“ und ein Such-Prompt „task: search result | query:“, dazu ein leeres Schlüsselfeld mit dem Hinweis, dass ein Server wie Ollama oder llama.cpp keinen braucht

Nach der Schlafzimmerdecke gefragt liefert der Arbeitsbereich zuerst die Sprachnotiz (Whisper hatte sie transkribiert), dann die Feuchtemessungen, dann den Bericht.

Die Asset-Liste in Classifyre, semantisch durchsucht nach „water coming through the bedroom ceiling“: zuerst die Sprachnotiz HR-2231-site-memo.m4a, dann HR-2231-readings.csv, dann HR-2231-inspection-report.docx

Was es nicht tut: Es nutzt nur die Textseite des Modells. Bilder werden nach ihren Wörtern gelesen, und die drei Fotos ohne Schrift tauchen in keinem Ergebnis auf. Das Bild selbst einzubetten, wie im Abschnitt oben, kann das Produkt nicht.

Der Test eines neuen Modells hat auch Dinge zutage gebracht, die nichts mit ihm zu tun hatten. Vier davon sind seit heute im Entwicklungszweig behoben:

  • Das Leseprogramm hatte aufgehört zu lesen. Eine Version der OCR-Bibliothek vom 8. Oktober hat einen Namen entfernt, den eine andere Bibliothek importiert. Diese fing den Fehler ab, schrieb „no OCR engine found“ ins Protokoll und machte weiter, sodass jedes Bild und jeder Scan als leeres Dokument zurückkam. Das zählt jetzt als fehlgeschlagene Extraktion mit genanntem Grund, und die Version ist festgeschrieben.
  • Die Transkription stürzte ab, bei jeder Audio- und Videodatei, nachdem ein Update der Medienbibliothek ein Argument entfernt hatte, das die Sprachbibliothek noch übergibt. Ebenfalls festgeschrieben.
  • Ein Endpunkt ohne API-Schlüssel wurde abgelehnt, was jeden selbst betriebenen Server ausschloss. Für solche ist der Schlüssel jetzt optional.
  • Für die beiden Prompts gab es keinen Platz. Sie sind jetzt Felder am Anbieter, und eine Änderung des Dokument-Prompts bettet den Arbeitsbereich neu ein.

Was es nicht tut

  • Seine Werte liegen dicht beieinander. In unserem Raster erzielte das richtige Bild 0,67 bis 0,81 und ein falsches 0,51 bis 0,71. Ordnen Sie die Ergebnisse; ziehen Sie keine Grenze bei einer Zahl.
  • 128 Zahlen sind für Text. Das sagt Googles Tabelle, und die Modellkarte sagt es auch.
  • Beim Indexieren ist es auf einem Prozessor nicht schnell, und Bilder kosten weit mehr als Text.
  • Es liest 8.192 Tokens auf einmal. Eine lange Aufnahme oder ein Video muss vorher zerschnitten werden.
  • Es war fünf Tage alt, als wir es getestet haben. Die Werkzeuge holen noch auf, wie der Ollama-Fehler zeigt.

Eine Faustregel

Eine Karte schlägt drei Maschinen hintereinander. Einmal mit dem großen Modell indexieren, mit dem kleinen suchen. Und an den eigenen Dateien testen, mit Fragen, deren Antworten man kennt.

Quellen

Mehr aus dem Blog

Last updated on