E-01 Classification des données
Brique E: Données, RAG, contexte, mémoire. Version anglaise: E-01-data-classification
1. Rôle et responsabilités
Attribue un niveau de classification (public, internal, confidential, restricted, secret) aux textes et médias à partir de Presidio et de règles métier.
- Détection d'entités (PII, financier, santé)
- Règles métier par tenant (regex, dictionnaires)
- Retour de la classification maximale et des findings
2. Position dans l'architecture et interactions
- Appelants: DLP Gateway, ingestion RAG, Media (F), Context Manager.
- Chemin d'exécution: Synchrone.
- Toute interaction passe par l'API Control Plane v1 (
/v1) derrière la passerelle API (D-14).
3. Composant open source et partie développée
- Open source: Microsoft Presidio
- Développé: Moteur de règles et mapping niveau.
- Intégration externe via un adaptateur
eai/integrations/<system>.pyavec repli in-process lorsque l'URL n'est pas configurée.
4. Modèle de données
Tables (schéma eai, RLS tenant_id):
eai.dlp_rules
Colonnes communes : id uuid, tenant_id uuid NOT NULL, created_at, updated_at ; politique RLS current_setting('app.tenant_id', true)::uuid.
5. Contrat
- Contrat appliqué: context-contract
- Schéma JSON:
contracts/v1/context-contract.schema.json - Champs clés:
classification_max, segments[].classification - Validation :
POST /v1/contracts/{name}/validate; application d'un manifeste :POST /v1/manifests/apply.
6. Endpoints API
POST /v1/privacy/classify
Requête POST /v1/privacy/classify:
{
"text": "Client Jean Dupont, IBAN FR76 3000 6000 0112 3456 7890 189"
}
Réponse:
{
"classification": "confidential",
"findings": [
{
"type": "PERSON",
"start": 7,
"end": 18,
"score": 0.85
},
{
"type": "IBAN_CODE",
"start": 25,
"end": 58,
"score": 1.0
}
]
}
7. Exemples SDK
Python:
from enterprise_ai import EnterpriseAI
client = EnterpriseAI(base_url="<control-plane-url>", api_key="eai_xxx_secret")
res = client.privacy.classify(text="...")
TypeScript:
import { EnterpriseAI } from "@enterprise-ai/sdk";
const client = new EnterpriseAI({ baseUrl: "<control-plane-url>", apiKey: process.env.EAI_API_KEY });
const res = await client.privacy.classify({ text: "..." });
Java:
EnterpriseAIClient client = EnterpriseAIClient.builder()
.baseUrl("<control-plane-url>")
.apiKey(System.getenv("EAI_API_KEY"))
.build();
JsonNode res = client.privacy().classify(Map.of("text", "Contact jane.doe@example.com", "language", "en"));
Go:
c, _ := eai.NewClient(eai.WithBaseURL("<control-plane-url>"), eai.WithAPIKey(os.Getenv("EAI_API_KEY")))
res, _ := c.Privacy.Classify(ctx, map[string]any{"text": "..."})
8. Configuration
- Variables d'environnement:
EAI_PRESIDIO_URL,EAI_DATABASE_URL - Clés Helm:
controlPlane.config.EAI_PRESIDIO_URL
9. Contrôles de sécurité
- Le texte analysé n'est pas journalisé
- Toutes les requêtes portent le tenant issu du credential ; RLS PostgreSQL
- Chaque mutation et décision de politique écrit un événement d'audit chaîné
10. Observabilité
- Métriques Prometheus:
eai_classify_total{level},eai_classify_latency_seconds - Traces: spans OpenTelemetry avec conventions sémantiques GenAI (
gen_ai.operation.name,gen_ai.agent.id,gen_ai.tool.name), attributseai.tenant_id,eai.run_id, propagationtraceparent. - Actions d'audit:
11. Unités FinOps
- Appels d'analyse, caractères traités.
- Émis comme Usage Event (
POST /v1/finops/usage) avec tenant, projet, agent et run.
12. Modes de défaillance et résilience
- Presidio indisponible : repli règles regex intégrées, niveau au minimum confidential
- Erreurs normalisées (enveloppe error, message_i18n en/fr)
13. Adoption autonome (client d'un client)
- enterprise_ai.privacy + Control Plane (+ Presidio).
- SDK:
enterprise_ai.privacy / dlp / knowledge_bases / memory / retention / lineage - Déploiement minimal : chart Helm avec
controlPlane.enabled=trueet PostgreSQL ; les composants externes désactivés utilisent leur repli in-process.
14. Tests d'acceptation
- IBAN détecté -> confidential
- Texte neutre -> public ou internal
- Accès inter-tenant refusé
- Erreur renvoyée en fr avec Accept-Language: fr
RAG gouverné (kit L4)
Les fragments restricted et secret sont scellés au repos (enveloppe Tink) et ne sont lus qu'au moment de la construction du contexte, après les filtres ACL et habilitation.