
Mesurer et combler l'écart d'intégrité texte–vecteur dans le RAG hors ligne : loi des marges, audits de bases de données vectorielles et vérification au niveau du code.
Code, données et résultats pour l'article Signed but Steerable: Measuring and Closing the Text-Vector Integrity Gap in Offline Retrieval-Augmented Generation (G. Feretzakis, A. Papaspyridis, securagen.ai).
Archivé sur Zenodo : 10.5281/zenodo.23945569 (toutes les versions ; version v1.0.2, citée dans l'article : 10.5281/zenodo.23948839). L'identifiant arXiv de l'article sera ajouté dès qu'il sera disponible.
ragtrust/ bibliothèque partagée, incluant codeverify.py, le vérificateur de référence au niveau du code utilisé pour chaque
résultat de vérification de code (ambiguïté tranchée uniquement à partir du recalcul du vérificateur ; acceptation
par voisinage uniquement ; canonicalisation).desktop/ expériences exécutées sur le poste de travail : scoring d'abstention (E1) et sa vérification MS MARCO, l'attaque de
désynchronisation de vecteurs et la loi de marge (E7), les marges BEIR, l'exposition des bases de données vectorielles, la démonstration
FAISS, la vérification au niveau du code et le déterminisme des pipelines en virgule flottante.device/ expériences exécutées sur le CPU du Raspberry Pi 5 : élagage du contexte (E2), coût de la vérification à côté du
modèle de langage (E4), embedding côté appareil et fidélité INT8 (E5), l'attaque de bout en bout (E7) et les mises à jour de pack (E8).analysis/ analyses, les contrôles de précision et d'unités, et make_figures.py, qui régénère les figures.data/ le corpus dérivé de SQuAD, les fenêtres, les questions et les vecteurs ; results/ les sorties par expérience ;
tests/ tests unitaires ; remote/ utilitaires pour piloter le Pi depuis le poste de travail (adapter les noms d'hôtes).PROTOCOL.md hypothèses fixées avant la collecte des données et journal des écarts et analyses exploratoires.
Les numéros d'expérience suivent le protocole ; E3 et E6 ne font pas partie de cette version.pins.json révisions épinglées des modèles et des outils.python tests/test_codeverify.py.bash desktop/setup_desktop.sh ; figures : python analysis/make_figures.py.device/requirements_device.txt, et llama.cpp au commit indiqué dans pins.json.Sur le Raspberry Pi, après cp device/config.env.example device/config.env (adapter les chemins) et installation de
device/requirements_device.txt dans venv_device :
bash device/inner_generate.sh démarre llama-server et exécute k3_full (60 premières questions,
contrôle de reproductibilité), k5_ce3, k10_ce3, k10_ce5, k5_bi3, k5_ce3 avec le sélecteur INT8 en ligne, et les configurations
E7 ; la configuration de bout en bout CPU-INT8 seule : bash device/run_e7_cpu_int8.sh. Les variantes
k5_ce3w, k3_ce3 et k3_ce3w s'exécutent avec python device/e2_generate.py --config <name> pendant que llama-server
tourne (démarré comme dans device/inner_generate.sh). Une configuration est ignorée lorsque results/e2/status_<name>.json
existe ; déplacer ces fichiers pour régénérer les résultats publiés.python device/e4_contention.py ; E5 : python device/e5_reindex.py --backends ort-fp32,ort-int8 --batch 32 (la
taille de lot des résultats publiés : l'INT8 dynamique dépend du lot, et des lots de 64 donnent des vecteurs différents) ;
E8 : python device/e8_device_verify.py --vector-backend ort-fp32.remote/pi_sync.sh copie le dépôt vers le Pi et remote/pi_fetch.sh récupère les résultats.results/e7/margin_law_squad.json ; autres corpus et Fig. 1 : results/e7/beir_margins.json
et results/e7/margins/ ; exposition au seuil de référence CPU-INT8 : results/e7/cpu_int8_exposure.json ;
précision numérique et vérifications d'unités : results/e7/margin_precision_check.json ; calibration du seuil de référence
INT8 (quantile exact, fenêtres honnêtes en dessous, ré-encodage bit à bit au batch 32) :
results/e5/int8_calibration_check.json (analysis/e5_int8_calibration_check.py).results/e7/vecdb_quant.json ; audit FAISS et attaque exécutée : results/e7/faiss_integrity.json ;
budget résiduel : results/e7/guard_budget.json.results/e7/analysis.json (réponses correctes et refus) et results/e7/e2e_checks.json
(mêmes questions, budget angulaire, charge utile dans le contexte top-3).results/e2/decomposition.json ; coût à côté du modèle de langage (E4) : results/e4/.results/figures/fig_margin_law.pdf (Fig. 1) et results/figures/fig_vdb.pdf (Fig. 2), régénérées par
analysis/make_figures.py.results/e7/squad_question_vectors.npz
(analysis/margin_law_squad.py) et results/e7/proxy_vectors.npz (analysis/margin_law.py).results/e7/vecs/ (écrit par
desktop/beir_margins.py), results/e7/scale_*.npy (écrits par les scripts de vérification du code),
data/beir/ et artifacts/models/ (écrits par desktop/export_onnx.py).Certains scripts d'analyse chargent des caches qu'ils ont eux-mêmes créés avec numpy.load(..., allow_pickle=True) ;
ne chargez de tels fichiers qu'à partir de vos propres exécutions, jamais depuis des sources non fiables.
Les modèles, jeux de données et leurs licences sont listés dans DATA_LICENSES.md. Veuillez également citer SQuAD 2.0 (Rajpurkar et al., 2018),
BEIR (Thakur et al., 2021), MS MARCO (Bajaj et al., 2016), BGE-M3 (Chen et al., 2024) et Sentence-BERT (Reimers et
Gurevych, 2019) lorsque vous utilisez les parties correspondantes.
LICENSE).Copyright 2026 securagen.ai P.C. MIT pour le code et nos résultats ; les données dérivées de SQuAD, les fichiers de résultats contenant du texte
SQuAD et les réponses générées restent sous CC BY-SA 4.0 ; voir LICENSE et DATA_LICENSES.md pour les détails et pour les conditions
des autres jeux de données et modèles.