← CS Lab AI & Machine Learning / Cosine Similarity Open standalone ↗

Cosine similarity scores how alike two vectors are by the angle between them — not by how far apart they sit. It is the default ranking signal behind semantic search: turn text into a vector, and "relevant" becomes "points in nearly the same direction".

Where you meet it

What it does

It collapses two vectors into a single number in [−1, 1] that captures orientation. The drag-tool shows this in 2D; the real payoff is that the same formula works unchanged in the hundreds or thousands of dimensions an embedding actually lives in, where you can't picture the angle at all.

Throwing away length is the whole point: a tweet and an essay on one topic should match, and only the angle lets them.

How it works

cos θ = (a · b) / (|a| · |b|)

The dot product a · b already carries the angle — it is largest when the vectors point the same way and shrinks as they turn apart, going negative once they point opposite. The catch: it also grows with length. Dividing by both magnitudes |a| and |b| cancels length entirely, leaving pure direction:

Why direction instead of Euclidean distance for text embeddings? Vector length often tracks something incidental — document length, word frequency, how often a token was seen. A short note and a long article on the same topic should match, and they do when you read the angle and ignore the length. That is exactly what cosine measures.

Watch out

  • It ignores magnitude. Two vectors with the same direction score 1 no matter their length — useful for meaning, but it discards any signal that is carried by magnitude (e.g. raw counts, confidence).
  • On L2-normalised vectors, cosine equals the dot product — every vector already has length 1, so the denominator is 1. There it is also monotonic in Euclidean distance, so cosine-nearest and L2-nearest give the same ranking. Many vector databases normalise up front and then just use the dot product.
  • It is not always the right metric. Match the similarity used at search time to the one the embedding model was trained with; the wrong choice quietly degrades results.
  • Mind the zero vector. |a| = 0 makes the denominator zero — cosine is undefined. Guard for empty or all-zero inputs instead of dividing by zero.

Go deeper

Die Kosinus-Ähnlichkeit bewertet, wie ähnlich zwei Vektoren sind — über den Winkel zwischen ihnen, nicht über ihren Abstand. Sie ist das Standard-Ranking-Signal hinter semantischer Suche: mach aus Text einen Vektor, und "relevant" wird zu "zeigt fast in dieselbe Richtung".

Wo es vorkommt

Was es tut

Es verdichtet zwei Vektoren zu einer einzigen Zahl in [−1, 1], die die Ausrichtung erfasst. Das Drag-Tool zeigt das in 2D; der eigentliche Gewinn ist, dass dieselbe Formel unverändert in den Hunderten oder Tausenden Dimensionen funktioniert, in denen ein Embedding tatsächlich lebt — wo man sich den Winkel gar nicht mehr vorstellen kann.

Die Länge wegzuwerfen ist der ganze Sinn: Ein Tweet und ein Essay zum selben Thema sollen zusammenpassen — und nur der Winkel lässt sie das.

Wie es funktioniert

cos θ = (a · b) / (|a| · |b|)

Das Skalarprodukt a · b trägt den Winkel bereits in sich — es ist am größten, wenn die Vektoren in dieselbe Richtung zeigen, und wird kleiner, je weiter sie auseinanderdrehen, bis negativ bei entgegengesetzter Richtung. Der Haken: Es wächst auch mit der Länge. Das Teilen durch beide Beträge |a| und |b| kürzt die Länge komplett heraus — übrig bleibt reine Richtung:

Warum Richtung statt euklidischer Distanz bei Text-Embeddings? Die Vektorlänge spiegelt oft etwas Nebensächliches — Dokumentlänge, Worthäufigkeit, wie oft ein Token gesehen wurde. Eine kurze Notiz und ein langer Artikel zum selben Thema sollen zusammenpassen — und das tun sie, wenn man den Winkel liest und die Länge ignoriert. Genau das misst der Kosinus.

Worauf achten

  • Die Magnitude wird ignoriert. Zwei gleich ausgerichtete Vektoren ergeben 1, egal wie lang sie sind — gut für Bedeutung, aber jedes Signal, das in der Magnitude steckt (z. B. rohe Häufigkeiten, Konfidenz), geht verloren.
  • Bei L2-normalisierten Vektoren ist der Kosinus gleich dem Skalarprodukt — jeder Vektor hat schon Länge 1, der Nenner ist also 1. Dort ist er außerdem monoton zur euklidischen Distanz, das Kosinus-nächste und das L2-nächste Element liefern dasselbe Ranking. Viele Vektor-Datenbanken normalisieren vorab und nutzen dann einfach das Skalarprodukt.
  • Es ist nicht für jede Domäne das richtige Maß. Das Ähnlichkeitsmaß zur Suchzeit muss zu dem passen, mit dem das Embedding-Modell trainiert wurde; die falsche Wahl verschlechtert die Ergebnisse unmerklich.
  • Vorsicht beim Nullvektor. |a| = 0 macht den Nenner null — der Kosinus ist undefiniert. Leere oder komplett aus Nullen bestehende Eingaben abfangen, statt durch null zu teilen.

Mehr dazu

Next up
AI & Machine LearningVector Search AI & Machine LearningRAG Pipeline All concepts →