Vektoreinbettungen

Der Begriff Embedding oder Einbettung bezieht sich auf die Reduzierung von hochdimensionalen Daten, wie z. B. unstrukturiertem Text, in eine Darstellung mit weniger Dimensionen, wie z. B. einen Vektor. Moderne Deep-Learning-Techniken können aus unstrukturierten Daten wie Text und Bildern Vektoreinbettungen erstellen, d. h. strukturierte numerische Darstellungen, wobei semantische Begriffe wie Ähnlichkeit und Unähnlichkeit in der Geometrie der erzeugten Vektoren erhalten bleiben.

Die folgende Abbildung ist ein vereinfachtes Beispiel für die Vektoreinbettung und die geometrische Ähnlichkeit von natürlichem Text. In der Praxis erzeugen neuronale Netze Einbettungsvektoren mit Hunderten oder sogar Tausenden von Dimensionen, nicht wie hier gezeigt zwei, aber das Konzept ist dasselbe. Semantisch ähnlicher Text ergibt Vektoren, die in dieselbe allgemeine Richtung „weisen“.

Ein zweidimensionales Beispiel für Vektorähnlichkeit

Viele Anwendungen können von der Fähigkeit profitieren, Text oder Bilder zu finden, die einem Ziel ähnlich sind. Wenn beispielsweise ein neuer Support-Fall bei einem Helpdesk angemeldet wird, kann das Support-Team von der Möglichkeit profitieren, ähnliche Fälle zu finden, die bereits gelöst wurden. Der Vorteil der Verwendung von Einbettungsvektoren in dieser Anwendung ist, dass sie über das Abgleichen von Schlüsselwörtern hinausgeht und eine semantische Ähnlichkeit herstellt, sodass verwandte Datensätze auch dann gefunden werden können, wenn sie nicht genau dieselben Wörter enthalten.

Snowflake Cortex bietet die Funktionen EMBED_TEXT_768 und EMBED_TEXT_1024, um Einbettungen zu erstellen, sowie mehrere Vektorähnlichkeitsfunktionen, um sie für verschiedene Anwendungen zu vergleichen.

Allgemeine Informationen zu Vektorähnlichkeitsfunktionen

Die Messung der Ähnlichkeit zwischen Vektoren ist eine grundlegende Operation beim semantischen Vergleich. Snowflake Cortex bietet drei Vektorähnlichkeitsfunktionen: VECTOR_INNER_PRODUCT, VECTOR_L2_DISTANCE und VECTOR_COSINE_SIMILARITY. Weitere Informationen zu diesen Funktionen finden Sie unter Vektorähnlichkeitsfunktionen.

Einzelheiten zur Syntax und Verwendung finden Sie auf der Referenzseite zu jeder Funktion:

Beispiele

Die folgenden Beispiele verwenden die Vektorähnlichkeitsfunktionen.

Das folgende SQL-Beispiel verwendet die Funktion VECTOR_INNER_PRODUCT, um zu ermitteln, welche Vektoren in der Tabelle zwischen den Spalten a und b am nächsten beieinander liegen:

CREATE TABLE vectors (a VECTOR(float, 3), b VECTOR(float, 3));
INSERT INTO vectors SELECT [1.1,2.2,3]::VECTOR(FLOAT,3), [1,1,1]::VECTOR(FLOAT,3);
INSERT INTO vectors SELECT [1,2.2,3]::VECTOR(FLOAT,3), [4,6,8]::VECTOR(FLOAT,3);

-- Compute the pairwise inner product between columns a and b
SELECT VECTOR_INNER_PRODUCT(a, b) FROM vectors;
Copy
+------+
| 6.3  |
|------|
| 41.2 |
+------+

Das folgende SQL-Beispiel ruft die Funktion VECTOR_COSINE_SIMILARITY auf, um den Vektor zu finden, der [1,2,3] am nächsten kommt:

SELECT a, VECTOR_COSINE_SIMILARITY(a, [1,2,3]::VECTOR(FLOAT, 3)) AS similarity
    FROM vectors
ORDER BY similarity DESC
LIMIT 1;
Copy
+-------------------------+
| [1, 2.2, 3] | 0.9990... |
+-------------------------+

Snowflake Connector für Python

Die folgenden Beispiele zeigen, wie Sie den Datentyp VECTOR und die Vektorähnlichkeitsfunktionen mit dem Python-Konnektor verwenden können.

Bemerkung

Die Unterstützung für den Typ VECTOR wurde in Version 3.6 des Snowflake Connectors für Python eingeführt.

import snowflake.connector

conn = ... # Set up connection
cur = conn.cursor()

# Create a table and insert some vectors
cur.execute("CREATE OR REPLACE TABLE vectors (a VECTOR(FLOAT, 3), b VECTOR(FLOAT, 3))")
values = [([1.1, 2.2, 3], [1, 1, 1]), ([1, 2.2, 3], [4, 6, 8])]
for row in values:
        cur.execute(f"""
            INSERT INTO vectors(a, b)
                SELECT {row[0]}::VECTOR(FLOAT,3), {row[1]}::VECTOR(FLOAT,3)
        """)

# Compute the pairwise inner product between columns a and b
cur.execute("SELECT VECTOR_INNER_PRODUCT(a, b) FROM vectors")
print(cur.fetchall())
Copy
[(6.30...,), (41.2...,)]
# Find the closest vector to [1,2,3]
cur.execute(f"""
    SELECT a, VECTOR_COSINE_SIMILARITY(a, {[1,2,3]}::VECTOR(FLOAT, 3))
        AS similarity
        FROM vectors
        ORDER BY similarity DESC
        LIMIT 1;
""")
print(cur.fetchall())
Copy
[([1.0, 2.2..., 3.0], 0.9990...)]

Snowpark Python

Die folgenden Beispiele zeigen, wie Sie den Datentyp VECTOR und die Vektorähnlichkeitsfunktionen mit der Snowpark Python Library verwenden können.

Bemerkung

  • Die Unterstützung für den Typ VECTOR wurde in Version 1.11 von Snowpark Python eingeführt.

  • Die Snowpark Python-Bibliothek unterstützt die Funktion VECTOR_COSINE_SIMILARITY nicht.

from snowflake.snowpark import Session, Row
session = ... # Set up session
from snowflake.snowpark.types import VectorType, StructType, StructField
from snowflake.snowpark.functions import col, lit, vector_l2_distance
schema = StructType([StructField("vec", VectorType(int, 3))])
data = [Row([1, 2, 3]), Row([4, 5, 6]), Row([7, 8, 9])]
df = session.create_dataframe(data, schema)
df.select(
    "vec",
    vector_l2_distance(df.vec, lit([1, 2, 2]).cast(VectorType(int, 3))).as_("dist"),
).sort("dist").limit(1).show()
Copy
----------------------
|"VEC"      |"DIST"  |
----------------------
|[1, 2, 3]  |1.0     |
----------------------

Vektoreinbettungen aus Text erstellen

Wichtig

Die Modelle snowflake-arctic-embed-m und e5-base-v2 haben ein Eingabelimit von 512 Token. Einige Token stellen keine Wörter dar, sodass die Anzahl der unterstützten Wörter etwas geringer ist. Wenn der Text zu lang ist, erhalten Sie eine Fehlermeldung.

Um eine Vektoreinbettung aus einem Textstück zu erstellen, verwenden Sie die Funktion EMBED_TEXT_768 (SNOWFLAKE.CORTEX) oder EMBED_TEXT_1024 (SNOWFLAKE.CORTEX). Diese Funktionen geben die Vektoreinbettung für einen gegebenen englischsprachigen Text zurück. Dieser Vektor kann mit den Vektorvergleichsfunktionen verwendet werden, um die semantische Ähnlichkeit zweier Dokumente zu ermitteln.

SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768(model, text)
Copy

Tipp

Sie können andere Einbettungsmodelle über Snowpark Container Services verwenden. Weitere Informationen dazu finden Sie unter Embed Text Container Service.

Wichtig

EMBED_TEXT_768 und EMBED_TEXT_1024 sind Cortex LLM-Funktionen, daher unterliegt ihre Verwendung derselben Zugriffssteuerung wie die anderen Cortex LLM-Funktionen. Eine Anleitung zum Zugriff auf diese Funktionen finden Sie unter Erforderliche Berechtigungen für Cortex LLM-Funktionen.

Beispielhafte Anwendungsfälle

Dieser Abschnitt zeigt, wie Sie Einbettungen, die Vektorähnlichkeitsfunktionen und den Datentyp VECTOR verwenden, um beliebte Anwendungsfälle wie Vektorähnlichkeitssuche und Retrieval-Augmented Generation (RAG) zu implementieren.

Retrieval-Augmented Generation (RAG)

Bei der Retrieval-Augmented Generation (RAG) wird die Abfrage eines Benutzers verwendet, um mithilfe der Vektorähnlichkeit ähnliche Dokumente zu finden. Das oberste/beste Dokument wird dann zusammen mit der Abfrage des Benutzers an ein großes Sprachmodell (LLM) weitergeleitet, das den Kontext für die generative Antwort (Completion) liefert. Dies kann die Brauchbarkeit der Antwort erheblich verbessern.

Im folgenden Beispiel ist wiki eine Tabelle mit einer Textspalte content und query ist eine einzeilige Tabelle mit einer Textspalte text.

-- Create embedding vectors for wiki articles (only do once)
ALTER TABLE wiki ADD COLUMN vec VECTOR(FLOAT, 768);
UPDATE wiki SET vec = SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', content);

-- Embed incoming query
SET query = 'in which year was Snowflake Computing founded?';
CREATE OR REPLACE TABLE query_table (query_vec VECTOR(FLOAT, 768));
INSERT INTO query_table SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', $query);

-- Do a semantic search to find the relevant wiki for the query
WITH result AS (
    SELECT
        w.content,
        $query AS query_text,
        VECTOR_COSINE_SIMILARITY(w.vec, q.query_vec) AS similarity
    FROM wiki w, query_table q
    ORDER BY similarity DESC
    LIMIT 1
)

-- Pass to large language model as context
SELECT SNOWFLAKE.CORTEX.COMPLETE('mistral-7b',
    CONCAT('Answer this question: ', query_text, ' using this text: ', content)) FROM result;
Copy

Hinweise zu Kosten

Snowflake Cortex-LLM-Funktionen, einschließlich EMBED_TEXT_768 und EMBED_TEXT_1024, verursachen Computekosten, die sich nach der Anzahl der verarbeiteten Token richten.

Bemerkung

Ein Token ist die kleinste Texteinheit, die von den Snowflake Cortex-LLM-Funktionen verarbeitet wird, und entspricht etwa vier Textzeichen. Das Verhältnis des ein-/ausgegebene Rohtextes zur Tokenanzahl kann je nach Modell variieren.

  • Bei den Funktionen EMBED_TEXT_768 und EMBED_TEXT_1024 werden nur die eingegebenen Token auf die abrechenbare Summe angerechnet.

  • Vektorähnlichkeitsfunktionen verursachen keine tokenbasierten Kosten.

Weitere Informationen zur Abrechnung von Cortex LLM-Funktionen finden Sie unter Kostenhinweise zu Cortex LLM-Funktionen. Allgemeine Informationen zu Computekosten finden Sie unter Erläuterungen zu den Computekosten.