For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale
Theme

Plongements vectoriels

Apprenez à représenter du texte sous forme de nombres pour des applications comme la recherche.

New embedding models
text-embedding-3-small and text-embedding-3-large, our newest and most performant embedding models, are now available. They feature lower costs, higher multilingual performance, and new parameters to control the overall size.

Qu’est-ce qu’un plongement vectoriel ?

Les plongements vectoriels de texte d’OpenAI permettent de mesurer la proximité sémantique entre des chaînes de caractères. Ils servent couramment aux tâches suivantes :

  • Recherche (classer les résultats selon leur pertinence par rapport à une requête)
  • Regroupement (regrouper des textes selon leur similarité)
  • Recommandation (recommander des éléments dont les textes sont proches)
  • Détection d’anomalies (repérer les éléments atypiques qui ressemblent peu aux autres)
  • Mesure de la diversité (analyser la distribution des similarités)
  • Classification (attribuer à chaque texte l’étiquette dont il est le plus proche)

Un plongement vectoriel est un vecteur (une liste) de nombres à virgule flottante. La distance entre deux vecteurs mesure leur proximité sémantique. Une faible distance indique que les textes ont probablement des sens proches, une grande distance que leurs sens sont probablement éloignés.

Consultez notre page de tarification pour connaître les tarifs des plongements vectoriels. La facturation des requêtes dépend du nombre de tokens dans les données d’entrée.

Comment obtenir des plongements vectoriels

Pour obtenir un plongement vectoriel, envoyez votre chaîne de caractères au point de terminaison de l’API dédié aux plongements vectoriels en indiquant le nom du modèle de plongement (par exemple text-embedding-3-small) :

Exemple : obtenir des plongements vectoriels
import OpenAI from "openai";
const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "Your text string goes here",
  encoding_format: "float",
});

console.log(embedding);

La réponse contient le vecteur de plongement (une liste de nombres à virgule flottante) ainsi que des métadonnées. Vous pouvez extraire ce vecteur, l’enregistrer dans une base de données vectorielle et l’utiliser dans de nombreuses applications.

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422, -0.005336422007530928, -4.547132266452536e-5,
        -0.024047505110502243
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

Par défaut, le vecteur comporte 1536 dimensions pour text-embedding-3-small ou 3072 pour text-embedding-3-large. Pour réduire le nombre de dimensions tout en préservant la capacité du vecteur à représenter des concepts, utilisez le paramètre dimensions. Vous trouverez plus de détails sur les dimensions dans la section consacrée aux cas d’usage.

Modèles de plongement vectoriel

OpenAI propose deux modèles de plongement vectoriel performants de troisième génération, reconnaissables à la mention -3 dans leur identifiant. Consultez l’article annonçant les modèles de troisième génération pour en savoir plus.

L’utilisation est facturée par token d’entrée. Le tableau indique combien de pages de texte vous pouvez traiter pour un dollar américain, à raison d’environ 800 tokens par page :

Modèle Pages par dollar (environ) Résultat à l’évaluation MTEB Taille maximale de l’entrée (tokens)
text-embedding-3-small 62 500 62,3 % 8 192
text-embedding-3-large 9 615 64,6 % 8 192
text-embedding-ada-002 12 500 61,0 % 8 192

Cas d’usage

Les exemples suivants illustrent plusieurs cas d’usage à partir du jeu de données d’avis sur des produits alimentaires vendus sur Amazon.

Obtention des plongements vectoriels

Le jeu de données contient 568 454 avis sur des produits alimentaires publiés par des utilisateurs d’Amazon jusqu’en octobre 2012. Pour cet exemple, nous retenons les 1 000 avis les plus récents. Rédigés en anglais, ces avis tendent à exprimer une opinion positive ou négative. Chaque avis comporte un identifiant de produit (ProductId), un identifiant d’utilisateur (UserId), une note (Score), un titre (Summary) et le texte de l’avis (Text). Par exemple :

Identifiant du produit Identifiant de l’utilisateur Note Titre Texte
B001E4KFG0 A3SGXH7AUHU8GW 5 Good Quality Dog Food I have bought several of the Vitality canned…
B00813GRG4 A1D87F6ZCVE5NK 1 Not as Advertised Product arrived labeled as Jumbo Salted Peanut…

Dans l’exemple ci-dessous, nous réunissons le titre et le corps de chaque avis en un seul texte. Le modèle encode ce texte et produit un seul vecteur de plongement.

Get_embeddings_from_dataset.ipynb
import { mkdir, writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const reviews = ["A rich cup of coffee.", "A bright herbal tea."];

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: reviews.map((review) => review.replaceAll("\n", " ")),
});

const csvField = (value) => `"${value.replaceAll('"', '""')}"`;
const rows = response.data.map(({ embedding }, index) =>
  [csvField(reviews[index]), csvField(JSON.stringify(embedding))].join(",")
);

await mkdir("output", { recursive: true });
await writeFile(
  "output/embedded_1k_reviews.csv",
  ["combined,ada_embedding", ...rows].join("\n") + "\n"
);

Pour charger les données à partir d’un fichier enregistré, exécutez le code suivant :

from ast import literal_eval
import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(literal_eval).apply(np.array)

FAQ

Comment compter les tokens d’une chaîne avant de calculer son vecteur ?

En Python, vous pouvez découper une chaîne en tokens avec le tokenizer tiktoken d’OpenAI.

Exemple de code :

import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


num_tokens_from_string("tiktoken is great!", "cl100k_base")

Pour les modèles de plongement de troisième génération comme text-embedding-3-small, utilisez l’encodage cl100k_base.

Le guide de l’OpenAI Cookbook Compter les tokens avec tiktoken fournit davantage de détails et des exemples de code.

Comment retrouver rapidement les K vecteurs de plongement les plus proches ?

Pour effectuer rapidement une recherche parmi de nombreux vecteurs, nous recommandons d’utiliser une base de données vectorielle. Vous trouverez des exemples d’utilisation de bases de données vectorielles avec l’API OpenAI dans notre Cookbook sur GitHub.

Quelle fonction de distance utiliser ?

Nous recommandons la similarité cosinus. Le choix de la fonction de distance a généralement peu d’incidence.

Les vecteurs de plongement d’OpenAI sont normalisés de façon à avoir une norme égale à 1. Par conséquent :

  • Un simple produit scalaire permet de calculer la similarité cosinus un peu plus rapidement.
  • La similarité cosinus et la distance euclidienne donnent des classements identiques.

Puis-je partager mes plongements vectoriels en ligne ?

Oui. Les données que les clients envoient à nos modèles et les résultats qu’ils en obtiennent leur appartiennent, y compris dans le cas des plongements vectoriels. Il vous incombe de vérifier que le contenu que vous transmettez à notre API respecte la législation applicable et nos conditions d’utilisation.

Les modèles de plongement V3 connaissent-ils les événements récents ?

Non. Les modèles text-embedding-3-large et text-embedding-3-small n’ont pas connaissance des événements survenus après septembre 2021. Cette limite est généralement moins importante que pour les modèles de génération de texte, mais elle peut réduire les performances dans certains cas particuliers.