Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 42s
CI / test-go-edu-search (push) Successful in 34s
CI / test-python-klausur (push) Failing after 2m51s
CI / test-python-agent-core (push) Successful in 21s
CI / test-nodejs-website (push) Successful in 29s
sed replacement left orphaned hostname references in story page and empty lines in getApiBase functions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
186 lines
9.6 KiB
TypeScript
186 lines
9.6 KiB
TypeScript
'use client'
|
|
|
|
export function TabArchitecture() {
|
|
return (
|
|
<div className="space-y-6">
|
|
{/* Architecture Diagram */}
|
|
<ArchitectureDiagram />
|
|
|
|
{/* Components */}
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
<ComponentCard
|
|
icon="🔍"
|
|
title="TrOCR Service"
|
|
description="Das TrOCR-Modell von Microsoft ist speziell fuer Handschrifterkennung trainiert. Es verwendet eine Vision-Transformer (ViT) Architektur fuer Bildverarbeitung und einen Text-Decoder fuer die Textgenerierung."
|
|
specs={[
|
|
{ label: 'Modell', value: 'microsoft/trocr-base-handwritten' },
|
|
{ label: 'Groesse', value: '~350 MB' },
|
|
{ label: 'Lizenz', value: 'MIT' },
|
|
{ label: 'Framework', value: 'PyTorch / Transformers' },
|
|
]}
|
|
/>
|
|
<ComponentCard
|
|
icon="🎯"
|
|
title="LoRA Fine-Tuning"
|
|
description="LoRA fuegt kleine, trainierbare Matrizen zu bestimmten Schichten hinzu, ohne das Basismodell zu veraendern. Dies ermoeglicht effizientes Fine-Tuning mit minimaler Speichernutzung."
|
|
specs={[
|
|
{ label: 'Methode', value: 'Low-Rank Adaptation' },
|
|
{ label: 'Adapter-Groesse', value: '~10 MB' },
|
|
{ label: 'Trainingszeit', value: '5-15 Min (CPU)' },
|
|
{ label: 'Min. Beispiele', value: '10' },
|
|
]}
|
|
/>
|
|
<ComponentCard
|
|
icon="🔒"
|
|
title="Pseudonymisierung"
|
|
description="Schuelernamen werden durch anonyme Tokens ersetzt, bevor Daten die lokale Umgebung verlassen. Das Mapping wird ausschliesslich lokal gespeichert."
|
|
specs={[
|
|
{ label: 'Methode', value: 'QR-Code Tokens' },
|
|
{ label: 'Token-Format', value: 'UUID v4' },
|
|
{ label: 'Mapping', value: 'Lokal beim Lehrer' },
|
|
{ label: 'Cloud-Daten', value: 'Nur Tokens + Text' },
|
|
]}
|
|
/>
|
|
<ComponentCard
|
|
icon="☁️"
|
|
title="Cloud LLM"
|
|
description="Die KI-Korrektur erfolgt auf deutschen Servern mit strikter Mandantentrennung. Es werden keine Klarnamen oder identifizierenden Informationen uebertragen."
|
|
specs={[
|
|
{ label: 'Provider', value: 'SysEleven (DE)' },
|
|
{ label: 'Standort', value: 'Deutschland' },
|
|
{ label: 'Isolation', value: 'Namespace pro Schule' },
|
|
{ label: 'Datenverarbeitung', value: 'Nur pseudonymisiert' },
|
|
]}
|
|
/>
|
|
</div>
|
|
|
|
{/* Data Flow */}
|
|
<DataFlowCard />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
function ArchitectureDiagram() {
|
|
return (
|
|
<div className="bg-white rounded-xl shadow-sm border p-6">
|
|
<h2 className="text-lg font-semibold text-slate-900 mb-6">Systemarchitektur</h2>
|
|
|
|
<div className="bg-slate-900 rounded-lg p-6 font-mono text-xs overflow-x-auto">
|
|
<pre className="text-slate-300">
|
|
{`┌─────────────────────────────────────────────────────────────────────────────┐
|
|
│ MAGIC HELP ARCHITEKTUR │
|
|
├─────────────────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌───────────────┐ ┌──────────────────┐ ┌───────────────┐ │
|
|
│ │ FRONTEND │ │ BACKEND │ │ STORAGE │ │
|
|
│ │ (Next.js) │ │ (FastAPI) │ │ │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ ┌─────────┐ │ REST │ ┌────────────┐ │ │ ┌─────────┐ │ │
|
|
│ │ │ Admin │──┼─────────┼──│ TrOCR │ │ │ │ Models │ │ │
|
|
│ │ │ Panel │ │ │ │ Service │──┼─────────┼──│ (ONNX) │ │ │
|
|
│ │ └─────────┘ │ │ └────────────┘ │ │ └─────────┘ │ │
|
|
│ │ │ │ │ │ │ │ │
|
|
│ │ ┌─────────┐ │ WebSocket│ ┌────────────┐ │ │ ┌─────────┐ │ │
|
|
│ │ │ Lehrer │──┼─────────┼──│ Klausur │ │ │ │ LoRA │ │ │
|
|
│ │ │ Portal │ │ │ │ Processor │──┼─────────┼──│ Adapter │ │ │
|
|
│ │ └─────────┘ │ │ └────────────┘ │ │ └─────────┘ │ │
|
|
│ │ │ │ │ │ │ │ │
|
|
│ └───────────────┘ │ ┌────────────┐ │ │ ┌─────────┐ │ │
|
|
│ │ │ Pseudo- │ │ │ │Training │ │ │
|
|
│ │ │ nymizer │──┼─────────┼──│ Data │ │ │
|
|
│ │ └────────────┘ │ │ └─────────┘ │ │
|
|
│ │ │ │ │ │
|
|
│ └──────────────────┘ └───────────────┘ │
|
|
│ │ │
|
|
│ │ (nur pseudonymisiert) │
|
|
│ ▼ │
|
|
│ ┌──────────────────┐ │
|
|
│ │ CLOUD LLM │ │
|
|
│ │ (SysEleven) │ │
|
|
│ │ Namespace- │ │
|
|
│ │ Isolation │ │
|
|
│ └──────────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────────────────┘`}
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
interface ComponentCardProps {
|
|
icon: string
|
|
title: string
|
|
description: string
|
|
specs: Array<{ label: string; value: string }>
|
|
}
|
|
|
|
function ComponentCard({ icon, title, description, specs }: ComponentCardProps) {
|
|
return (
|
|
<div className="bg-white rounded-xl shadow-sm border p-6">
|
|
<h3 className="text-lg font-semibold text-slate-900 mb-4 flex items-center gap-2">
|
|
<span>{icon}</span> {title}
|
|
</h3>
|
|
<div className="space-y-3 text-sm">
|
|
{specs.map((spec) => (
|
|
<div key={spec.label} className="flex justify-between">
|
|
<span className="text-slate-500">{spec.label}</span>
|
|
<span className="text-slate-900">{spec.value}</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
<p className="text-slate-500 text-sm mt-4">{description}</p>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const DATA_FLOW_STEPS = [
|
|
{
|
|
num: 1,
|
|
color: 'bg-blue-100 text-blue-600',
|
|
title: 'Lokale Header-Extraktion',
|
|
desc: 'TrOCR erkennt Schuelernamen, Klasse und Fach direkt im Browser/PWA (offline-faehig)',
|
|
},
|
|
{
|
|
num: 2,
|
|
color: 'bg-purple-100 text-purple-600',
|
|
title: 'Pseudonymisierung',
|
|
desc: 'Namen werden durch QR-Code Tokens ersetzt, Mapping bleibt lokal',
|
|
},
|
|
{
|
|
num: 3,
|
|
color: 'bg-green-100 text-green-600',
|
|
title: 'Cloud-Korrektur',
|
|
desc: 'Nur pseudonymisierte Dokument-Tokens werden an die KI gesendet',
|
|
},
|
|
{
|
|
num: 4,
|
|
color: 'bg-yellow-100 text-yellow-600',
|
|
title: 'Re-Identifikation',
|
|
desc: 'Ergebnisse werden lokal mit dem Mapping wieder den echten Namen zugeordnet',
|
|
},
|
|
]
|
|
|
|
function DataFlowCard() {
|
|
return (
|
|
<div className="bg-white rounded-xl shadow-sm border p-6">
|
|
<h2 className="text-lg font-semibold text-slate-900 mb-4">Datenfluss</h2>
|
|
<div className="space-y-4">
|
|
{DATA_FLOW_STEPS.map((step) => (
|
|
<div key={step.num} className="flex items-start gap-4 bg-slate-50 rounded-lg p-4">
|
|
<div className={`w-8 h-8 rounded-full ${step.color} flex items-center justify-center font-bold`}>
|
|
{step.num}
|
|
</div>
|
|
<div>
|
|
<div className="font-medium text-slate-900">{step.title}</div>
|
|
<div className="text-sm text-slate-500">{step.desc}</div>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|