Intégrations vectorielles

Une intégration fait référence à la réduction de données à haute dimension, comme un texte non structuré, en une représentation à moins de dimensions, comme un vecteur. Les techniques modernes d’apprentissage profond peuvent créer des intégrations vectorielles, qui sont des représentations numériques structurées, à partir de données non structurées telles que du texte et des images, en préservant les notions sémantiques de similarité et de dissimilarité dans la géométrie des vecteurs qu’elles produisent.

L’illustration ci-dessous est un exemple simplifié de l’intégration vectorielle et de la similarité géométrique d’un texte en langage naturel. Dans la pratique, les réseaux neuronaux produisent des vecteurs d’intégration comportant des centaines, voire des milliers de dimensions, et non deux comme illustré ici, mais le concept est le même. Un texte sémantiquement similaire produit des vecteurs qui « pointent » dans la même direction générale.

Un exemple bidimensionnel de similarité vectorielle

De nombreuses applications peuvent bénéficier de la possibilité de trouver du texte ou des images similaires à une cible. Par exemple, lorsqu’un nouveau ticket d’assistance est enregistré dans un service d’assistance, l’équipe d’assistance peut bénéficier de la possibilité de trouver des cas similaires qui ont déjà été résolus. L’avantage de l’utilisation des vecteurs d’intégration dans cette application est qu’elle va au-delà de la correspondance des mots clés pour s’intéresser à la similarité sémantique, de sorte que des enregistrements apparentés peuvent être trouvés même s’ils ne contiennent pas exactement les mêmes mots.

Snowflake Cortex propose les fonctions EMBED_TEXT_768 et EMBED_TEXT_1024 pour créer des intégrations ainsi que plusieurs Fonctions de similarité vectorielle pour les comparer pour diverses applications.

À propos des fonctions de similarité vectorielle

La mesure de la similarité entre des vecteurs est une opération fondamentale de la comparaison sémantique. Snowflake Cortex fournit trois fonctions de similarité vectorielle : VECTOR_INNER_PRODUCT VECTOR_L2_DISTANCE, et VECTOR_COSINE_SIMILARITY. Pour en savoir plus sur ces fonctions, consultez Fonctions de similarité vectorielle.

Pour plus de détails sur la syntaxe et l’utilisation, reportez-vous à la page de référence de chaque fonction :

Exemples

Les exemples suivants utilisent les fonctions de similarité vectorielle.

Cet exemple SQL utilise la fonction VECTOR_INNER_PRODUCT pour déterminer quels vecteurs de la table sont les plus proches les uns des autres entre les colonnes a et b :

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 |
+------+

Cet exemple SQL appelle la fonction VECTOR_COSINE_SIMILARITY pour trouver le vecteur le plus proche de [1,2,3] :

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 Python Connector

Ces exemples montrent comment utiliser le type de données VECTOR et les fonctions de similarité vectorielle avec le connecteur Python.

Note

La prise en charge du type VECTOR a été introduite dans la version 3.6 du Snowflake Python Connector.

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

Ces exemples montrent comment utiliser le type de données VECTOR et les fonctions de similarité vectorielle avec la bibliothèque Snowpark Python.

Note

  • La prise en charge du type VECTOR a été introduite dans la version 1.11 de Snowpark Python.

  • La bibliothèque de Snowpark Python ne prend pas en charge la fonction VECTOR_COSINE_SIMILARITY.

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     |
----------------------

Créez des intégrations vectorielles à partir d’un texte

Important

Les modèles snowflake-arctic-embed-m et e5-base-v2 ont une limite d’entrée de 512 jetons. Certains jetons ne représentent pas des mots, de sorte que le nombre de mots pris en charge est légèrement inférieur. Vous recevrez un message d’erreur si le texte est trop long.

Pour créer une intégration vectorielle à partir d’un morceau de texte, utilisez les fonctions EMBED_TEXT_768 (SNOWFLAKE.CORTEX) ou EMBED_TEXT_1024 (SNOWFLAKE.CORTEX). Cette fonction renvoie l’intégration vectorielle d’un texte anglais donné. Ce vecteur peut être utilisé avec les fonctions de comparaison de vecteurs pour déterminer la similarité sémantique de deux documents.

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

Astuce

Vous pouvez utiliser d’autres modèles d’intégration via Snowpark Container Services. Pour plus d’informations, voir Embed Text Container Service.

Important

EMBED_TEXT_768 et EMBED_TEXT_1024 sont des fonctions Cortex LLM. Leur utilisation est donc régie par les mêmes contrôles d’accès que les autres fonctions Cortex LLM. Pour savoir comment accéder à ces fonctions, consultez Privilèges requis pour les fonctions Cortex LLM.

Exemples de cas d’utilisation

Cette section montre comment utiliser les intégrations, les fonctions de similarité vectorielle et le type de données VECTOR pour mettre en œuvre des cas d’utilisation populaires tels que la recherche de similarité vectorielle et la génération augmentée de récupération (RAG).

Génération augmentée de récupération (RAG)

Dans la génération augmentée de récupération (RAG), la requête d’un utilisateur est utilisée pour trouver des documents similaires à l’aide du vecteur de similarité. Le document de tête est ensuite transmis à un grand modèle de langage (LLM) avec la requête de l’utilisateur, fournissant le contexte pour la réponse générative (achèvement). Cela peut améliorer considérablement la pertinence de la réponse.

Dans l’exemple suivant, wiki est une table avec une colonne de texte content, et query est une table à une seule ligne avec une colonne de texte 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

Considérations relatives aux clients

Les fonctions Snowflake Cortex, dont EMBED_TEXT_768 et EMBED_TEXT_1024LLM, ont un coût de calcul basé sur le nombre de jetons traités.

Note

Un jeton est la plus petite unité de texte traitée par les fonctions Snowflake Cortex LLM, correspondant approximativement à quatre caractères de texte. L’équivalence du texte brut d’entrée ou de sortie en jetons peut varier selon le modèle.

  • Pour les fonctions EMBED_TEXT_768 et EMBED_TEXT_1024, seuls les jetons d’entrée sont pris en compte dans le total facturable.

  • Les fonctions de similarité vectorielle n’entraînent pas de coûts liés aux jetons.

Pour plus d’informations sur la facturation des fonctions Cortex LLM, voir Considérations relatives aux fonctions Cortex LLM. Pour des informations générales sur les coûts de calcul, consultez Comprendre le coût du calcul.