Skip to content

Ranking-Szenarien in LLARS

Übersicht

Ranking-Szenarien ermöglichen es Nutzern, mehrere Items (z.B. Zusammenfassungen eines Textes) in Qualitätskategorien zu sortieren.

Datenmodell

EvaluationItem (function_type_id=1 für Ranking)
├── Messages[]
│   ├── Message 1: Quelltext (sender: "Source Article")
│   ├── Message 2: Item A (sender: "Summary A")
│   ├── Message 3: Item B (sender: "Summary B")
│   └── ...
└── Features[]  <-- WICHTIG: Das sind die rankbaren Items!
    ├── Feature 1: Summary A (type_id=Summary, llm_id=SummEval)
    ├── Feature 2: Summary B (type_id=Summary, llm_id=SummEval)
    └── ...

Wichtige Tabellen

Tabelle Zweck
evaluation_items Container für Ranking-Aufgabe
messages Textinhalte (Anzeige im rechten Panel)
features Rankbare Items (Anzeige im linken Panel)
feature_types Typ des Features (z.B. "Summary")
llms Quelle des Features (z.B. "SummEval", "GPT-4")
user_feature_rankings Nutzer-Rankings (Bucket: Gut/Mittel/Schlecht)

Ranking UI

Die Ranking-Oberfläche besteht aus zwei Panels:

Linkes Panel: Features zum Ranken

  • Zeigt Features gruppiert nach FeatureType
  • 4 Buckets pro FeatureType:
  • Gut - Hohe Qualität
  • Mittel - Mittlere Qualität
  • Schlecht - Niedrige Qualität
  • Neutral - Noch nicht gerankt (Standard)
  • Nutzer zieht Features per Drag&Drop zwischen Buckets

Rechtes Panel: Quelltext (NUR Kontext!)

  • Zeigt NUR den Quelltext/Originalartikel als Message
  • WICHTIG: Summaries werden NICHT als Messages erstellt!
  • Summaries erscheinen NUR im linken Panel als Features
  • Dient als Kontext/Referenz beim Ranken

Daten anlegen

1. Demo-Daten (demo_datasets.py)

RANKING_SAMPLES = [
    {
        "subject": "Summary Ranking: Artikeltitel",
        "source_text": "Der vollständige Originaltext...",
        "summaries": [
            {
                "id": "A",
                "content": "Zusammenfassung A...",
                "human_scores": {"relevance": 4.5, "avg": 4.5}
            },
            {
                "id": "B",
                "content": "Zusammenfassung B...",
                "human_scores": {"relevance": 2.0, "avg": 2.0}
            },
            # ... weitere Zusammenfassungen
        ],
        "task": "Ranken Sie die Zusammenfassungen nach Qualität"
    },
]

2. Seeding (scenarios.py)

# 1. EvaluationItem erstellen
thread = EvaluationItem(
    chat_id=11000 + idx,
    institut_id=1,
    subject=sample['subject'],
    function_type_id=1  # ranking
)
db.session.add(thread)
db.session.flush()

# 2. Quelltext als Message
db.session.add(Message(
    item_id=thread.item_id,
    sender='Source Article',
    content=sample['source_text']
))

# 3. Für jede Summary: NUR Feature erstellen (NICHT Message!)
# Summaries werden NICHT als Messages erstellt - sie erscheinen nur
# im linken Panel als rankbare Items, NICHT im rechten Panel
summary_ft = FeatureType.query.filter_by(name='Summary').first()
summeval_llm = LLM.query.filter_by(name='SummEval').first()

for summary in sample['summaries']:
    # Feature für Ranking (WICHTIG!)
    # KEINE Message erstellen - nur der Quelltext soll rechts angezeigt werden
    db.session.add(Feature(
        item_id=thread.item_id,
        type_id=summary_ft.type_id,
        llm_id=summeval_llm.llm_id,
        content=summary['content']
    ))

# 4. Zu Szenario hinzufügen
st = ScenarioThreads(scenario_id=ranking_scenario.id, item_id=thread.item_id)
db.session.add(st)

3. Benötigte Stammdaten

# FeatureType "Summary" muss existieren
ft = FeatureType.query.filter_by(name='Summary').first()
if not ft:
    ft = FeatureType(name='Summary')
    db.session.add(ft)

# LLM für Datenquelle (z.B. "SummEval" für SummEval-Dataset)
llm = LLM.query.filter_by(name='SummEval').first()
if not llm:
    llm = LLM(name='SummEval')
    db.session.add(llm)

API Endpoints

Endpoint Beschreibung
GET /api/email_threads/rankings Liste aller Ranking-Items
GET /api/email_threads/rankings/<id> Einzelnes Item mit Messages & Features
GET /api/email_threads/<id>/current_ranking Aktueller Ranking-Stand des Nutzers
POST /api/save_ranking/<id> Ranking speichern

SummEval-Dataset

Das Demo verwendet das SummEval-Dataset:

  • 100 Quell-Artikel (CNN News)
  • Je 16 verschiedene System-generierte Zusammenfassungen
  • Human-Ratings für: Coherence, Consistency, Fluency, Relevance
  • Skala: 1-5 (5 = beste Qualität)

In LLARS werden 15 Artikel mit je 5 Zusammenfassungen verwendet (unterschiedliche Qualitätsstufen).

Verifikation

-- Prüfen ob Features erstellt wurden
SELECT e.subject, COUNT(f.feature_id) as feature_count
FROM evaluation_items e
LEFT JOIN features f ON e.item_id = f.item_id
WHERE e.function_type_id = 1
GROUP BY e.subject
LIMIT 5;

-- Erwartetes Ergebnis: 5 Features pro Ranking-Item

Häufige Fehler

Keine Features im Ranking-Panel

Problem: Messages werden angezeigt, aber nichts zu ranken.

Ursache: Features wurden nicht erstellt - nur Messages.

Lösung: Für jedes rankbare Item ein Feature mit korrektem type_id und llm_id erstellen.

Summaries werden im rechten Panel angezeigt

Problem: Summaries erscheinen sowohl links (Features) als auch rechts (Messages).

Ursache: Summaries wurden fälschlicherweise auch als Messages erstellt.

Lösung: Summaries NUR als Features erstellen, NICHT als Messages. Nur der Quelltext/Originalartikel soll als Message erstellt werden.

FeatureType "Summary" nicht gefunden

Problem: feature_types.get('Summary') gibt None zurück.

Ursache: FeatureType wurde nicht in der Initialisierung hinzugefügt.

Lösung: 'Summary' zur FeatureType-Initialisierungsliste hinzufügen (scenarios.py, ca. Zeile 127).