Zum Inhalt

BASO Fragebogen-Modul

Das BASO-Modul unterstützt die Bearbeitung von BASO/ForumISM-Sicherheitsfragebögen im XLSX-Format. Es erkennt vorausgefüllte Fragebögen, baut daraus eine Wissensdatenbank auf und generiert KI-Prompts für neue Fragebögen.

Verzeichnisstruktur

baso/
├── __init__.py
├── __main__.py          # Delegiert an cli.py
├── cli.py               # CLI-Einstiegspunkt (argparse)
├── config.py            # Konfigurationsmanagement
├── db.py                # SQLite-Schema + CRUD
├── io_xlsx.py           # XLSX lesen (2 Layouts)
├── io_docx.py           # DOCX-Sikos einlesen
├── prompts.py           # Prompt-Generierung
├── apply_answers.py     # JSON-Antworten in XLSX schreiben
├── retrieval.py         # Fuzzy-Matching
├── textnorm.py          # Textnormalisierung
├── gui_module.py        # Tkinter-GUI (BasoModuleFrame)
└── gui.py               # Legacy-Standalone-GUI

Konfiguration

Datei: baso.config.json im Projektstamm

Schlüssel Standard Beschreibung
paths.source_dir data/baso/quelle Bereits ausgefüllte Fragebögen
paths.new_dir data/baso/neu Neue (leere) Fragebögen
paths.sikos_dir data/shared/sikos Sicherheitskonzepte (DOCX)
paths.db_path data/db/baso.sqlite SQLite-Datenbank
paths.prompts_dir out/baso/prompts Erzeugte Prompt-Dateien
paths.answers_dir out/baso/answers Abgelegte JSON-Antworten
paths.filled_dir out/baso/filled Befüllte XLSX-Ausgabe
Schlüssel Standard Beschreibung
ui.evaluated_by "Martin Zeifang" Prüferkürzel in Ausgabedokumenten
ui.top_k 3 Anzahl ähnlicher Beispiele im Prompt
ui.batch_size 20 Fragen pro Prompt-Datei
ui.test_mode false Beschränkt Verarbeitung auf wenige Elemente
ui.debug_mode true Schreibt Debug-Log
Schlüssel Beschreibung
prompt.header Einleitungstext der Prompt-Dateien
prompt.style_system Anweisungstext für System-Layout
prompt.style_service Anweisungstext für Service-Layout
prompt.system_statuses Erlaubte Umsetzungsstatus-Werte
prompt.service_contract_values Erlaubte Vertragswerte (Ja, Nein, Nicht anwendbar)

XLSX-Layouts

Das Modul erkennt zwei unterschiedliche Fragebogen-Layouts:

Layout "system" (Quelldateien aus quelle/)

Spalte Beschreibung
Titel Abschnittsüberschrift
BASO-ID Eindeutige Kennung der Anforderung
Frage / Sollmaßnahme Fragentext
Schutzziel Z.B. Vertraulichkeit, Integrität, Verfügbarkeit
Umsetzung Status der Umsetzung
Bemerkung Freitext-Anmerkungen

Layout "service" (Neue Dienstleistungsfragebögen aus neu/)

Spalte Beschreibung
Titel Abschnittsüberschrift
Frage / Sollmaßnahme Fragentext
Vertraglich zugesichert Ja / Nein / Nicht anwendbar
Operativ umgesetzt Umsetzungsstatus
Bemerkung Freitext; Schutzziele werden hier eingetragen

Datenmodell

@dataclass(frozen=True)
class XlsxItem:
    file_name: str
    sheet_name: str
    row: int
    layout: str              # "system" oder "service"
    title: str
    question: str
    schutzziel: str | None = None
    umsetzung: str | None = None
    bemerkung_umsetzung: str | None = None
    baso_id: str | None = None
    contract_assured: str | None = None
    ops_met: str | None = None
    bemerkung: str | None = None

Datenbankfunktionen

baso/db.py

Funktion Beschreibung
ensure_db(db_path) Erstellt Schema wenn nicht vorhanden
ingest_questionnaires(source_dir, db_path, progress) Liest XLSX-Fragebögen ein
ingest_sikos(sikos_dir, db_path, progress) Liest DOCX-Sikos ein
fetch_answered_items(db_path, limit) Gibt beantwortete Elemente zurück
fetch_siko_paragraphs(db_path, limit) Gibt Siko-Absätze zurück

Ähnlichkeitssuche

baso/retrieval.py + baso/textnorm.py

def top_matches(
    query: str,
    candidates: list[dict],
    text_key: str,
    top_k: int = 5
) -> list[Match]:
    ...

Verwendet rapidfuzz.fuzz.token_set_ratio nach Textnormalisierung: - Kleinschreibung - Entfernung von Satzzeichen - Kollabieren mehrfacher Leerzeichen

Der token_set_ratio ist reihenfolgeunabhängig und funktioniert auch bei Teilmengen-Ähnlichkeit.

GUI (BasoModuleFrame)

Die Tkinter-Benutzeroberfläche bietet:

Schaltfläche Aktion
Fragebögen einlesen ingest_questionnaires()
Sikos einlesen ingest_sikos()
Prompts erstellen Fuzzy-Match + Prompt-Generierung
Fragebögen befüllen apply_answers() (grüner Button)

Über Bearbeiten → Projekteinstellungen / Prompt-Einstellungen kann die Konfiguration direkt in der GUI angepasst werden.

CLI

# Fragebögen einlesen
python -m baso ingest --source data/baso/quelle --db data/db/baso.sqlite

# Sikos einlesen
python -m baso ingest-sikos --sikos data/shared/sikos --db data/db/baso.sqlite

# Prompts erstellen
python -m baso prepare \
    --new data/baso/neu \
    --db data/db/baso.sqlite \
    --out out/baso/prompts \
    [--top 3] \
    [--batch-size 20] \
    [--answers-out out/baso/answers]

# Antworten eintragen
python -m baso apply \
    --new data/baso/neu \
    --answers out/baso/answers \
    --out out/baso/filled \
    [--by "Martin Zeifang"]

# GUI starten
python -m baso gui

Sicherheitshinweise

  • Maximale XLSX-Größe: 10.000 Zeilen, 200 Spalten, 25 MB
  • Office-Dateien werden auf gültige ZIP-Struktur geprüft (Anti-Zip-Bomb)
  • Pfade werden gegen das Workspace-Root validiert (kein Path-Traversal)