Zurück zum Blog

iPhone-Fotos bleiben lokal, Comma findet sie

Auch die Modelle laufen lokal. Eine Frage in eigenen Worten genügt, und Comma findet die Fotos in einem lokalen Index.

LoslegenDokumentation lesen

Bei der Online-Buchung eines Mietwagens verlangt das Formular die Nummer und das Ablaufdatum des Führerscheins. Der Führerschein ist nicht zur Hand. Im letzten Jahr, beim neuen Führerschein, entstanden Fotos von Vorder- und Rückseite, doch die stecken irgendwo zwischen Zehntausenden Fotos auf dem iPhone. Der Wunsch: Comma in eigenen Worten fragen und die beiden Fotos zurückbekommen.

Diese Anleitung zeigt einen Weg dorthin: Lokale Modelle bauen einen Index der Fotos auf, und Comma durchsucht ihn. Es handelt sich um eine Beispielkonfiguration auf einem Mac, nicht um eine eingebaute Funktion von Comma.

Die Mediathek bleibt lokal

Comma braucht keine Kopie der Fotos. Die schwere Arbeit, also den Text in jedem Bild zu lesen und jedes Foto in Vektoren umzuwandeln, erledigen lokale Modelle. Der Agent erhält das Ergebnis einer Suche: einige Foto-IDs, ihre Daten, den darin erkannten Text und, wenn eine Auswahl nötig ist, einen Kontaktbogen mit Miniaturen. Nur die Fotos, die am Ende ausgewählt werden, gelangen in den Chat.

Die Fotos selbst werden weiterhin über iCloud synchronisiert; „lokal“ meint hier die Texterkennung, die Vektoren und den Index nach dem Export. Nutzt Comma ein Cloud-Modell, gehen diese Suchergebnisse und jedes Bild, das Comma ansehen soll, an den gewählten Modellanbieter. Bei einem Dokument wie dem Führerschein enthält der erkannte Text die Nummer und die Adresse. Der Index selbst wird nirgendwohin gesendet. Comma ist Open Source und lässt sich auch auf der eigenen Maschine betreiben.

Den Fotoindex aufbauen

Der Index hängt sich an den Weg, den die Fotos ohnehin nehmen. Auf dem iPhone ändert sich nichts.

Fotos werden über iCloud-Fotos vom iPhone auf den Mac synchronisiert und exportiert; danach erstellen lokale Modelle Miniaturen, lesen Text, berechnen zwei Sätze Bildvektoren und bauen einen Volltextindex auf 1 · Fotos auf den Mac holen iPhone fotografiert wie gewohnt iCloud-Fotos synchronisiert sie auf den Mac Fotos auf dem Mac Mediathek auf externer Festplatte Originale exportieren behält Zeit und Ort 2 · Mit lokalen Modellen verarbeiten Miniaturen spätere Schritte lesen nur diese Text Apple Vision Bildvektoren Chinese-CLIP Bildvektoren Qwen3-VL-Embedding Volltextindex SQLite die Suche rankt mit jedem Satz und führt beide Ranglisten zusammen Fotos werden über iCloud-Fotos vom iPhone auf den Mac synchronisiert und exportiert; danach erstellen lokale Modelle Miniaturen, lesen Text, berechnen zwei Sätze Bildvektoren und bauen einen Volltextindex auf 1 · Fotos auf den Mac holen iPhone fotografiert wie gewohnt iCloud-Fotos synchronisiert sie auf den Mac Fotos auf dem Mac Mediathek auf externer Festplatte Originale exportieren behält Zeit und Ort 2 · Mit lokalen Modellen verarbeiten Miniaturen spätere Schritte lesen nur diese Text Apple Vision Bildvektoren Chinese-CLIP Bildvektoren Qwen3-VL-Embedding Volltextindex SQLite die Suche rankt mit jedem Satz und führt beide Ranglisten zusammen
Jeder Schritt nach dem Export läuft auf dem Mac.

Die Einrichtung hat drei Schritte:

  1. Fotos auf den Mac holen. Die Fotos vom iPhone mit iCloud-Fotos auf den Mac synchronisieren und neue Fotos täglich in einen Ordner exportieren.

  2. Mit lokalen Modellen verarbeiten. Den Text in jedem Bild erkennen und das Bild mit Chinese-CLIP und Qwen3-VL-Embedding in Vektoren umwandeln.

  3. In einem lokalen Index speichern. Die Ergebnisse in einer lokalen Datenbank ablegen, dazu ein Befehl für die Suche. In diesem Beispiel heißt der Befehl lpa.

Was eine Suche liefert

Lokal ist eine Suche ein Befehl. Ein Aufruf kann mehrere Formulierungen enthalten, und die Modelle werden nur einmal geladen. Der Agent macht aus Wörtern wie „letztes Jahr“ einen Datumsbereich.

sh
lpa search "driver license" "driver's license" "驾照" \
  --from 2025-01-01 --to 2026-01-01 --prefer text --json -n 9

Jedes Ergebnis zeigt, welche Art von Beleg dahintersteht:

KennzeichnungBedeutung
TexttrefferJedes Wort wurde im Text des Bildes gefunden.
MöglichDas Bild sieht ähnlich aus. Ähnliches wird leicht verwechselt.
Geringe SicherheitWird nur angezeigt, wenn es nichts Besseres gibt.

--prefer text stellt Texttreffer nach vorn und eignet sich für Dokumente, Karten und Bildschirmfotos. --prefer picture stellt ähnlich aussehende Bilder nach vorn und eignet sich für eine Katze oder einen Strand. Fast gleiche Fotos, die innerhalb weniger Minuten entstanden sind, belegen nur einen Platz in der Liste; die übrigen hängen darunter.

Ein Comma-Chat: Auf die Frage nach dem WLAN-Passwort einer Pension am Meer liest Comma Netzwerkname und Passwort von einem kleinen Kärtchen auf einem Zimmerfoto ab und sendet das Foto.
Ein Texttreffer: Netzwerkname und Passwort stammen aus den Wörtern auf der Karte im Foto. Das Foto wurde für dieses Beispiel erzeugt.
Ein Comma-Chat: Auf die Bitte um Fotos einer Katze auf der Fensterbank liefert Comma drei Fotos der Katze auf einer Fensterbank.
Ein Bildtreffer: Nichts in diesen Fotos lautet „Katze“ oder „Fensterbank“; die Bildvektoren finden sie.

Sind die obersten Ergebnisse unsicher, rät der Agent nicht. Er legt die Miniaturen der Kandidaten auf einen nummerierten Bogen, höchstens neun, und bittet um eine Auswahl.

Ein nummerierter Kontaktbogen mit drei mal drei Bildern: 1 und 2 sind Vorder- und Rückseite eines Muster-Führerscheins, 3 und 4 sind WLAN-Karten, der Rest sind Kandidaten mit geringer Sicherheit.
Ein Beispiel-Kontaktbogen; der Führerschein ist eine Musterkarte. 1 und 2 sind Texttreffer für Vorder- und Rückseite, 3 und 4 sehen wie Karten aus, der Rest sind Kandidaten mit geringer Sicherheit. Auf die Antwort „1 und 2“ sendet der Agent beide Seiten des Führerscheins.

Wie die beiden Vektorsätze zusammenwirken, wurde an einer vollständigen Mediathek mit rund 50.000 Fotos kalibriert. Mit Qwen3-VL-Embedding allein landeten die richtigen Antworten, die ein Mensch ausgewählt hatte, weiter hinten als mit Chinese-CLIP allein. Mit zusammengeführten Ranglisten schnitt jeder geprüfte Eintrag mindestens so gut ab wie mit einem der beiden Modelle allein. Auch „Möglich“ gibt es nur, wenn die Ähnlichkeit beider Modelle über der Schwelle liegt: Bei einer Testabfrage sank die Zahl der als „Möglich“ markierten Fotos von 4.970 auf 4. Der Preis: Eine Suche dauert 3,5–6 Sekunden statt etwa 3.

Dieses Beispiel läuft auf einem MacBook Air mit 16 GB Arbeitsspeicher, mit der 2B-Version von Qwen3-VL-Embedding. Auf einer stärkeren Maschine lassen sich größere Qwen-Modelle verwenden:

  • Ein größeres Vektormodell. Qwen3-VL-Embedding-2B durch Qwen3-VL-Embedding-8B ersetzen. Danach müssen die Vektoren aller Fotos mit dem neuen Modell neu berechnet werden.

  • Beschreibungen und Schlagwörter für jedes Foto. Zusätzlich Qwen3-VL-4B-Instruct oder Qwen3-VL-8B-Instruct ausführen, um für jedes Foto eine einzeilige Beschreibung und einige Schlagwörter zu schreiben und im Textindex zu speichern. Auf einem MacBook Pro mit 24 GB Arbeitsspeicher läuft zum Beispiel das 8B-Modell mit 8-Bit-Quantisierung. Die Schlagwörter taugen für eine grobe Vorauswahl; dass sie stimmen, ist nicht garantiert.

Und Englisch? Chinese-CLIP wurde vor allem mit chinesischen Bildern und Texten trainiert und ist für englische Abfragen nicht verlässlich. Die beiden anderen Teile sind nicht betroffen: Die Texterkennung liest Chinesisch wie Englisch, und Qwen3-VL-Embedding unterstützt viele Sprachen. Deshalb gehören chinesische und englische Formulierungen in dieselbe Suche, wie im Befehl oben; das lässt sich in einem Skill festhalten. Sind Mediathek und Fragen überwiegend englisch, kann Chinese-CLIP auch durch das ursprüngliche CLIP ersetzt werden, was ebenfalls eine Neuberechnung der Vektoren bedeutet.

Familie und Freunde finden

Fotos gruppiert die Gesichter derselben Person bereits. Der Index nutzt diese Gruppen direkt und macht keine eigene Gesichtserkennung.

  1. Zuerst Personen benennen. Beim ersten Mal wählt der Agent einige Fotostapel aus diesen Gruppen, nummeriert sie und fragt, wer das ist. Erst nach einer Antwort wie „Nummer 3 ist Mama“ merkt er es sich. Eine nicht bestätigte Gruppe gilt als niemand.

  2. Nach Person suchen. Danach berücksichtigt die Suche bei einem Namen nur die Fotos, auf denen diese Person zu sehen ist. Namen lassen sich kombinieren: Bei zwei Namen kommen nur Fotos mit beiden Personen zurück, also gemeinsame Fotos.

  3. Mit anderen Bedingungen kombinieren. Ein Name lässt sich mit Bildinhalt und Zeitraum verbinden, etwa „Fotos von Mama und mir am Strand letztes Jahr“:

sh
lpa search "beach" --person Me --person Mom \
  --from 2025-01-01 --to 2026-01-01 --prefer picture --json -n 9

Ist ein Name nicht bestätigt oder haben zwei Personen denselben Namen, sagt die Suche das, statt zu raten. Ein falscher Name lässt sich korrigieren, und jede Korrektur lässt sich rückgängig machen.

So werden Videos gefunden

Videos werden getrennt von Fotos durchsucht. Eine normale Suche betrachtet nur Fotos. Soll es etwa das Video sein, in dem das Kind die Geburtstagskerzen auspustet, genügt der Hinweis an Comma, dass ein Video gesucht wird; dann ergänzt Comma die Suche um --source video:

sh
lpa search "blowing out candles" "birthday cake" --source video --json -n 9

Dahinter stehen drei Schritte:

  1. Einzelbilder entnehmen. Das Video selbst geht nie in ein Modell. Das Indexierungsprogramm entnimmt alle 5 Sekunden ein Einzelbild, höchstens 12 pro Video.

  2. Nach Einzelbildern suchen. Die Einzelbilder durchlaufen dieselbe Verarbeitung wie Fotos: Texterkennung und beide Vektorsätze. Eine Suche vergleicht diese Einzelbilder; passt eines, gilt das ganze Video als gefunden und belegt nur einen Platz in den Ergebnissen.

  3. Das Video senden. Nach der Auswahl sendet der Agent es mit lpa video.

Ein Comma-Chat: Auf die Bitte um ein Video von Bambusflößen in Yangshuo liefert Comma ein 12-sekündiges Video von Flößen, die über ein Wehr gleiten.
Eine Videosuche: Die passenden Einzelbilder gehören zu einem Video, daher ist das Video ein einziges Ergebnis.

Vorerst zählt nur das Bild, nicht der Ton. Was in einem Video gesagt wird, lässt sich noch nicht durchsuchen, und Personen in einem Video werden noch nicht erkannt. Die Zahl der Einzelbilder ist begrenzt, sodass etwas, das in einem langen Video nur kurz aufblitzt, unter Umständen nicht gefunden wird.

Wie LocalPhotoAgent aufgebaut ist

Das lpa in dieser Anleitung stammt aus LocalPhotoAgent, einem selbst geschriebenen Indexierungsprogramm, das wir als Open Source veröffentlichen werden. Die Indexierung ist oben beschrieben; zwei Punkte kommen hinzu:

  • Es lässt sich jederzeit anhalten. Jeder Schritt jedes Fotos wird einzeln festgehalten. Nach einem Abbruch geht es beim nächsten Mal weiter; nach einer geänderten Einstellung läuft nur der betroffene Schritt erneut. Während der Arbeit behält es Arbeitsspeicher, Temperatur und Speicherplatz im Blick und pausiert, sobald ein Wert seine Grenze überschreitet.

  • Es gibt dem Agenten einige Befehle. lpa search sucht, lpa sheet erstellt einen Kontaktbogen, lpa preview sendet Fotos und lpa video sendet Videos. Bei der Suche nach Fotos ruft der Agent sie in dieser Reihenfolge auf:

Der Comma-Agent führt über den Connector lpa search aus, bei Unsicherheit lpa sheet, dann lpa preview oder lpa video; nur Bogen und Senden lesen die externe Festplatte Comma-Agent führt Befehle über den Connector aus lpa search durchsucht nur die Datenbank lpa sheet erstellt bei Unsicherheit einen Bogen lpa preview / video sendet das Foto oder Video Externe Festplatte Miniaturen und Originale, nur für einen Kontaktbogen oder ein Senden gelesen Der Comma-Agent führt über den Connector lpa search aus, bei Unsicherheit lpa sheet, dann lpa preview oder lpa video; nur Bogen und Senden lesen die externe Festplatte Comma-Agent führt Befehle über den Connector aus lpa search durchsucht nur die Datenbank lpa sheet erstellt bei Unsicherheit einen Bogen lpa preview / video sendet das Foto oder Video Externe Festplatte Miniaturen und Originale, nur für einen Kontaktbogen oder ein Senden gelesen

Comma verbinden

Vorausgesetzt ist, dass LocalPhotoAgent auf dem Mac bereits funktioniert. Die Verbindung hat vier Schritte:

  1. Ein Gerät hinzufügen. In Comma unter Settings > Devices auf Add device klicken, um einen Installationsbefehl zu erhalten.

  2. Den Befehl ausführen. Ihn im Terminal des Macs ausführen, auf dem die Mediathek liegt, um den Comma Connector zu installieren.

  3. Den Zugriff einschalten. Ein neues Gerät steht zunächst auf Off. Erst mit Full kann der Agent lpa ausführen.

  4. Einen Skill schreiben. Dem Agenten mitteilen, dass er zuerst sucht, bei Unsicherheit einen Kontaktbogen schickt und Fotos erst nach der Auswahl sendet. Es genügt auch, Comma zu bitten, „einen Skill zu erstellen“.

Danach reicht eine Frage wie in jedem Chat: „Finde die Fotos meines Führerscheins vom letzten Jahr, Vorder- und Rückseite.“

Ein Comma-Chat: Auf die Bitte um die Fotos des Führerscheins vom letzten Jahr, Vorder- und Rückseite, sendet Comma zwei Fotos eines Muster-Führerscheins.
Die Frage vom Anfang dieser Anleitung, beantwortet. Der Führerschein ist eine Musterkarte.

Vertrauen und Grenzen

Der Index liest die Originale nur. Er verschiebt, bearbeitet oder löscht sie nie. Eine Suche berührt die externe Festplatte überhaupt nicht; nur das Erstellen eines Kontaktbogens und das Senden eines Fotos lesen von ihr. Fotos zu verschieben oder zu löschen gehört nicht zu dieser Konfiguration. Allerdings kann der Agent mit dem Zugriff Full auf diesem Mac auch andere Befehle als lpa ausführen.

Ein Texttreffer bedeutet nur, dass die Wörter gefunden wurden, nicht, dass es das gesuchte Foto ist. „Möglich“ ist nur ein Kandidat. Wenn Comma eine Anfrage als erledigt markiert, lohnt ein Blick auf die gesendeten Fotos.

Für den ersten Versuch eignet sich etwa: „Finde die Fotos meines Führerscheins vom letzten Jahr. Zeig mir zuerst den Kontaktbogen und sende, verschiebe oder lösche nichts.“

Try Comma, Now.

Loslegen