Erst die Repräsentation, dann der Schwellenwert
Zwei Farben, zwei Stimmungen, eine Lektion, unabhängig voneinander gelernt
Fotografie-KI·Experte·9 Min. Lesezeit · 16. Juli 2026
Der Farbabgleich in diesem System begann mit einem Vergleich, der vernünftig aussah und auf Modellebene, nicht auf Parameterebene, still falsch war.
Das kontrollierte Farbvokabular bildet ein Anfrage-Token wie "blue" auf einen festen Referenz-Hex ab — #0000FF. Die Dominantfarben eines Fotos sind eine separate, unabhängig generierte Liste echter Pixel-Hexes, extrahiert von Claude Vision — etwas wie #2C5F8A. Der ursprüngliche Abgleich verglich diese per exakter String-Gleichheit, was bedeutete, dass ein sichtbar blaues Foto und eine Anfrage nach "blue" fast nie übereinstimmten, weil zwei Hex-Strings, die echt ähnliche Farben repräsentieren, praktisch nie byte-identisch sind. Das ist kein Schwellenwert-Problem. Es ist ein Kategorienfehler: Farbe ist eine geometrische, perzeptuelle Eigenschaft, und exakte String-Gleichheit war nie ein gültiger Weg, zwei Punkte in diesem Raum zu vergleichen, unabhängig davon, welchen Schwellenwert man darum gelegt hätte.
Die Korrektur änderte das Vergleichsmodell, nicht eine Zahl darin. Sowohl der Anfrage-Hex als auch jeder Kandidaten-Hex aus der Palette werden nach OKLab konvertiert — einem perzeptuell gleichmäßigen Farbraum, veröffentlicht von Björn Ottosson im Jahr 2020 — und in diesem Raum per euklidischer Distanz verglichen. OKLab wurde dem vertrauteren CIELAB vorgezogen, weil es direkt aus linearem sRGB über zwei feste Matrizen konvertiert, ohne einen Weißpunkt- oder Farbadaptions-Parameter wählen zu müssen, und der rohen RGB-Distanz vorgezogen, weil RGB-Distanzen nicht wahrgenommenen Unterschieden entsprechen — der tiefere Defekt, dessen Sonderfall exakte Hex-Gleichheit nur war. Der Abgleich wurde gegen bekannt-gute und bekannt-schlechte Paare validiert, so berechnet: #0000FF gegen #2C5F8A (0,2308) und #7EA6C1 (0,3643) mussten als Treffer registrieren; #0000FF gegen #FF0000 (0,5371) und #008000 gegen #FF00FF (0,5309) mussten als Nicht-Treffer registrieren. Das ist reine Mathematik — keine KI, keine Embeddings, kein Klassifikator, vollständig deterministisch, vollständig lokal.
Die Korrektur des Vergleichsmodells legte das Nächste offen, was falsch war — nicht die Mathematik, sondern die Repräsentation. Jeder Farbname wurde noch immer von genau einem gesättigten Referenzmuster getragen, und eine Produktionsprüfung ergab, dass echte Fotografien fast nie eine reine Primärfarbe enthalten. Sie enthalten Himmelblau, Stahlblau, Schieferblau, marineblau-nahe Töne — eine ganze Nachbarschaft von Dingen, die eine Person "blau" nennen würde, repräsentiert durch einen willkürlichen Punkt darin. Die Korrektur bestand darin, jeden einzelnen Referenz-Hex durch eine kuratierte Farbfamilie zu ersetzen: 17 Familien, je 4 bis 8 repräsentative Hexes, entnommen aus der erweiterten Schlüsselwortliste des CSS Color Module plus einer Handvoll fotografiespezifischer Namen — Rust, Charcoal, Jet, Gunmetal —, im Quellcode ausdrücklich als solche gekennzeichnet. Der Abgleich prüft jetzt jedes Familienmitglied gegen jeden Paletteneintrag und behält das nächstgelegene Paar irgendwo in dieser erweiterten Menge. Da das erste Mitglied einer Familie immer identisch mit dem alten Einzelanker-Hex ist, kann diese Änderung gegenüber der alten Version nur Kandidaten-Treffer hinzufügen — sie kann strukturell keinen Treffer verlieren, den die Einzel-Hex-Version fand, nur solche gewinnen, die sie übersah. Die bestätigte Korrektur: Ein Foto mit Dominantfarbe #4A4A4A, zuvor von "black"s alleinigem #000000-Anker bei einer Distanz von 0,4091 abgelehnt, trifft jetzt über den Familien-Repräsentanten Charcoal bei 0,038.
Stimmung brauchte die identische Korrektur, unabhängig erreicht, aus einem strukturell identischen Grund. Der Stimmungs-Abgleich fragte noch immer ein allgemeines Text-Embedding "welches Wort ist im Sprach-Embedding-Raum am nächsten", während tatsächlich ein kuratiertes Modell affektiver Nähe gebraucht wurde — und ein Live-Ähnlichkeits-Audit, durchgeführt bevor irgendein Code geändert wurde, fand, dass nahezu perfekte menschliche Synonyme von "serene" den Produktions-Schwellenwert nicht bestanden, dass das stärkste gleich-Gefühl-Paar, das das gesamte Audit maß — "moody" und "melancholic" — ihn immer noch nicht bestand, und dass es rundweg abgelehnt wurde, den Schwellenwert zum Ausgleich zu senken, weil ein Paar ohne echte konzeptuelle Beziehung ("contemplative" und "tranquil") über einem Paar lag, das klar eine hatte ("dramatic" und "moody"). Kein einzelner globaler Schwellenwert konnte die echten Synonyme zulassen, ohne vergleichbares Rauschen mit zuzulassen. Die folgende Korrektur war dieselbe Korrektur wie bei Farbe, übersetzt in eine andere Modalität: den Einzelpunkt durch eine kuratierte Familie ersetzen. MOOD_FAMILIES gruppiert eine kleine Menge verwandter Gefühle — calm, reflective, dramatic, energetic —, jede Gruppierung mit einer eingebetteten Quellenangabe entweder zu einer echten Produktions-Ko-Okkurrenz oder einer gemessenen Audit-Ähnlichkeit belegt, nicht aus Intuition behauptet. Das war kein Zufall der Namensgebung. Es war eine Architektur, für Farbe als korrekt erwiesen, bewusst auf eine völlig andere Art von Daten wiederangewendet, weil die zugrunde liegende Form des Problems — ein Punkt, der für eine ganze Nachbarschaft verwandter Bedeutung steht — beide Male dieselbe Form hatte.
Was beide Korrekturen verbindet, ist die Reihenfolge, in der sie geschahen. Bei Farbe wurde das Vergleichsmodell (OKLab) korrigiert, bevor die Repräsentation (Familien) korrigiert wurde, und die Repräsentation wurde korrigiert, bevor jemand den sie deckelnden Schwellenwert anfasste. Bei Stimmung galt dieselbe Reihenfolge: Architektur — was überhaupt als Kandidaten-Treffer zählen sollte — wurde festgelegt, bevor irgendeine Zahl beschrieb, wie nah nah genug ist. Es andersherum zu tun — einen Schwellenwert gegen ein kaputtes Vergleichsmodell zu justieren, oder gegen einen unrepräsentativen Punkt — erzeugt eine Zahl, die präzise auf die falsche Frage kalibriert ist.
Die übertragbare Lektion: Bevor man Aufwand in die Kalibrierung eines Schwellenwerts steckt, sollte man bestätigen, dass das, was der Schwellenwert misst, tatsächlich das Richtige ist, was gemessen werden sollte. Ein perfekt justierter Grenzwert auf einem falschen Vergleichsmodell, oder ein unrepräsentativer Punkt, der für eine ganze Kategorie steht, ist keine Teilkorrektur. Es ist eine präzise falsche, und keine Menge an Schwellenwert-Justierung korrigiert dafür, dass die Schicht darunter kaputt ist.
Die Repräsentation zu korrigieren, schuf allerdings ein eigenes Problem. Mehr Referenzpunkte pro Farbe verengen mechanisch die Lücke zwischen dem, was übereinstimmen sollte, und dem, was nicht sollte — mehr Kandidatenpaare bedeuten mehr Gelegenheiten, dass die Repräsentanten zweier verschiedener Farben zufällig nah beieinanderliegen. Dieser Effekt wurde während der Familien-Arbeit direkt gemessen und ausdrücklich unadressiert gelassen, außerhalb des Umfangs dieser Phase nach ihrer eigenen erklärten Regel: keinen Schwellenwert justieren, außer die Repräsentation ist erst als strukturell fehlerhaft erwiesen — und selbst dann, es aufschieben. Die Repräsentation war jetzt korrekt. Der Schwellenwert, der für die alte, spärlichere Repräsentation kalibriert worden war, war es nicht. Irgendetwas musste die neue Lücke tatsächlich messen, statt anzunehmen, die alte Zahl passe noch.