Aller au contenu principal

Protection des données du RAG

  • Isolation des tenants : RLS forcée sur kb_documents, kb_chunks, kb_quarantine_reviews ; une collection Qdrant par tenant.
  • ACL document et fragment vérifiées dans le magasin de vecteurs puis avant la construction du contexte.
  • Droit de la source : connecteur actif exigé à l'ingestion et à la requête (403 source_permission_denied).
  • Empoisonnement : quarantaine, revue par security_officer (responsable des données), auditée.
  • Chiffrement : texte des fragments restricted et secret en enveloppe Tink, rotation et ré-emballage.
  • Cache sensible : chiffré par Tink, clé liée au tenant, Redis jamais source de vérité.
  • Données de test bancaires : toutes fictives.

Chaînes Docling et PaddleOCR vérifiées (DATA-010, DATA-011)​

Installation (environnements virtuels séparés, versions épinglées, sources officielles uniquement) :

bash tools/rag/setup-docling.sh # /tmp/toolchains/docling-venv + /tmp/toolchains/docling-models
bash tools/rag/setup-paddleocr.sh # /tmp/toolchains/paddleocr-venv + /tmp/toolchains/paddleocr-models
  • Docling 2.145.0 (MIT), docling-core 2.105.0 (MIT), docling-ibm-models 4.0.4 (MIT), torch 2.9.1+cpu (BSD-3-Clause, index officiel https://download.pytorch.org/whl/cpu), python-docx 1.2.0 (MIT).
  • paddlepaddle 3.3.1 CPU (Apache-2.0), paddleocr 3.7.0 (Apache-2.0), paddlex 3.7.2 (Apache-2.0), depuis PyPI.
  • Les scripts écrivent models.sha256 (sha256 de chaque fichier de poids) et affichent la licence de chaque carte de modèle.

Poids de modèles et licences :

ModèleSource officielleFichiersha256Licence
docling-layout-heronHugging Face docling-project/docling-layout-heronmodel.safetensors00333a43451945aaf89db8ca9c0a17e75d1537c17db60fdb91aa95f4c7929e0cApache-2.0
docling-layout-heron-onnxHugging Face docling-project/docling-layout-heron-onnxmodel.onnx59c81a3a2923042d85034ffc487f8f47e4854117e879aef89b2b9f728fb4922aApache-2.0
TableFormer accurateHugging Face docling-project/docling-modelstableformer_accurate.safetensors2a7d6c924b3cd12fb99a09280ca9c33a89c5d60b93253617d2e088c1a40374d9CDLA-Permissive-2.0
TableFormer fastHugging Face docling-project/docling-modelstableformer_fast.safetensors3119563aab5a7c96fda4d621119b63fd8806272b86c30936d15507616422f718CDLA-Permissive-2.0
PP-OCRv5_mobile_detHugging Face PaddlePaddle/PP-OCRv5_mobile_detinference.pdiparamsafa1820cb16c1fd0dad589d0f8b389139061c1ef6d68019685fd07be997dda5bApache-2.0
PP-OCRv5_mobile_recHugging Face PaddlePaddle/PP-OCRv5_mobile_recinference.pdiparams2460da90875937c94db97eba74ae3d9e5d4c4c57c42f1f41531c09a26bcc771aApache-2.0

Workers HTTP (127.0.0.1 uniquement, port libre choisi par l'appelant) :

HF_HUB_OFFLINE=1 /tmp/toolchains/docling-venv/bin/python tools/rag/docling_worker.py --port PORT --models /tmp/toolchains/docling-models
PADDLE_PDX_CACHE_HOME=/tmp/toolchains/paddleocr-models /tmp/toolchains/paddleocr-venv/bin/python tools/rag/paddleocr_worker.py --port PORT

docling_worker.py reprend le sous-ensemble POST /v1/convert/source de Docling Serve 1.x (sources de type file, réponse document.md_content), OCR Docling désactivé (les scans vont à PaddleOCR, ocr_applied: false est renvoyé). paddleocr_worker.py reprend POST /ocr de PaddleX serving ; oneDNN est désactivé (enable_mkldnn=False) car paddlepaddle 3.3.1 CPU lève NotImplementedError (ConvertPirAttribute2RuntimeAttribute) sur ces modèles. L'adaptateur ajoute l'extension du type MIME au nom de fichier envoyé à Docling, qui choisit le format d'entrée par l'extension.

Preuve : services/control-plane/tests/test_rag_docling_ocr_real.py démarre les deux workers et vérifie, via eai.integrations.docling et eai.integrations.ocr (donc eai.security.egress), un PDF de recette (texte et tableau), un DOCX avec tableau (cellules exactes), l'ingestion par l'API puis la requête, le refus d'une destination hors politique d'egress et l'OCR d'une image de texte rendue par Pillow. Toolchain absente : échec explicite, jamais d'ignorance.

Cache sensible et détection d'embeddings aberrants (DATA-024, DATA-015)​

services/control-plane/tests/test_rag_kit_acceptance.py vérifie sur un vrai /usr/bin/redis-server (port libre) que l'entrée du cache RAG est un chiffré Tink (eaitink1:), qu'une entrée copiée sous la clé d'un autre tenant est lue comme une absence (le déballage d'une DEK d'un autre tenant lève EnvelopeError, jamais une erreur 500), et qu'une panne Redis retombe sur le magasin vectoriel sans contenu dans les journaux. Le même fichier met en quarantaine un document dont un chunk pointe à l'opposé du centroïde du document (outlier_embedding). Il couvre aussi DATA-019, DATA-020, DATA-022, DATA-023 et le scénario 7 (RAG avec ACL, citations autorisées, lignage source vers réponse).

Revue de la quarantaine RAG​

Un document suspect (injection, embedding aberrant, source non fiable) est mis en quarantaine : ses fragments ne sont plus cherchables. La revue est réservée aux rôles tenant_admin, security_officer et data_steward (REVIEW_ROLES de eai.domains.knowledge), qui doivent aussi avoir la relation viewer sur la base de connaissances.

OpérationRouteEffet
Lister la quarantaineGET /v1/knowledge-bases/{kb_id}/quarantineDocuments en attente de revue
DéciderPOST /v1/knowledge-bases/{kb_id}/documents/{doc_id}/reviewrelease : fragments de nouveau cherchables ; reject : document rejeté ; décision auditée

Avant l'ingestion : sécurité des fichiers​

Aucun octet n'atteint Docling, l'OCR ou le RAG sans une analyse libérée par ClamAV et YARA-X : voir file-security-pipeline.md.

Pages liées​