IA : recherche vectorielle
Description
Section intitulée « Description »IA : recherche vectorielle classe les lignes d’une table selon la proximité de leur colonne Vector avec un vecteur de requête, et écrit les lignes les plus proches — avec la distance qui les a classées — dans une table cible. Fournissez plusieurs vecteurs de requête : chacun obtient son propre jeu de correspondances, en un seul passage sur la table source et dans une seule table de sortie.
La recherche est exacte. Chaque ligne qui passe le filtre de l’étape est comparée à chaque vecteur de requête ; les correspondances sont donc les lignes réellement les plus proches et non une approximation — et le travail croît avec le nombre de lignes parcourues multiplié par le nombre de vecteurs de requête. Il n’y a aucun index vectoriel à construire, à régler ou sur lequel se rabattre.
Source et cible
Section intitulée « Source et cible »- Table à rechercher — la table dont les vecteurs stockés sont recherchés.
- Table cible — la table dans laquelle les correspondances sont écrites.
Recherche
Section intitulée « Recherche »- Colonne vectorielle — la colonne Vector de la table à rechercher par rapport à laquelle la distance est mesurée. Tout autre type de données est refusé, avec le nom de la colonne et le type qu’elle contient réellement.
- Métrique de distance — Cosinus ou Euclidienne (L2). Le cosinus mesure l’angle entre deux vecteurs et ignore leur norme, ce qui convient aux plongements de texte ; la distance euclidienne mesure la distance en ligne droite et tient compte de la norme. Dans les deux cas, une distance plus faible signifie une ligne plus proche. Cosinus est la valeur par défaut.
- Correspondances par requête — le nombre de lignes les plus proches à conserver pour chaque vecteur de requête. La valeur par défaut est 10.
Vecteurs de requête
Section intitulée « Vecteurs de requête »L’onglet Vecteurs de requête attend un tableau JSON avec une entrée par requête, chacune portant un id et un
vector :
[ {"id": "q1", "vector": [0.1, 0.2, 0.3]}, {"id": "q2", "vector": [0.4, 0.5, 0.6]}]Chaque requête renvoie son propre jeu de correspondances, et c’est l’id qui les identifie dans la sortie. Les
identifiants doivent être uniques, chaque valeur doit être un nombre fini, et chaque vecteur de requête doit contenir le même
nombre de valeurs que les vecteurs stockés — une distance n’est définie qu’entre des vecteurs de même largeur.
Une différence est refusée, avec le nom de la requête, le nombre de valeurs qu’elle contient et la largeur que la colonne
contient ou déclare.
Sélectionner un sous-ensemble de données
Section intitulée « Sélectionner un sous-ensemble de données »Un filtre restreint les lignes candidates. Les lignes sont filtrées avant d’être classées ; les correspondances sont donc les lignes les plus proches parmi celles qui passent le filtre — et non les lignes les plus proches dans l’absolu, filtrées ensuite. C’est le principal levier sur la quantité de travail de l’étape ; consultez Dimensionner une recherche.
Colonnes de sortie
Section intitulée « Colonnes de sortie »Chaque correspondance est écrite sous forme d’une ligne portant les colonnes que vous avez sélectionnées dans l’onglet Sélection des données de la table, plus deux colonnes calculées dont vous contrôlez les noms :
- Colonne du nom de la requête — l’identifiant du vecteur de requête auquel cette ligne répond. Par défaut,
query_id. - Colonne de distance — la distance mesurée entre la correspondance et ce vecteur de requête. Par défaut,
distance. C’est aussi la clé de classement.
Le nom de la requête vient en premier dans la sortie, les colonnes que vous avez sélectionnées suivent, et la distance vient en dernier. Les noms des colonnes de sortie doivent être uniques.
Lignes exclues
Section intitulée « Lignes exclues »Une ligne dont la distance ne peut pas être mesurée est exclue des correspondances plutôt que renvoyée comme si elle était la plus proche. Un vecteur dont la norme dépasse la plage d’un flottant 32 bits est le cas que vous rencontrerez : aucune distance mesurable n’est renvoyée pour lui, et comme rien de disponible ne classe une distance non mesurable en dernier, inclure une telle ligne placerait les lignes que la recherche connaît le moins en tête de chaque résultat.
Exécutez le workflow avec le Mode de diagnostic activé pour voir le nombre. Le journal du workflow indique alors combien de lignes chaque requête a exclues, ou précise que l’étape a mesuré chaque ligne qu’elle a parcourue. L’obtention de ce nombre coûte un second passage sur la table, ce qui explique qu’elle ne soit facturée que si vous la demandez ; avec le Mode de diagnostic désactivé, le journal précise que les lignes non mesurables sont exclues par conception et vous renvoie vers le Mode de diagnostic pour obtenir le nombre.
Un vecteur stocké contenant une valeur manquante dans le tableau est un cas différent : aucune distance ne peut être mesurée par rapport à un tableau qui en contient une, et la recherche est donc refusée d’emblée, avec le nom de la colonne, plutôt que de renvoyer silencieusement un résultat partiel. Corrigez ou supprimez ces lignes, puis réexécutez.
Dimensionner une recherche
Section intitulée « Dimensionner une recherche »Le coût d’une exécution est le nombre de lignes candidates multiplié par le nombre de vecteurs de requête, et l’étape refuse une recherche dont le total dépasse dix milliards de mesures de distance — en indiquant le nombre de lignes, le nombre de requêtes et la limite — plutôt que de lancer un travail qui ne pourrait pas aboutir. Deux pratiques maintiennent une recherche bien en deçà de cette limite :
- Filtrez sur la tranche qui compte. Restreignez les candidats à une entité, une période ou un ensemble de documents plutôt que de parcourir tout un corpus pour répondre à une question sur une partie de celui-ci.
- Scindez la table selon la dimension sur laquelle vous filtrez toujours, et recherchez dans la table pertinente. Réduire le nombre de candidats est bien plus efficace que tout autre moyen disponible ici.
Déclarer une Largeur du vecteur sur la colonne aide aussi : lorsqu’elle est déclarée, l’étape prend la largeur dans la déclaration au lieu d’échantillonner une ligne pour la découvrir. Consultez Type de données vectorielles.
Ce qu’une colonne vectorielle ne peut pas faire
Section intitulée « Ce qu’une colonne vectorielle ne peut pas faire »Une colonne Vector est refusée comme clé de jointure, comme colonne de regroupement et comme cible d’agrégation — dans cette étape comme dans toutes les autres. Le message nomme la colonne et le rôle dans lequel elle a été utilisée, aussi bien lorsque vous enregistrez l’étape que lorsqu’une étape enregistrée plus tôt est exécutée. Joignez et regroupez plutôt sur les clés métier situées à côté du vecteur. Transporter un vecteur dans une étape comme colonne de sortie ordinaire est possible, de même que compter les lignes et compter les valeurs distinctes.
Voir aussi
Section intitulée « Voir aussi »- Type de données vectorielles — déclarer une colonne Vector, définir sa largeur et y charger des plongements
- Spatial Find Nearest — la même logique de plus proche voisin sur des géométries plutôt que sur des plongements
- Table Lookup — rapatrie des colonnes descriptives sur les lignes correspondantes
- Importer depuis Parquet — charge des plongements depuis un fichier Parquet