Secure RAG Assistant
Un système de Retrieval-Augmented Generation de niveau production, avec contrôle d'accès aux documents par rôle — conçu comme preuve de concept pour la gestion de connaissances interne en entreprise.
Ce que fait l'application
Les utilisateurs s'authentifient via SSO (Keycloak / OIDC) et interrogent une base de connaissances documentaire à travers une interface conversationnelle. Le système applique les politiques d'accès aux données au niveau de la récupération : un employé ne reçoit que des réponses ancrées dans les documents que son rôle l'autorise à consulter.
Points techniques clés
Récupération RAG filtrée par rôle
Les rôles JWT sont mappés à une hiérarchie de privilèges au moment de la requête, via le filtrage des métadonnées pgvector — la politique d'accès est appliquée à la couche de recherche vectorielle, pas seulement dans l'interface.
Garde-fou de prompt multi-couches
Pré-filtrage regex / blocklist à coût nul, détection de toxicité via Amazon Comprehend, et un « canary word » qui repère les tentatives d'exfiltration du prompt système.
Pipeline LLM en deux phases
Passe « tool-first » (MCP / SSE) avec repli sur le RAG ; l'expansion multi-requêtes (4 variantes) améliore le rappel de la recherche.
Double mode d'ingestion
Endpoint REST pour le développement local ; consommateur SQS en production (notifications d'événements S3 → pipeline asynchrone chunk-embed-store).
Architecture Maven multi-modules
Bibliothèque commune partagée (embeddings, modèle de rôles) consommée par des services Spring Boot indépendants.
Architecture
┌──────────────────────────────────────────────────────────────┐
│ USER BROWSER │
│ Angular 21 SPA (:4200) │
│ Keycloak PKCE login → Bearer token on each request │
└───────────────────────────────┬──────────────────────────────┘
│ HTTPS + JWT
▼
┌──────────────────────────────────────────────────────────────┐
│ BACKEND (:8080) │
│ │
│ POST /ask ─► PromptGuardService │
│ [1] regex injection patterns (zero cost) │
│ [2] keyword blocklist (zero cost) │
│ [3] Comprehend DetectToxicContent │
│ │ │
│ ▼ │
│ ChatService │
│ ┌ Phase 1: Tool-first ───────────────────┐ │
│ │ ChatClient + MCP tools (no RAG) │ │
│ │ → if LLM answers: return ✓ │ │
│ └ Phase 2: RAG fallback ─────────────────┘ │
│ MultiQueryExpander (4 query variants) │
│ RoleFilterDocumentRetriever │
│ JWT role → RoleHierarchy → pgvector │
│ ContextualQueryAugmenter │
│ CanaryWordAdvisor (leak detection) [4] │
│ EvaluationService (relevancy score) │
│ │
│ POST /upload ─► DocumentUploadService ─► S3 │
│ GET /history ─► SPRING_AI_CHAT_MEMORY + RAG_SOURCES (PG) │
└──────┬─────────────────────────┬─────────────────────────────┘
│ SSE (MCP) │ pgvector query / JDBC
▼ ▼
┌──────────────┐ ┌────────────────────────────┐
│ TOOLS (:8082)│ │ PostgreSQL + pgvector │
│ DocumentAccess │ (:5433) │
│ Tool → S3 │ │ • vector_store │
└──────────────┘ │ • SPRING_AI_CHAT_MEMORY │
│ • RAG_SOURCES │
└────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ INGESTION SERVICE (:8081) │
│ local profile POST /ingest (multipart) ───────────────┐ │
│ aws profile SQS ◄─ S3 event notification │ │
│ HeadObject (metadata) + GetObject │ │
│ TikaDocumentReader → TokenTextSplitter │ │
│ VectorStore.accept() ─► Titan V2 ─► pgvector│
└──────────────────────────────────────────────────────────────┘
┌───────────────┐ ┌────────────────────────────────┐
│ KEYCLOAK │ │ AWS BEDROCK (eu-west-3) │
│ (:8180) │ │ • claude-haiku-4-5 (chat) │
│ realm: │ │ • titan-embed-text-v2 │
│ rag-assistant │ │ (1024-dim embeddings) │
└───────────────┘ └────────────────────────────────┘
┌──────────────────────────────────────────────┐
│ OBSERVABILITY │
│ Prometheus (:9090) ◄─ Spring Boot actuators │
│ Grafana (:3000) ◄─ Prometheus │
│ Jaeger (:16686) ◄─ OTLP traces │
└──────────────────────────────────────────────┘L'idée architecturale clé est la frontière de confiance au niveau de la récupération : la sécurité est appliquée à l'intérieur de RoleFilterDocumentRetriever — le LLM ne reçoit jamais de documents que l'utilisateur n'est pas autorisé à voir, quelle que soit sa question.
Stack technique
Backend
- Spring Boot 3.5
- Spring AI 1.1
- PostgreSQL + pgvector
- AWS Bedrock — Claude Haiku
- Titan Embeddings V2
- Amazon Comprehend
- S3 · SQS
Frontend
- Angular 21
- TypeScript (strict)
- Signals-first architecture
- Keycloak JS — PKCE / OIDC
Infrastructure
- Docker Compose
- Terraform (IaC)
- AWS ECS Fargate
- Aurora Serverless
- Keycloak 26
Observabilité
- Prometheus
- Grafana
- Jaeger
- OpenTelemetry tracing
Un projet similaire en tête ?
Discutons de la façon dont je peux concevoir et industrialiser des solutions GenAI sécurisées pour votre organisation.