OpenClaw + bases de données : PostgreSQL, RAG et recherche sémantique

La série technique OpenClaw se clôt sur l'intégration base de données : PostgreSQL via psycopg2, pipeline RAG avec pgvector, et recherche sémantique sur vos données internes. Architecture concrète, checklist terrain.

OpenClaw + bases de données : PostgreSQL, RAG et recherche sémantique

Les fichiers plats ont leur utilité. Mais quand un réseau d'agents doit lire, écrire et raisonner sur des données structurées à l'échelle — les bases de données changent la donne. Ce billet clôt la série technique OpenClaw sur une note concrète : PostgreSQL, RAG et recherche sémantique dans un déploiement agent IA.

1. Au-delà des fichiers : pourquoi connecter OpenClaw à une vraie base de données

Un agent OpenClaw peut lire et écrire des fichiers Markdown, JSON, CSV. Pour beaucoup d'usages, c'est suffisant. Le workspace Git comme système de persistance couvre 80 % des scénarios d'automatisation courante : logs, notes, configurations, états inter-sessions.

Mais certaines situations nécessitent plus :

  • Volumes importants — un historique de 50 000 transactions ne se lit pas raisonnablement en Markdown.
  • Requêtes dynamiques — filtrer les clients par revenu, par date, par statut : SQL est le bon outil, pas grep.
  • Concurrence — plusieurs agents qui écrivent simultanément dans le même fichier créent des race conditions. Une base de données gère ça nativement.
  • Recherche sémantique — retrouver des documents par sens, pas par mot-clé exact : ça nécessite un vector store, pas un fichier texte.

Selon une étude Gartner 2025, 61 % des déploiements d'agents IA en production ont besoin d'une couche de persistance structurée dans les 6 premiers mois d'opération. L'intégration base de données n'est pas une option avancée — c'est la prochaine étape naturelle.

Architecture PostgreSQL et agent OpenClaw
Agent OpenClaw connecté à PostgreSQL via psycopg2 — lecture/écriture dynamique depuis les scripts d'automatisation.

2. PostgreSQL + OpenClaw : connexion directe via scripts

L'intégration la plus directe : un script Python dans le workspace de l'agent. L'agent exécute le script via son skill exec, le script se connecte à PostgreSQL via psycopg2, effectue les opérations, retourne les résultats dans un fichier JSON que l'agent lit ensuite.

Architecture typique :

Agent → exec(scripts/query_db.py --action timesheet --user BOTUM)
         ↓
scripts/query_db.py → psycopg2 → PostgreSQL
         ↓
data/query-result.json → Agent lit → traite → répond

Exemple de connexion dans un script agent :

import psycopg2, json, os

conn = psycopg2.connect(
    host=os.environ['PG_HOST'],
    dbname=os.environ['PG_DB'],
    user=os.environ['PG_USER'],
    password=os.environ['PG_PASS']
)
cur = conn.cursor()
cur.execute(
    "SELECT client, SUM(hours) as total "
    "FROM timesheets WHERE month=%s "
    "GROUP BY client ORDER BY total DESC",
    ('2026-03',))

results = [{'client': r[0], 'hours': float(r[1])} for r in cur.fetchall()]
with open('data/timesheet-result.json', 'w') as f:
    json.dump(results, f, ensure_ascii=False, indent=2)

conn.close()
print(f"Résultats écrits : {len(results)} clients")

Règle de sécurité absolue : les credentials PostgreSQL ne sont jamais dans le workspace Git. Ils transitent via des variables d'environnement injectées par le vault au démarrage de l'agent — le même principe que pour tout credential dans OpenClaw (voir Billet 4 de cette série).

3. Cas d'usage concrets

Timesheet automatique

L'agent LEDGER de BOTUM exécute chaque vendredi un script qui agrège les entrées timesheet depuis PostgreSQL, génère un rapport Markdown, et l'envoie en digest. Le résultat : aucune intervention humaine pour les rapports hebdomadaires.

CRM mis à jour par un agent

Après chaque appel client loggé dans la messagerie, l'agent NEXUS extrait les informations clés (décision prise, prochaine étape, persona de contact) et insère/met à jour la ligne correspondante dans la table contacts de PostgreSQL. Le CRM se tient à jour en temps réel, sans saisie manuelle.

Logs structurés d'opérations

Chaque action significative des agents (email envoyé, rapport généré, alerte déclenchée) est loggée dans une table agent_logs avec horodatage, agent source, type d'action et statut. Cela permet un audit complet et des tableaux de bord opérationnels — impossible à faire de façon fiable avec des fichiers texte.

4. RAG (Retrieval-Augmented Generation) : pourquoi ça change tout

Un LLM a une fenêtre de contexte limitée. Vous ne pouvez pas lui injecter 10 000 pages de documentation, l'historique complet d'un CRM, ou 5 ans de décisions techniques. Le RAG résout ce problème.

Le principe : plutôt que d'injecter tout le contenu dans le prompt, on récupère seulement les passages les plus pertinents à la question posée, et on les injecte. La pertinence est calculée non pas par correspondance exacte de mots-clés, mais par similarité sémantique — proximité de sens dans l'espace vectoriel.

Architecture simple d'un pipeline RAG :

1. Indexation (une fois)
   Documents → Embeddings (vecteurs 1536 dims) → Stockage (pgvector ou fichier)

2. Requête (chaque question)
   Question → Embedding → Recherche similarité → Top-K passages → Contexte LLM
Pipeline RAG : query → embedding → vector search → context → LLM
Pipeline RAG complet — de la question à la réponse enrichie par contexte.

5. Implémenter un RAG basique avec OpenClaw

Étape 1 : Générer des embeddings

Un embedding est une représentation vectorielle dense d'un texte — un tableau de 1536 nombres qui capture le "sens" du texte. Des textes sémantiquement proches ont des vecteurs proches dans cet espace.

import openai, json, numpy as np

client = openai.OpenAI()

def get_embedding(text: str) -> list[float]:
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

# Indexer des documents
documents = [
    {"id": "doc1", "content": "Décision architecturale : PostgreSQL pour le CRM..."},
    {"id": "doc2", "content": "Réunion du 12 mars : migration prévue pour Q3..."},
]

for doc in documents:
    doc["embedding"] = get_embedding(doc["content"])

# Sauvegarder (approche simple : fichier JSON)
with open("data/embeddings.json", "w") as f:
    json.dump(documents, f)

Étape 2 : pgvector pour le stockage vectoriel (recommandé en production)

Pour les petits volumes (< 10 000 documents), un fichier JSON et une recherche cosinus en Python suffisent. Pour la production, l'extension pgvector de PostgreSQL est la solution naturelle si vous êtes déjà sur Postgres.

-- Installation pgvector
CREATE EXTENSION IF NOT EXISTS vector;

-- Table de documents
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT NOT NULL,
    source VARCHAR(200),
    embedding vector(1536)
);

-- Index pour recherche rapide (HNSW recommandé)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

-- Requête de similarité
SELECT content, source,
       1 - (embedding <=> %s::vector) AS similarity
FROM documents
ORDER BY embedding <=> %s::vector
LIMIT 5;

Étape 3 : Pipeline complet dans un script agent

def rag_query(question: str, top_k: int = 5) -> str:
    # Retourne le contexte pertinent pour une question.
    q_embedding = get_embedding(question)

    # Recherche dans pgvector
    cur.execute(
        "SELECT content, source, "
        "1-(embedding <=> %s::vector) AS score "
        "FROM documents "
        "ORDER BY embedding <=> %s::vector LIMIT %s",
        (q_embedding, q_embedding, top_k))

    passages = cur.fetchall()
    context = "

---

".join([
        f"Source: {p[1]} (score: {p[2]:.2f})
{p[0]}"
        for p in passages if p[2] > 0.7  # seuil de pertinence
    ])
    return context

6. Recherche sémantique sur vos données

La recherche sémantique est la conséquence immédiate d'un pipeline RAG opérationnel. Au lieu de chercher "PostgreSQL" dans vos notes, vous cherchez "décisions d'architecture base de données" — et vous retrouvez les passages pertinents même s'ils ne contiennent pas le mot exact.

Recherche sémantique et similarité vectorielle
Visualisation de la similarité vectorielle — les documents sémantiquement proches se regroupent naturellement dans l'espace d'embedding.

Cas d'usage concrets chez BOTUM :

  • Retrouver des décisions passées — "Quelle était la décision sur l'architecture de backup ?" → l'agent retrouve le passage exact dans les notes de réunion, même de 8 mois auparavant.
  • Trouver les billets similaires — avant de publier un billet, vérifier si on a déjà couvert ce sujet sous un autre angle. La recherche sémantique évite les doublons que la recherche par mots-clés rate.
  • Chercher dans un CRM — "Quels clients ont mentionné des problèmes de sécurité ?" → scan sémantique des notes de contacts, pas une recherche exacte.
  • Knowledge base interne — les agents retrouvent la procédure standard applicable à une situation, même formulée différemment.

7. Limites et réalité terrain

Le RAG n'est pas une baguette magique. Les équipes BOTUM ont identifié plusieurs limites concrètes :

Qualité des embeddings

Un mauvais texte d'entrée produit un mauvais embedding. Si vos notes de réunion sont des bullet points cryptiques ("Migration — décision finale — voir Slack"), l'embedding ne capture pas grand chose. La qualité du corpus d'indexation détermine la qualité des résultats.

Coût des embeddings

Avec text-embedding-3-small (OpenAI), le coût est de $0.02 pour 1 million de tokens. Pour un corpus de 10 000 documents de 500 tokens chacun : ~$0.10 pour l'indexation initiale. Raisonnable — mais ça s'accumule si on réindexe trop souvent.

Latence

Un pipeline RAG ajoute 200-500ms à chaque requête (appel API embedding + recherche vectorielle). Pour un agent interactif, c'est souvent invisible. Pour un pipeline batch de 1 000 requêtes, ça compte.

Quand le RAG est inutile

Si vos données tiennent en moins de 50 000 tokens (environ 150 pages), injectez-les directement dans le contexte. Claude 3.5 Sonnet gère 200 000 tokens de contexte. Le RAG introduit une complexité qui n'est pas toujours justifiée.

8. Architecture recommandée : quand utiliser quoi

Situation Solution recommandée Pourquoi
Données < 50K tokens, statiques Injection directe dans contexte Zéro latence, zéro complexité
Données structurées, requêtes filtrées PostgreSQL direct via psycopg2 SQL > grep, concurrence gérée
< 10K docs, proto/dev JSON + cosinus en Python Simple, pas de dépendances
10K-1M docs, déjà sur Postgres pgvector Intégration naturelle, performant
> 1M docs, multi-tenant Qdrant, Weaviate, Pinecone Vector stores dédiés, scalables
Logs opérations agents PostgreSQL (table agent_logs) Audit, dashboards, requêtes ad hoc

9. Checklist intégration DB

  • Credentials via vault uniquement — jamais dans le workspace Git, jamais en dur dans un script
  • Utilisateur PostgreSQL dédié à l'agent — droits minimaux (SELECT/INSERT/UPDATE sur les tables nécessaires uniquement)
  • Pool de connexions — ne pas ouvrir une nouvelle connexion par requête en production (utilisez pgBouncer ou un pool applicatif)
  • Timeout sur les requêtes — toujours définir un statement_timeout, un agent ne doit pas bloquer indéfiniment
  • Requêtes paramétrées uniquement — jamais de f-string dans un SELECT, risque d'injection SQL même depuis un agent
  • Résultats écrits dans data/ — l'agent lit les résultats depuis un fichier, pas directement depuis la connexion DB
  • Index sur les colonnes fréquentes — l'agent ne doit pas lancer de full scans sur des tables de 100K lignes
  • Seuil de similarité RAG — toujours filtrer les résultats avec un score minimum (> 0.65–0.7), les résultats non pertinents sont pires que rien
  • Réindexation planifiée, pas en temps réel — réindexer les embeddings en batch (nuit, weekend), pas à chaque écriture
  • Tester la régression — après chaque modification du corpus, vérifier que les requêtes de référence retournent toujours les bons passages

10. Conclusion de la série OpenClaw

Ce dixième billet marque la fin de la série technique OpenClaw sur blog.botum.ca. En dix épisodes, BOTUM a documenté un déploiement réel — de l'installation initiale jusqu'à l'intégration base de données et la recherche sémantique.

Un récapitulatif de la trajectoire :

  • B1-B2 — Le concept, l'installation, le premier agent opérationnel
  • B3-B4 — Sécurité en production : auth, SSL, vault, gestion des secrets dans le contexte IA
  • B5 — Réseau d'agents spécialisés : identités, rôles, communication inter-agents
  • B6-B7 — Choix de LLM : comparatif honnête, DeepSeek et modèles locaux open-source
  • B8-B9 — Automatisation avancée : crons, triggers, files de tâches, mémoire long terme
  • B10 — Persistance structurée : PostgreSQL, RAG, recherche sémantique

La série suivante explorera les dimensions business et stratégiques : métriques ROI, architectures PME vs Enterprise, et déploiements edge. Ces articles paraîtront dans la section Insights de botum.ca.

🚀 Prêt à connecter votre infrastructure IA à vos données ?

Vous avez maintenant les 10 piliers d'un déploiement OpenClaw enterprise. Mais entre lire un guide et déployer en production, il y a l'architecture réelle, les décisions d'intégration, et les pièges qui ne sont dans aucune documentation.

Les équipes BOTUM accompagnent les organisations de l'audit technique jusqu'à la mise en production. Chaque projet est unique — le vôtre aussi.

Parler à un expert BOTUM →

📄 Télécharger ce guide en PDF

Version complète de ce billet : PostgreSQL, RAG et recherche sémantique avec OpenClaw — format PDF optimisé pour lecture et partage.

Télécharger le PDF →

Index complet — Série OpenClaw B1–B10

🚀 Aller plus loin avec BOTUM

Ce guide couvre les bases. En production, chaque environnement a ses spécificités. Les équipes BOTUM accompagnent les organisations dans le déploiement, la configuration avancée et la sécurisation de leur infrastructure. Si vous avez un projet, parlons-en.

Discuter de votre projet →
Série OpenClaw