structguard / app.py
joachim-ganter's picture
Create app.py
820af45 verified
Raw
History Blame Contribute Delete
2.8 kB
import gradio as ui
import numpy as np
import json
from structguard import StructGuard, StructGuardValidator, Schema
# 1. Standard-Schema definieren
default_schema = Schema({
"text": str,
"kategorie": ["Dosierung", "Einheit", "Negation", "Semantik"],
"quelle": str,
})
def pipeline_demonstration(json_input, query_val, answer_val):
try:
# JSON-Output parsen
output_dict = json.loads(json_input)
except Exception as e:
return "⚠️ Ungültiges JSON-Format im Eingabefeld!", "ABGELEHNT", 0.0
# Einfache Dummy-Embeddings aus den numerischen Schiebereglern simulieren
q_emb = np.array([float(query_val), 0.0, 0.0])
a_emb = np.array([float(answer_val), 0.0, 0.0])
# StructGuard initialisieren
sem_validator = StructGuardValidator()
guard = StructGuard(schema=default_schema, semantic_validator=sem_validator)
# Validierung ausführen
verdict = guard.pruefen(answer=output_dict, query_emb=q_emb, answer_emb=a_emb)
# Ergebnis für die Verknüpfung mit SENTRY-DVL aufbereiten
sentry_status = "WARTET" if verdict.ist_freigegeben() else "BLOCKIERT (Early-Exit)"
details_str = json.dumps(verdict.details, indent=2)
fehler_str = ", ".join(verdict.fehler) if verdict.fehler else "Keine Fehler"
report = f"--- 🛠️ PIPELINE REPORT ---\n" \
f"Phase 1 & 2 Fehler: {fehler_str}\n" \
f"Status für SENTRY-DVL: {sentry_status}\n\n" \
f"Audit-Trail Details:\n{details_str}"
return report, verdict.status, verdict.score
# Gradio Interface aufbauen
with ui.Blocks(title="StructGuard v2.1 Demo") as demo:
ui.Markdown("# 🛡️ StructGuard v2.1")
ui.Markdown("### Structural & Semantic Validation Layer for LLM Outputs")
ui.Markdown("Diese Demo simuliert die Eingangsschicht vor der Übergabe an SENTRY-DVL.")
with ui.Row():
with ui.Column():
json_box = ui.Textbox(
label="LLM Output (JSON)",
value='{"text": "Metformin 500 mg", "kategorie": "Dosierung", "quelle": "Arzt"}',
lines=5
)
q_slider = ui.Slider(0.0, 1.0, value=1.0, label="Query Vektor Komponente X")
a_slider = ui.Slider(0.0, 1.0, value=0.95, label="Answer Vektor Komponente X")
btn = ui.Button("Output validieren", variant="primary")
with ui.Column():
status_box = ui.Textbox(label="Verdict Status")
score_box = ui.Number(label="Kohärenz-Score")
report_box = ui.Code(label="Pipeline Verbindung & Log", language="json")
btn.click(
fn=pipeline_demonstration,
inputs=[json_box, q_slider, a_slider],
outputs=[report_box, status_box, score_box]
)
demo.launch()