Context Engineering — Section 2 : Sources de Contexte
Docs internes, bases SQL, APIs, logs, Knowledge Graphs, emails — ingestion, indexation, sécurité et qualité.
2. Sources de Contexte
Cartographie, ingestion, indexation hybride, métadonnées, sécurité & gouvernance.
- A. Panorama
- B. Typologies
- C. Ingestion (ETL/ELT)
- D. Indexation hybride
- E. Métadonnées & Catalogue
- F. Qualité & Observabilité
- G. Sécurité / RGPD
- H. Connecteurs
- I. Snippets
- J. Schémas JSON
- K. Playbook
Le contexte regroupe toutes les informations injectées (directement ou après retrieval/condensation) dans la fenêtre du modèle. L’objectif est de rendre ces données recherchables, filtrables, versionnées et traçables.
Problèmes à résoudre
Obsolescence, bruit, silos, coûts tokens, confidentialité, manque de traçabilité.
Principes
“Less but better” : sélection pertinente + preuves (citations) + formats contrôlés + coût maîtrisé.
Périmètres
Docs internes, bases SQL/NoSQL, APIs, logs, KGs, emails, tickets, wikis, CRM/ERP, référentiels légaux.
╭────────────────────────────────────────────────────────╮
│ PIPELINE DE CONTEXTE (vue synthèse) │
╭───────────╮ │ Ingestion → Indexation → Retrieval/Ranking │ ╭───────────╮
│ Sources │──▶│ (ETL/ELT) → (lexical+vec) → + Compression + Cache ├──▶│ LLM/ │
│ (docs…KG) │ │ + Métadonnées + Sécurité + Observabilité │ │ Agents │
╰───────────╯ ╰────────────────────────────────────────────────────────╯ ╰───────────╯
Chaque élément indexé doit porter un doc_id stable, un permalink, et les droits d’accès (RBAC).
Panier de sources (avec usages typiques)
- Docs internes (PDF/DOCX/MD) — politiques, procédures, guides → réponses sourcées.
- SQL/NoSQL — référentiels produits, SLA, KPI → tableaux, calculs et contraintes.
- APIs — prix, stocks, météo, incidents → enrichissement just-in-time.
- Logs/metrics/traces — diagnostic incidents, post-mortems → agents SRE.
- Knowledge Graphs — entités/relations → explication & raisonnement.
- Emails/Tickets — contexte client, historique → support/CSAT.
[DOCS]──┐
[SQL ]──┼─► Normalisation → Chunking → Embeddings → Index hybride
[APIs]──┤
[LOGS]──┤
[ KG ]──┘
Étendre progressivement : démarrer avec 2–3 sources à fort ROI, puis itérer (A/B tests de retrieval).
ETL/ELT : étapes et responsabilités
[Connecteur] → [Extraction] → [Nettoyage/PII] → [Normalisation] → [Split/Chunk]
→ [Enrichissement métadonnées] → [Persistance blob + index]
- Extraction : S3/SharePoint/GDrive, Postgres/Snowflake, Confluence/Jira, REST/GraphQL.
- Nettoyage/PII : masquage e-mails/téléphone/clefs, filtres secrets (regex+NER).
- Normalisation : HTML→Markdown, encodage UTF-8, suppression entêtes/pieds.
- Chunking : 512–1200 tokens, overlap 10–20%, par titres si MD/HTML.
- Enrichissement : auteur, version, langue, produit, tenant, droits d’accès.
- Persistance : blob store + index vectoriel & lexical + catalogue des métadonnées.
Éviter les “blobs” géants : préférer des chunks cohérents, titrés, avec contexte local.
Lexical + Vectoriel + Re-ranking (hybride)
- Lexical (BM25) : mots-clés, références, numéros d’articles/erreurs.
- Vectoriel (embeddings) : sémantique, paraphrases, synonymes.
- Fusion : RRF (reciprocal rank fusion) puis re-ranking (cross-encoder) sur top-50→top-10.
Stratégies de retrieval
- Multi-query : variantes “déf/étapes/examples/caveats”.
- Filtres : récence, tenant, langue, rôle, produit/version, zone.
- Boost : titres/H1, sections “Procédure” ou “Résumé”, champs tags.
- Cache : re-use de fenêtres et d’assemblages de contexte.
Query → BM25 (top50) ┐
├─► RRF ─► Re-rank (cross-encoder) ─► Top-k context
Embeddings (top50) ──┘
Stocker doc_id, offset (début/fin) et un permalink pour afficher la preuve à l’utilisateur.
Schéma minimal recommandé
{
"doc_id": "kb-2025-00142",
"source": "confluence",
"title": "Procédure d'escalade N2",
"lang": "fr",
"version": "v2025.3",
"effective_date": "2025-08-01",
"tenant": "acme-eu",
"tags": ["SRE","incident","N2"],
"access": ["role:sre","dept:ops"],
"permalink": "https://kb/acme/kb-2025-00142",
"hash": "sha256:…"
}Synchroniser le même schéma sur l’index vectoriel et le catalogue documentaire pour des filtres d’accès cohérents.
Métriques et tests
- Freshness (âge moyen), Coverage (répartition par tags/produits), Completeness (métadonnées obligatoires).
- Retrieval@k sur jeux “gold” (questions → passages attendus), faithfulness avec citations.
- Tableau de bord coûts (tokens in/out, latence p50/p95, cache hit-rate).
Ne mélange pas des versions contradictoires sans “version”/“effective_date” claires.
Contrôles essentiels
- PII scrubbers à l’ingestion (regex + NER) + journalisation masquée.
- RBAC jusqu’au retrieval (filtres par rôle/tenant/équipe).
- Chiffrement au repos (KMS) & en transit (TLS).
- Rétention différenciée : corpus, prompts, traces, mémoires.
- Lineage : qui a vu quoi, quand (auditable).
Éviter l’export massif non contrôlé ; préférez des vues filtrées côté serveur.
Connecteurs de base (lecture seule)
- Fichiers : S3, Azure Blob, GCS, SMB/SharePoint.
- Wikis : Confluence, Notion, GitBook, MediaWiki.
- Code : GitHub/GitLab/Bitbucket (blobs + AST pour résumés).
- Tickets : Jira, ServiceNow, Zendesk.
- Emails : IMAP, Gmail API.
- Bases : Postgres, MySQL, MSSQL, BigQuery, Snowflake.
- Logs : OpenSearch, Loki, Datadog, Elastic.
- KG : Neo4j, Neptune, RDF/SPARQL.
- APIs : REST/GraphQL (schémas, throttling, cache TTL).
Uniformiser les sorties de connecteurs → contrat DocumentItem (content + metadata).
Python — Contrat DocumentItem & chunking
from dataclasses import dataclass
from typing import Dict, List
@dataclass
class DocumentItem:
doc_id: str
content: str
metadata: Dict[str, str]
def chunk(text: str, max_tokens=900, overlap=120) -> List[str]:
# pseudo: coupe par tokens ou par titres si Markdown/HTML
return split_by_headings_or_tokens(text, max_tokens, overlap)Python — Recherche hybride (RRF + re-ranking)
def hybrid_search(q: str, k=8):
bm = bm25_search(q, top=50)
ve = vector_search(q, top=50)
fused = rrf_fusion([bm, ve])
reranked = cross_encoder_rerank(q, fused)
return reranked[:k]SQL — Vue matérialisée (lexical)
CREATE MATERIALIZED VIEW kb_docs AS
SELECT
doc_id,
title,
to_tsvector('french', coalesce(title,'') || ' ' || coalesce(content,'')) AS tsv,
metadata->>'lang' AS lang,
metadata->>'tenant' AS tenant,
metadata->>'version' AS version,
metadata->>'permalink' AS permalink
FROM raw_docs;Contrat “DocumentItem” (JSON Schema)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "DocumentItem",
"type": "object",
"required": ["doc_id","content","metadata"],
"properties": {
"doc_id": {"type":"string"},
"content": {"type":"string"},
"metadata": {
"type":"object",
"required": ["source","lang","permalink"],
"properties": {
"source":{"type":"string"},
"title":{"type":"string"},
"lang":{"type":"string"},
"tenant":{"type":"string"},
"version":{"type":"string"},
"tags":{"type":"array","items":{"type":"string"}},
"access":{"type":"array","items":{"type":"string"}},
"permalink":{"type":"string"}
}
}
}
}Valider ce schéma avant indexation et rejeter tout item incomplet.
Bascule vers un pipeline de contexte (6 étapes)
- Cartographier les sources, propriétaires, DPO, droits et versions.
- Établir le contrat DocumentItem + schéma des métadonnées.
- Construire l’ingestion (PII scrub, chunking, normalisation, catalogue).
- Indexer en hybride (BM25+vecteur) + re-ranking + filtres RBAC.
- Observer (retrieval@k, freshness, coût, cache) + tests gold.
- Industrialiser (policies, retention, lineage, budgets tokens).
Commencer par un périmètre réduit mais critique (ex. support N2 + wikis + runbooks), puis étendre.
Context Engineering · Sources de Contexte
