Vector
La classe Vector
vous permet de manipuler des vecteurs et d'effectuer des calculs de distance et de similarité entre eux. Cette classe est disponible depuis le "class store" de 4D
.
Dans le monde des IA, un vecteur est une séquence de nombres qui permet à une machine de comprendre et de manipuler des données complexes. Pour un aperçu détaillé du rôle des vecteurs avec les IA, vous pouvez vous référer à cette page.
Comprendre les différents calculs vectoriels
La classe 4D.Vector
propose trois types de calculs vectoriels. Le tableau suivant résume les principales caractéristiques de chacun d'entre eux :
cosineSimilarity (similarité de cosinus) | dotSimilarity (produit point) | euclideanDistance (distance euclidienne) | |
---|---|---|---|
Définition | Compare l'orientation de deux textes représentés sous forme de vecteurs. Plus ils pointent dans la même direction, plus ils sont proches. | Somme des produits entre chaque dimension du vecteur. Il s'agit d'une sorte de score de compatibilité pondéré. | Distance réelle entre deux vecteurs, comme si on la mesurait à l'aide d'une règle. |
Analogie simple | Parlons-nous du même sujet ? | Parlez-vous du même sujet avec insistance ? | Êtes-vous vraiment loin de ce que je dis ? |
Exemple | Imaginez que vous cherchiez des films à regarder sur un service de vidéo à la demande. La similarité de cosinus est utilisée pour comparer vos goûts (par exemple, vous aimez les films d'action avec un peu de comédie) aux descriptions de films dans la base de données du service. Peu importe que vous soyez un "petit" fan (vous regardez 1 film par mois) ou un "grand" fan (vous regardez 10 films par semaine), ce qui compte c'est que les films aient des caractéristiques similaires à ce que vous aimez (action + comédie). Le service de streaming utilise la similarité cosinusoïdale pour recommander des films qui "vont dans la même direction" que vos préférences. | Pensez à un moteur de recherche. Lorsque vous tapez "recette de gâteau au chocolat", l'algorithme compare votre requête à des pages web. La dotSimilarity peut être utilisée non seulement pour vérifier si une page parle de gâteaux au chocolat (une direction similaire à votre recherche), mais aussi pour donner plus de poids aux pages qui sont très pertinentes (par exemple, une page avec beaucoup de contenu détaillé sur les gâteaux au chocolat aura une plus grande "longueur" et donc un score plus élevé). Une page ne comportant qu'une seule phrase sur le sujet aura un score plus faible. | Imaginez une application de rencontres. L'algorithme peut utiliser la distance euclidienne pour comparer votre profil (vos centres d'intérêt, votre âge, votre localisation, etc.) avec ceux des autres utilisateurs. Si vos profils sont très similaires (par exemple, vous aimez tous les deux la randonnée et la musique pop, et vous vivez à 5 km l'un de l'autre), la distance euclidienne entre vos profils sera faible, et l'application suggérera cette personne comme un bon "match". Ici, toutes les différences (aussi petites soient-elles) comptent, et pas seulement l'orientation générale de vos goûts. |
Dans tous les cas, il est conseillé de tester les différents vecteurs pour déterminer celui qui correspond le mieux à vos besoins et à vos données.
Objet vecteur
Les objets vectoriels sont partagés, immuables et transmissibles.
.cosineSimilarity( vector : 4D.Vector ) : Real calcule la similarité en cosinus entre le vecteur 4D courant et celui que vous avez passé dans le paramètre vector |
.dotSimilarity( vector : 4D.Vector ) : Real calcule le produit point du vecteur 4D courant et de celui que vous avez passé dans le paramètre vector |
.euclideanDistance( vector : 4D.Vector ) : Real calcule la distance euclidienne entre le vecteur 4D courant et celui que vous avez passé dans le paramètre vector |
length : Integer le nombre de composantes du vecteur |
.toCollection() : Collection renvoie les composantes du vecteur sous la forme d'une collection de nombres réels |
4D.Vector.new()
Historique
Release | Modifications |
---|---|
20 R10 | Ajout |
4D.Vector.new ( parameter : Collection ) : 4D.Vector
Paramètres | Type | Description | |
---|---|---|---|
paramètres | Collection de réels | -> | Collection de nombres réels représentant un vecteur |
Résultat | 4D.Vector | <- | Nouvel objet vectoriel |
Description
La fonction 4D.Vector.new()
crée et renvoie un nouvel objet de type 4D.Vector
.
Dans parameter, passez une collection de nombres réels représentant le vecteur à créer. Ces valeurs sont fournies par les intelligences artificielles et représentent mathématiquement des objets tels que des mots ou des données.
Exemple
Pour créer un vecteur :
var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
Vous pouvez accéder aux composants individuels ou convertir l'ensemble du vecteur en collection :
var $firstComponent := $vector[0]
var $collection := $vector.toCollection()
.cosineSimilarity()
.cosineSimilarity( vector : 4D.Vector ) : Real
Paramètres | Type | Description | |
---|---|---|---|
vector | 4D.Vector | -> | Vecteur à comparer |
Résultat | Real | <- | Distance entre les vecteurs |
Description
La fonction .cosineSimilarity()
calcule la similarité en cosinus entre le vecteur 4D courant et celui que vous avez passé dans le paramètre vector. Les deux vecteurs doivent avoir la même taille.
Cette métrique mesure l'angle entre les vecteurs et est couramment utilisée pour déterminer la similarité sémantique entre les textes. Elle est recommandée pour les représentations vectorielles (embeddings) de texte, les documents, les phrases et toutes les données pour lesquelles la direction est plus importante que la magnitude (par exemple, pour la recherche sémantique ou la classification de texte).
Valeur retournée
- Plage : -1 (opposé) à 1 (identique).
- Plus la valeur retournée est élevée, plus les vecteurs sont similaires.
Exemple 1
var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
var $similarity := $vector.cosineSimilarity($anotherVector)
Exemple 2
Cet exemple utilise l'extension 4D AIKit pour générer des représentations vectorielles.
var $model:="text-embedding-ada-002"
var $people:=ds.People.get(1)
$prompt:=String($people.Firstname)+" "+String($people.Lastname)+" was born on "+\
String($people.Birthday)+" and lives in "+String($people.Address)+", "+\
String($people.ZipCode)+", "+String($people.City)+", "+String($people.Country)+\
". Contact: "+String($people.email)+", "+String($people.Cell)+", "+\
String($people.Phone)+". Family IDs - Father: "+String($people.FatherID)+\
", Mother : "+String($people.MotherID)+", Partner: "+String($people.PartnerID)+"."
var $clientAI:=cs.AIKit.OpenAI.new(getAIKey())
// Calcul vectoriel avec 4D AIKit
var $result:=$clientAI.embeddings.create($prompt; $model)
// Création d'un objet 4D.vector
var $vector:=$result.vector
var $question:="I'm looking for John who lives in USA"
// Calcul vectoriel avec le composant 4D AIKit
var $questionVector:=$clientAI.embeddings.create($question; $model).vector
// calcul de similarité
If ($vector.cosineSimilarity($questionVector)>0.9)
ALERT("Interesting result")
End if
// résultat réel : 0,7360136465949
.dotSimilarity()
.dotSimilarity( vector : 4D.Vector ) : Real
Paramètres | Type | Description | |
---|---|---|---|
vector | 4D.Vector | -> | Vecteur à comparer |
Résultat | Real | <- | Distance entre les vecteurs |
Description
La fonction .dotSimilarity()
calcule le produit point du vecteur 4D courant et de celui que vous avez passé dans le paramètre vector. Les deux vecteurs doivent avoir la même taille.
Cette métrique reflète à la fois la similarité et la magnitude, et est généralement utilisée dans les modèles où les normes vectorielles (magnitudes) varient. Elle est recommandée pour les scénarios dans lesquels les représentations vectorielles ont été affinées en tenant compte de la magnitude (par exemple, moteurs de recommandation, évaluation de la pertinence).
Valeur retournée
- Dépend de la magnitude et de la direction des vecteurs
- Plus la valeur retournée est élevée, plus les vecteurs sont similaires.
Exemple
var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
var $score := $vector.dotSimilarity($anotherVector)
Exemple 2
Cet exemple utilise l'extension 4D AIKit pour générer des représentations vectorielles.
var $model:="text-embedding-ada-002"
var $clientAI:=cs.AIKit.OpenAI.new(getAIKey())
$documents:=[{text : "How to bake a chocolate cake" ; similarité : 0} ; \
{text : "Best hiking trails in the Alps" ; similarité : 0} ; \N-
{texte : "Tips for learning 4D programming" ; similarité : 0} ; \N-
{texte : "Top 10 sci-fi movies of all time" ; similarité : 0}]
$question:= "4D coding tutorials"
// Calcul vectoriel avec le composant 4D AIKit
$questionVector:=$clientAI.embeddings.create($question; $model).vector
For each ($document; $documents)
// Calcul vectoriel avec le composant 4D AIKit
$vector:=$clientAI.embeddings.create($document.text ; $model).vector
// similarité
$document.similarity:=$vector.dotSimilarity($questionVector)
End for each
$documents:=$documents.orderBy("similarity desc")
ALERT("Meilleure réponse : "+$documents[0].text)
//$documents:
//{text:Tips for learning 4D programming,similarity:0.90409492325102}
//{text:Top 10 sci-fi movies of all time,similarity:0.75362527646035}
//{text:How to bake a chocolate cake,similarity:0.73664833336323}
//{text:Best hiking trails in the Alps,similarity:0.73138600461065}
.euclideanDistance()
.euclideanDistance( vector : 4D.Vector ) : Real
Paramètres | Type | Description | |
---|---|---|---|
vector | 4D.Vector | -> | Vecteur à comparer |
Résultat | Real | <- | Distance entre les vecteurs |
Description
La fonction .euclideanDistance()
calcule la distance euclidienne entre le vecteur 4D courant et celui que vous avez passé dans le paramètre vector. Les deux vecteurs doivent avoir la même taille.
Elle mesure la distance en ligne droite dans l'espace vectoriel. Elle est recommandée pour les représentations vectorielles de données numériques ou structurées, ou lors de l'utilisation de modèles où la proximité dans l'espace brut est directement corrélée à la similarité.
Valeur retournée
- valeur retournée >= 0
- Plus la valeur retournée est faible, plus les vecteurs sont similaires.
Exemple 1
var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
var $distance := $vector.euclideanDistance($anotherVector)
Exemple 2
$places:=[\
{name: "Eiffel Tower"; coord: [48.8584; 200.2945]; similarity: 0}; \
{name: "Louvre Museum"; coord: [48.8606; 200.3376]; similarity: 0}; \
{name: "Notre-Dame"; coord: [48.8529; 200.35]; similarity: 0}; \
{name: "Montmartre"; coord: [48.8867; 200.3431]; similarity: 0}\
]
$userLocation:=[8.8566; 20.3522]
var $vector:=4D.Vector.new($userLocation)
For each ($place; $places)
$place.similarity:=$vector.euclideanDistance(4D.Vector.new($place.coord))
End for each
$places:=$places.orderBy("similarity asc")
ALERT("Nearest monument: "+$places[0].name)
.length
length : Integer
Description
La propriété .length
contient le nombre de composantes du vecteur.
.toCollection()
.toCollection() : Collection
Paramètres | Type | Description | |
---|---|---|---|
Résultat | Collection | <- | Collection de nombres réels représentant un vecteur |
La fonction .toCollection()
renvoie les composantes du vecteur sous la forme d'une collection de nombres réels.