GraphQL automatique + embeddings vectoriels
Extension GraphQL auto-générée depuis le schéma, extension vectorielle pour la recherche par similarité (HNSW, IVFFLAT) et le RAG. Activées par défaut.
GraphQL automatique + embeddings vectoriels
Chaque backend Pool C inclut deux extensions PostgreSQL particulièrement puissantes : une extension GraphQL qui génère une API GraphQL depuis le schéma sans configuration, et une extension vectorielle qui ajoute le type vector et les opérateurs de distance pour la recherche par similarité et le RAG. Activées automatiquement à la création du projet.
Quand utiliser — quand non
GraphQL — idéal pour
- Apps frontend qui veulent un schéma typé fort
- Requêtes avec relations imbriquées multi-niveaux
- Pagination cursor-based standard
Vectoriel — idéal pour
- RAG (Retrieval-Augmented Generation) — embeddings + LLM
- Recherche sémantique (similarité de phrases, paragraphes)
- Recommandations basées sur la similarité
Endpoint GraphQL
POST https://wzfbhd.runtime.di2amp.com/graphql/v1 Authorization: Bearer $ANON_KEY apikey: $ANON_KEY Content-Type: application/json
Requêtes et mutations GraphQL
query {
todosCollection(
first: 10,
orderBy: [{ created_at: DescNullsLast }],
filter: { done: { eq: false } }
) {
edges {
node {
id
title
done
created_at
user { # relation FK automatique
email
display_name
}
}
}
pageInfo { hasNextPage endCursor }
}
}
mutation {
insertIntoTodosCollection(objects: [{ title: "Acheter du pain" }]) {
records { id title created_at }
affectedCount
}
}
Toutes les foreign keys deviennent des relations navigables. Les policies RLS s'appliquent aux queries / mutations exactement comme sur l'API REST.
Embeddings — création de table
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT NOT NULL,
metadata JSONB DEFAULT '{}',
embedding vector(1536), -- text-embedding-3-small (OpenAI)
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Index HNSW (recommandé)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
Opérateurs de distance
-- Distance L2 (Euclidienne) : <-> SELECT content, embedding <-> '[0.1, 0.2, ...]' AS distance FROM documents ORDER BY distance LIMIT 10; -- Similarité cosinus : <=> (0 = identique, 2 = opposé) SELECT content, embedding <=> '[0.1, 0.2, ...]' AS distance FROM documents ORDER BY distance LIMIT 10; -- Produit scalaire négatif : <#> (pour embeddings normalisés) SELECT content, -(embedding <#> '[0.1, 0.2, ...]') AS similarity FROM documents ORDER BY embedding <#> '[0.1, 0.2, ...]' LIMIT 10;
Recherche hybride (vectorielle + SQL)
SELECT content, embedding <=> $1 AS distance FROM documents WHERE metadata->>'language' = 'fr' AND created_at > NOW() - INTERVAL '90 days' ORDER BY embedding <=> $1 LIMIT 5;
Exemple RAG
Pipeline complet : embedding + recherche pgvector + appel LLM via AI Gateway européen, le tout dans une fonction serverless co-localisée.
// fonction serverless
const url = Deno.env.get("PAAS_BAAS_URL")!;
const serviceKey = Deno.env.get("PAAS_BAAS_SERVICE_ROLE_KEY")!;
const aiGateway = Deno.env.get("PAAS_AI_GATEWAY_URL")!;
const aiKey = Deno.env.get("PAAS_AI_API_KEY")!;
// 1. Vectoriser la question
const emb = await fetch(`${aiGateway}/v1/embeddings`, {
method: "POST",
headers: { Authorization: `Bearer ${aiKey}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: "E5-Mistral-7B", input: question }),
}).then(r => r.json());
// 2. RPC vers PostgreSQL pour retrouver les passages
const passages = await fetch(`${url}/rest/v1/rpc/match_documents`, {
method: "POST",
headers: { apikey: serviceKey, Authorization: `Bearer ${serviceKey}` },
body: JSON.stringify({ query_embedding: emb.data[0].embedding, match_count: 5 }),
}).then(r => r.json());
// 3. Appel LLM avec contexte
const completion = await fetch(`${aiGateway}/v1/chat/completions`, {
method: "POST",
headers: { Authorization: `Bearer ${aiKey}`, "Content-Type": "application/json" },
body: JSON.stringify({
model: "Mistral-Small-3.2-24B-Instruct",
messages: [
{ role: "system", content: "Réponds uniquement à partir du contexte fourni." },
{ role: "user", content: `Contexte :\n${passages.map((p:any)=>p.content).join("\n\n")}\n\nQuestion : ${question}` }
],
max_tokens: 512,
}),
}).then(r => r.json());
Dimensions supportées
| Modèle d'embedding | Dimensions | Compatible |
|---|---|---|
| text-embedding-3-small (OpenAI) | 1 536 | Oui |
| text-embedding-3-large (OpenAI) | 3 072 | Oui (PCA recommandée) |
| E5-Mistral-7B (OVH) | 4 096 | Oui (PCA recommandée) |
| BGE-M3 (OVH) | 1 024 | Oui |
| Nomic Embed Text | 768 | Oui |
L'extension supporte jusqu'à 2 000 dimensions nativement. Au-delà : réduction PCA / matryoshka avant stockage.
Sécurité et isolation
Les policies RLS PostgreSQL s'appliquent à GraphQL et aux requêtes vectorielles exactement comme à l'API REST. Pas de partage de données entre projets.
Pour aller plus loin
Tarification associée
Extensions incluses sans surcoût. Stockage des embeddings compté dans le quota disque du backend. Voir tarifs.