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 inputRecherche 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