Retour aux projets Projet · GenAI

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.

Enterprise PoC RAG / GenAI AWS Bedrock

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

1

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.

2

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.

3

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.

4

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).

5

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.