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.

Modèles de vectorisation de texte

Snowflake propose les modèles de vectorisation de texte suivants. Voir ci-dessous pour plus de détails.

Nom du modèle

Dimensions de la sortie

Fenêtre contextuelle

Prise en charge des langages

snowflake-arctic-embed-m-v1.5

768

512

Anglais uniquement

snowflake-arctic-embed-m

768

512

Anglais uniquement

e5-base-v2

768

512

Anglais uniquement

snowflake-arctic-embed-l-v2.0

1024

512

Multilingue

voyage-multilingue-2

1024

32000

Multilingue (langues prises en charge)

nv-embed-qa-4

1024

512

Anglais uniquement

Les modèles pris en charge peuvent avoir des coûts différents.

À 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 quatre fonctions de similarité vectorielle : VECTOR_INNER_PRODUCT VECTOR_L1_distance, 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

Pour créer une représentation vectorielle à partir d’un morceau de texte, vous pouvez utiliser les fonctions EMBED_TEXT_768 (SNOWFLAKE.CORTEX) ou EMBED_TEXT_1024 (SNOWFLAKE.CORTEX), selon les dimensions de sortie du modèle. 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.