Back to all posts
Tutorial

Comment créer un assistant IA Agentic RAG à 0 $ à partir de zéro avec Cloudflare

Si vous payez encore 20 $/mois pour une base de données vectorielle gérée et que vous hébergez votre chatbot IA sur des fonctions sans serveur à démarrage à froid, vous vous y prenez mal.

Lorsque j'ai décidé d'ajouter un assistant IA à mon portfolio, j'avais deux exigences strictes : il ne doit y avoir aucune latence, et il doit me coûter exactement 0 $ à faire fonctionner.

J'ai atteint ces deux objectifs en déplaçant toute l'architecture de l'IA vers la périphérie (edge). Dans ce tutoriel, je vais vous montrer exactement comment construire un système Agentic RAG (Retrieval-Augmented Generation) avec état (stateful) à partir de zéro en utilisant la plateforme de développement Cloudflare.


L'architecture Stack à 0 $

Pour maintenir les coûts à zéro tout en conservant des performances de niveau entreprise, nous nous appuyons entièrement sur les niveaux gratuits de Cloudflare :

  • Cloudflare Workers : Le runtime de calcul en périphérie. (Gratuit jusqu'à 100 000 requêtes/jour).
  • Cloudflare Vectorize : Notre base de données vectorielle pour la recherche sémantique. (Gratuit jusqu'à 30 millions de dimensions interrogées/mois).
  • Cloudflare D1 : Notre base de données SQLite sans serveur pour l'historique des discussions. (Gratuit jusqu'à 5 millions de lignes lues/jour).
  • Cloudflare AI Gateway : Pour mettre en cache les requêtes LLM et éviter les limites de débit.

Au lieu d'un système RAG passif qui se contente d'insérer des documents dans une invite (prompt), nous construisons un système Agentic. Cela signifie que l'IA s'exécute dans une boucle "ReAct" (Raisonnement et Action), équipée d'outils personnalisés qu'elle peut invoquer dynamiquement en fonction des entrées de l'utilisateur.


Étape 1 : Initialisation du Worker Edge

Tout d'abord, nous devons lancer un Cloudflare Worker. Il servira de cerveau à notre opération.

npm create cloudflare@latest agentic-assistant
cd agentic-assistant

Ouvrez votre fichier wrangler.toml. C'est là que la magie opère. Nous devons lier notre base de données D1 et notre index Vectorize directement à l'environnement du worker afin qu'ils s'exécutent avec une latence quasi nulle.

name = "agentic-assistant"
main = "src/index.ts"
compatibility_date = "2026-05-01"

[[d1_databases]]
binding = "DB"
database_name = "chat_history"
database_id = "your-d1-id"

[[vectorize]]
binding = "KNOWLEDGE_BASE"
index_name = "rag-index"

Étape 2 : Ingestion de la base de connaissances

Avant que notre agent puisse répondre aux questions, il a besoin de données. J'ai créé un simple fichier rag-data.ts contenant mon parcours professionnel, mes services et mes tarifs.

Pour intégrer ces données dans Cloudflare Vectorize, nous utilisons les modèles natifs d'intégration de texte (embeddings) de Cloudflare Workers AI. C'est beaucoup moins cher (et plus rapide) que d'appeler l'API d'embeddings d'OpenAI.

import { Ai } from '@cloudflare/ai';

export default {
  async fetch(request, env) {
    const ai = new Ai(env.AI);
    
    // 1. Générer l'intégration vectorielle à la périphérie (edge)
    const { data } = await ai.run('@cf/baai/bge-small-en-v1.5', {
      text: "Elvis Li est un développeur Full-Stack Solo spécialisé dans l'IA."
    });

    // 2. Insérer directement dans Vectorize
    await env.KNOWLEDGE_BASE.upsert([{
      id: "bio-1",
      values: data[0],
      metadata: { category: "background" }
    }]);

    return new Response("Knowledge Base updated!");
  }
}

Étape 3 : Construction de la boucle ReAct d'appel d'outils

C'est ce qui rend le système Agentic. Le RAG standard se contente de rechercher aveuglément dans la base de données vectorielle. Notre système demande au LLM de décider s'il a besoin de chercher.

J'utilise Gemini 1.5 Pro via la passerelle d'IA Cloudflare (AI Gateway). Nous fournissons à Gemini un schéma JSON des outils disponibles.

const tools = [
  {
    name: "query_knowledge_base",
    description: "Utilisez ceci pour rechercher dans la base de données vectorielle des faits sur Elvis.",
    parameters: {
      type: "object",
      properties: {
        query: { type: "string" }
      },
      required: ["query"]
    }
  }
];

Lorsque l'utilisateur demande : "Quel genre de systèmes d'IA construisez-vous ?", le worker intercepte la demande et déclenche la boucle de l'agent :

  1. La Requête (The Request) : Le worker envoie le message de l'utilisateur et la liste des outils à Gemini.
  2. La Pensée (The Thought) : Gemini réalise qu'il ne connaît pas la réponse, mais il sait que l'outil query_knowledge_base la connaît. Il renvoie une réponse tool_call.
  3. L'Action (RAG) : Le worker intercepte l'appel de l'outil, prend la requête de recherche générée par Gemini, l'intègre via Workers AI, et interroge Cloudflare Vectorize.
  4. La Résolution (The Resolution) : Le worker renvoie les résultats de la recherche vectorielle à Gemini, qui synthétise ensuite une réponse naturelle et humaine.

Tout cela se déroule dans un seul nœud périphérique (edge node) situé physiquement près de l'utilisateur, ce qui permet d'obtenir des temps de réponse incroyablement rapides.


Étape 4 : Persistance de l'état avec Cloudflare D1

Une IA est inutile si elle souffre d'amnésie. Pour rendre le chatbot conversationnel, nous devons conserver l'historique des messages.

Au lieu de mettre en place une instance PostgreSQL externe, nous utilisons Cloudflare D1. C'est SQLite construit sur des Objets Durables (Durable Objects), ce qui signifie qu'il fonctionne à la périphérie aux côtés de notre worker.

// Sauvegarder la conversation localement à la périphérie
await env.DB.prepare(`
  INSERT INTO messages (session_id, role, content) 
  VALUES (?, ?, ?)
`).bind(sessionId, 'user', userQuery).run();

À chaque requête entrante, le worker effectue simplement un SELECT * FROM messages WHERE session_id = ? pour reconstruire l'historique de la discussion avant d'interroger le LLM. Comme D1 est sans serveur et distribué, cette requête n'ajoute presque aucune surcharge.

Le Résultat : Niveau Entreprise, Zéro Coût

En tirant parti de Cloudflare Workers, Vectorize et D1, vous éliminez le besoin de bases de données vectorielles gérées coûteuses, de Lambdas à démarrage à froid et de serveurs de bases de données dédiés.

Le résultat est un système Agentic RAG complètement autonome et avec état qui coûte 0 $ à faire fonctionner et répond plus rapidement que presque n'importe quelle alternative commerciale. Si vous créez des portfolios personnels, des pages de destination de startups ou des outils internes, c'est l'architecture définitive de 2026.