Zum Inhalt

Evaluation Datenformate

Version: 1.0 | Status: Aktiv

Diese Dokumentation beschreibt die JSON-Schemas für alle 7 Evaluationstypen in LLARS. Nutze die Minimalbeispiele für einen schnellen Start und die vollständigen Beispiele als Referenz.


Übersicht

Typ function_type_id Verwendung
Ranking 1 Items in Qualitätsbuckets sortieren
Rating 2 Multi-dimensionale Bewertung (LLM Evaluator)
Mail Rating 3 E-Mail-Verläufe bewerten
Comparison 4 Paarweiser A/B-Vergleich
Authenticity 5 Echt/Fake-Klassifikation
Labeling 7 Kategorien zuweisen
Communication Comparison 8 Beratungs-A/B — Rater wählt, welche Antwort er „abschicken" würde (gleiches Datenformat wie Comparison, eigene UI mit Send-Animation)
Conversation Labeling 9 Sinneinheiten („Spans") innerhalb eines Gesprächs einzeln labeln — ein Item = ein Gespräch = viele Entscheidungen

Schnellstart: Minimalbeispiele

Ranking (Minimal)

{
  "schema_version": "1.0",
  "type": "ranking",
  "items": [
    { "id": "item_1", "label": "Text 1", "content": "Erster Text zum Ranken" },
    { "id": "item_2", "label": "Text 2", "content": "Zweiter Text zum Ranken" }
  ],
  "config": {
    "mode": "simple",
    "buckets": [
      { "id": "good", "label": { "de": "Gut", "en": "Good" }, "color": "#98d4bb", "order": 1 },
      { "id": "poor", "label": { "de": "Schlecht", "en": "Poor" }, "color": "#e8a087", "order": 2 }
    ],
    "allow_ties": true,
    "require_complete": true
  }
}

Rating (Minimal)

{
  "schema_version": "1.0",
  "type": "rating",
  "items": [
    { "id": "item_1", "label": "Zu bewertender Text", "content": "Der Text, der bewertet werden soll." }
  ],
  "config": {
    "scale": { "min": 1, "max": 5, "step": 1 },
    "dimensions": [
      { "id": "quality", "label": { "de": "Qualität", "en": "Quality" }, "weight": 1.0 }
    ],
    "show_overall": false
  }
}

Comparison (Minimal)

{
  "schema_version": "1.0",
  "type": "comparison",
  "items": [
    { "id": "item_a", "label": "Option A", "content": "Erste Option" },
    { "id": "item_b", "label": "Option B", "content": "Zweite Option" }
  ],
  "config": {
    "question": { "de": "Welche Option ist besser?", "en": "Which option is better?" },
    "allow_tie": true,
    "show_source": false
  }
}

Labeling (Minimal)

{
  "schema_version": "1.0",
  "type": "labeling",
  "items": [
    { "id": "item_1", "label": "Text", "content": "Zu klassifizierender Text" }
  ],
  "config": {
    "mode": "single",
    "labels": [
      { "id": "positive", "label": { "de": "Positiv", "en": "Positive" } },
      { "id": "negative", "label": { "de": "Negativ", "en": "Negative" } }
    ],
    "allow_other": false
  }
}

Basis-Schema

Alle Evaluationstypen folgen dieser Grundstruktur:

interface EvaluationData {
  schema_version: "1.0";
  type: "ranking" | "rating" | "mail_rating" | "comparison" | "authenticity" | "labeling"
      | "communication_comparison" | "conversation_labeling";

  // Optional: Kontext/Referenz (rechts im Interface)
  reference?: Reference;

  // Items zum Bewerten (links im Interface)
  items: Item[];

  // Typ-spezifische Konfiguration
  config: TypeConfig;

  // Optional: Ground Truth für supervised evaluation
  ground_truth?: GroundTruth;
}

interface Reference {
  type: "text" | "conversation";
  label: string;                    // UI-Anzeigename
  content: string | Message[];      // Text oder Messages
  metadata?: Record<string, any>;
}

interface Item {
  id: string;                       // Technische ID (NICHT LLM-Namen!)
  label: string;                    // UI-Anzeigename
  source?: Source;
  content: string | ConversationContent;
}

interface Source {
  type: "human" | "llm" | "unknown";
  name?: string;                    // Bei LLM: Modellname
}

interface Message {
  role: string;                     // "Klient", "Berater", "User", "Assistant"
  content: string;
  timestamp?: string;               // ISO 8601
}

1. Ranking (function_type_id = 1)

Zweck: Items per Drag & Drop in Qualitätsbuckets einordnen.

UI-Layout:

  • Links: Items zum Ranken
  • Rechts: Referenz/Kontext (optional)

Vollständiges Beispiel: Einfaches Ranking

{
  "schema_version": "1.0",
  "type": "ranking",
  "reference": {
    "type": "text",
    "label": "Original-Artikel",
    "content": "Die Teilnehmer des Weltklimagipfels haben sich auf neue ambitionierte Ziele zur Reduktion von Treibhausgasen geeinigt. Die Industrieländer verpflichten sich zu einer Senkung der Emissionen um 55% bis 2030.",
    "metadata": {
      "source": "Reuters",
      "date": "2024-01-15"
    }
  },
  "items": [
    {
      "id": "item_1",
      "label": "Zusammenfassung 1",
      "source": { "type": "llm", "name": "mistralai/Mistral-Small-3.2" },
      "content": "Auf dem Weltklimagipfel einigten sich die Teilnehmer auf eine CO2-Reduktion von 55% bis 2030."
    },
    {
      "id": "item_2",
      "label": "Zusammenfassung 2",
      "source": { "type": "llm", "name": "openai/gpt-4" },
      "content": "Die Klimakonferenz beschloss neue Ziele zur Emissionsreduktion mit Fokus auf Industrieländer."
    },
    {
      "id": "item_3",
      "label": "Zusammenfassung 3",
      "source": { "type": "human" },
      "content": "Industrieländer einigen sich auf 55% weniger Emissionen bis 2030."
    }
  ],
  "config": {
    "mode": "simple",
    "buckets": [
      { "id": "good", "label": { "de": "Gut", "en": "Good" }, "color": "#98d4bb", "order": 1 },
      { "id": "moderate", "label": { "de": "Moderat", "en": "Moderate" }, "color": "#D1BC8A", "order": 2 },
      { "id": "poor", "label": { "de": "Schlecht", "en": "Poor" }, "color": "#e8a087", "order": 3 }
    ],
    "allow_ties": true,
    "require_complete": true
  }
}

Multi-Group Ranking (Tabs)

Für paralleles Ranken mehrerer Kategorien:

{
  "schema_version": "1.0",
  "type": "ranking",
  "reference": {
    "type": "text",
    "label": "Original-Artikel",
    "content": "Der Weltklimagipfel hat historische Beschlüsse gefasst..."
  },
  "items": [
    {
      "id": "item_1",
      "label": "Zusammenfassung 1",
      "group": "summaries",
      "source": { "type": "llm", "name": "gpt-4" },
      "content": "Klimagipfel einigt sich auf 55% CO2-Reduktion."
    },
    {
      "id": "item_2",
      "label": "Zusammenfassung 2",
      "group": "summaries",
      "source": { "type": "llm", "name": "claude-3" },
      "content": "Neue Klimaziele für Industrieländer beschlossen."
    },
    {
      "id": "item_3",
      "label": "Kommentar 1",
      "group": "comments",
      "source": { "type": "llm", "name": "gpt-4" },
      "content": "Ein wichtiger Schritt, aber Umsetzung bleibt abzuwarten."
    },
    {
      "id": "item_4",
      "label": "Kommentar 2",
      "group": "comments",
      "source": { "type": "llm", "name": "claude-3" },
      "content": "Historischer Moment für den Klimaschutz."
    }
  ],
  "config": {
    "mode": "multi_group",
    "groups": [
      {
        "id": "summaries",
        "label": { "de": "Zusammenfassungen", "en": "Summaries" },
        "buckets": [
          { "id": "accurate", "label": { "de": "Präzise", "en": "Accurate" }, "color": "#98d4bb", "order": 1 },
          { "id": "acceptable", "label": { "de": "Akzeptabel", "en": "Acceptable" }, "color": "#D1BC8A", "order": 2 },
          { "id": "inaccurate", "label": { "de": "Ungenau", "en": "Inaccurate" }, "color": "#e8a087", "order": 3 }
        ],
        "allow_ties": true
      },
      {
        "id": "comments",
        "label": { "de": "Kommentare", "en": "Comments" },
        "buckets": [
          { "id": "insightful", "label": { "de": "Einsichtsreich", "en": "Insightful" }, "color": "#88c4c8", "order": 1 },
          { "id": "balanced", "label": { "de": "Ausgewogen", "en": "Balanced" }, "color": "#b0ca97", "order": 2 },
          { "id": "biased", "label": { "de": "Einseitig", "en": "Biased" }, "color": "#e8a087", "order": 3 }
        ],
        "allow_ties": true
      }
    ],
    "require_complete": true
  }
}

2. Rating (function_type_id = 2)

Zweck: Multi-dimensionale Bewertung auf Likert-Skala (LLM Evaluator Metriken).

UI-Layout:

  • Links: Dimensionen mit Likert-Skalen
  • Rechts: Zu bewertender Text/Kontext

Vollständiges Beispiel: SummEval-Style

{
  "schema_version": "1.0",
  "type": "rating",
  "reference": {
    "type": "text",
    "label": "Quelldokument",
    "content": "Ein führendes Technologieunternehmen hat heute einen bedeutenden Fortschritt im Bereich der künstlichen Intelligenz vorgestellt. Der neue Algorithmus kann komplexe wissenschaftliche Probleme in Sekunden lösen, für die menschliche Forscher Wochen benötigen würden.",
    "metadata": { "source": "TechNews", "date": "2024-01-20" }
  },
  "items": [
    {
      "id": "item_1",
      "label": "Generierte Zusammenfassung",
      "source": { "type": "llm", "name": "mistralai/Mistral-Small-3.2" },
      "content": "Ein Tech-Konzern stellte eine KI vor, die wissenschaftliche Probleme lösen kann."
    }
  ],
  "config": {
    "scale": {
      "min": 1,
      "max": 5,
      "step": 1,
      "labels": {
        "1": { "de": "Sehr schlecht", "en": "Very poor" },
        "2": { "de": "Schlecht", "en": "Poor" },
        "3": { "de": "Akzeptabel", "en": "Acceptable" },
        "4": { "de": "Gut", "en": "Good" },
        "5": { "de": "Sehr gut", "en": "Very good" }
      }
    },
    "dimensions": [
      {
        "id": "coherence",
        "label": { "de": "Kohärenz", "en": "Coherence" },
        "description": { "de": "Logischer Aufbau und Zusammenhang", "en": "Logical structure and connection" },
        "weight": 0.25
      },
      {
        "id": "fluency",
        "label": { "de": "Flüssigkeit", "en": "Fluency" },
        "description": { "de": "Grammatik und Lesbarkeit", "en": "Grammar and readability" },
        "weight": 0.25
      },
      {
        "id": "relevance",
        "label": { "de": "Relevanz", "en": "Relevance" },
        "description": { "de": "Wichtige Informationen erfasst", "en": "Important information captured" },
        "weight": 0.25
      },
      {
        "id": "consistency",
        "label": { "de": "Konsistenz", "en": "Consistency" },
        "description": { "de": "Faktentreue zum Original", "en": "Factual accuracy to source" },
        "weight": 0.25
      }
    ],
    "show_overall": true
  }
}

Beratungsantwort bewerten

{
  "schema_version": "1.0",
  "type": "rating",
  "reference": {
    "type": "conversation",
    "label": "Beratungskontext",
    "content": [
      {
        "role": "Klient",
        "content": "Ich fühle mich überfordert bei der Arbeit.",
        "timestamp": "2024-01-15T09:00:00Z"
      },
      {
        "role": "Berater",
        "content": "Das tut mir leid. Seit wann haben Sie diese Gefühle?",
        "timestamp": "2024-01-15T09:05:00Z"
      }
    ]
  },
  "items": [
    {
      "id": "item_1",
      "label": "Nächste Beraterantwort",
      "source": { "type": "llm", "name": "openai/gpt-4" },
      "content": "Es klingt, als ob Sie unter großem Druck stehen. Können Sie mir mehr darüber erzählen?"
    }
  ],
  "config": {
    "scale": { "min": 1, "max": 5, "step": 1 },
    "dimensions": [
      { "id": "empathy", "label": { "de": "Empathie", "en": "Empathy" }, "weight": 0.3 },
      { "id": "helpfulness", "label": { "de": "Hilfsbereitschaft", "en": "Helpfulness" }, "weight": 0.3 },
      { "id": "professionalism", "label": { "de": "Professionalität", "en": "Professionalism" }, "weight": 0.2 },
      { "id": "clarity", "label": { "de": "Klarheit", "en": "Clarity" }, "weight": 0.2 }
    ],
    "show_overall": true
  }
}

3. Mail Rating (function_type_id = 3)

Zweck: Gesamte E-Mail-Konversation bewerten (LLARS-spezifisch).

Vollständiges Beispiel

{
  "schema_version": "1.0",
  "type": "mail_rating",
  "reference": null,
  "items": [
    {
      "id": "item_1",
      "label": "E-Mail-Verlauf #4521",
      "source": { "type": "human" },
      "content": {
        "type": "conversation",
        "messages": [
          {
            "role": "Klient",
            "content": "Sehr geehrte Damen und Herren, ich habe eine Frage zu meinem Mietvertrag. Der Vermieter verlangt eine Nachzahlung von 500€.",
            "timestamp": "2024-01-10T09:00:00Z"
          },
          {
            "role": "Berater",
            "content": "Vielen Dank für Ihre Anfrage. Haben Sie die Nebenkostenabrechnung bereits geprüft? Oft finden sich dort Fehler.",
            "timestamp": "2024-01-10T14:30:00Z"
          },
          {
            "role": "Klient",
            "content": "Danke für die Antwort. Ich werde die Abrechnung nochmal genau prüfen.",
            "timestamp": "2024-01-10T15:00:00Z"
          }
        ]
      }
    }
  ],
  "config": {
    "scale": { "min": 1, "max": 5, "step": 1 },
    "dimensions": [
      { "id": "response_quality", "label": { "de": "Antwortqualität", "en": "Response Quality" }, "weight": 0.3 },
      { "id": "solution_orientation", "label": { "de": "Lösungsorientierung", "en": "Solution Orientation" }, "weight": 0.3 },
      { "id": "communication", "label": { "de": "Kommunikation", "en": "Communication" }, "weight": 0.2 },
      { "id": "timeliness", "label": { "de": "Zeitnähe", "en": "Timeliness" }, "weight": 0.2 }
    ],
    "focus_role": "Berater"
  }
}

4. Comparison (function_type_id = 4)

Zweck: Paarweiser A/B-Vergleich (welches ist besser?).

UI-Layout:

  • Links: Option A
  • Rechts: Option B
  • Unten: Auswahlbuttons

Vollständiges Beispiel

{
  "schema_version": "1.0",
  "type": "comparison",
  "reference": {
    "type": "text",
    "label": "Originaltext (Englisch)",
    "content": "The quick brown fox jumps over the lazy dog."
  },
  "items": [
    {
      "id": "item_a",
      "label": "Übersetzung A",
      "source": { "type": "llm", "name": "deepl/translator" },
      "content": "Der schnelle braune Fuchs springt über den faulen Hund."
    },
    {
      "id": "item_b",
      "label": "Übersetzung B",
      "source": { "type": "llm", "name": "openai/gpt-4" },
      "content": "Der flinke braune Fuchs springt über den trägen Hund."
    }
  ],
  "config": {
    "question": {
      "de": "Welche Übersetzung ist natürlicher und genauer?",
      "en": "Which translation is more natural and accurate?"
    },
    "criteria": ["Natürlichkeit", "Genauigkeit", "Stil"],
    "allow_tie": true,
    "show_source": false
  }
}

8. Communication Comparison (function_type_id = 8)

Zweck: Spezialisierung von Comparison (Typ 4) für Beratungs-Kontexte — der Rater wählt, welche Antwort (A/B) er „abschicken" würde.

Datenformat: identisch zu Comparison (type: "comparison", gleiche items/reference/config-Struktur). Der Unterschied liegt nur in der function_type_id (8) und der UI: Die Auswahl wird als „Antwort senden" mit Fly-Out-Animation gerahmt, mit optionalem Antwort-Prompt und Rater-Notiz.

Da das Datenformat mit Comparison übereinstimmt, gilt das Beispiel aus Abschnitt 4 — es genügt, den function_type_id des Szenarios auf 8 zu setzen.


5. Authenticity (function_type_id = 5)

Zweck: Binäre Echt/Fake-Klassifikation (KI-generiert erkennen).

Vollständiges Beispiel

{
  "schema_version": "1.0",
  "type": "authenticity",
  "reference": {
    "type": "text",
    "label": "Bewertungskriterien",
    "content": "Bewerten Sie, ob dieser Text von einem Menschen oder einer KI geschrieben wurde."
  },
  "items": [
    {
      "id": "item_1",
      "label": "Zu bewertender Text",
      "source": { "type": "unknown" },
      "content": "Die Forschungsergebnisse zeigen eindeutig, dass regelmäßige Bewegung nicht nur die körperliche Gesundheit verbessert, sondern auch signifikante positive Auswirkungen auf die mentale Gesundheit hat."
    }
  ],
  "config": {
    "options": [
      { "id": "human", "label": { "de": "Von Mensch geschrieben", "en": "Written by human" } },
      { "id": "ai", "label": { "de": "KI-generiert", "en": "AI-generated" } }
    ],
    "show_confidence": true
  },
  "ground_truth": {
    "value": "ai",
    "source": { "type": "llm", "name": "openai/gpt-4" }
  }
}

7. Labeling (function_type_id = 7)

Zweck: Kategorie(n) zuweisen (Single-Label oder Multi-Label).

Single-Label Beispiel

{
  "schema_version": "1.0",
  "type": "labeling",
  "items": [
    {
      "id": "item_1",
      "label": "Nachrichtenartikel",
      "source": { "type": "human", "name": "Reuters" },
      "content": "Die EZB hat heute die Leitzinsen um 0,25 Prozentpunkte gesenkt. Dies ist die erste Zinssenkung seit 2019."
    }
  ],
  "config": {
    "mode": "single",
    "labels": [
      { "id": "politics", "label": { "de": "Politik", "en": "Politics" }, "color": "#4A90D9" },
      { "id": "economy", "label": { "de": "Wirtschaft", "en": "Economy" }, "color": "#50C878" },
      { "id": "sports", "label": { "de": "Sport", "en": "Sports" }, "color": "#FF6B6B" },
      { "id": "culture", "label": { "de": "Kultur", "en": "Culture" }, "color": "#9B59B6" },
      { "id": "science", "label": { "de": "Wissenschaft", "en": "Science" }, "color": "#F39C12" }
    ],
    "allow_other": false
  },
  "ground_truth": {
    "value": "economy"
  }
}

Multi-Label Beispiel

{
  "schema_version": "1.0",
  "type": "labeling",
  "items": [
    {
      "id": "item_1",
      "label": "Beratungsanfrage",
      "source": { "type": "human" },
      "content": {
        "type": "conversation",
        "messages": [
          {
            "role": "Klient",
            "content": "Ich habe Probleme mit meinem Vermieter. Er will die Miete erhöhen und droht mit Kündigung. Außerdem ist die Heizung kaputt."
          }
        ]
      }
    }
  ],
  "config": {
    "mode": "multi",
    "labels": [
      { "id": "legal", "label": { "de": "Rechtliche Frage", "en": "Legal question" } },
      { "id": "financial", "label": { "de": "Finanzielle Beratung", "en": "Financial advice" } },
      { "id": "conflict", "label": { "de": "Konfliktlösung", "en": "Conflict resolution" } },
      { "id": "housing", "label": { "de": "Wohnungsfragen", "en": "Housing issues" } },
      { "id": "maintenance", "label": { "de": "Instandhaltung", "en": "Maintenance" } }
    ],
    "allow_other": true,
    "min_labels": 1,
    "max_labels": 3
  },
  "ground_truth": {
    "value": ["legal", "housing", "maintenance"]
  }
}

9. Conversation Labeling (function_type_id = 9)

Zweck: Innerhalb eines Gesprächs jede Sinneinheit („Span") einzeln labeln.

Der Unterschied zu Typ 7 ist die Analyse-Einheit. Bei klassischem Labeling ist ein Item eine Entscheidung; hier ist ein Item ein ganzes Gespräch und enthält viele Entscheidungen — in der VRM-Studie rund 92 pro Gespräch. Das zieht sich konsequent durch: IRR wird über Span-Zellen gerechnet, die Bearbeitungszeit pro Span gemessen, und ein Gespräch gilt erst als fertig, wenn alle seine Spans entschieden sind.

Segmentierung ist Eingabe, keine Aufgabe. Die Spans kommen fertig aus dem Import und werden nicht von den Bewertenden gezogen. Ist eine Grenze falsch, melden sie das über eine dafür vorgesehene Label-Karte; nur als bewusste Ausnahme lässt sich ein Span über ein zurückhaltend platziertes „Span teilen" nachträglich auftrennen (siehe unten).

Beispiel

{
  "schema_version": "1.0",
  "type": "conversation_labeling",
  "items": [
    {
      "id": "item_1",
      "label": "Beratungsverlauf A",
      "source": { "type": "human" },
      "content": {
        "type": "conversation_labeling",
        "messages": [
          {
            "role": "Ratsuchende",
            "content": "Unser Sohn ist 12 und seit Wochen sehr gereizt.",
            "labelable": false
          },
          {
            "role": "Beratende",
            "message_id": 2,
            "labelable": true,
            "content": "Vielen Dank fuer Ihre Nachricht. Haben Sie einen Ausloeser bemerkt?",
            "spans": [
              { "span_id": "gemco_A/1/m2/s001", "start": 0, "end": 34 },
              { "span_id": "gemco_A/1/m2/s002", "start": 35, "end": 68 }
            ]
          }
        ]
      }
    }
  ],
  "config": {
    "labels": [
      { "id": "D", "label": { "de": "Disclosure", "en": "Disclosure" },
        "description": { "de": "Offenbart eigene Gedanken, Gefuehle oder Absichten.",
                         "en": "Reveals the speaker's own thoughts, feelings or intentions." } },
      { "id": "K", "label": { "de": "Acknowledgement", "en": "Acknowledgement" },
        "description": { "de": "Signalisiert blossen Empfang - Grussformeln, Anrede.",
                         "en": "Conveys mere receipt - salutations, terms of address." } },
      { "id": "FLAG", "label": { "de": "Span-Grenze falsch", "en": "Wrong span boundary" } }
    ],
    "context_window": 3,
    "future_spans": "dimmed",
    "no_future_messages": true
  }
}

Span

Feld Pflicht Bedeutung
span_id ja Stabiler String aus dem Import (max. 64 Zeichen), keine laufende DB-ID. Nur so ist ein Re-Import idempotent und sind Exporte aus zwei Zeitpunkten joinbar.
start / end ja Zeichen-Offsets in content der Nachricht. Sie sind die Wahrheit — der Text wird einmal gespeichert, Spans referenzieren ihn nur (bei 8.307 Spans ist das der Unterschied zwischen ~1 MB und ~100 MB).
text nein Redundante Bequemlichkeit fürs Debugging. Wird gegen die Offsets validiert; im Zweifel gilt content[start:end].

labelable: false heißt „nur Kontext" — solche Nachrichten tragen keine Spans und erzeugen keine Entscheidungen.

Der Import lehnt ab: doppelte span_id im Item, Spans an nicht-labelbaren Nachrichten, Offsets jenseits des Nachrichtentexts, end <= start und Items ganz ohne Span.

Sichtbarkeit

Feld Standard Wirkung
context_window 3 Wie viele vorangehende Nachrichten voll sichtbar sind; ältere werden zusammengeklappt.
future_spans "dimmed" Wie noch nicht erreichte Spans derselben Nachricht dargestellt werden.
no_future_messages true Spätere Nachrichten bleiben verborgen — die Bewertenden sollen nicht wissen, wie das Gespräch ausgeht.

Diese Sichtbarkeit gilt für Mensch und Co-Pilot identisch: der serverseitig gebaute {context} im Prompt folgt denselben Feldern. Andernfalls würden beide über unterschiedliche Informationen entscheiden und wären nicht vergleichbar.

Export

Jede Zeile ist eine Span-Entscheidung. Zusätzlich zu den gemeinsamen Spalten:

Spalte Bedeutung
span_id Join-Schlüssel zurück auf die importierte Segmentierung
message_id Nachricht, zu der der Span gehört
span_index Position innerhalb der Nachricht

Die drei Spalten stehen am Ende der Spaltenliste, damit Konsumenten, die nach Position indizieren, unverändert weiterlaufen. Für alle anderen Typen bleiben sie leer.

Span teilen

Trägt ein Span erkennbar zwei Sprechakte, lässt er sich über einen bewusst unauffälligen Link unter dem Zielspan zeichengenau auftrennen (POST /api/evaluation/session/<sid>/items/<iid>/spans/split). Drei Regeln halten die Daten dabei ehrlich:

  • Der Schnitt muss echt innerhalb liegen — an der Kante entstünde eine Einheit der Länge null.
  • Neue IDs werden abgeleitet (xx+a / x+b), nicht neu durchnummeriert. Ein älterer Export joint dadurch weiterhin, unberührte Spans behalten ihre ID.
  • Das Vote auf den alten Span wird für alle Bewertenden gelöscht, ebenso dessen Co-Pilot-Log und Zeitmessung. Eine Entscheidung über den ganzen Span ist keine Entscheidung über eine Hälfte, und die Messungen beschreiben eine Einheit, die es nicht mehr gibt.

Schema-Referenz

Ranking Config

Feld Typ Beschreibung
mode "simple" | "multi_group" Einfach oder mit Tabs
buckets Bucket[] Bucket-Definitionen
allow_ties boolean Mehrere Items pro Bucket?
require_complete boolean Alle Items zuordnen?
groups RankingGroup[] Nur bei multi_group

Rating Config

Feld Typ Beschreibung
scale.min number Minimum (meist 1)
scale.max number Maximum (meist 5)
scale.step number Schrittweite (meist 1)
scale.labels Record<number, I18nLabel> Skalenbeschriftungen
dimensions Dimension[] Bewertungsdimensionen
show_overall boolean Gesamtscore anzeigen?

Dimension

Feld Typ Beschreibung
id string Technische ID
label I18nLabel Anzeigename
description I18nLabel Tooltip/Hilfetext
weight number Gewichtung (0-1, Summe = 1)

Dateien

Die Schemas sind definiert in:

Backend (Ground Truth):
app/schemas/evaluation_data_schemas.py

Frontend:
llars-frontend/src/schemas/evaluationSchemas.js

API:
GET /api/scenarios/{id}/schema