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

Plongements vectoriels

Apprenez à transformer du texte en nombres pour des cas d’utilisation 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.

Que sont les plongements vectoriels ?

Les plongements vectoriels de texte d’OpenAI mesurent la proximité entre des chaînes de texte. Ils sont couramment utilisés pour :

  • Rechercher (les résultats sont classés selon leur pertinence par rapport à une requête textuelle)
  • Regroupement (les chaînes de texte sont regroupées selon leur similarité)
  • Recommandations (les éléments associés à des chaînes de texte proches sont recommandés)
  • Détection d’anomalies (les éléments atypiques présentant peu de similarité avec les autres sont identifiés)
  • Mesure de la diversité (les distributions de similarité sont analysées)
  • Classification (les chaînes de texte sont classées selon l’étiquette qui leur est la plus similaire)

Un plongement vectoriel est un vecteur (une liste) de nombres à virgule flottante. La distance entre deux vecteurs mesure leur proximité. Une faible distance indique une forte proximité, tandis qu’une grande distance indique une faible proximité.

Consultez notre page des tarifs pour connaître les tarifs des plongements vectoriels. Les requêtes sont facturées selon le nombre de tokens dans l’entrée.

Comment obtenir des plongements vectoriels

Pour obtenir un plongement vectoriel, envoyez votre chaîne de texte au point de terminaison de l’API de plongements vectoriels en indiquant le nom du modèle de plongement vectoriel (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 du plongement (une liste de nombres à virgule flottante) ainsi que des métadonnées supplémentaires. Vous pouvez extraire ce vecteur, l’enregistrer dans une base de données vectorielle et l’utiliser dans de nombreux cas d’utilisation.

{
  "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 du plongement comporte 1536 dimensions pour text-embedding-3-small ou 3072 pour text-embedding-3-large. Pour réduire le nombre de dimensions du plongement sans perdre sa capacité à représenter des concepts, fournissez le paramètre dimensions. Pour en savoir plus sur les dimensions des plongements vectoriels, consultez la section consacrée à leurs cas d’utilisation.

Modèles de plongement vectoriel

OpenAI propose deux puissants modèles de plongement vectoriel de troisième génération (identifiés par -3 dans l’identifiant du modèle). Pour en savoir plus, consultez l’article de blog annonçant les modèles de plongement vectoriel v3.

L’utilisation est facturée par token d’entrée. Le tableau ci-dessous illustre ces tarifs en indiquant le nombre de pages de texte traitées par dollar américain (en supposant environ 800 tokens par page) :

Modèle~ Pages par dollarPerformances à l’évaluation MTEBTaille maximale de l’entrée
text-embedding-3-small62 50062,3 %8192
text-embedding-3-large9 61564,6 %8192
text-embedding-ada-00212 50061,0 %8192

Cas d’utilisation

Voici quelques cas d’utilisation représentatifs, illustrés à l’aide du jeu de données d’avis sur les produits alimentaires d’Amazon.

Obtention des plongements vectoriels

Le jeu de données contient au total 568 454 avis sur des produits alimentaires publiés par des utilisateurs d’Amazon jusqu’en octobre 2012. Pour ces exemples, nous utilisons un sous-ensemble des 1 000 avis les plus récents. Les avis sont en anglais et tendent à être positifs ou négatifs. Chaque avis comporte un ProductId, un UserId, un Score, un titre (Summary) et un corps de texte (Text). Par exemple :

Identifiant du produitIdentifiant de l’utilisateurNoteRésuméTexte
B001E4KFG0A3SGXH7AUHU8GW5Nourriture pour chiens de bonne qualitéJ’ai acheté plusieurs conserves Vitality...
B00813GRG4A1D87F6ZCVE5NK1Non conforme à la descriptionLe produit est arrivé avec une étiquette indiquant « Cacahuètes salées géantes »...

Ci-dessous, nous réunissons le résumé et le texte de l’avis en un seul texte. Le modèle encode ce texte et produit un unique plongement vectoriel.

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é, vous pouvez exécuter le code suivant :

import pandas as pd

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

FAQ

Comment connaître le nombre de tokens d’une chaîne avant de créer son plongement vectoriel ?

En Python, vous pouvez découper une chaîne en tokens avec le tokeniseur 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 vectoriel de troisième génération comme text-embedding-3-small, utilisez l’encodage cl100k_base.

Vous trouverez plus de détails et des exemples de code dans le guide du Cookbook OpenAI consacré au comptage des tokens avec tiktoken.

Comment récupérer rapidement les K vecteurs de plongement les plus proches ?

Pour effectuer des recherches rapides 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 dois-je utiliser ?

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

Les plongements vectoriels d’OpenAI sont normalisés pour avoir une norme de 1, ce qui signifie que :

  • La similarité cosinus peut être calculée un peu plus rapidement à l’aide d’un simple produit scalaire
  • La similarité cosinus et la distance euclidienne donnent des classements identiques

Puis-je partager mes plongements vectoriels en ligne ?

Oui, les clients sont propriétaires des données qu’ils fournissent à nos modèles et des sorties qu’ils en obtiennent, y compris les plongements vectoriels. Il vous appartient de veiller à ce que le contenu que vous transmettez à notre API respecte la législation applicable et nos conditions d’utilisation.

Les modèles de plongement vectoriel 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 contraignante que pour les modèles de génération de texte, mais elle peut réduire les performances dans certains cas particuliers.