Spaces:
Sleeping
Sleeping
| 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() |