Skip to content
Esta página aún no está disponible en su idioma. Se muestra la versión en inglés.

Annotationsverlauf

Jede Annotationsaktion mit Zeitstempeln für Auditing und Analyse verfolgen.

Annotationsverlauf

Potato bietet eine umfassende Verfolgung aller Annotationsaktionen mit detaillierter Zeitstempel-Metadaten. Dies ermöglicht Leistungsanalysen, Qualitätssicherung und detaillierte Prüfprotokolle.

Übersicht

Das Annotationsverlaufssystem verfolgt:

  • Jede Annotationsaktion: Label-Auswahl, Span-Annotationen, Texteingaben
  • Präzise Zeitstempel: Server- und clientseitige Zeitstempel
  • Aktions-Metadaten: Nutzer, Instanz, Schema, alte/neue Werte
  • Leistungsmetriken: Verarbeitungszeiten, Aktionsraten
  • Verdächtige Aktivitäten: Ungewöhnlich schnelle oder stoßartige Aktivitätsmuster

Aktionsverfolgung

Jede Annotationsänderung wird als AnnotationAction mit folgenden Feldern aufgezeichnet:

FeldBeschreibung
action_idEindeutige UUID für jede Aktion
timestampServerseitiger Zeitstempel
client_timestampBrowserseitiger Zeitstempel (falls verfügbar)
user_idNutzer, der die Aktion durchgeführt hat
instance_idAnnotierte Instanz
action_typeArt der durchgeführten Aktion
schema_nameName des Annotationsschemas
label_nameSpezifisches Label innerhalb des Schemas
old_valueVorheriger Wert (bei Aktualisierungen/Löschungen)
new_valueNeuer Wert (bei Hinzufügungen/Aktualisierungen)
span_dataSpan-Details für Span-Annotationen
server_processing_time_msServerseitige Verarbeitungszeit

Aktionstypen

Das System verfolgt folgende Aktionstypen:

  • add_label – Neue Label-Auswahl
  • update_label – Label-Wert geändert
  • delete_label – Label entfernt
  • add_span – Neue Span-Annotation erstellt
  • update_span – Span-Annotation geändert
  • delete_span – Span-Annotation entfernt

Konfiguration

Die Verfolgung des Annotationsverlaufs ist standardmäßig aktiviert. Keine zusätzliche Konfiguration erforderlich.

Leistungsmetriken

Das System berechnet Leistungsmetriken aus dem Aktionsverlauf:

python
from potato.annotation_history import AnnotationHistoryManager
 
metrics = AnnotationHistoryManager.calculate_performance_metrics(actions)
 
# Returns:
{
    'total_actions': 150,
    'average_action_time_ms': 45.2,
    'fastest_action_time_ms': 12,
    'slowest_action_time_ms': 234,
    'actions_per_minute': 8.5,
    'total_processing_time_ms': 6780
}

Erkennung verdächtiger Aktivitäten

Das System kann potenziell problematische Annotationsmuster erkennen:

python
from potato.annotation_history import AnnotationHistoryManager
 
analysis = AnnotationHistoryManager.detect_suspicious_activity(
    actions,
    fast_threshold_ms=500,      # Actions faster than this are flagged
    burst_threshold_seconds=2   # Actions closer than this are flagged
)
 
# Returns:
{
    'suspicious_actions': [...],
    'fast_actions_count': 5,
    'burst_actions_count': 12,
    'fast_actions_percentage': 3.3,
    'burst_actions_percentage': 8.0,
    'suspicious_score': 15.2,
    'suspicious_level': 'Low'
}

Verdächtigkeitsstufen

WertStufeInterpretation
0–10NormalTypisches Annotationsverhalten
10–30NiedrigEinige schnelle Aktionen, wahrscheinlich akzeptabel
30–60MittelAuffälliges Muster, Überprüfung möglicherweise angebracht
60–80HochBesorgniserregendes Muster, Überprüfung empfohlen
80–100Sehr hochWahrscheinliches Qualitätsproblem, sofortige Überprüfung

API-Referenz

AnnotationAction

python
from potato.annotation_history import AnnotationAction
 
action = AnnotationAction(
    action_id="uuid-here",
    timestamp=datetime.now(),
    user_id="annotator1",
    instance_id="doc_001",
    action_type="add_label",
    schema_name="sentiment",
    label_name="positive",
    old_value=None,
    new_value=True
)
 
# Serialize to dictionary
data = action.to_dict()
 
# Deserialize from dictionary
action = AnnotationAction.from_dict(data)

AnnotationHistoryManager

python
from potato.annotation_history import AnnotationHistoryManager
 
# Create a new action with current timestamp
action = AnnotationHistoryManager.create_action(
    user_id="annotator1",
    instance_id="doc_001",
    action_type="add_label",
    schema_name="sentiment",
    label_name="positive",
    old_value=None,
    new_value=True
)
 
# Filter actions by time range
filtered = AnnotationHistoryManager.get_actions_by_time_range(
    actions,
    start_time=datetime(2024, 1, 1),
    end_time=datetime(2024, 1, 31)
)
 
# Filter actions by instance
instance_actions = AnnotationHistoryManager.get_actions_by_instance(
    actions, instance_id="doc_001"
)
 
# Calculate performance metrics
metrics = AnnotationHistoryManager.calculate_performance_metrics(actions)
 
# Detect suspicious activity
analysis = AnnotationHistoryManager.detect_suspicious_activity(actions)

Anwendungsfälle

Qualitätssicherung

Annotatorverhalten auf Qualitätsprobleme überwachen:

python
for user_id in get_all_users():
    user_actions = get_user_actions(user_id)
    analysis = AnnotationHistoryManager.detect_suspicious_activity(user_actions)
 
    if analysis['suspicious_level'] in ['High', 'Very High']:
        flag_for_review(user_id, analysis)

Prüfpfad

Änderungen für die Einhaltung von Vorschriften verfolgen:

python
instance_actions = AnnotationHistoryManager.get_actions_by_instance(
    all_actions, "doc_001"
)
 
audit_log = [action.to_dict() for action in instance_actions]
with open("audit_doc_001.json", "w") as f:
    json.dump(audit_log, f, indent=2)

Zeitanalyse

Annotationszeitpläne verstehen:

python
from collections import Counter
 
hours = Counter(action.timestamp.hour for action in all_actions)
print("Peak annotation hours:", hours.most_common(5))

Datenspeicherung

Der Annotationsverlauf wird in den Nutzerzustandsdateien gespeichert:

text
output/
  annotations/
    user_state_annotator1.json  # Includes action history
    user_state_annotator2.json

Exportformat

Aktionen werden mit ISO-8601-Zeitstempeln serialisiert:

json
{
  "action_id": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2024-01-15T10:30:45.123456",
  "user_id": "annotator1",
  "instance_id": "doc_001",
  "action_type": "add_label",
  "schema_name": "sentiment",
  "label_name": "positive",
  "old_value": null,
  "new_value": true,
  "server_processing_time_ms": 23
}

Bewährte Vorgehensweisen

  1. Regelmäßige Überwachung: Verdächtigkeitsberichte regelmäßig prüfen
  2. Schwellenwert-Anpassung: Erkennungsschwellenwerte an die Aufgabenkomplexität anpassen
  3. Export-Sicherungen: Verlauf regelmäßig für die Langzeitspeicherung exportieren
  4. Datenschutzkonformität: Datenaufbewahrungsrichtlinien für Zeitstempel berücksichtigen

Weiterführende Informationen

Implementierungsdetails finden Sie in der Quelldokumentation.