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.

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;
+------+
| 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;
+-------------------------+
| [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())
[(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())
[([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()
----------------------
|"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)
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).
Recherche de similitudes vectorielles¶
Pour mettre en œuvre une recherche de documents sémantiquement similaires, il faut d’abord stocker les intégrations des documents à rechercher. Maintenez les intégrations à jour lorsque des documents sont ajoutés ou modifiés.
Dans cet exemple, les documents sont des problèmes soumis au centre d’appel enregistrés par les représentants du service d’assistance. La question est stockée dans une colonne appelée issue_text
dans la table issues
. Le SQL suivant crée une nouvelle colonne de vecteurs pour contenir les intégrations des questions.
ALTER TABLE issues ADD COLUMN issue_vec VECTOR(FLOAT, 768);
UPDATE issues
SET issue_vec = SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', issue_text);
Pour effectuer une recherche, il faut créer une intégration du terme recherché ou du document cible, puis utiliser une fonction de similarité vectorielle pour localiser les documents dont les intégrations sont similaires. Utilisez les clauses ORDER BY et LIMIT pour sélectionner les k premiers documents correspondants et utilisez éventuellement une condition WHERE pour spécifier une similarité minimale.
En règle générale, l’appel à la fonction de similarité vectorielle doit figurer dans la clause SELECT et non dans la clause WHERE. De cette façon, la fonction n’est appelée que pour les lignes spécifiées par la clause WHERE, qui peut restreindre la requête sur la base d’autres critères, au lieu d’opérer sur toutes les lignes de la table. Pour tester une valeur de similarité dans la clause WHERE, définissez un alias de colonne pour l’appel VECTOR_COSINE_SIMILARITY dans la clause SELECT et utilisez cet alias dans une condition de la clause WHERE.
Cet exemple permet de trouver jusqu’à cinq questions correspondant au terme de recherche au cours des 90 derniers jours, en supposant que la similarité en cosinus avec le terme de recherche est d’au moins 0,7.
SELECT
issue,
VECTOR_COSINE_SIMILARITY(
issue_vec,
SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', 'User could not install Facebook app on his phone')
) AS similarity
FROM issues
ORDER BY similarity DESC
LIMIT 5
WHERE DATEDIFF(day, CURRENT_DATE(), issue_date) < 90 AND similarity > 0.7;
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;
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.