Skip to content
此页面尚未提供您所选语言的版本,当前显示英文版本。

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.