RAG production avec Supabase pgvector : guide 2026
Construire un RAG production-ready : embeddings Voyage-3, pgvector Supabase, reranking Cohere. Code prêt à déployer, tutoriel 2026.

- Tutoriel pour construire un système RAGRetrieval-Augmented Generation, une technique qui combine un LLM avec une base documentaire pour ancrer ses réponses dans des sources. en production avec Supabase et pgvector.
- Stack : Supabase (pgvector) + [OpenAI](https://openai.com/blog) ada-3 (embeddings) + Claude Sonnet 4.7 (génération).
- Coût mensuel estimé : 50 à 500 € selon le volume.
- Code complet TypeScript fourni, déployable sur Vercel en quelques heures.
RAG est en 2026 la brique IA d'entreprise la plus rentable. Pour quelques heures de mise en place, vous obtenez un assistant qui hallucine 10× moins.
Si vous voulez faire répondre Claude ou GPT précisément sur vos propres documents (manuels produit, base de connaissances, jurisprudence interne), vous avez besoin d'un système RAG. Voici comment en construire un en production avec une stack moderne et abordable.
Architecture combinant recherche vectorielle dans une base documentaire et génération par LLMLarge Language Model, un modèle de langage entraîné sur des milliards de paramètres pour générer et comprendre du texte.. L'IA répond uniquement en s'appuyant sur vos sources, avec citations. Concept popularisé par un papier Meta en 2020, devenu le standard entreprise en 2026.
Plateforme open sourceUn logiciel dont le code source, et parfois les poids du modèle, sont publiés librement et réutilisables. créée en 2020, alternative à Firebase. Construit sur PostgreSQL avec APIApplication Programming Interface, le canal d'accès programmatique à un service ou à un modèle. auto-générée. Offre une extension pgvector qui transforme PostgreSQL en base vectorielle performante. Free tier généreux : 500 MB DB + 1 GB stockage + 50k requêtes API.
Configurer la base vectorielle
create extension vector;create table documents (
id bigserial primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
create index on documents using ivfflat (embedding vector_cosine_ops);
Le nombre 1536 correspond à la dimension des embeddings OpenAI text-embeddingLa représentation numérique (un vecteur) d'un mot, d'une phrase ou d'une image dans un espace que le modèle comprend.-3-small. Pour [Mistral](/modeles/mistral) Embed : 1024. Pour Cohere v4 : 1024. Toujours faire correspondre la dimension de la table avec celle de votre modèle d'embedding.
Le pipeline d'ingestion
import { createClient } from '@supabase/supabase-js';
import OpenAI from 'openai';
const supabase = createClient(URL, KEY);
const openai = new OpenAI();
async function ingest(text: string, source: string) {
const chunks = chunkText(text, 1000, 100);
for (const chunk of chunks) {
const { data: emb } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: chunk,
});
await supabase.from('documents').insert({
content: chunk,
metadata: { source },
embedding: emb.data[0].embedding,
});
}
}
Construire la requête de retrieval
create or replace function match_documents (
query_embedding vector(1536),
match_count int default 5
) returns table (
id bigint,
content text,
similarity float
) language sql as $$
select id, content, 1 - (embedding <=> query_embedding) as similarity
from documents
order by embedding <=> query_embedding
limit match_count;
$$;
L'opérateur <=> de pgvector calcule la distance cosinus entre deux vecteurs. C'est le cœur mathématique du retrieval moderne.
Connecter le LLM
import [Anthropic](https://www.anthropic.com/news) from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
async function ask(question: string) {
// 1. Embedding de la question
const { data: emb } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: question,
});
// 2. Retrieval des chunks pertinents
const { data: chunks } = await supabase.rpc('match_documents', {
query_embedding: emb.data[0].embedding,
match_count: 5,
});
// 3. Construction du prompt
const context = chunks.map(c => c.content).join('\n\n');
const prompt = `Réponds uniquement à partir du contexte suivant. Cite tes sources.
<context>
${context}
</context>
Question: ${question}`;
// 4. Appel Claude
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-7',
max_tokens: 1024,
messages: [{ role: 'user', content: prompt }],
});
return response.content[0].text;
}
Estimation des coûts
| Composant | Free tier | Production légère | Production forte |
|---|---|---|---|
| Supabase | 0 € | 25 €/mois | 599 €/mois |
| OpenAI embeddings | ~5 €/mois | 20 €/mois | 100 €/mois |
| Claude API | ~30 €/mois | 100 €/mois | 1000 €/mois |
| Total | ~35 € | ~145 € | ~1700 € |
Les 3 pièges à éviter
1. Mauvais découpage : couper au milieu d'une phrase ruine la pertinence. Toujours découper sur les paragraphes ou phrases.
2. Pas de "réponds uniquement à partir du contexteLa fenêtre de contexte : le nombre maximum de tokens qu'un modèle peut traiter en une seule requête (ex : 200k, 1M)." : sans cette consigne, Claude redevient généraliste et hallucine.
3. Top-K trop élevé : 5 chunks suffisent. Plus = bruit + coût inutile.
- Supabase AI documentation
- pgvector sur GitHub
- OpenAI Embeddings docs
- Anthropic API docs
- Lewis et al., "Retrieval-Augmented Generation for Knowledge-Intensive NLPNatural Language Processing, le traitement automatique du langage humain par les machines. Tasks", [Meta AI](https://ai.meta.com/blog) 2020
Architecture détaillée du RAG
Un RAG production-ready combine 5 briques :
- Ingestion : extraction texte depuis docs (PDF, HTML, MD)
- Chunking : découpage en passages de 200-500 tokens
- Embedding : conversion en vecteurs (Voyage-3, OpenAI ada-3)
- Stockage : pgvector dans Supabase Postgres
- Retrieval + reranking : recherche similarité + Cohere rerank
- Generation : promptLes instructions ou questions écrites envoyées à un modèle d'IA pour obtenir une réponse. avec contexte + Claude Opus 4.7
Schéma Supabase pour pgvector
-- Activer l'extension
create extension if not exists vector;
-- Table des documents
create table documents (
id uuid primary key default uuid_generate_v4(),
source text not null,
metadata jsonb,
content text not null,
embedding vector(1024) -- Voyage-3 = 1024 dims
);
-- Index HNSW pour la recherche
create index on documents using hnsw (embedding vector_cosine_ops);
-- Fonction de recherche
create function match_documents (
query_embedding vector(1024),
match_threshold float,
match_count int
) returns table (id uuid, content text, similarity float)
language sql stable as $$
select id, content, 1 - (embedding <=> query_embedding) as similarity
from documents
where 1 - (embedding <=> query_embedding) > match_threshold
order by embedding <=> query_embedding
limit match_count;
$$;
Choisir son modèle d'embedding
| Modèle | Vendor | Dimensions | Prix /M tokens | Qualité |
|---|---|---|---|---|
| Voyage-3 | Voyage AI (Anthropic) | 1024 | 0,12$ | ⭐⭐⭐⭐⭐ |
| text-embedding-3-large | OpenAI | 3072 | 0,13$ | ⭐⭐⭐⭐ |
| jina-embeddings-v3 | Jina AI | 1024 | 0,02$ | ⭐⭐⭐⭐ |
| bge-large-en-v1.5 | BAAI (open source) | 1024 | 0 (self-host) | ⭐⭐⭐ |
| Mistral embed | Mistral | 1024 | 0,10$ | ⭐⭐⭐⭐ |
Voyage-3 est notre recommandation pour la qualité, Mistral embed pour la souveraineté FR.
Reranking : pourquoi c'est crucial
La recherche par similarité cosinus retourne des passages "proches" mais pas forcément pertinents. Un reranker (Cohere Rerank ou Voyage Rerank) repondère les résultats selon la pertinence sémantique fine.
// Pseudo-code reranking
const initialResults = await pgvector.search(query, { topK: 50 });
const reranked = await cohere.rerank({
query,
documents: initialResults.map(r => r.content),
topN: 5,
});
const finalContext = reranked.results.map(r => r.document);
Gain typique : +20-40% sur la précision de la réponse finale.
Chunking : la science cachée
Un chunking mal pensé sabote tout le RAG. Recommandations :
- Taille : 200-500 tokens (pas plus)
- Overlap : 50 tokens entre chunks consécutifs
- Respecter la structure : ne pas couper au milieu d'une phrase ou paragraphe
- Header injection : injecter le titre du document dans chaque chunk
- Metadata : tagger chaque chunk (date, source, type)
Coût mensuel pour un RAG production
Profil : 10 000 documents, 1000 requêtes/jour.
- Embedding initial : 10k docs × 500 tokens = 5M tokens × 0,12$ = 600$ (one-shot)
- Embedding nouvelles requêtes : 1000 × 100 tokens × 30j = 3M tokens × 0,12$ = 360$/mois
- Reranking : 1000 × 30 × 0,01$ = 300$/mois
- LLM final (Claude Sonnet 4.7) : ~150$/mois
- Supabase : 25$/mois Pro tier
- Total mensuel : ~835$/mois pour un RAG sérieux
Pièges à éviter
Pour aller plus loin
- Notre article RAG : génération augmentée par récupération
- Notre guide agents IA
- Notre guide prompt engineering
Points clés à connaître
Pour les développeurs
Les outils Claude Code 2 et Cursor 2 sont devenus indispensables en 2026. Pour aller plus loin, voir notre comparatif Cursor 2 vs Claude Code 2.
Pour les PME françaises
Mistral Le Chat Enterprise (15€/user) reste l'option souveraine privilégiée. Pour les usages internationaux, Claude Pro (22€) ou ChatGPT Plus (20$) offrent une qualité premium.
Pour les créateurs de contenu
Midjourney v7 pour l'image, Veo 3 pour la vidéo, Suno V5 pour la musique, ElevenLabs ou OpenAI Voice pour l'audio. Stack complète ~150€/mois.
Pour la souveraineté EU
L'AI Act européen impose des obligations renforcées dès août 2026. Mistral, Aleph Alpha (Allemagne) et Pollen Robotics (France) offrent des alternatives souveraines.
Pour la recherche académique
Les laboratoires français (INRIAInstitut National de Recherche en Informatique et Automatique, l'institut public français des sciences du numérique., CNRS, 3IA, IHES) restent à la pointe sur le ML théorique. Les outils comme NotebookLM et Claude Projects facilitent la synthèse de papers.
Questions fréquentes
- pgvector tient-il à l'échelle ?
- Oui, jusqu'à plusieurs millions de chunks sans problème, à condition d'utiliser l'index HNSW. Au-delà de 100M chunks, des solutions dédiées comme Pinecone ou Weaviate peuvent devenir pertinentes, mais pour 99% des cas d'usage, pgvector est largement suffisant.
- Faut-il vraiment un reranker ?
- Quasi-toujours oui. Le reranker apporte +30% de précision en moyenne pour ~200ms de latence supplémentaire et 0,002$ par requête. C'est le meilleur ROI de toute la chaîne RAG. Skip uniquement pour des prototypes ou des cas ultra-simples.
- Comment gérer les documents multilingues ?
- Deux approches : (1) un embedder multilingue (Voyage-3, Cohere Embed v3 supportent 100+ langues) sur tous les contenus, ou (2) un embedder par langue avec routing au moment de la query. La première est plus simple, la seconde donne légèrement de meilleurs résultats sur des langues spécifiques (FR avec bge-large-fr par exemple).
- Quel modèle de génération utiliser ?
- Pour la majorité des cas, Claude Sonnet 4.7 ou Mistral Large 3 offrent le meilleur rapport qualité/prix. Pour des cas où la précision est critique (médical, juridique), Claude Opus 4.7 vaut le surcoût. Pour le low-cost massif, Llama 5 70B via Together est excellent.
- Cet outil est-il conforme au RGPD et à l'AI Act européen ?
- La conformité dépend du déploiement. Les versions cloud hébergées en région EU (AWS Paris, Azure West Europe, Google Cloud Paris) offrent une garantie technique, mais restent soumises au Cloud Act américain. Pour une souveraineté complète, privilégiez Mistral AI (français), Aleph Alpha (allemand) ou un déploiement on-premise. L'AI Act impose depuis août 2025 des obligations renforcées : documentation, supervision humaine pour les usages à haut risque, étiquetage des contenus générés. Consultez votre DPO pour valider votre cas d'usage.
- Quelle alternative française ou européenne existe-t-il ?
- L'écosystème européen offre plusieurs alternatives crédibles. Mistral AI (Paris, 22 Md€ de valorisation) propose Le Chat, Codestral et Mistral Large 3 avec hébergement souverain. Pour les modèles open source, Mistral 8x22B et les variantes Hugging Face de Pollen Robotics (Bordeaux) sont déployables on-premise. Sur la productivité, Doctolib AI, Pennylane et Qonto intègrent de l'IA respectant les standards français. Consultez notre cartographie complète de l'écosystème IA français pour les acteurs majeurs.


