feat(control-pipeline): BSI QUAIDAL Clean-Room ingestion (AI Act Art. 10)
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-consent (push) Successful in 40s
CI / test-python-voice (push) Successful in 36s
CI / test-bqas (push) Successful in 33s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-consent (push) Successful in 40s
CI / test-python-voice (push) Successful in 36s
CI / test-bqas (push) Successful in 33s
Clean-Room derivation of 195 controls from BSI QUAIDAL (10 criteria + 15 building blocks + 30 measures + 140 metrics) for EU AI Act Art. 10 training-data quality compliance. - ingest_bsi_quaidal.py parses YAML frontmatter into a structural index (no protected prose stored on disk). - derive_quaidal_mcs.py rewrites each entry via local LLM (qwen3.5:35b-a3b) with a hard 4-gram plagiarism gate < 20%; achieved mean overlap 0.5%. - Migration 011 adds compliance.derived_controls table with full source provenance (framework, section, url, commit SHA, license note). - apply_quaidal_to_db.py UPSERTs YAML into DB. - Source repo (legal-sources/bsi-quaidal/) gitignored. Same pattern as IACE module DIN-reference handling: name the norm and section, never quote. Backed by BSI license clarification 2026-05: § 5 UrhG anwendbar, share:true im Frontmatter; Clean-Room derivation is the safe path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -41,6 +41,11 @@ backups/*.backup
|
|||||||
*.mp3
|
*.mp3
|
||||||
*.wav
|
*.wav
|
||||||
|
|
||||||
|
# Cloned external legal-source repos (gitignored; pulled fresh at ingest time)
|
||||||
|
legal-sources/bsi-quaidal/
|
||||||
|
legal-sources/bsi-quaidal-src/
|
||||||
|
legal-sources/bsi-grundschutz-plus/
|
||||||
|
|
||||||
# Compiled binaries
|
# Compiled binaries
|
||||||
billing-service/billing-service
|
billing-service/billing-service
|
||||||
consent-service/server
|
consent-service/server
|
||||||
|
|||||||
@@ -0,0 +1,430 @@
|
|||||||
|
source: Derived from BSI QUAIDAL (Clean-Room)
|
||||||
|
source_url: https://github.com/BSI-Bund/QUAIDAL
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
plagiarism_limit_4gram: 0.2
|
||||||
|
generated_by_model: qwen3.5:35b-a3b
|
||||||
|
controls:
|
||||||
|
- id: AC-AI-DATA-QB-01-syntaktische-genauigkeit
|
||||||
|
canonical_name: Syntaktische Genauigkeit
|
||||||
|
description: Das KI-Trainingsset muss syntaktisch konsistent sein, wobei alle definierten
|
||||||
|
Grammatik- und Strukturregeln strikt einzuhalten sind. Eine fehlerfreie Datenstruktur
|
||||||
|
ist zwingend erforderlich, um eine korrekte Verarbeitung durch Parser oder Sprachmodelle
|
||||||
|
zu gewährleisten. Die Validierung der formalen Korrektheit ist vor jedem Training
|
||||||
|
durchzuführen, um Verarbeitungsfehler auszuschließen.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-01
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
- MA-04
|
||||||
|
- MA-05
|
||||||
|
- MA-27
|
||||||
|
external_refs:
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-01
|
||||||
|
title_original_de: QB-01 Syntaktische Genauigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-01_Syntactic%20Accuracy.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-02-semantische-genauigkeit
|
||||||
|
canonical_name: Semantische Genauigkeit
|
||||||
|
description: Die KI-Trainingsdaten müssen inhaltlich korrekt sein, sodass die zugewiesenen
|
||||||
|
Werte dem tatsächlichen Sachverhalt entsprechen und nicht nur formal valide sind.
|
||||||
|
Es ist sicherzustellen, dass semantische Zuordnungen keine logischen Fehler aufweisen,
|
||||||
|
wie beispielsweise die Klassifizierung von Tieren als technische Geräte. Eine
|
||||||
|
Prüfung muss verifizieren, dass die Bedeutung der Datenpunkte im Kontext der Anwendung
|
||||||
|
eindeutig und fehlerfrei interpretiert werden kann.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-05
|
||||||
|
- MA-06
|
||||||
|
- MA-07
|
||||||
|
- MA-27
|
||||||
|
external_refs:
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-02
|
||||||
|
title_original_de: QB-02 Semantische Genauigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-02_Semantic%20Accuracy.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-03-vielfalt
|
||||||
|
canonical_name: Vielfalt
|
||||||
|
description: Das KI-Trainingsdatenset muss eine maximale Varianz in den relevanten
|
||||||
|
Merkmalen aufweisen, um die Heterogenität der Eingabewerte zu gewährleisten. Es
|
||||||
|
ist sicherzustellen, dass das Spektrum der enthaltenen Werte breit genug ist,
|
||||||
|
um das Variationspotential der Zielgruppe vollständig abzudecken. Eine Prüfung
|
||||||
|
der Datenverteilung ist vor dem Training durchzuführen, um eine unzureichende
|
||||||
|
Diversität auszuschließen.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-08
|
||||||
|
- MA-09
|
||||||
|
- MA-10
|
||||||
|
- MA-12
|
||||||
|
- MA-27
|
||||||
|
- MA-28
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-03
|
||||||
|
title_original_de: QB-03 Vielfalt
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-03_Diversity.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0204
|
||||||
|
- id: AC-AI-DATA-QB-04-ausgewogenheit
|
||||||
|
canonical_name: Ausgewogenheit
|
||||||
|
description: Der Trainingsdatensatz ist so zu konzipieren, dass die Verteilung aller
|
||||||
|
relevanten Klassen proportional zur Zielrealität erfolgt, um eine einseitige Dominanz
|
||||||
|
einzelner Kategorien zu vermeiden. Es ist sicherzustellen, dass keine Gruppe systematisch
|
||||||
|
unter- oder überrepräsentiert wird, um Verzerrungen im Modellverhalten auszuschließen.
|
||||||
|
Die Datenqualität muss durch eine ausgewogene Varianz aller Merkmale gewährleistet
|
||||||
|
werden, um Overfitting und Bias wirksam zu verhindern.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-08
|
||||||
|
- MA-09
|
||||||
|
- MA-10
|
||||||
|
- MA-12
|
||||||
|
- MA-14
|
||||||
|
- MA-27
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-04
|
||||||
|
title_original_de: QB-04 Ausgewogenheit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-04_Balance.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0182
|
||||||
|
- id: AC-AI-DATA-QB-05-umfang
|
||||||
|
canonical_name: Umfang
|
||||||
|
description: Der Trainingsdatensatz muss eine quantitativ ausreichende Anzahl an
|
||||||
|
Datenpunkten aufweisen, um statistisch signifikante Muster zu erfassen und das
|
||||||
|
Risiko von Overfitting zu minimieren. Die Größe der Datenbasis ist so zu dimensionieren,
|
||||||
|
dass sie eine belastbare Analyse der zugrundeliegenden Verteilungen ermöglicht
|
||||||
|
und die Generalisierungsfähigkeit des Modells stabilisiert. Eine Prüfung ist durchzuführen,
|
||||||
|
um sicherzustellen, dass der reine quantitative Umfang die notwendige Basis für
|
||||||
|
eine robuste Modellbildung bildet.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-11
|
||||||
|
- MA-12
|
||||||
|
- MA-15
|
||||||
|
- MA-27
|
||||||
|
external_refs:
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-05
|
||||||
|
title_original_de: QB-05 Umfang
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-05_Size.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0161
|
||||||
|
- id: AC-AI-DATA-QB-06-verzerrung
|
||||||
|
canonical_name: Verzerrung
|
||||||
|
description: Das KI-System muss vor dem produktiven Einsatz auf systematische Verzerrungen
|
||||||
|
in den Trainingsdaten und den daraus resultierenden Vorhersagen untersucht werden.
|
||||||
|
Es ist sicherzustellen, dass latente Ungleichbehandlungen quantitativ erfasst
|
||||||
|
und dokumentiert werden, um eine transparente Bewertung der Fairness zu ermöglichen.
|
||||||
|
Die Prüfung umfasst die Identifikation von Abweichungen, die auf unausgewogene
|
||||||
|
Datenverteilungen zurückzuführen sind, bevor das Modell für reale Anwendungen
|
||||||
|
freigegeben wird.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-01
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
- MA-04
|
||||||
|
- MA-06
|
||||||
|
- MA-07
|
||||||
|
- MA-08
|
||||||
|
- MA-09
|
||||||
|
- MA-10
|
||||||
|
- MA-11
|
||||||
|
- MA-12
|
||||||
|
- MA-13
|
||||||
|
- MA-14
|
||||||
|
- MA-15
|
||||||
|
- MA-16
|
||||||
|
- MA-17
|
||||||
|
- MA-18
|
||||||
|
- MA-20
|
||||||
|
- MA-23
|
||||||
|
- MA-24
|
||||||
|
- MA-27
|
||||||
|
- MA-28
|
||||||
|
- QB-15
|
||||||
|
- QM-11
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-06
|
||||||
|
title_original_de: QB-06 Verzerrung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-06_Bias-Detektion.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-07-gesamtheit
|
||||||
|
canonical_name: Gesamtheit
|
||||||
|
description: Das Trainingsdatenset muss sämtliche für das spezifische Anwendungsszenario
|
||||||
|
definierten Attribute und Entitätsinstanzen vollständig enthalten, um die Anforderung
|
||||||
|
der Gesamtheit zu erfüllen. Diese Vollständigkeit ist auf der Ebene des gesamten
|
||||||
|
Datensatzes, einzelner Spalten oder einzelner Datenpunkte nachweisbar zu prüfen.
|
||||||
|
Die Bewertung der Datenqualität erfolgt stets kontextbezogen unter Berücksichtigung
|
||||||
|
der jeweiligen Nutzungszwecke.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-12
|
||||||
|
- MA-13
|
||||||
|
- MA-27
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-07
|
||||||
|
title_original_de: QB-07 Gesamtheit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-07_Totality.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-08-konsistenzsicherung
|
||||||
|
canonical_name: Konsistenzsicherung
|
||||||
|
description: Die Konsistenz der KI-Trainingsdaten ist durch standardisierte Datentypen
|
||||||
|
und formatierte Attribute über den gesamten Lebenszyklus sicherzustellen. Automatisierte
|
||||||
|
Prüfmechanismen müssen Abweichungen in den Datenwerten sowie zeitlichen Verläufen
|
||||||
|
frühzeitig identifizieren, um nachvollziehbare Transformations- oder Imputationsmaßnahmen
|
||||||
|
einzuleiten. Eine einheitliche Datenstruktur ist zwingend erforderlich, um die
|
||||||
|
Integrität der Trainingsbasis für valide Modellentscheidungen zu gewährleisten.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-01
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-08
|
||||||
|
title_original_de: QB-08 Konsistenzsicherung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-08_ConsistencyAssurance.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-09-quellenmanagement
|
||||||
|
canonical_name: Quellenmanagement
|
||||||
|
description: Die Organisation muss einen durchgängigen Mechanismus implementieren,
|
||||||
|
der die Herkunft und den Verarbeitungsweg jeder Trainingsdaten-Einheit lückenlos
|
||||||
|
dokumentiert. Es ist sicherzustellen, dass jeder Datenpunkt mit seinem Ursprung
|
||||||
|
sowie allen nachfolgenden Transformationsschritten verknüpft bleibt, um die Integrität
|
||||||
|
der KI-Datenbasis zu gewährleisten. Zusätzlich sind alle Zugriffe und Modifikationen
|
||||||
|
in einem unveränderlichen Protokoll chronologisch festzuhalten, um einen vollständigen
|
||||||
|
Audit-Trail für Compliance-Prüfungen zu schaffen.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-18
|
||||||
|
- MA-19
|
||||||
|
- MA-20
|
||||||
|
- MA-22
|
||||||
|
external_refs:
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
- framework: AI Act
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-09
|
||||||
|
title_original_de: QB-09 Quellenmanagement
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-09_Sourcemanagement.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0167
|
||||||
|
- id: AC-AI-DATA-QB-10-datenpruefung
|
||||||
|
canonical_name: _Datenprüfung
|
||||||
|
description: Vor der Initialisierung des Trainingsprozesses ist eine systematische
|
||||||
|
Validierung der Eingangsdaten auf Vollständigkeit, Konsistenz und Integrität durchzuführen.
|
||||||
|
Dabei sind Unregelmäßigkeiten wie fehlende Werte, formatinkonsistenzen oder statistische
|
||||||
|
Ausreißer zu identifizieren und zu bereinigen. Das System muss sicherstellen,
|
||||||
|
dass keine verzerrten oder fehlerhaften Datensätze das Modelltraining beeinträchtigen
|
||||||
|
und die Datenqualität den definierten Qualitätsstandards entspricht.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-05
|
||||||
|
- MA-20
|
||||||
|
- MA-26
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-10
|
||||||
|
title_original_de: QB-10_Datenprüfung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-10_DataChecks.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0204
|
||||||
|
- id: AC-AI-DATA-QB-11-prozesse
|
||||||
|
canonical_name: Prozesse
|
||||||
|
description: Es ist sicherzustellen, dass jeder Schritt der Datenvorbereitung und
|
||||||
|
-verarbeitung für KI-Trainingszwecke lückenlos protokolliert wird, um die vollständige
|
||||||
|
Nachvollziehbarkeit der Datenherkunft und aller Transformationen zu gewährleisten.
|
||||||
|
Diese Dokumentation muss so strukturiert sein, dass sie eine valide Reproduzierbarkeit
|
||||||
|
der Modelle sowie eine fundierte Qualitätssicherung der zugrundeliegenden Datensätze
|
||||||
|
ermöglicht. Durch die Erfassung aller Änderungsereignisse wird die Integrität
|
||||||
|
der Trainingsdaten über den gesamten Lebenszyklus hinweg verifiziert.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-18
|
||||||
|
- MA-21
|
||||||
|
external_refs:
|
||||||
|
- framework: BSI Grundschutz
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 23894
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 42001
|
||||||
|
citation: null
|
||||||
|
- framework: AI Act
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-11
|
||||||
|
title_original_de: QB-11 Prozesse
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-11_Processes.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-12-merkmalsentwicklung
|
||||||
|
canonical_name: Merkmalsentwicklung
|
||||||
|
description: Die Erstellung und Auswahl von Eingangsmerkmalen für KI-Modelle ist
|
||||||
|
so zu gestalten, dass sie signifikante Korrelationen zur Zielgröße aufweisen und
|
||||||
|
redundante Informationen eliminieren. Es ist sicherzustellen, dass die transformierten
|
||||||
|
Daten generalisierbar sind und eine hohe Informationsdichte für neue, unbekannte
|
||||||
|
Datensätze bieten. Eine Validierung muss nachweisen, dass die abgeleiteten Merkmale
|
||||||
|
die Interpretierbarkeit des Modells unterstützen und keine unnötige Komplexität
|
||||||
|
verursachen.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-01
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
- MA-06
|
||||||
|
- MA-12
|
||||||
|
- MA-14
|
||||||
|
- MA-17
|
||||||
|
- MA-23
|
||||||
|
- MA-24
|
||||||
|
- MA-27
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-12
|
||||||
|
title_original_de: QB-12 Merkmalsentwicklung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-12_FeatureEngineering.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-13-datenvorbereitung
|
||||||
|
canonical_name: Datenvorbereitung
|
||||||
|
description: Vor der Initialisierung des Trainingsprozesses sind alle Rohdaten durch
|
||||||
|
definierte Transformationen in eine qualitätsgeprüfte und für das Modell verarbeitbare
|
||||||
|
Struktur zu überführen. Es ist sicherzustellen, dass jede angewandte Datenaufbereitung
|
||||||
|
die Integrität der Trainingsmenge gewährleistet und keine nicht validierten Artefakte
|
||||||
|
in das Lernsystem einfließen. Die Durchführbarkeit dieser Schritte ist vor dem
|
||||||
|
Start der Modellkonvergenz durch systematische Prüfverfahren nachzuweisen.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
- MA-04
|
||||||
|
- MA-13
|
||||||
|
- MA-14
|
||||||
|
- MA-16
|
||||||
|
- MA-17
|
||||||
|
- MA-23
|
||||||
|
- MA-24
|
||||||
|
- MA-25
|
||||||
|
- MA-27
|
||||||
|
- MA-29
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-13
|
||||||
|
title_original_de: QB-13 Datenvorbereitung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-13_DataPreparation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-14-expertanalysis
|
||||||
|
canonical_name: _Expertanalysis
|
||||||
|
description: Die Qualität der KI-Trainingsdaten ist durch eine unabhängige, manuelle
|
||||||
|
Begutachtung durch qualifiziertes Fachpersonal zu validieren. Dabei sind mehrere
|
||||||
|
Prüfer eigenständig einzusetzen, um subjektive Verzerrungen und Gruppenkonformitätseffekte
|
||||||
|
bei der Bewertung auszuschließen. Die Ergebnisse dieser fachlichen Analyse müssen
|
||||||
|
anonymisiert zusammengeführt werden, um eine objektive Beurteilung der Datensatzqualität
|
||||||
|
zu gewährleisten.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-06
|
||||||
|
- MA-10
|
||||||
|
- MA-14
|
||||||
|
- MA-15
|
||||||
|
- MA-21
|
||||||
|
- MA-22
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-14
|
||||||
|
title_original_de: QB-14_Expertanalysis
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-14_Expertanalysis.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: AC-AI-DATA-QB-15-bias-mitigation
|
||||||
|
canonical_name: Bias-Mitigation
|
||||||
|
description: Das System muss technische Mechanismen implementieren, um systematische
|
||||||
|
Verzerrungen in den Trainingsdaten oder während des Lernprozesses zu identifizieren
|
||||||
|
und zu kompensieren. Diese Maßnahmen sind unabhängig vom Entwicklungsstadium anzuwenden,
|
||||||
|
wobei Datenanpassungen vor dem Training, Regularisierungsverfahren während des
|
||||||
|
Lernens oder Korrekturen der Ausgabeergebnisse nach dem Training möglich sind.
|
||||||
|
Eine Prüfung der Fairness-Kriterien ist vor der Freigabe des Modells durchzuführen,
|
||||||
|
um sicherzustellen, dass keine diskriminierenden Muster in den Ergebnissen verbleiben.
|
||||||
|
kind: building_block
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-30
|
||||||
|
- QM-57
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QB-15
|
||||||
|
title_original_de: QB-15 Bias-Mitigation
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-15_Bias-Mitigation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
source: Derived from BSI QUAIDAL (Clean-Room)
|
||||||
|
source_url: https://github.com/BSI-Bund/QUAIDAL
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
plagiarism_limit_4gram: 0.2
|
||||||
|
generated_by_model: qwen3.5:35b-a3b
|
||||||
|
controls:
|
||||||
|
- id: MC-AI-DATA-QKB-01-repraesentativitaet
|
||||||
|
canonical_name: Repräsentativität
|
||||||
|
description: Der Trainingsdatensatz muss die statistische Verteilung der Zielpopulation
|
||||||
|
exakt abbilden, um systematische Verzerrungen im Modell zu vermeiden. Es ist sicherzustellen,
|
||||||
|
dass alle relevanten Merkmalsausprägungen in ausreichender Häufigkeit und ohne
|
||||||
|
Über- oder Unterrepräsentation vorliegen. Die Datenmenge ist so zu dimensionieren,
|
||||||
|
dass eine robuste Generalisierungsfähigkeit für alle Subgruppen der Gesamtpopulation
|
||||||
|
gewährleistet wird. Eine Prüfung auf Stichprobenqualität ist vor dem Training
|
||||||
|
durchzuführen.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-03
|
||||||
|
- QB-04
|
||||||
|
- QB-05
|
||||||
|
- QB-06
|
||||||
|
- QB-15
|
||||||
|
external_refs:
|
||||||
|
- framework: AI Act
|
||||||
|
citation: Artikel 10
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-01
|
||||||
|
title_original_de: QKB-01 Repräsentativität
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-01_Representativity.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-02-vollstaendigkeit
|
||||||
|
canonical_name: Vollständigkeit
|
||||||
|
description: Der Datensatz muss sämtliche für das spezifische KI-Modell erwarteten
|
||||||
|
Attribute und Merkmalsausprägungen lückenlos beinhalten. Es ist sicherzustellen,
|
||||||
|
dass keine Entitätsinstanzen fehlen und alle definierten Merkmale mit Werten belegt
|
||||||
|
sind. Eine Prüfung auf fehlende Werte oder unvollständige Attributmengen ist vor
|
||||||
|
dem Training zwingend durchzuführen, um Verzerrungen zu vermeiden.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-07
|
||||||
|
- QB-09
|
||||||
|
external_refs:
|
||||||
|
- framework: AI Act
|
||||||
|
citation: Artikel 10
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 25024
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-02
|
||||||
|
title_original_de: QKB-02 Vollständigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-02_Completeness.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-03-genauigkeit
|
||||||
|
canonical_name: Genauigkeit
|
||||||
|
description: Die Integrität der KI-Trainingsdaten erfordert, dass jeder einzelne
|
||||||
|
Datenelementwert eine definierte numerische oder symbolische Übereinstimmung mit
|
||||||
|
dem referenzierten Sollwert aufweist. Es ist sicherzustellen, dass Abweichungen
|
||||||
|
innerhalb festgelegter Toleranzgrenzen bezüglich Rundung, Formatierung und Messauflösung
|
||||||
|
bleiben. Die Einhaltung dieser Spezifikation ist durch automatisierte Prüfverfahren
|
||||||
|
vor jedem Trainingslauf zu verifizieren.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-01
|
||||||
|
- QB-02
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-03
|
||||||
|
title_original_de: QKB-03 Genauigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-03_Accuracy.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-04-konsistenz
|
||||||
|
canonical_name: Konsistenz
|
||||||
|
description: Das System muss sicherstellen, dass alle Eingabedaten für das KI-Training
|
||||||
|
logisch kohärent und frei von internen Widersprüchen sind. Einheitliche Kodierungen
|
||||||
|
für Kategorien sowie konsistente Formatierungen sind zwingend erforderlich, um
|
||||||
|
eine fehlerfreie Generalisierung durch das Modell zu ermöglichen. Jede Abweichung
|
||||||
|
von den definierten Datenstandards ist durch automatische Prüfmechanismen zu identifizieren
|
||||||
|
und zu unterbinden.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-02
|
||||||
|
- QB-07
|
||||||
|
- QB-08
|
||||||
|
- QB-10
|
||||||
|
- QB-11
|
||||||
|
- QB-12
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-04
|
||||||
|
title_original_de: QKB-04 Konsistenz
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-04_Consistency.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-05-korrektheit
|
||||||
|
canonical_name: Korrektheit
|
||||||
|
description: Das KI-Modell muss ausschließlich auf Datensätzen trainiert werden,
|
||||||
|
die inhaltlich frei von Fehlern sind und den tatsächlichen Gegebenheiten oder
|
||||||
|
definierten Referenzstandards exakt entsprechen. Es ist sicherzustellen, dass
|
||||||
|
jede annotierte Information den als wahr geltenden Zustand im Anwendungskontext
|
||||||
|
fehlerfrei abbildet. Die Validierung der Trainingsdaten ist vor Beginn des Lernprozesses
|
||||||
|
durchzuführen, um sicherzustellen, dass keine inkorrekten Werte die Modellleistung
|
||||||
|
beeinträchtigen.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-09
|
||||||
|
- QB-10
|
||||||
|
- QB-12
|
||||||
|
- QB-14
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
- framework: AI Act
|
||||||
|
citation: Artikel 10
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-05
|
||||||
|
title_original_de: QKB-05 Korrektheit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-05_Correctness.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-06-einheitlichkeit
|
||||||
|
canonical_name: Einheitlichkeit
|
||||||
|
description: Die Konsistenz der KI-Trainingsdaten ist durch die strikte Einhaltung
|
||||||
|
definierter Syntaxregeln und Datenstrukturen sicherzustellen. Jedes Datenelement
|
||||||
|
muss vor der Verarbeitung gemäß festgelegten Standards formatiert werden, um strukturelle
|
||||||
|
Abweichungen auszuschließen. Eine Prüfung der formalen Einheitlichkeit ist unabhängig
|
||||||
|
von der inhaltlichen Richtigkeit der Werte durchzuführen.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-02
|
||||||
|
- QB-08
|
||||||
|
- QB-10
|
||||||
|
- QB-12
|
||||||
|
- QB-14
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-06
|
||||||
|
title_original_de: QKB-06 Einheitlichkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-06_Uniformity.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-07-gueltigkeit
|
||||||
|
canonical_name: Gültigkeit
|
||||||
|
description: Das System muss sicherstellen, dass die für das KI-Training verwendeten
|
||||||
|
Daten inhaltlich exakt das intendierte Zielkonstrukt abbilden und nicht nur oberflächliche
|
||||||
|
Korrelationen erfassen. Es ist zu prüfen, ob die erfassten Merkmale den theoretischen
|
||||||
|
Anforderungen an den Messgegenstand entsprechen, um eine valide Grundlage für
|
||||||
|
Ableitungen zu gewährleisten. Eine Abweichung zwischen dem gemessenen Inhalt und
|
||||||
|
dem definierten Zielkonzept ist als Fehlerzustand zu klassifizieren und muss ausgeschlossen
|
||||||
|
werden.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-02
|
||||||
|
- QB-05
|
||||||
|
- QB-09
|
||||||
|
- QB-10
|
||||||
|
- QB-14
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-07
|
||||||
|
title_original_de: QKB-07 Gültigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-07_Validity.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-08-eindeutigkeit
|
||||||
|
canonical_name: Eindeutigkeit
|
||||||
|
description: Jeder Datensatz im Trainingskorpus muss eine eindeutige Identität besitzen,
|
||||||
|
um die Entstehung redundanter Instanzen auszuschließen. Es ist sicherzustellen,
|
||||||
|
dass keine doppelten oder mehrdeutigen Einträge vorliegen, da diese die Modellgeneralisierung
|
||||||
|
beeinträchtigen und zu Overfitting führen können. Die Validierung muss nachweisen,
|
||||||
|
dass jede Dateneinheit eindeutig identifizierbar ist und logisch von anderen unterscheidbar
|
||||||
|
bleibt.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-05
|
||||||
|
- QB-10
|
||||||
|
- QB-13
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-08
|
||||||
|
title_original_de: QKB-08 Eindeutigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-08_Uniqueness.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-09-sichere-quellen
|
||||||
|
canonical_name: Sichere Quellen
|
||||||
|
description: Für KI-Trainingsdaten muss eine lückenlose Provenienz-Dokumentation
|
||||||
|
etabliert werden, die jeden Verarbeitungsschritt von der Erfassung bis zur finalen
|
||||||
|
Nutzung nachvollziehbar macht. Es ist sicherzustellen, dass alle Transformationen
|
||||||
|
und Herkunftsinformationen vollständig erfasst sind, um die Datenintegrität und
|
||||||
|
-qualität kontinuierlich verifizieren zu können. Die Nachprüfbarkeit dieser Metadaten
|
||||||
|
ist zwingend erforderlich, um potenzielle Qualitätsmängel oder Manipulationen
|
||||||
|
in den Trainingsbeständen frühzeitig zu identifizieren.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-09
|
||||||
|
- QB-11
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
- framework: BSI AIC4
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-09
|
||||||
|
title_original_de: QKB-09 Sichere Quellen
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-09_SecureSource.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MC-AI-DATA-QKB-10-daten-mit-personenbezug
|
||||||
|
canonical_name: Daten mit Personenbezug
|
||||||
|
description: Das System muss vor der Nutzung von Trainingsdaten eine automatisierte
|
||||||
|
Prüfung durchführen, um personenbezogene Informationen zu identifizieren. Ist
|
||||||
|
derartige Datenbestandteil der Eingabedaten, ist deren vollständige und nachweisbare
|
||||||
|
Entfernung sicherzustellen, bevor ein Modelltraining initiiert wird. Die Integrität
|
||||||
|
der verbleibenden Datensätze ist durch technische Maßnahmen gegen unbeabsichtigte
|
||||||
|
Wiederverwendung zu gewährleisten.
|
||||||
|
kind: criterion
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QB-09
|
||||||
|
- QB-10
|
||||||
|
- QB-11
|
||||||
|
- QB-14
|
||||||
|
external_refs:
|
||||||
|
- framework: EU GDPR
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: QKB-10
|
||||||
|
title_original_de: QKB-10 Daten mit Personenbezug
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-10_PersonalDataCheck.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,753 @@
|
|||||||
|
source: Derived from BSI QUAIDAL (Clean-Room)
|
||||||
|
source_url: https://github.com/BSI-Bund/QUAIDAL
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
plagiarism_limit_4gram: 0.2
|
||||||
|
generated_by_model: qwen3.5:35b-a3b
|
||||||
|
controls:
|
||||||
|
- id: MIT-AI-DATA-MA-01-datentyp-validierung
|
||||||
|
canonical_name: Datentyp Validierung
|
||||||
|
description: Es ist sicherzustellen, dass alle Eingabedaten und Trainingsdatensätze
|
||||||
|
vor der Verarbeitung auf Konformität mit den definierten Schemata und Datentypen
|
||||||
|
des Modells geprüft werden. Abweichungen von den erwarteten Formaten sind automatisch
|
||||||
|
zu identifizieren und müssen entweder bereinigt oder ausgeschlossen werden, um
|
||||||
|
Inferenzfehler zu verhindern. Diese Validierung ist als automatisierter Schritt
|
||||||
|
in den Datenpipelines zu implementieren, um die Integrität der KI-Systeme zu gewährleisten.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-32
|
||||||
|
- QM-34
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-01
|
||||||
|
title_original_de: MA-01 Datentyp Validierung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-01_Datatype%20Validation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-02-format-pruefung
|
||||||
|
canonical_name: Format Prüfung
|
||||||
|
description: Die Eingabedaten für KI-Trainingszwecke sind vor der Verarbeitung auf
|
||||||
|
strukturelle Korrektheit zu validieren, wobei Datentypen wie Zeitstempel oder
|
||||||
|
Textfelder exakt den definierten Schemata entsprechen müssen. Durch die erzwingung
|
||||||
|
einer einheitlichen Formatierung wird verhindert, dass regionale Abweichungen
|
||||||
|
oder inkonsistente Darstellungen zu Fehlinterpretationen im Modell führen. Die
|
||||||
|
Konformität ist automatisiert zu prüfen, um sicherzustellen, dass keine nicht
|
||||||
|
konformen Datensätze in den Lernprozess eingehen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-32
|
||||||
|
- QM-34
|
||||||
|
- QM-43
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-02
|
||||||
|
title_original_de: MA-02 Format Prüfung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-02_Format%20Check.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-03-bereichspruefung
|
||||||
|
canonical_name: Bereichsprüfung
|
||||||
|
description: Das System muss vor dem KI-Training eine automatische Validierung aller
|
||||||
|
Eingangsmerkmale durchführen, um Werte außerhalb definierter physikalischer oder
|
||||||
|
logischer Grenzen zu identifizieren. Dabei sind insbesondere inkonsistente Datentypen,
|
||||||
|
fehlerhafte Maßeinheiten und statistisch unplausible Ausreißer zu detektieren
|
||||||
|
und zu isolieren. Die Integrität des Trainingsdatensatzes ist erst dann gewährleistet,
|
||||||
|
wenn alle nicht konformen Einträge ausgeschlossen oder korrigiert wurden, bevor
|
||||||
|
der Lernprozess initiiert wird.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-51
|
||||||
|
- QM-52
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-03
|
||||||
|
title_original_de: MA-03 Bereichsprüfung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-03_Range%20Check.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-04-over-undersampling
|
||||||
|
canonical_name: Over-Undersampling
|
||||||
|
description: Das Daten-Set für das KI-Training ist auf ein ausgewogenes Klassenverhältnis
|
||||||
|
zu prüfen, wobei eine künstliche Aufstockung seltener Kategorien durch synthetische
|
||||||
|
Generierung oder Duplizierung zulässig ist. Alternativ ist eine Reduktion der
|
||||||
|
Datenpunkte der Mehrheitsklasse nach definierten Kriterien durchzuführen, um eine
|
||||||
|
Verzerrung des Modells zu vermeiden. Die angewandte Methode zur Erreichung dieses
|
||||||
|
Gleichgewichts ist dokumentiert und muss reproduzierbar sein.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-34
|
||||||
|
- QM-38
|
||||||
|
- QM-57
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-04
|
||||||
|
title_original_de: MA-04 Over-Undersampling
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-04_Over-Undersampling.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-05-automatisierte-aufgaben
|
||||||
|
canonical_name: Automatisierte Aufgaben
|
||||||
|
description: Wiederkehrende Prozesse der Datenvorverarbeitung und Qualitätsprüfung
|
||||||
|
im KI-Lebenszyklus sind durch automatisierte Mechanismen zu implementieren. Die
|
||||||
|
Ausführung dieser Aufgaben muss so konfiguriert sein, dass eine konsistente Ergebnisqualität
|
||||||
|
über alle Durchläufe hinweg sichergestellt wird. Es ist zu prüfen, dass die eingesetzten
|
||||||
|
Automatisierungswerkzeuge spezifische Validierungsregeln für Trainingsdaten zuverlässig
|
||||||
|
anwenden.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-02
|
||||||
|
- MA-03
|
||||||
|
- QM-10
|
||||||
|
- QM-34
|
||||||
|
- QM-64
|
||||||
|
external_refs:
|
||||||
|
- framework: AI Act
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-05
|
||||||
|
title_original_de: MA-05 Automatisierte Aufgaben
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-05_Automated%20Tasks.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-06-experten-auswertung
|
||||||
|
canonical_name: Experten Auswertung
|
||||||
|
description: Für die Validierung von KI-Trainingsdaten ist eine manuelle Prüfung
|
||||||
|
durch qualifizierte Fachexperten zwingend erforderlich. Diese Experten müssen
|
||||||
|
die inhaltliche Gültigkeit, Relevanz und Korrektheit der Datensätze auf Basis
|
||||||
|
domänenspezifischen Wissens systematisch evaluieren. Das Ergebnis dieser Begutachtung
|
||||||
|
dient dazu, methodische Fehler oder qualitative Mängel frühzeitig zu identifizieren
|
||||||
|
und konkrete Maßnahmen zur Datenbereinigung abzuleiten.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-16
|
||||||
|
- QM-30
|
||||||
|
- QM-43
|
||||||
|
- QM-45
|
||||||
|
- QM-59
|
||||||
|
- QM-70
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 25012
|
||||||
|
citation: null
|
||||||
|
- framework: ISO/IEC 25024
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-06
|
||||||
|
title_original_de: MA-06 Experten Auswertung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-06_Expert%20Evaluation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0204
|
||||||
|
- id: MIT-AI-DATA-MA-07-massenbeteiligung
|
||||||
|
canonical_name: Massenbeteiligung
|
||||||
|
description: Das System muss Mechanismen implementieren, um die Qualität von Trainingsdaten
|
||||||
|
durch dezentrale Validierung durch eine heterogene Gruppe externer Prüfer sicherzustellen.
|
||||||
|
Es ist zwingend erforderlich, dass die Ergebnisse dieser kollektiven Überprüfung
|
||||||
|
mit internen Qualitätsstandards abgeglichen werden, um systematische Fehler in
|
||||||
|
den annotierten Datensätzen zu identifizieren. Die Integrität der KI-Modelle ist
|
||||||
|
nur gewährleistet, wenn diese skalierbare Prüfprozedur für kritische Datenmengen
|
||||||
|
routinemäßig angewendet wird.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-06
|
||||||
|
- QM-03
|
||||||
|
- QM-16
|
||||||
|
- QM-43
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-07
|
||||||
|
title_original_de: MA-07 Massenbeteiligung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-07_Crowdsourcing.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-08-verteilungsanalyse
|
||||||
|
canonical_name: Verteilungsanalyse
|
||||||
|
description: Es ist sicherzustellen, dass die Verteilung der Trainingsdaten über
|
||||||
|
alle relevanten Klassen und Merkmalsbereiche systematisch auf statistische Verzerrungen
|
||||||
|
und Anomalien geprüft wird. Diese Analyse muss nachweisen, dass das Modell auf
|
||||||
|
einer repräsentativen und ausgewogenen Datenbasis trainiert wurde, um die Generalisierungsfähigkeit
|
||||||
|
der Vorhersagen zu gewährleisten. Die Ergebnisse der Verteilungsprüfung sind vor
|
||||||
|
Beginn des Trainings zu dokumentieren und bei signifikanten Abweichungen sind
|
||||||
|
Korrekturmaßnahmen einzuleiten.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-06
|
||||||
|
- QM-10
|
||||||
|
- QM-11
|
||||||
|
- QM-51
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-08
|
||||||
|
title_original_de: MA-08 Verteilungsanalyse
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-08_DistributionAnalysis.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0339
|
||||||
|
- id: MIT-AI-DATA-MA-09-vergleichgrundgesamtheit
|
||||||
|
canonical_name: VergleichGrundgesamtheit
|
||||||
|
description: Das System muss eine repräsentative Referenzstichprobe aus der Zielverteilung
|
||||||
|
bereitstellen, um die Validität von KI-Trainingsdaten zu verifizieren. Es ist
|
||||||
|
sicherzustellen, dass diese Referenzdaten als Goldstandard dienen, um Abweichungen
|
||||||
|
zwischen dem Trainingsset und der tatsächlichen Grundgesamtheit zu quantifizieren.
|
||||||
|
Die Übereinstimmung ist durch einen automatisierten Abgleich mit den vorab definierten
|
||||||
|
Verteilungsparametern zu prüfen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-9
|
||||||
|
- QM-51
|
||||||
|
- QM-52
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-09
|
||||||
|
title_original_de: MA-09 VergleichGrundgesamtheit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-09_CompareGroundtruth.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-10-gewichtung-der-daten
|
||||||
|
canonical_name: Gewichtung der Daten
|
||||||
|
description: Für KI-Trainingsdatensätze ist eine manuelle Gewichtung der einzelnen
|
||||||
|
Merkmale zwingend erforderlich, um systematische Verzerrungen zu minimieren. Diese
|
||||||
|
Maßnahme dient der Sicherstellung einer ausgewogenen Datenrepräsentation und verbessert
|
||||||
|
die Generalisierungsfähigkeit des Modells auf spezifische Anwendungsfälle. Die
|
||||||
|
Zuordnung der Gewichtungsfaktoren ist vor dem Training durchzuführen und muss
|
||||||
|
dokumentiert werden, um die Nachvollziehbarkeit der Datenqualität zu gewährleisten.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-10
|
||||||
|
- QM-18
|
||||||
|
- QM-28
|
||||||
|
- QM-29
|
||||||
|
- QM-37
|
||||||
|
- QM-38
|
||||||
|
- QM-39
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-10
|
||||||
|
title_original_de: MA-10 Gewichtung der Daten
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-10_ManualWeights.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-11-stichprobengroesse
|
||||||
|
canonical_name: Stichprobengröße
|
||||||
|
description: Die Menge der für das Training verwendeten Daten ist so zu dimensionieren,
|
||||||
|
dass statistisch signifikante Ergebnisse bei definiertem Konfidenzniveau und akzeptabler
|
||||||
|
Fehlervarianz gewährleistet sind. Die Datengröße muss iterativ angepasst werden,
|
||||||
|
wobei sowohl die Gesamtgröße der zugrundeliegenden Population als auch die spezifische
|
||||||
|
Art der Datenerweiterung systematisch zu berücksichtigen sind. Eine Validierung
|
||||||
|
der Datenqualität ist zwingend erforderlich, um Verzerrungen durch unterschiedliche
|
||||||
|
Skalierungsmethoden auszuschließen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-08
|
||||||
|
- QM-09
|
||||||
|
- QM-39
|
||||||
|
- QM-41
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-11
|
||||||
|
title_original_de: MA-11 Stichprobengröße
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-11_Trainingsdataset%20Size.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-12-abdeckung-relevanter-merkmale
|
||||||
|
canonical_name: Abdeckung relevanter Merkmale
|
||||||
|
description: Das Trainingsdatenset muss vollständig alle für die spezifische Problemstellung
|
||||||
|
essenziellen Eingangsvariablen enthalten, um eine lückenlose Merkmalsabdeckung
|
||||||
|
zu gewährleisten. Es ist sicherzustellen, dass keine kritischen Einflussgrößen
|
||||||
|
fehlen, da sonst das Modell keine verlässlichen Korrelationen erlernen kann. Die
|
||||||
|
Vollständigkeit des Merkmalsraums ist vor Beginn des Trainingsprozesses durch
|
||||||
|
eine formale Prüfung zu verifizieren.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-06
|
||||||
|
- MA-14
|
||||||
|
- QM-10
|
||||||
|
- QM-11
|
||||||
|
- QM-13
|
||||||
|
- QM-25
|
||||||
|
- QM-26
|
||||||
|
- QM-27
|
||||||
|
- QM-28
|
||||||
|
- QM-29
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-12
|
||||||
|
title_original_de: MA-12 Abdeckung relevanter Merkmale
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-12_RelevantFeatureCoverage.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-13-vollstaendige-information-in-datensaetze
|
||||||
|
canonical_name: Vollständige Information in Datensätzen
|
||||||
|
description: Für die Validierung von KI-Trainingsdaten ist sicherzustellen, dass
|
||||||
|
alle für die Analyse erforderlichen Attribute vollständig vorliegen und keine
|
||||||
|
unbeabsichtigten Lücken existieren. Bei festgestellten Datenfehlern ist zwingend
|
||||||
|
die Ursache zu ermitteln, um das passende Imputationsverfahren basierend auf dem
|
||||||
|
spezifischen Fehlerschema auszuwählen. Eine unzureichende Datenbasis darf nicht
|
||||||
|
zur Modellierung genutzt werden, solange die Integrität der relevanten Information
|
||||||
|
nicht durch geeignete Maßnahmen wiederhergestellt wurde.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-12
|
||||||
|
- QM-40
|
||||||
|
- QM-53
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-13
|
||||||
|
title_original_de: MA-13 Vollständige Information in Datensätzen
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-13_CompleteInformation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-14-eda-explorative-daten-analyse
|
||||||
|
canonical_name: EDA-Explorative Daten Analyse
|
||||||
|
description: Vor Beginn des Modelltrainings ist eine explorative Datenanalyse durchzuführen,
|
||||||
|
um Datenverteilungen, Korrelationen sowie Ausreißer und strukturelle Anomalien
|
||||||
|
ohne vorab definierte Hypothesen zu identifizieren. Die gewonnenen Erkenntnisse
|
||||||
|
sind systematisch zu dokumentieren, um die Qualität der Trainingsdaten zu validieren
|
||||||
|
und fundierte Entscheidungen über notwendige Bereinigungs- oder Erweiterungsschritte
|
||||||
|
abzuleiten. Auf Basis dieser Analyse ist der Datensatz so anzupassen, dass er
|
||||||
|
die für die Zielfunktion erforderliche Repräsentativität und Integrität gewährleistet.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-10
|
||||||
|
- QM-12
|
||||||
|
- QM-24
|
||||||
|
- QM-25
|
||||||
|
- QM-26
|
||||||
|
- QM-27
|
||||||
|
- QM-28
|
||||||
|
- QM-29
|
||||||
|
- QM-36
|
||||||
|
- QM-42
|
||||||
|
- QM-54
|
||||||
|
- QM-57
|
||||||
|
- QM-61
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-14
|
||||||
|
title_original_de: MA-14 EDA-Explorative Daten Analyse
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-14_EDA-ExplorativeDataAnalysis.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-15-empirische-evidenz
|
||||||
|
canonical_name: Empirische Evidenz
|
||||||
|
description: Es ist sicherzustellen, dass die Wirksamkeit von Schutzmaßnahmen gegen
|
||||||
|
KI-gestützte Angriffe durch den systematischen Vergleich mit historischen Einsatzszenarien
|
||||||
|
empirisch validiert wird. Dabei sind Leistungsdaten aus vergleichbaren Anwendungsfällen
|
||||||
|
heranzuziehen, um die Angemessenheit der eingesetzten Trainingsdatensätze und
|
||||||
|
Methoden für den spezifischen Kontext nachzuweisen. Die Analyse muss belegen,
|
||||||
|
dass die gewählten Maßnahmen die identifizierten Risiken in der Praxis effektiv
|
||||||
|
reduzieren und die Datenqualität den aktuellen Bedrohungsmodellen entspricht.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-16
|
||||||
|
- QM-30
|
||||||
|
- QM-61
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-15
|
||||||
|
title_original_de: MA-15 Empirische Evidenz
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-15_EmpiricEvidence.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-16-daten-imputation
|
||||||
|
canonical_name: Daten Imputation
|
||||||
|
description: Für KI-Trainingsdatensätze ist eine systematische Analyse der Ursachen
|
||||||
|
für fehlende Werte zwingend erforderlich, bevor eine Rekonstruktion erfolgt. Das
|
||||||
|
gewählte Verfahren zur Datenergänzung muss sich strikt an den identifizierten
|
||||||
|
Entstehungsgründen orientieren, um die statistische Integrität des Modells zu
|
||||||
|
wahren. Eine unkritische Imputation ohne Ursachenanalyse ist unzulässig, da sie
|
||||||
|
das Lernverhalten des Algorithmus verfälschen kann.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-13
|
||||||
|
- QM-10
|
||||||
|
- QM-22
|
||||||
|
- QM-44
|
||||||
|
- QM-53
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-16
|
||||||
|
title_original_de: MA-16 Daten Imputation
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-16_DataImputation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-17-metadatenverwaltung
|
||||||
|
canonical_name: Metadatenverwaltung
|
||||||
|
description: Für den KI-Trainingsprozess ist eine vollständige Dokumentation der
|
||||||
|
Datenherkunft, der Qualitätsmetriken sowie der rechtlichen Klassifizierung jeder
|
||||||
|
einzelnen Trainingsinstanz sicherzustellen. Diese strukturellen Begleitinformationen
|
||||||
|
müssen maschinenlesbar vorliegen, um eine automatisierte Validierung der Datenintegrität
|
||||||
|
und eine nachvollziehbare Auditierung des Datensatzes zu ermöglichen. Die Erfassung
|
||||||
|
dieser Attribute ist zwingend erforderlich, um die Eignung der Daten für den spezifischen
|
||||||
|
Trainingszweck zu gewährleisten und regulatorische Vorgaben einzuhalten.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-59
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-17
|
||||||
|
title_original_de: MA-17 Metadatenverwaltung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-17_MetadataManagement.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-18-provenienztracking
|
||||||
|
canonical_name: ProvenienzTracking
|
||||||
|
description: Die Herkunft und der Verarbeitungsweg von KI-Trainingsdaten sind lückenlos
|
||||||
|
zu dokumentieren, um deren Integrität und Nachvollziehbarkeit sicherzustellen.
|
||||||
|
Für jeden Datensatz ist eine eindeutige Identifikation des Ursprungs sowie aller
|
||||||
|
Transformationsschritte im Lebenszyklus zu führen. Diese Metadaten müssen so strukturiert
|
||||||
|
sein, dass eine Rückverfolgung zur ursprünglichen Quelle jederzeit möglich ist,
|
||||||
|
ohne dass Datenverluste oder Manipulationen unentdeckt bleiben.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-59
|
||||||
|
- QM-60
|
||||||
|
- QM-61
|
||||||
|
- QM-65
|
||||||
|
- QM-67
|
||||||
|
- QM-70
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-18
|
||||||
|
title_original_de: MA-18 ProvenienzTracking
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-18_ProvenienzTracking.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-19-audit-trails
|
||||||
|
canonical_name: Audit Trails
|
||||||
|
description: Für die Nachvollziehbarkeit von KI-Trainingsprozessen ist ein lückenloses
|
||||||
|
Protokollierungssystem zu implementieren, das alle Datenmanipulationen und Modellupdates
|
||||||
|
zeitgestempelt erfasst. Jeder Zugriff auf Trainingsdatensätze sowie jede Änderung
|
||||||
|
der Modellparameter muss mit eindeutigen Benutzeridentitäten verknüpft werden.
|
||||||
|
Die gespeicherten Logs müssen so strukturiert sein, dass sie eine vollständige
|
||||||
|
Rekonstruktion des Datenflusses und eine Rückführung auf frühere Datenqualitätszustände
|
||||||
|
ermöglichen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- MA-22
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-19
|
||||||
|
title_original_de: MA-19 Audit Trails
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-19_AuditTrails.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-20-prozess-dokumentation
|
||||||
|
canonical_name: Prozess Dokumentation
|
||||||
|
description: Für die Sicherstellung der Datenqualität im KI-Trainingsprozess ist
|
||||||
|
eine vollständige Dokumentation aller Phasen der Datenerstellung und -aufbereitung
|
||||||
|
zwingend erforderlich. Diese Spezifikation muss verbindlich festlegen, welche
|
||||||
|
Aktivitäten auszuführen sind, wer hierfür verantwortlich zeichnet, welche Ressourcen
|
||||||
|
notwendig sind und welche qualitativen Ergebnisse zu erzielen sind. Insbesondere
|
||||||
|
ist die Nachverfolgbarkeit der Datenherkunft innerhalb des Dokumentationsprozesses
|
||||||
|
lückenlos zu gewährleisten, um die Integrität der Trainingsdaten zu validieren.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-15
|
||||||
|
- QM-31
|
||||||
|
- QM-62
|
||||||
|
- QM-65
|
||||||
|
external_refs:
|
||||||
|
- framework: ISO/IEC 42001
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-20
|
||||||
|
title_original_de: MA-20 Prozess Dokumentation
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-20_ProcessDocumentation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-21-compliance
|
||||||
|
canonical_name: Compliance
|
||||||
|
description: Der Einsatz von KI-Modellen erfordert eine zwingende Prüfung der Trainingsdatensätze
|
||||||
|
auf rechtliche Konformität und ethische Integrität, bevor diese zur Modellgenerierung
|
||||||
|
verwendet werden. Es ist sicherzustellen, dass alle verarbeiteten Informationen
|
||||||
|
die Vorgaben der DSGVO sowie branchenspezifische Regularien vollständig erfüllen
|
||||||
|
und keine unrechtmäßig beschafften oder personenbezogenen Daten ohne explizite
|
||||||
|
Einwilligung enthalten. Die Validierung dieser Datenqualität muss vor jedem Trainingslauf
|
||||||
|
durch einen automatisierten oder manuellen Compliance-Check nachgewiesen werden.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-12
|
||||||
|
- QM-15
|
||||||
|
external_refs:
|
||||||
|
- framework: EU GDPR
|
||||||
|
citation: null
|
||||||
|
- framework: AI Act
|
||||||
|
citation: null
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-21
|
||||||
|
title_original_de: MA-21 Compliance
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-21_Compliance.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-22-vertrauenswuerdigkeit
|
||||||
|
canonical_name: Vertrauenswürdigkeit
|
||||||
|
description: Die Integrität und Zuverlässigkeit der für das KI-Training verwendeten
|
||||||
|
Datensätze ist im jeweiligen Anwendungskontext nachweislich zu verifizieren. Es
|
||||||
|
ist sicherzustellen, dass potenzielle Manipulationen oder unbeabsichtigte Korruptionen
|
||||||
|
des Datenflusses durch technische Prüfmechanismen ausgeschlossen werden. Bei der
|
||||||
|
Anwendung von Korrekturverfahren zur Datenbereinigung muss die ursprüngliche Glaubwürdigkeit
|
||||||
|
der Informationen gewahrt bleiben und darf nicht durch die Maßnahme beeinträchtigt
|
||||||
|
werden.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-15
|
||||||
|
- QM-43
|
||||||
|
- QM-65
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-22
|
||||||
|
title_original_de: MA-22 Vertrauenswürdigkeit
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-22_Credibility.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-23-merkmalsskalierung
|
||||||
|
canonical_name: Merkmalsskalierung
|
||||||
|
description: Für KI-Trainingsdatensätze ist eine Normalisierung der Merkmalswerte
|
||||||
|
auf einen einheitlichen Wertebereich zwingend erforderlich, um Dominanzeffekte
|
||||||
|
durch unterschiedliche Größenordnungen zu vermeiden. Diese Maßnahme stellt sicher,
|
||||||
|
dass Algorithmen, die auf Distanzberechnungen oder Gradientenverfahren basieren,
|
||||||
|
nicht durch skalenbedingte Verzerrungen beeinträchtigt werden. Die Wirksamkeit
|
||||||
|
der Skalierung ist vor dem Training systematisch zu prüfen, um die Vorhersagegenauigkeit
|
||||||
|
des Modells zu garantieren.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-10
|
||||||
|
- QM-56
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-23
|
||||||
|
title_original_de: MA-23 Merkmalsskalierung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-23_FeatureScaling.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-24-merkmalserstellung
|
||||||
|
canonical_name: Merkmalserstellung
|
||||||
|
description: Es ist sicherzustellen, dass bei der Erstellung neuer Eingangsmerkmale
|
||||||
|
für KI-Modelle ausschließlich validierte Transformationsverfahren angewendet werden,
|
||||||
|
um die Datenqualität zu gewährleisten. Die Generierung neuer Features muss auf
|
||||||
|
nachvollziehbaren Algorithmen basieren, die eine signifikante Verbesserung der
|
||||||
|
Modellleistung gegenüber den Rohdaten nachweisen. Jede angewandte Methode zur
|
||||||
|
Datenanreicherung oder -bereinigung ist vor dem Training auf ihre Eignung zur
|
||||||
|
Mustererkennung und Vorhersagegenauigkeit zu prüfen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-11
|
||||||
|
- QM-25
|
||||||
|
- QM-26
|
||||||
|
- QM-27
|
||||||
|
- QM-28
|
||||||
|
- QM-51
|
||||||
|
- QM-71
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-24
|
||||||
|
title_original_de: MA-24 Merkmalserstellung
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-24_FeatureCreation.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-25-differential-privacy
|
||||||
|
canonical_name: Differential Privacy
|
||||||
|
description: Das System muss bei der Verarbeitung von KI-Trainingsdaten differenzielle
|
||||||
|
Privatsphäre implementieren, indem statistisch signifikante, zufällige Störgrößen
|
||||||
|
zu den Ergebnissen hinzugefügt werden. Es ist sicherzustellen, dass die An- oder
|
||||||
|
Abwesenheit einzelner Datensätze im Trainingsset das Ausgabeergebnis nur marginal
|
||||||
|
beeinflusst. Durch diese Maßnahme ist zu prüfen, ob keine Rückschlüsse auf spezifische
|
||||||
|
Personen aus den generierten Analysen gezogen werden können, während die allgemeine
|
||||||
|
Datenqualität für das Modelltraining erhalten bleibt.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-58
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-25
|
||||||
|
title_original_de: MA-25 Differential Privacy
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-25_Differential%20Privacy.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0625
|
||||||
|
- id: MIT-AI-DATA-MA-26-federated-learning
|
||||||
|
canonical_name: Federated Learning
|
||||||
|
description: Für KI-Systeme, die auf verteilten Datenquellen basieren, ist ein Federated-Learning-Ansatz
|
||||||
|
zwingend vorzusehen, um die Rohdaten dezentral zu belassen. Die lokalen Modelle
|
||||||
|
müssen ausschließlich aggregierte Parameter an eine zentrale Instanz übermitteln,
|
||||||
|
während die ursprünglichen Trainingsdaten niemals die lokale Umgebung verlassen.
|
||||||
|
Eine Prüfung ist sicherzustellen, dass durch diese Architektur keine sensiblen
|
||||||
|
Informationen während des Lernprozesses zentralisiert oder übertragen werden.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-63
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-26
|
||||||
|
title_original_de: MA-26 Federated Learning
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-26_Federated%20Learning%20Approach.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-27-statistische-grundlagenthemen
|
||||||
|
canonical_name: Statistische Grundlagenthemen
|
||||||
|
description: Für die Sicherstellung der Datenqualität im KI-Lebenszyklus sind statistische
|
||||||
|
Basisverfahren systematisch zu implementieren und kontinuierlich zu validieren.
|
||||||
|
Es ist sicherzustellen, dass alle relevanten Metriken zur Verteilungsanalyse und
|
||||||
|
Datenintegrität konsistent in die Berechnungspipelines integriert werden. Diese
|
||||||
|
fundamentalen Analysen müssen unabhängig von spezifischen Bausteinen als übergeordnete
|
||||||
|
Prüfkriterien für die Modellgüte dienen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-01
|
||||||
|
- QM-02
|
||||||
|
- QM-03
|
||||||
|
- QM-04
|
||||||
|
- QM-06
|
||||||
|
- QM-07
|
||||||
|
- QM-09
|
||||||
|
- QM-23
|
||||||
|
- QM-51
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-27
|
||||||
|
title_original_de: MA-27 Statistische Grundlagenthemen
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-27_StatisticalBasis.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0213
|
||||||
|
- id: MIT-AI-DATA-MA-28-diversitaetsindizes
|
||||||
|
canonical_name: Diversitätsindizes
|
||||||
|
description: Das System muss quantitative Metriken zur Erfassung der Heterogenität
|
||||||
|
von KI-Trainingsdaten implementieren, um die Verteilung verschiedener Kategorien
|
||||||
|
zu messen. Es ist sicherzustellen, dass diese Kennzahlen sowohl die Anzahl vorhandener
|
||||||
|
Klassen als auch deren Gleichverteilung abbilden. Die Validierung der Datenqualität
|
||||||
|
erfolgt durch die Berechnung von Diversitätsindizes, die statistische Unsicherheit
|
||||||
|
oder Kollisionswahrscheinlichkeiten quantifizieren.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-68
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-28
|
||||||
|
title_original_de: MA-28 Diversitätsindizes
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-28_Diversity-Indices.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-29-data-splitting
|
||||||
|
canonical_name: Data-Splitting
|
||||||
|
description: Die Aufteilung von KI-Trainingsdaten in disjunkte Teilmengen ist zwingend
|
||||||
|
erforderlich, um eine unvoreingenommene Validierung der Modellgüte zu gewährleisten.
|
||||||
|
Dabei müssen mindestens drei voneinander getrennte Bereiche für das Training,
|
||||||
|
die Hyperparameter-Optimierung sowie die abschließende Leistungsbewertung definiert
|
||||||
|
werden. Eine zufällige oder stratifizierte Trennung ist sicherzustellen, um Datenlecks
|
||||||
|
zwischen den Phasen auszuschließen und die Generalisierungsfähigkeit des Systems
|
||||||
|
nachweisbar zu prüfen.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-69
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-29
|
||||||
|
title_original_de: MA-29 Data-Splitting
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-29_Data%20Splitting.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
|
- id: MIT-AI-DATA-MA-30-fairness
|
||||||
|
canonical_name: Fairness
|
||||||
|
description: Das System muss sicherstellen, dass KI-Trainingsdaten keine systematischen
|
||||||
|
Verzerrungen bezüglich sensibler demografischer Merkmale aufweisen, um diskriminierende
|
||||||
|
Vorhersagen zu vermeiden. Bei unzureichender Repräsentation von Teilgruppen sind
|
||||||
|
präventive Aufbereitungsverfahren oder algorithmische Transformationsmethoden
|
||||||
|
zur Bias-Korrektur zwingend anzuwenden. Die Wirksamkeit dieser Maßnahmen ist vor
|
||||||
|
der Modellbereitstellung durch quantitative Prüfverfahren auf Gleichbehandlungsgrundsätze
|
||||||
|
zu validieren.
|
||||||
|
kind: measure
|
||||||
|
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
|
||||||
|
related_quaidal_ids:
|
||||||
|
- QM-57
|
||||||
|
external_refs: []
|
||||||
|
source:
|
||||||
|
framework: BSI QUAIDAL
|
||||||
|
section: MA-30
|
||||||
|
title_original_de: MA-30 Fairness
|
||||||
|
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-30_Fairness.md
|
||||||
|
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
|
||||||
|
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
|
||||||
|
plagiarism_score_at_generation: 0.0
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,58 @@
|
|||||||
|
-- Migration 011: Derived Controls Library (Clean-Room MCs from external sources)
|
||||||
|
-- Schema: compliance
|
||||||
|
--
|
||||||
|
-- Holds Master Controls + atomic controls + mitigations + metrics that were
|
||||||
|
-- derived Clean-Room from external regulatory sources (BSI QUAIDAL today,
|
||||||
|
-- Grundschutz++/CRA/NIST AI RMF next). Kept separate from the gpre2
|
||||||
|
-- master_controls table because:
|
||||||
|
-- 1) The shape is different (no object_group/phase concepts).
|
||||||
|
-- 2) Source-Layer-Trennung: derivations from external IP must be cleanly
|
||||||
|
-- separable from internally-generated artifacts.
|
||||||
|
-- 3) Each row carries the licence + provenance for due diligence.
|
||||||
|
--
|
||||||
|
-- Run: ssh macmini "docker exec -i bp-core-postgres psql -U breakpilot -d breakpilot_db" \
|
||||||
|
-- < control-pipeline/migrations/011_derived_controls.sql
|
||||||
|
|
||||||
|
SET search_path TO compliance, public;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS derived_controls (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
derived_id VARCHAR(200) UNIQUE NOT NULL, -- e.g. MC-AI-DATA-QKB-01-repraesentativitaet
|
||||||
|
kind VARCHAR(30) NOT NULL, -- criterion | building_block | measure | metric
|
||||||
|
canonical_name VARCHAR(300) NOT NULL,
|
||||||
|
description TEXT NOT NULL, -- our own wording, never the original
|
||||||
|
regulation_anchor TEXT, -- e.g. "EU AI Act Art. 10"
|
||||||
|
related_quaidal_ids JSONB NOT NULL DEFAULT '[]', -- ["QB-03", "QB-04", ...]
|
||||||
|
external_refs JSONB NOT NULL DEFAULT '[]', -- [{framework, citation}, ...]
|
||||||
|
source_framework VARCHAR(80) NOT NULL, -- "BSI QUAIDAL"
|
||||||
|
source_section VARCHAR(80) NOT NULL, -- "QKB-01"
|
||||||
|
source_url TEXT,
|
||||||
|
source_commit_sha VARCHAR(80),
|
||||||
|
source_title_original TEXT, -- original title (label, not protected)
|
||||||
|
source_license_note TEXT,
|
||||||
|
plagiarism_score_at_generation NUMERIC(5,4), -- 0..1; gate was 0.20
|
||||||
|
generated_by_model VARCHAR(80),
|
||||||
|
yaml_path TEXT, -- pointer back to source YAML
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_derived_controls_kind ON derived_controls(kind);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_derived_controls_source_framework ON derived_controls(source_framework);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_derived_controls_source_section ON derived_controls(source_section);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_derived_controls_related_quaidal_gin
|
||||||
|
ON derived_controls USING GIN(related_quaidal_ids);
|
||||||
|
|
||||||
|
-- Trigger to keep updated_at fresh
|
||||||
|
CREATE OR REPLACE FUNCTION trg_derived_controls_set_updated_at()
|
||||||
|
RETURNS TRIGGER AS $$
|
||||||
|
BEGIN
|
||||||
|
NEW.updated_at = NOW();
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS derived_controls_updated_at ON derived_controls;
|
||||||
|
CREATE TRIGGER derived_controls_updated_at
|
||||||
|
BEFORE UPDATE ON derived_controls
|
||||||
|
FOR EACH ROW EXECUTE FUNCTION trg_derived_controls_set_updated_at();
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Upsert derived QUAIDAL controls from YAML into compliance.derived_controls.
|
||||||
|
|
||||||
|
Reads:
|
||||||
|
control-pipeline/data/quaidal/master_controls.yaml
|
||||||
|
control-pipeline/data/quaidal/atomic_controls.yaml
|
||||||
|
control-pipeline/data/quaidal/mitigations.yaml
|
||||||
|
control-pipeline/data/quaidal/metrics.yaml
|
||||||
|
|
||||||
|
Writes: compliance.derived_controls (idempotent UPSERT by derived_id)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
# Mac Mini direct:
|
||||||
|
python3 control-pipeline/scripts/apply_quaidal_to_db.py
|
||||||
|
|
||||||
|
# Via SSH (locally, against macmini DB):
|
||||||
|
DB_HOST=macmini python3 control-pipeline/scripts/apply_quaidal_to_db.py
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
import psycopg
|
||||||
|
import yaml
|
||||||
|
except ImportError as e:
|
||||||
|
print(f"ERROR: missing dependency {e.name}. Install with: pip install psycopg[binary] pyyaml", file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
DATA_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
|
||||||
|
|
||||||
|
KIND_FILES = {
|
||||||
|
"criterion": "master_controls.yaml",
|
||||||
|
"building_block": "atomic_controls.yaml",
|
||||||
|
"measure": "mitigations.yaml",
|
||||||
|
"metric": "metrics.yaml",
|
||||||
|
}
|
||||||
|
|
||||||
|
UPSERT_SQL = """
|
||||||
|
INSERT INTO compliance.derived_controls (
|
||||||
|
derived_id, kind, canonical_name, description, regulation_anchor,
|
||||||
|
related_quaidal_ids, external_refs,
|
||||||
|
source_framework, source_section, source_url, source_commit_sha,
|
||||||
|
source_title_original, source_license_note,
|
||||||
|
plagiarism_score_at_generation, generated_by_model, yaml_path
|
||||||
|
) VALUES (
|
||||||
|
%(derived_id)s, %(kind)s, %(canonical_name)s, %(description)s, %(regulation_anchor)s,
|
||||||
|
%(related_quaidal_ids)s::jsonb, %(external_refs)s::jsonb,
|
||||||
|
%(source_framework)s, %(source_section)s, %(source_url)s, %(source_commit_sha)s,
|
||||||
|
%(source_title_original)s, %(source_license_note)s,
|
||||||
|
%(plagiarism_score)s, %(generated_by_model)s, %(yaml_path)s
|
||||||
|
)
|
||||||
|
ON CONFLICT (derived_id) DO UPDATE SET
|
||||||
|
kind = EXCLUDED.kind,
|
||||||
|
canonical_name = EXCLUDED.canonical_name,
|
||||||
|
description = EXCLUDED.description,
|
||||||
|
regulation_anchor = EXCLUDED.regulation_anchor,
|
||||||
|
related_quaidal_ids = EXCLUDED.related_quaidal_ids,
|
||||||
|
external_refs = EXCLUDED.external_refs,
|
||||||
|
source_framework = EXCLUDED.source_framework,
|
||||||
|
source_section = EXCLUDED.source_section,
|
||||||
|
source_url = EXCLUDED.source_url,
|
||||||
|
source_commit_sha = EXCLUDED.source_commit_sha,
|
||||||
|
source_title_original = EXCLUDED.source_title_original,
|
||||||
|
source_license_note = EXCLUDED.source_license_note,
|
||||||
|
plagiarism_score_at_generation = EXCLUDED.plagiarism_score_at_generation,
|
||||||
|
generated_by_model = EXCLUDED.generated_by_model,
|
||||||
|
yaml_path = EXCLUDED.yaml_path
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def load_yaml_records(yaml_path: Path) -> tuple[list[dict], str | None, str | None]:
|
||||||
|
if not yaml_path.exists():
|
||||||
|
return [], None, None
|
||||||
|
data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
|
||||||
|
return data.get("controls", []), data.get("commit_sha"), data.get("generated_by_model")
|
||||||
|
|
||||||
|
|
||||||
|
def to_row(ctrl: dict, yaml_path: Path, default_model: str | None, default_commit: str | None) -> dict:
|
||||||
|
source = ctrl.get("source") or {}
|
||||||
|
return {
|
||||||
|
"derived_id": ctrl["id"],
|
||||||
|
"kind": ctrl["kind"],
|
||||||
|
"canonical_name": ctrl["canonical_name"],
|
||||||
|
"description": ctrl["description"],
|
||||||
|
"regulation_anchor": ctrl.get("regulation_anchor"),
|
||||||
|
"related_quaidal_ids": json.dumps(ctrl.get("related_quaidal_ids", []), ensure_ascii=False),
|
||||||
|
"external_refs": json.dumps(ctrl.get("external_refs", []), ensure_ascii=False),
|
||||||
|
"source_framework": source.get("framework", "BSI QUAIDAL"),
|
||||||
|
"source_section": source.get("section", ""),
|
||||||
|
"source_url": source.get("url"),
|
||||||
|
"source_commit_sha": source.get("commit_sha") or default_commit,
|
||||||
|
"source_title_original": source.get("title_original_de"),
|
||||||
|
"source_license_note": source.get("license_note"),
|
||||||
|
"plagiarism_score": ctrl.get("plagiarism_score_at_generation"),
|
||||||
|
"generated_by_model": default_model,
|
||||||
|
"yaml_path": str(yaml_path.relative_to(REPO_ROOT)),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def build_dsn(args: argparse.Namespace) -> str:
|
||||||
|
if args.dsn:
|
||||||
|
return args.dsn
|
||||||
|
return (
|
||||||
|
f"host={args.db_host} port={args.db_port} "
|
||||||
|
f"dbname={args.db_name} user={args.db_user} password={args.db_password}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
ap = argparse.ArgumentParser(description=__doc__)
|
||||||
|
ap.add_argument("--dsn", help="Full DSN; overrides individual flags")
|
||||||
|
ap.add_argument("--db-host", default=os.environ.get("DB_HOST", "localhost"))
|
||||||
|
ap.add_argument("--db-port", default=os.environ.get("DB_PORT", "5432"))
|
||||||
|
ap.add_argument("--db-name", default=os.environ.get("DB_NAME", "breakpilot_db"))
|
||||||
|
ap.add_argument("--db-user", default=os.environ.get("DB_USER", "breakpilot"))
|
||||||
|
ap.add_argument("--db-password", default=os.environ.get("DB_PASSWORD", "breakpilot"))
|
||||||
|
ap.add_argument("--dry-run", action="store_true")
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
total = 0
|
||||||
|
rows: list[dict] = []
|
||||||
|
for kind, fname in KIND_FILES.items():
|
||||||
|
path = DATA_DIR / fname
|
||||||
|
records, commit, model = load_yaml_records(path)
|
||||||
|
for rec in records:
|
||||||
|
rows.append(to_row(rec, path, model, commit))
|
||||||
|
if records:
|
||||||
|
print(f" {fname}: {len(records)} entries", file=sys.stderr)
|
||||||
|
total += len(records)
|
||||||
|
|
||||||
|
if not rows:
|
||||||
|
print("ERROR: no YAML records found; run derive_quaidal_mcs.py first", file=sys.stderr)
|
||||||
|
return 2
|
||||||
|
|
||||||
|
print(f"Total rows: {total}", file=sys.stderr)
|
||||||
|
if args.dry_run:
|
||||||
|
print("Dry run — sample row:", file=sys.stderr)
|
||||||
|
print(json.dumps({k: (v[:200] if isinstance(v, str) else v) for k, v in rows[0].items()}, indent=2, ensure_ascii=False))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
dsn = build_dsn(args)
|
||||||
|
print(f"Connecting to {args.db_host}:{args.db_port}/{args.db_name}", file=sys.stderr)
|
||||||
|
inserted = updated = 0
|
||||||
|
with psycopg.connect(dsn) as conn:
|
||||||
|
with conn.cursor() as cur:
|
||||||
|
for row in rows:
|
||||||
|
cur.execute(
|
||||||
|
"SELECT 1 FROM compliance.derived_controls WHERE derived_id = %s",
|
||||||
|
(row["derived_id"],),
|
||||||
|
)
|
||||||
|
existed = cur.fetchone() is not None
|
||||||
|
cur.execute(UPSERT_SQL, row)
|
||||||
|
if existed:
|
||||||
|
updated += 1
|
||||||
|
else:
|
||||||
|
inserted += 1
|
||||||
|
conn.commit()
|
||||||
|
print(f"Inserted: {inserted}, Updated: {updated}", file=sys.stderr)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -0,0 +1,400 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Clean-Room MC derivation from BSI QUAIDAL.
|
||||||
|
|
||||||
|
For each QUAIDAL entry in the parsed index, ask a local LLM to produce our own
|
||||||
|
wording for a Master Control / atomic control / mitigation / metric. Reject any
|
||||||
|
output whose 4-gram overlap with the BSI source text exceeds PLAGIARISM_LIMIT.
|
||||||
|
|
||||||
|
We never store the BSI prose; only our own derived wording plus structural
|
||||||
|
references (BSI section ID + URL + commit SHA).
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
# Single entry, prints to stdout for review:
|
||||||
|
python3 control-pipeline/scripts/derive_quaidal_mcs.py --only QKB-01 --dry-run
|
||||||
|
|
||||||
|
# Full run, writes YAML:
|
||||||
|
python3 control-pipeline/scripts/derive_quaidal_mcs.py --ollama-host macmini
|
||||||
|
|
||||||
|
Output: control-pipeline/data/quaidal/{master_controls,atomic_controls,mitigations,metrics}.yaml
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
import httpx
|
||||||
|
import yaml
|
||||||
|
except ImportError as e:
|
||||||
|
print(f"ERROR: missing dependency {e.name}. Install with: pip install httpx pyyaml", file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
SOURCE_ROOT = REPO_ROOT / "legal-sources" / "bsi-quaidal"
|
||||||
|
INDEX_FILE = REPO_ROOT / "control-pipeline" / "data" / "quaidal" / "quaidal_index.json"
|
||||||
|
OUTPUT_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
|
||||||
|
|
||||||
|
PLAGIARISM_LIMIT = 0.20 # max share of 4-grams that may appear in BSI source
|
||||||
|
N_GRAM = 4
|
||||||
|
MAX_RETRIES = 3
|
||||||
|
|
||||||
|
DEFAULT_OLLAMA_URL = "http://macmini:11434"
|
||||||
|
OLLAMA_MODEL = "qwen3.5:35b-a3b"
|
||||||
|
QUAIDAL_REPO_URL = "https://github.com/BSI-Bund/QUAIDAL"
|
||||||
|
|
||||||
|
KIND_TO_PROMPT_ROLE = {
|
||||||
|
"criterion": "Master Control",
|
||||||
|
"building_block": "atomarer technischer Control",
|
||||||
|
"measure": "Schutzmaßnahme",
|
||||||
|
"metric": "messbarer Qualitäts-Indikator",
|
||||||
|
}
|
||||||
|
|
||||||
|
KIND_TO_OUTPUT_FILE = {
|
||||||
|
"criterion": "master_controls.yaml",
|
||||||
|
"building_block": "atomic_controls.yaml",
|
||||||
|
"measure": "mitigations.yaml",
|
||||||
|
"metric": "metrics.yaml",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Source-side extraction (kept in memory, never written to disk)
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
FRONTMATTER_RE = re.compile(r"^---\s*\n.*?\n---\s*\n", re.DOTALL)
|
||||||
|
SECTION_RE = re.compile(r"^###?\s+(.+?)\s*$", re.MULTILINE)
|
||||||
|
|
||||||
|
|
||||||
|
def load_source_extract(rel_path: str) -> dict:
|
||||||
|
"""Load BSI source text for ONE entry. Used only for prompt + plagiarism check."""
|
||||||
|
path = SOURCE_ROOT / rel_path
|
||||||
|
text = path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
# Strip frontmatter; capture shortdesc separately for the prompt.
|
||||||
|
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", text, re.DOTALL)
|
||||||
|
shortdesc = ""
|
||||||
|
if fm_match:
|
||||||
|
for line in fm_match.group(1).splitlines():
|
||||||
|
if line.lower().startswith("shortdesc:"):
|
||||||
|
shortdesc = line.split(":", 1)[1].strip()
|
||||||
|
break
|
||||||
|
body = FRONTMATTER_RE.sub("", text, count=1)
|
||||||
|
|
||||||
|
# Pull the first 1-2 paragraphs under "Beschreibung" (or whole body if none)
|
||||||
|
desc_match = re.search(r"###?\s+Beschreibung\s*\n+(.+?)(?:\n###?\s|\Z)", body, re.DOTALL)
|
||||||
|
description_excerpt = desc_match.group(1).strip() if desc_match else body[:1500].strip()
|
||||||
|
paragraphs = [p.strip() for p in description_excerpt.split("\n\n") if p.strip()]
|
||||||
|
description_excerpt = "\n\n".join(paragraphs[:2])
|
||||||
|
|
||||||
|
return {
|
||||||
|
"shortdesc": shortdesc,
|
||||||
|
"description_excerpt": description_excerpt,
|
||||||
|
"full_body": body,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Plagiarism gate
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
WORD_RE = re.compile(r"\b[\wäöüÄÖÜß]+\b", re.UNICODE)
|
||||||
|
|
||||||
|
|
||||||
|
def _tokenize(text: str) -> list[str]:
|
||||||
|
return [w.lower() for w in WORD_RE.findall(text)]
|
||||||
|
|
||||||
|
|
||||||
|
def ngram_overlap(produced: str, source: str, n: int = N_GRAM) -> float:
|
||||||
|
"""Share of produced n-grams that also appear in source."""
|
||||||
|
p_tokens = _tokenize(produced)
|
||||||
|
s_tokens = _tokenize(source)
|
||||||
|
if len(p_tokens) < n:
|
||||||
|
return 0.0
|
||||||
|
s_grams = {tuple(s_tokens[i : i + n]) for i in range(len(s_tokens) - n + 1)}
|
||||||
|
if not s_grams:
|
||||||
|
return 0.0
|
||||||
|
p_grams = [tuple(p_tokens[i : i + n]) for i in range(len(p_tokens) - n + 1)]
|
||||||
|
hits = sum(1 for g in p_grams if g in s_grams)
|
||||||
|
return hits / len(p_grams)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# LLM prompt + call
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
PROMPT_TEMPLATE = """Du bist Compliance-Engineer bei BreakPilot. Schreibe eine eigenständige Anforderung im Stil einer technischen Kontroll-Spezifikation.
|
||||||
|
|
||||||
|
Quelle: BSI QUAIDAL Sektion {entry_id} ("{title_de}"). Die Quelle steht unter unklarer Lizenz (BSI-Veröffentlichung, § 5 UrhG anwendbar) — wir dürfen die Idee aufgreifen, aber NICHT abschreiben.
|
||||||
|
|
||||||
|
Aufgabe: Formuliere eine eigenständige Anforderung im Stil eines {role}. Anforderungen:
|
||||||
|
- Eigene Formulierung in deutscher Sprache. Kein Satz darf aus der Quelle übernommen werden, auch nicht teilweise. Synonyme verwenden, Satzbau ändern, Inhalt strukturell anders aufbauen.
|
||||||
|
- 2-4 Sätze (max 80 Wörter).
|
||||||
|
- Sprachstil: nüchtern, technisch, normativ ("muss", "ist sicherzustellen", "ist zu prüfen").
|
||||||
|
- Bezug auf KI-Trainingsdaten oder KI-Datenqualität, je nach Quelle.
|
||||||
|
- Nicht die wörtlichen BSI-Beispiele kopieren.
|
||||||
|
|
||||||
|
Quellauszug (NUR zur Orientierung, NICHT abschreiben):
|
||||||
|
---
|
||||||
|
shortdesc: {shortdesc}
|
||||||
|
|
||||||
|
{description_excerpt}
|
||||||
|
---
|
||||||
|
|
||||||
|
Antwort: Liefere AUSSCHLIESSLICH die fertige Beschreibung als reinen Text — kein JSON, keine Überschriften, keine Anführungszeichen, keine Quellenangabe."""
|
||||||
|
|
||||||
|
|
||||||
|
def call_ollama(prompt: str, ollama_url: str, model: str, retries: int = 2) -> str:
|
||||||
|
last_err = None
|
||||||
|
for attempt in range(retries + 1):
|
||||||
|
try:
|
||||||
|
resp = httpx.post(
|
||||||
|
f"{ollama_url}/api/chat",
|
||||||
|
json={
|
||||||
|
"model": model,
|
||||||
|
"messages": [{"role": "user", "content": prompt}],
|
||||||
|
"stream": False,
|
||||||
|
"options": {"temperature": 0.4},
|
||||||
|
"think": False,
|
||||||
|
},
|
||||||
|
timeout=180.0,
|
||||||
|
)
|
||||||
|
resp.raise_for_status()
|
||||||
|
return resp.json()["message"]["content"].strip()
|
||||||
|
except (httpx.HTTPError, KeyError, ValueError) as e:
|
||||||
|
last_err = e
|
||||||
|
if attempt < retries:
|
||||||
|
time.sleep(2 ** attempt)
|
||||||
|
raise RuntimeError(f"Ollama call failed after {retries+1} attempts: {last_err}")
|
||||||
|
|
||||||
|
|
||||||
|
def strip_llm_artifacts(text: str) -> str:
|
||||||
|
"""Clean leading/trailing markdown and quotes from LLM output."""
|
||||||
|
text = text.strip()
|
||||||
|
# Strip surrounding code fences
|
||||||
|
if text.startswith("```"):
|
||||||
|
text = re.sub(r"^```[a-zA-Z]*\n?", "", text)
|
||||||
|
text = re.sub(r"\n?```\s*$", "", text)
|
||||||
|
# Strip surrounding quotes
|
||||||
|
text = text.strip('"„"”„')
|
||||||
|
# Drop a leading "Beschreibung:" or similar label
|
||||||
|
text = re.sub(r"^(Beschreibung|Description|Anforderung|Control):\s*", "", text, flags=re.IGNORECASE)
|
||||||
|
return text.strip()
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Derivation
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class DerivedControl:
|
||||||
|
derived_id: str
|
||||||
|
source_id: str
|
||||||
|
kind: str
|
||||||
|
canonical_name: str
|
||||||
|
description: str
|
||||||
|
plagiarism_score: float
|
||||||
|
related_quaidal_ids: list[str]
|
||||||
|
external_refs: list[dict]
|
||||||
|
source: dict
|
||||||
|
|
||||||
|
|
||||||
|
_ASCII_FOLD = str.maketrans({"ä": "ae", "ö": "oe", "ü": "ue", "Ä": "ae", "Ö": "oe", "Ü": "ue", "ß": "ss"})
|
||||||
|
|
||||||
|
|
||||||
|
def slug(text: str) -> str:
|
||||||
|
text = text.translate(_ASCII_FOLD).lower()
|
||||||
|
text = re.sub(r"[^a-z0-9]+", "-", text)
|
||||||
|
return text.strip("-")
|
||||||
|
|
||||||
|
|
||||||
|
def derived_id_for(entry: dict) -> str:
|
||||||
|
prefix = {
|
||||||
|
"criterion": "MC-AI-DATA",
|
||||||
|
"building_block": "AC-AI-DATA",
|
||||||
|
"measure": "MIT-AI-DATA",
|
||||||
|
"metric": "MET-AI-DATA",
|
||||||
|
}.get(entry["kind"], "X-AI-DATA")
|
||||||
|
title = entry["title_de"]
|
||||||
|
title = re.sub(r"^\s*(QKB|QB|MA|QM)-\d+[a-zA-Z]?\s*", "", title)
|
||||||
|
return f"{prefix}-{entry['id']}-{slug(title)[:40]}".rstrip("-")
|
||||||
|
|
||||||
|
|
||||||
|
def derive_one(entry: dict, source_extract: dict, ollama_url: str, model: str, *, verbose: bool = False) -> DerivedControl:
|
||||||
|
role = KIND_TO_PROMPT_ROLE.get(entry["kind"], "Control")
|
||||||
|
prompt = PROMPT_TEMPLATE.format(
|
||||||
|
entry_id=entry["id"],
|
||||||
|
title_de=entry["title_de"],
|
||||||
|
role=role,
|
||||||
|
shortdesc=source_extract["shortdesc"] or "(keiner)",
|
||||||
|
description_excerpt=source_extract["description_excerpt"] or "(keine Beschreibung)",
|
||||||
|
)
|
||||||
|
|
||||||
|
source_corpus = "\n\n".join(filter(None, [source_extract["shortdesc"], source_extract["description_excerpt"]]))
|
||||||
|
|
||||||
|
best: tuple[str, float] | None = None
|
||||||
|
for attempt in range(1, MAX_RETRIES + 1):
|
||||||
|
output = call_ollama(prompt, ollama_url, model)
|
||||||
|
output = strip_llm_artifacts(output)
|
||||||
|
score = ngram_overlap(output, source_corpus)
|
||||||
|
if verbose:
|
||||||
|
print(f" attempt {attempt}: overlap={score:.2%} len={len(output)}", file=sys.stderr)
|
||||||
|
if score < PLAGIARISM_LIMIT:
|
||||||
|
best = (output, score)
|
||||||
|
break
|
||||||
|
if best is None or score < best[1]:
|
||||||
|
best = (output, score)
|
||||||
|
# Strengthen the next prompt by appending a reject notice
|
||||||
|
prompt += f"\n\n(Vorheriger Versuch hatte {score:.0%} Wortdeckung mit der Quelle. Verwende völlig andere Begriffe und Satzstruktur.)"
|
||||||
|
|
||||||
|
if best is None:
|
||||||
|
raise RuntimeError(f"Could not derive {entry['id']}: no output")
|
||||||
|
output, score = best
|
||||||
|
if score >= PLAGIARISM_LIMIT:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"Plagiarism gate failed for {entry['id']}: best overlap {score:.2%} >= limit {PLAGIARISM_LIMIT:.0%}.\n"
|
||||||
|
f"Output:\n{output}"
|
||||||
|
)
|
||||||
|
|
||||||
|
title_de_clean = re.sub(r"^\s*(QKB|QB|MA|QM)-\d+[a-zA-Z]?\s*", "", entry["title_de"]).strip()
|
||||||
|
return DerivedControl(
|
||||||
|
derived_id=derived_id_for(entry),
|
||||||
|
source_id=entry["id"],
|
||||||
|
kind=entry["kind"],
|
||||||
|
canonical_name=title_de_clean or entry["title_de"],
|
||||||
|
description=output,
|
||||||
|
plagiarism_score=round(score, 4),
|
||||||
|
related_quaidal_ids=entry["referenced_ids"],
|
||||||
|
external_refs=entry["external_refs"],
|
||||||
|
source={
|
||||||
|
"framework": "BSI QUAIDAL",
|
||||||
|
"section": entry["id"],
|
||||||
|
"title_original_de": entry["title_de"],
|
||||||
|
"url": f"{QUAIDAL_REPO_URL}/blob/main/{entry['source_path'].replace(' ', '%20')}",
|
||||||
|
"commit_sha": None, # filled in by main()
|
||||||
|
"license_note": "§ 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Output writers
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
def control_to_dict(c: DerivedControl) -> dict:
|
||||||
|
d = {
|
||||||
|
"id": c.derived_id,
|
||||||
|
"canonical_name": c.canonical_name,
|
||||||
|
"description": c.description,
|
||||||
|
"kind": c.kind,
|
||||||
|
"regulation_anchor": "EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)",
|
||||||
|
"related_quaidal_ids": c.related_quaidal_ids,
|
||||||
|
"external_refs": c.external_refs,
|
||||||
|
"source": c.source,
|
||||||
|
"plagiarism_score_at_generation": c.plagiarism_score,
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def write_yaml_per_kind(controls: list[DerivedControl], commit_sha: str | None) -> dict[str, Path]:
|
||||||
|
out: dict[str, list[dict]] = {}
|
||||||
|
for c in controls:
|
||||||
|
c.source["commit_sha"] = commit_sha
|
||||||
|
fname = KIND_TO_OUTPUT_FILE.get(c.kind, "other.yaml")
|
||||||
|
out.setdefault(fname, []).append(control_to_dict(c))
|
||||||
|
|
||||||
|
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
written: dict[str, Path] = {}
|
||||||
|
for fname, items in out.items():
|
||||||
|
path = OUTPUT_DIR / fname
|
||||||
|
payload = {
|
||||||
|
"source": "Derived from BSI QUAIDAL (Clean-Room)",
|
||||||
|
"source_url": QUAIDAL_REPO_URL,
|
||||||
|
"commit_sha": commit_sha,
|
||||||
|
"plagiarism_limit_4gram": PLAGIARISM_LIMIT,
|
||||||
|
"generated_by_model": OLLAMA_MODEL,
|
||||||
|
"controls": items,
|
||||||
|
}
|
||||||
|
path.write_text(yaml.safe_dump(payload, allow_unicode=True, sort_keys=False), encoding="utf-8")
|
||||||
|
written[fname] = path
|
||||||
|
return written
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# CLI
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
ap = argparse.ArgumentParser(description=__doc__)
|
||||||
|
ap.add_argument("--only", help="Derive only this QUAIDAL ID (e.g. QKB-01)")
|
||||||
|
ap.add_argument("--kind", help="Derive only entries of this kind (criterion/building_block/measure/metric)")
|
||||||
|
ap.add_argument("--limit", type=int, help="Process at most N entries")
|
||||||
|
ap.add_argument("--dry-run", action="store_true", help="Print derived controls instead of writing YAML")
|
||||||
|
ap.add_argument("--ollama-host", default="macmini", help="Ollama host (default: macmini)")
|
||||||
|
ap.add_argument("--model", default=OLLAMA_MODEL)
|
||||||
|
ap.add_argument("--verbose", action="store_true")
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
if not INDEX_FILE.exists():
|
||||||
|
print(f"ERROR: missing index. Run ingest_bsi_quaidal.py first ({INDEX_FILE})", file=sys.stderr)
|
||||||
|
return 2
|
||||||
|
index = json.loads(INDEX_FILE.read_text(encoding="utf-8"))
|
||||||
|
entries = index["entries"]
|
||||||
|
if args.only:
|
||||||
|
entries = [e for e in entries if e["id"].upper() == args.only.upper()]
|
||||||
|
if args.kind:
|
||||||
|
entries = [e for e in entries if e["kind"] == args.kind]
|
||||||
|
if args.limit:
|
||||||
|
entries = entries[: args.limit]
|
||||||
|
|
||||||
|
if not entries:
|
||||||
|
print("No entries match the filter.", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
ollama_url = args.ollama_host if "://" in args.ollama_host else f"http://{args.ollama_host}:11434"
|
||||||
|
print(f"Derivation: {len(entries)} entries, model={args.model}, ollama={ollama_url}, limit={PLAGIARISM_LIMIT:.0%}", file=sys.stderr)
|
||||||
|
|
||||||
|
derived: list[DerivedControl] = []
|
||||||
|
failed: list[tuple[str, str]] = []
|
||||||
|
for i, entry in enumerate(entries, 1):
|
||||||
|
if args.verbose:
|
||||||
|
print(f"[{i}/{len(entries)}] {entry['id']} ({entry['kind']}): {entry['title_de']}", file=sys.stderr)
|
||||||
|
try:
|
||||||
|
extract = load_source_extract(entry["source_path"])
|
||||||
|
ctrl = derive_one(entry, extract, ollama_url, args.model, verbose=args.verbose)
|
||||||
|
derived.append(ctrl)
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
failed.append((entry["id"], str(exc)))
|
||||||
|
print(f" FAILED {entry['id']}: {exc}", file=sys.stderr)
|
||||||
|
|
||||||
|
print(f"\nDerived: {len(derived)} | Failed: {len(failed)}", file=sys.stderr)
|
||||||
|
|
||||||
|
if args.dry_run:
|
||||||
|
for c in derived:
|
||||||
|
c.source["commit_sha"] = index.get("commit_sha")
|
||||||
|
print(yaml.safe_dump(control_to_dict(c), allow_unicode=True, sort_keys=False))
|
||||||
|
print("---")
|
||||||
|
return 0 if not failed else 1
|
||||||
|
|
||||||
|
written = write_yaml_per_kind(derived, index.get("commit_sha"))
|
||||||
|
for fname, path in written.items():
|
||||||
|
print(f"Wrote {path.relative_to(REPO_ROOT)} ({sum(1 for c in derived if KIND_TO_OUTPUT_FILE[c.kind] == fname)} entries)", file=sys.stderr)
|
||||||
|
|
||||||
|
if failed:
|
||||||
|
print("\nFailures:", file=sys.stderr)
|
||||||
|
for fid, msg in failed:
|
||||||
|
print(f" - {fid}: {msg.splitlines()[0]}", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Parse BSI QUAIDAL Markdown catalog into a structural index.
|
||||||
|
|
||||||
|
Clean-Room principle: this script does NOT persist any QUAIDAL prose to disk.
|
||||||
|
It only extracts non-protectable structural facts (IDs, type, file paths,
|
||||||
|
cross-references to other QUAIDAL entries, references to external norms).
|
||||||
|
|
||||||
|
The derivation step (derive_quaidal_mcs.py) reads the index plus the original
|
||||||
|
.md files from the gitignored clone and asks the LLM to produce our own
|
||||||
|
wordings, never copying the BSI prose into our own controls/database.
|
||||||
|
|
||||||
|
Input: legal-sources/bsi-quaidal/0000_Markdown/**/*.md (gitignored clone)
|
||||||
|
Output: control-pipeline/data/quaidal/quaidal_index.json (structural only)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python3 control-pipeline/scripts/ingest_bsi_quaidal.py
|
||||||
|
python3 control-pipeline/scripts/ingest_bsi_quaidal.py --check # validate only
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from dataclasses import asdict, dataclass, field
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
import yaml
|
||||||
|
except ImportError:
|
||||||
|
print("ERROR: PyYAML missing. Install with: pip install pyyaml", file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
SOURCE_ROOT = REPO_ROOT / "legal-sources" / "bsi-quaidal"
|
||||||
|
MARKDOWN_ROOT = SOURCE_ROOT / "0000_Markdown"
|
||||||
|
OUTPUT_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
|
||||||
|
OUTPUT_FILE = OUTPUT_DIR / "quaidal_index.json"
|
||||||
|
|
||||||
|
# Map folder name -> our internal kind. Sub-folders inside the Methoden tree
|
||||||
|
# (e.g. "QM-10_Dimension Reduction") are treated as method variants of their
|
||||||
|
# parent QM.
|
||||||
|
KIND_BY_PARENT_DIR = {
|
||||||
|
"0000_Qualitätskriterien": "criterion", # QKB → Master Control candidates
|
||||||
|
"0001_Qualitätsbausteine": "building_block", # QB → atomic controls
|
||||||
|
"0002_Maßnahmen": "measure", # M → mitigations
|
||||||
|
"0003_Qualitätsmetriken_methoden": "metric", # QM → runtime check / metric
|
||||||
|
"0002_Referenz-Matrizen": "matrix", # cross-walk matrix
|
||||||
|
"9998_CustomTemplates": "template",
|
||||||
|
}
|
||||||
|
|
||||||
|
FRONTMATTER_RE = re.compile(r"^---\s*\n(.*?)\n---\s*\n", re.DOTALL)
|
||||||
|
ID_RE = re.compile(r"\b((?:QKB|QB|MA|QM)-\d+[a-zA-Z]?)", re.IGNORECASE)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class IndexEntry:
|
||||||
|
id: str # Canonical ID: QKB-01, QB-03, M-12, QM-07
|
||||||
|
kind: str # criterion / building_block / measure / metric / matrix / template
|
||||||
|
title_de: str
|
||||||
|
title_en: str
|
||||||
|
source_path: str # relative to SOURCE_ROOT
|
||||||
|
referenced_ids: list[str] = field(default_factory=list) # other QUAIDAL IDs linked in this file
|
||||||
|
external_refs: list[dict] = field(default_factory=list) # {framework, citation, ref_id}
|
||||||
|
tags: list[str] = field(default_factory=list)
|
||||||
|
share: bool | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def parse_frontmatter(text: str) -> dict:
|
||||||
|
m = FRONTMATTER_RE.match(text)
|
||||||
|
if not m:
|
||||||
|
return {}
|
||||||
|
try:
|
||||||
|
return yaml.safe_load(m.group(1)) or {}
|
||||||
|
except yaml.YAMLError:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def canonical_id(raw_id: str | list | None, filename: str) -> str | None:
|
||||||
|
"""QUAIDAL files sometimes list multiple IDs or odd casing — normalise."""
|
||||||
|
candidates: list[str] = []
|
||||||
|
if isinstance(raw_id, list):
|
||||||
|
candidates.extend(str(x) for x in raw_id)
|
||||||
|
elif isinstance(raw_id, str):
|
||||||
|
candidates.append(raw_id)
|
||||||
|
# Fallback: derive from filename
|
||||||
|
candidates.append(filename)
|
||||||
|
for c in candidates:
|
||||||
|
m = ID_RE.search(c)
|
||||||
|
if m:
|
||||||
|
return m.group(1).upper().replace(" ", "-")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def determine_kind(path: Path) -> str:
|
||||||
|
for parent in path.parents:
|
||||||
|
if parent.name in KIND_BY_PARENT_DIR:
|
||||||
|
return KIND_BY_PARENT_DIR[parent.name]
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
|
|
||||||
|
def collect_referenced_ids(body: str, own_id: str) -> list[str]:
|
||||||
|
found = {m.group(1).upper() for m in ID_RE.finditer(body)}
|
||||||
|
found.discard(own_id)
|
||||||
|
return sorted(found)
|
||||||
|
|
||||||
|
|
||||||
|
REF_FRAMEWORKS = [
|
||||||
|
("AI Act", ["AI-Act", "AI Act", "Verordnung (EU) 2024/1689", "KI-VO"]),
|
||||||
|
("EU GDPR", ["DSGVO", "Verordnung (EU) 2016/679", "GDPR"]),
|
||||||
|
("ISO/IEC 25012", ["ISO/IEC 25012", "ISO 25012"]),
|
||||||
|
("ISO/IEC 25024", ["ISO/IEC 25024", "ISO 25024"]),
|
||||||
|
("ISO/IEC 23894", ["ISO/IEC 23894", "ISO 23894"]),
|
||||||
|
("ISO/IEC 42001", ["ISO/IEC 42001", "ISO 42001"]),
|
||||||
|
("NIST AI RMF", ["NIST AI RMF", "AI Risk Management Framework"]),
|
||||||
|
("BSI Grundschutz", ["IT-Grundschutz", "Grundschutz"]),
|
||||||
|
("BSI AIC4", ["AIC4", "AI Cloud Service Compliance Criteria"]),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def detect_external_refs(body: str) -> list[dict]:
|
||||||
|
refs: list[dict] = []
|
||||||
|
seen: set[tuple[str, str]] = set()
|
||||||
|
# Section "Referenzen" tables — pick up first column ref-id and first
|
||||||
|
# textual hit of the framework. We do NOT store the BSI "Kurzbeschr."
|
||||||
|
# column to avoid copying their prose.
|
||||||
|
for line in body.splitlines():
|
||||||
|
for framework, patterns in REF_FRAMEWORKS:
|
||||||
|
for pat in patterns:
|
||||||
|
if pat.lower() in line.lower():
|
||||||
|
# Try to grab an article/section nearby (e.g. "Artikel 10")
|
||||||
|
art = re.search(r"(Artikel|Art\.?|Section|§)\s*([0-9]+[a-z]?)", line, re.IGNORECASE)
|
||||||
|
citation = f"{art.group(1)} {art.group(2)}" if art else None
|
||||||
|
key = (framework, citation or "")
|
||||||
|
if key in seen:
|
||||||
|
continue
|
||||||
|
seen.add(key)
|
||||||
|
refs.append({"framework": framework, "citation": citation})
|
||||||
|
break
|
||||||
|
return refs
|
||||||
|
|
||||||
|
|
||||||
|
def parse_file(path: Path) -> IndexEntry | None:
|
||||||
|
text = path.read_text(encoding="utf-8")
|
||||||
|
fm = parse_frontmatter(text)
|
||||||
|
body = text[text.find("---", 3) + 3 :] if text.startswith("---") else text
|
||||||
|
|
||||||
|
own_id = canonical_id(fm.get("ID"), path.stem)
|
||||||
|
if not own_id:
|
||||||
|
return None
|
||||||
|
|
||||||
|
title_de = str(fm.get("TitleGer") or fm.get("Title") or path.stem).strip()
|
||||||
|
title_en = str(fm.get("Title") or "").strip()
|
||||||
|
tags_raw = fm.get("tags") or []
|
||||||
|
if isinstance(tags_raw, str):
|
||||||
|
tags_raw = [tags_raw]
|
||||||
|
tags = [str(t).strip() for t in tags_raw if t]
|
||||||
|
|
||||||
|
share_val = fm.get("share")
|
||||||
|
share = bool(share_val) if share_val is not None else None
|
||||||
|
|
||||||
|
return IndexEntry(
|
||||||
|
id=own_id,
|
||||||
|
kind=determine_kind(path),
|
||||||
|
title_de=title_de,
|
||||||
|
title_en=title_en,
|
||||||
|
source_path=str(path.relative_to(SOURCE_ROOT)),
|
||||||
|
referenced_ids=collect_referenced_ids(body, own_id),
|
||||||
|
external_refs=detect_external_refs(body),
|
||||||
|
tags=tags,
|
||||||
|
share=share,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_commit_sha() -> str | None:
|
||||||
|
try:
|
||||||
|
out = subprocess.run(
|
||||||
|
["git", "-C", str(SOURCE_ROOT), "rev-parse", "HEAD"],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return out.stdout.strip()
|
||||||
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
ap = argparse.ArgumentParser(description=__doc__)
|
||||||
|
ap.add_argument("--check", action="store_true", help="Parse + validate, do not write output")
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
if not MARKDOWN_ROOT.exists():
|
||||||
|
print(f"ERROR: clone not found at {SOURCE_ROOT}", file=sys.stderr)
|
||||||
|
print("Run: git clone --depth=1 https://github.com/BSI-Bund/QUAIDAL.git legal-sources/bsi-quaidal", file=sys.stderr)
|
||||||
|
return 2
|
||||||
|
|
||||||
|
entries: list[IndexEntry] = []
|
||||||
|
skipped: list[Path] = []
|
||||||
|
for path in sorted(MARKDOWN_ROOT.rglob("*.md")):
|
||||||
|
entry = parse_file(path)
|
||||||
|
if entry is None:
|
||||||
|
skipped.append(path)
|
||||||
|
continue
|
||||||
|
entries.append(entry)
|
||||||
|
|
||||||
|
by_kind: dict[str, int] = {}
|
||||||
|
for e in entries:
|
||||||
|
by_kind[e.kind] = by_kind.get(e.kind, 0) + 1
|
||||||
|
|
||||||
|
print(f"Parsed {len(entries)} entries (skipped {len(skipped)} without ID):")
|
||||||
|
for kind, count in sorted(by_kind.items()):
|
||||||
|
print(f" {kind:18s} {count}")
|
||||||
|
|
||||||
|
if args.check:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
payload = {
|
||||||
|
"source": "BSI QUAIDAL",
|
||||||
|
"source_url": "https://github.com/BSI-Bund/QUAIDAL",
|
||||||
|
"commit_sha": get_commit_sha(),
|
||||||
|
"license_note": (
|
||||||
|
"BSI-Veroeffentlichung. Repo enthaelt keine SPDX-Lizenzdatei. "
|
||||||
|
"Frontmatter share:true. Veroeffentlichung durch Bundesbehoerde, "
|
||||||
|
"§ 5 UrhG (amtliche Werke) anwendbar. BSI hat 05/2026 die Annahme "
|
||||||
|
"CC-BY-SA-4.0 in unserer Anfrage nicht widersprochen, aber auch "
|
||||||
|
"nicht aktiv bestaetigt. Wir derivieren Clean-Room (eigene "
|
||||||
|
"Formulierungen, nur Referenz auf BSI QUAIDAL Sektion)."
|
||||||
|
),
|
||||||
|
"entries": [asdict(e) for e in entries],
|
||||||
|
}
|
||||||
|
OUTPUT_FILE.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||||
|
print(f"\nWrote index: {OUTPUT_FILE.relative_to(REPO_ROOT)}")
|
||||||
|
print(f"Commit SHA: {payload['commit_sha']}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Reference in New Issue
Block a user