?
SkillintermédiaireVérifié le 2025-05

Embeddings : recherche sémantique avec Ada

Générer et utiliser des embeddings pour la recherche, la classification et le clustering.

Les embeddings OpenAI

Les embeddings transforment du texte en vecteurs numériques qui capturent le sens sémantique. Deux textes ayant un sens similaire auront des vecteurs proches, même s'ils utilisent des mots différents. C'est la base de la recherche sémantique et du RAG.

Modèles disponibles

  • text-embedding-3-small : Compact et économique (1536 dimensions), excellent pour la plupart des cas
  • text-embedding-3-large : Plus performant (3072 dimensions), pour les cas exigeants

Les deux modèles supportent la réduction de dimensions via le paramètre dimensions pour optimiser le stockage.

Générer des embeddings

import OpenAI from "openai";

const client = new OpenAI();

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: "Comment déployer une application Next.js sur Vercel ?",
  dimensions: 1536
});

const vector = response.data[0].embedding;
// [0.0123, -0.0456, 0.0789, ...] (1536 floats)

Traitement par batch

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: [
    "Premier document à indexer",
    "Deuxième document à indexer",
    "Troisième document à indexer"
  ]
});

// response.data contient un embedding par input

Recherche sémantique

Principe 1. Indexation : Générez les embeddings de tous vos documents et stockez-les 2. Requête : Générez l'embedding de la question utilisateur 3. Recherche : Trouvez les documents les plus proches par similarité cosinus 4. Réponse : Envoyez les documents trouvés à GPT comme contexte

Similarité cosinus

function cosineSimilarity(a: number[], b: number[]): number {
  let dotProduct = 0;
  let normA = 0;
  let normB = 0;
  for (let i = 0; i < a.length; i++) {
    dotProduct += a[i] * b[i];
    normA += a[i] * a[i];
    normB += b[i] * b[i];
  }
  return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}

Pipeline RAG complet

// 1. Indexer les documents
const documents = [
  { id: 1, text: "Guide d'installation de Next.js..." },
  { id: 2, text: "Configuration du routing avec App Router..." }
];

const embeddings = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: documents.map(d => d.text)
});

// Stocker dans votre base vectorielle (Pinecone, Supabase, pgvector...)

// 2. Rechercher
const queryEmbedding = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: "Comment configurer les routes ?"
});

// Trouver les documents les plus proches dans votre DB
const relevantDocs = await vectorDB.search(queryEmbedding.data[0].embedding, { topK: 3 });

// 3. Générer la réponse
const answer = await client.chat.completions.create({
  model: "gpt-4o",
  messages: [
    { role: "system", content: "Réponds en te basant uniquement sur ces documents :" + relevantDocs.map(d => d.text).join("\n") },
    { role: "user", content: "Comment configurer les routes ?" }
  ]
});

Bases vectorielles populaires

  • Pinecone : Managed, scalable, simple à intégrer
  • Supabase pgvector : Si vous utilisez déjà Supabase/PostgreSQL
  • ChromaDB : Open-source, idéal pour le prototypage
  • Qdrant : Open-source, performant
  • Weaviate : Open-source avec fonctionnalités avancées

Bonnes pratiques

  • Chunking : Découpez les longs documents en segments de 200-500 tokens
  • Overlap : Ajoutez un chevauchement de 50-100 tokens entre les chunks
  • Métadonnées : Stockez le titre, la source et la date avec chaque embedding
  • Même modèle : Utilisez le même modèle pour l'indexation et la recherche

Sources

APIembeddingsrecherche