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:
| Feld | Beschreibung |
|---|---|
action_id | Eindeutige UUID für jede Aktion |
timestamp | Serverseitiger Zeitstempel |
client_timestamp | Browserseitiger Zeitstempel (falls verfügbar) |
user_id | Nutzer, der die Aktion durchgeführt hat |
instance_id | Annotierte Instanz |
action_type | Art der durchgeführten Aktion |
schema_name | Name des Annotationsschemas |
label_name | Spezifisches Label innerhalb des Schemas |
old_value | Vorheriger Wert (bei Aktualisierungen/Löschungen) |
new_value | Neuer Wert (bei Hinzufügungen/Aktualisierungen) |
span_data | Span-Details für Span-Annotationen |
server_processing_time_ms | Serverseitige Verarbeitungszeit |
Aktionstypen
Das System verfolgt folgende Aktionstypen:
add_label– Neue Label-Auswahlupdate_label– Label-Wert geändertdelete_label– Label entferntadd_span– Neue Span-Annotation erstelltupdate_span– Span-Annotation geändertdelete_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:
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:
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
| Wert | Stufe | Interpretation |
|---|---|---|
| 0–10 | Normal | Typisches Annotationsverhalten |
| 10–30 | Niedrig | Einige schnelle Aktionen, wahrscheinlich akzeptabel |
| 30–60 | Mittel | Auffälliges Muster, Überprüfung möglicherweise angebracht |
| 60–80 | Hoch | Besorgniserregendes Muster, Überprüfung empfohlen |
| 80–100 | Sehr hoch | Wahrscheinliches Qualitätsproblem, sofortige Überprüfung |
API-Referenz
AnnotationAction
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
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:
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:
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:
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:
output/
annotations/
user_state_annotator1.json # Includes action history
user_state_annotator2.json
Exportformat
Aktionen werden mit ISO-8601-Zeitstempeln serialisiert:
{
"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
- Regelmäßige Überwachung: Verdächtigkeitsberichte regelmäßig prüfen
- Schwellenwert-Anpassung: Erkennungsschwellenwerte an die Aufgabenkomplexität anpassen
- Export-Sicherungen: Verlauf regelmäßig für die Langzeitspeicherung exportieren
- Datenschutzkonformität: Datenaufbewahrungsrichtlinien für Zeitstempel berücksichtigen
Weiterführende Informationen
- Admin-Dashboard – Annotationsstatistiken anzeigen
- Verhaltens-Tracking – Tracking auf Interaktionsebene
- Qualitätskontrolle – Automatisierte Qualitätsprüfungen
Implementierungsdetails finden Sie in der Quelldokumentation.