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'embeddingDimensionsCompatible
text-embedding-3-small (OpenAI)1 536Oui
text-embedding-3-large (OpenAI)3 072Oui (PCA recommandée)
E5-Mistral-7B (OVH)4 096Oui (PCA recommandée)
BGE-M3 (OVH)1 024Oui
Nomic Embed Text768Oui

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.