Polling Agents in KI-Assistenten: 11 Implementierungsmuster

Zuverlässige Polling-Muster für KI-Agenten.

Inhaltsverzeichnis

Polling-Agenten gehören zu den wenig glamourösen Teilen der Architektur von KI-Assistenten, sind aber gleichzeitig auch eine der nützlichsten Komponenten.

Ein herkömmlicher Chat-Assistent wartet darauf, dass der Nutzer eine Frage stellt. Ein Polling-Agent (Abfrage-Agent) beobachtet fortlaufend. Er prüft eine Quelle, erkennt Änderungen, entscheidet, ob diese relevant sind, und trifft daraufhin eine Maßnahme. Diese Maßnahme kann eine Benachrichtigung, eine Zusammenfassung, ein Entwurf, ein Tool-Aufruf oder ein vollständiger Workflow sein.

So wandelt sich ein Assistent von „beantworte meine Frage“ zu „halte für mich die Augen offen“. Statt reaktiv zu sein, wird er zu einem Hintergrundprozess, der im Namen des Nutzers Dinge bemerkt und handelt, wenn bestimmte Bedingungen erfüllt sind.

KI-Agent überwacht Datenströme an einer futuristischen Steuerkonsole

Der wichtige Designpunkt ist einfach: Machen Sie das Sprachmodell nicht für Zeit, Zustand, Wiederholungsversuche oder Sperren verantwortlich. Nutzen Sie dafür herkömmliche Backend-Infrastruktur. Setzen Sie das Modell dort ein, wo es wertvoll ist: bei der Interpretation unstrukturierter Kontexte, semantischer Bewertungen und der Erzeugung nützlicher Sprache.

Was ist ein Polling-Agent?

Ein Polling-Agent ist ein Hintergrundprozess, der wiederholt eine Quelle überprüft und eine Assistentenaktion auslöst, wenn eine Bedingung erfüllt ist. Im breiteren KI-Systeme-Stack – wo der Assistent ein LLM (Large Language Model), Speicher, Tools, Routing und Observabilität kombiniert – ist die Polling-Schicht das, was den Assistenten proaktiv statt rein reaktiv macht. Für das vollständige Bild der fünf Schichten sehen Sie KI-Assistenten-Architektur: LLM, Speicher, Tools, Routing, Observabilität.

Beispiele:

  • Prüfe jeden Morgen den Posteingang und fasse wichtige Nachrichten zusammen.
  • Beobachte eine Notion-Aufgabenliste und führe den nächsten Todo-Punkt aus.
  • Überwache ein GitHub-Issue, bis sich der Status ändert.
  • Polling eines lang laufenden KI-Jobs, bis das Ergebnis bereit ist.
  • Prüfe einen Buchungstermin, bis einer verfügbar wird.
  • Beobachte ein Lieferantensportal, bis ein Dokument erscheint.
  • Scanne einmal pro Woche neue Forschungsarbeiten und fasse relevante zusammen.

Ein praktischer Polling-Agent hat fünf Verantwortlichkeiten:

  1. Zur richtigen Zeit aufwachen.
  2. Aus der Quelle lesen.
  3. Sich merken, was bereits gesehen wurde.
  4. Entscheiden, ob der neue Zustand relevant ist.
  5. Einmalig, sicher und ohne Wiederholung handeln.

Ein typischer Produktionsablauf sieht wie folgt aus:

Scheduler
  -> Polling-Worker
  -> Quellensystem
  -> Zustandspeicher
  -> deterministische Filter
  -> optionale LLM-Auswertung
  -> Assistentenaktion

Diese Struktur ist auf die bestmögliche Weise langweilig. Langweilige Systeme sind um 2 Uhr morgens leichter zu debuggen.

Der Zustand, den jeder Polling-Agent benötigt

Polling-Agenten benötigen einen persistenten Zustand. Der Gesprächsverlauf reicht nicht aus. Der Assistent mag sich das Gespräch merken, aber das System benötigt eine zuverlässige operative Aufzeichnung.

Ein guter Polling-Zustandsdatensatz enthält normalerweise:

{
  "poll_id": "poll_123",
  "user_id": "user_456",
  "source_type": "notion",
  "source_ref": "database_tasks",
  "condition": "eine Aufgabe im Todo-Status aufnehmen und ausführen",
  "interval_seconds": 600,
  "last_run_at": "2026-06-19T01:00:00Z",
  "next_run_at": "2026-06-19T01:10:00Z",
  "last_seen_cursor": "cursor_or_timestamp",
  "last_result_hash": "b64e8a...",
  "failure_count": 0,
  "status": "active"
}

Das genaue Schema hängt von der Quelle ab, aber die meisten Systeme benötigen diese Konzepte.

Poll-Definition

Dies beschreibt, was der Agent beobachtet und warum.

poll_id
user_id
workspace_id
source_type
source_ref
condition_text
priority
status

Zum Beispiel:

source_type: notion
source_ref: Tasks database
condition_text: Finde eine Todo-Aufgabe, übernehme sie, führe sie aus und markiere sie als Completed.

Zeitplan

Dies beschreibt, wann der Agent laufen soll.

interval_seconds
cron_expression
timezone
last_run_at
next_run_at
jitter

Für einen Hermes-Agenten, der alle 10 Minuten Notion prüft:

interval_seconds: 600
timezone: Australia/Melbourne

Cursor oder Snapshot

Dies hilft dem Agenten, dieselben Daten nicht erneut zu verarbeiten.

Je nach Quelle kann dies sein:

last_seen_id
last_seen_timestamp
api_cursor
etag
version
content_hash

Für eine Notion-Aufgabenwarteschlange ist der Cursor möglicherweise weniger wichtig als Aufgabestatus und Claim-Felder. Für Gmail, GitHub oder eine Synchronisierungs-API ist der Cursor normalerweise kritisch.

Claim oder Lease (Miete)

Dies verhindert, dass zwei Worker dieselbe Aufgabe übernehmen.

claimed_by
claimed_at
claim_expires_at
run_id

Zum Beispiel kann eine Notion-Aufgabe geändert werden von:

Status: Todo

zu:

Status: InProgress
ClaimedBy: hermes
ClaimedAt: 2026-06-19T01:00:00Z
ClaimExpiresAt: 2026-06-19T01:30:00Z
RunId: run_789

Das ist der Unterschied zwischen „Ich hoffe, nur ein Worker nimmt es“ und „das System hat ein Claim-Protokoll“.

Ausführungsprotokoll

Dies zeichnet auf, was während eines Laufs passierte.

run_id
poll_id
source_object_id
started_at
finished_at
status
items_checked
items_changed
decision_summary
error

Das Ausführungsprotokoll sollte im Assistenten-Backend leben, nicht nur in Notion oder einem anderen externen Tool. Notion ist gut für die menschliche Sichtbarkeit. Es ist nicht ideal als einziges Ausführungsprotokoll.

Deduplizierungsprotokoll

Dies verhindert doppelte Benachrichtigungen oder wiederholte Aktionen.

dedupe_key
poll_id
source_object_id
condition_version
action_type
delivered_at

Zum Beispiel:

user_456:poll_123:notion_page_999:execute:v1

Wenn dieselbe Aktion erneut versucht wird, kann das System sie unterdrücken.

Methode 1: Geplanter Polling-Worker

Dies ist das einfachste zuverlässige Muster.

Ein Scheduler wacht alle festen Intervalle auf und ruft einen Worker auf. Der Worker liest die Quelle, aktualisiert den Zustand und löst eine Assistentenaktion aus, falls erforderlich.

Scheduler
  -> Worker
  -> Quell-API
  -> Datenbank
  -> Assistentenaktion

Wie es läuft

Der Scheduler ist für die Zeit verantwortlich. Es könnte Cron, ein Cloud-Scheduler, ein Kubernetes CronJob oder ein kleiner interner Scheduler sein.

In jedem Intervall startet er einen Worker-Lauf. Der Worker lädt seine Konfiguration, fragt die Zielquelle ab, vergleicht das Ergebnis mit dem gespeicherten Zustand und handelt bei Bedarf.

Für einen einfachen Assistenten ist dies oft ausreichend. Ein einzelner Scheduler und ein leichtgewichtiges Worker-Prozess können dutzende tägliche Prüfungen handhaben, ohne Warteschlangen, Leases oder verteilte Koordination zu benötigen.

Zustandsmodell

Der Scheduler speichert sehr wenig. Normalerweise weiß er nur, wann er einen Job auslösen soll.

Die Anwendungsdatenbank speichert den wichtigen Zustand:

Poll-Definition
Zeitplan
Cursor oder Snapshot
Letzte Laufzeit
Fehlerzähler
Status

Der Worker sollte zustandslos sein. Er kann temporäre Daten halten, während er läuft, aber die persistente Wahrheit gehört in die Datenbank.

Beispielablauf

Alle 10 Minuten:
  Hermes Polling-Worker auslösen

Worker:
  aktive Poll-Konfiguration laden
  Quelle abfragen
  mit vorherigem Zustand vergleichen
  deterministische Prüfungen durchführen
  LLM nur bei Bedarf aufrufen
  Zustand aktualisieren
  Assistentenereignis emittieren

Best Fit

Verwenden Sie geplante Polling-Worker für:

  • Tägliche Zusammenfassungen.
  • Stündliche Prüfungen.
  • Kleine interne Automatisierungen.
  • Einfache „beobachte dies“-Aufgaben.
  • Assistentenjobs mit niedrigem bis mittlerem Volumen.

Schwächen

Geplantes Polling ist leicht zu verstehen, kann aber im großen Maßstab anfällig werden. Wenn viele Polls gleichzeitig laufen, können Sie Ihre Worker überlasten oder Anbieter-Ratenlimits erreichen. Wiederholungsversuche können auch unübersichtlich werden, wenn der Scheduler die Arbeit direkt startet.

Methode 2: Warteschlangenbasierte Polling-Worker

Warteschlangenbasiertes Polling ist normalerweise der beste Standard für Produktions-KI-Assistenten.

Der Scheduler führt den Poll nicht direkt aus. Er legt einen Job in eine Warteschlange. Worker-Prozesse konsumieren Jobs aus der Warteschlange.

Scheduler
  -> Warteschlange
  -> Worker-Pool
  -> Quell-API
  -> Zustandspeicher
  -> Assistentenaktion

Wie es läuft

Ein Scanner sucht nach fälligen Polls und legt Jobs in die Warteschlange. Worker ziehen Jobs, wenn sie Kapazität haben.

Dies gibt Ihnen Backpressure. Wenn das System beschäftigt ist, warten Jobs in der Warteschlange, anstatt die Quell-API oder den LLM-Anbieter zu überwältigen.

Zustandsmodell

Die Datenbank speichert den Poll-Zustand:

poll_id
user_id
source_ref
condition_text
next_run_at
cursor
status
failure_count

Die Warteschlangen-Nachricht sollte klein bleiben:

{
  "poll_id": "poll_123",
  "scheduled_for": "2026-06-19T01:10:00Z",
  "attempt": 1
}

Der Worker lädt den vollständigen Zustand aus der Datenbank, wenn er startet.

Beispielablauf

Alle Minute:
  Scheduler findet Polls, wo next_run_at <= jetzt
  Scheduler legt Jobs in die Warteschlange

Worker:
  zieht Jobs aus der Warteschlange
  sperrt oder mietet den Poll
  fragt die Quelle ab
  aktualisiert den Zustand
  emittiert Assistentenaktion bei Bedarf
  setzt next_run_at

Best Fit

Verwenden Sie warteschlangenbasiertes Polling für:

  • KI-Assistenten mit mehreren Benutzern.
  • Viele gleichzeitige Polls.
  • Integrationen mit Ratenlimits.
  • Wiederholbare Hintergrundarbeit.
  • Jobs, die unterschiedlich lange dauern können.
  • SaaS-Produkte, bei denen Zuverlässigkeit wichtig ist.

Schwächen

Warteschlangen fügen Infrastruktur hinzu. Sie benötigen Dead-Letter-Handling, Idempotenz, Sichtbarkeits timeouts und Wiederholungsrichtlinien. Das lohnt sich für Produktionssysteme, ist aber wahrscheinlich übertrieben für einen kleinen Prototyp.

Methode 3: Externes Tool als Aufgabenwarteschlange

Dies ist das Muster im Notion-plus-Hermes-Beispiel.

Das externe Tool ist nicht nur eine Datenquelle. Es wird zur menschenfreundlichen Aufgabenwarteschlange. Der Agent prüft periodisch das Tool, übernimmt eine Aufgabe, führt sie aus und aktualisiert den Aufgabestatus.

Scheduler
  -> Hermes-Worker
  -> Notion-Datenbank
  -> eine Aufgabe übernehmen
  -> Aufgabe ausführen
  -> Notion-Status aktualisieren

Wie es läuft

Alle 10 Minuten fragt Hermes die Notion-Datenbank nach einer Aufgabe im Zustand Todo ab. Er wählt die nächste Aufgabe, normalerweise nach Priorität und Erstellungszeit. Dann übernimmt er die Aufgabe, indem er sie auf InProgress setzt.

Danach führt Hermes die Aufgabe aus. Wenn die Ausführung erfolgreich ist, markiert er die Aufgabe als Complete. Wenn die Ausführung fehlschlägt, markiert er die Aufgabe als Failed oder gibt sie zu Todo mit einem Wiederholungszähler zurück.

Zustandsmodell

Notion speichert den menschenfreundlichen Aufgabenzustand:

Titel
Beschreibung
Status: Todo | InProgress | Complete | Failed
Priorität
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt

Das Hermes-Backend speichert den operativen Ausführungszustand:

run_id
notion_page_id
started_at
finished_at
execution_status
tool_calls
LLM trace
error details
idempotency_key

Diese Trennung ist wichtig. Notion ist hervorragend für Sichtbarkeit und manuelle Bearbeitung. Das Hermes-Backend ist besser für Logs, Wiederholungen, Deduplizierung und Audit-Historie.

Beispielablauf

Alle 10 Minuten:
  Hermes wacht auf

Hermes:
  fragt Notion nach einer Aufgabe ab, wo Status = Todo
  sortiert nach Priorität, CreatedAt
  aktualisiert ausgewählte Aufgabe zu InProgress
  setzt ClaimedBy, ClaimedAt, ClaimExpiresAt, RunId
  führt die Aufgabe aus
  schreibt Ausführungslog
  setzt Aufgabe auf Complete oder Failed

Best Fit

Verwenden Sie dieses Muster, wenn:

  • Menschen bereits Arbeit in Notion, Jira, Linear, Trello oder einem anderen Tool verwalten.
  • Sie möchten, dass der Assistent sichtbare Aufgaben verarbeitet.
  • Das Task-Board die Benutzeroberfläche ist.
  • Sie ein einfaches Human-in-the-Loop-Automatisierungsmodell benötigen.

Schwächen

Externe Tools sind selten perfekte Warteschlangen. Atomare Claims können begrenzt sein. Abfragekonsistenz kann verzögert sein. Ratenlimits können gelten. Wenn der Agent in mehreren Instanzen laufen kann, benötigen Sie eine sorgfältige Claim- oder Lease-Strategie.

Die praktische Empfehlung ist, Notion als menschenfreundlichen Aufgabenposteingang zu verwenden, während alle Ausführungslogs, Wiederholungsprotokolle, Traces und Idempotenz-Schlüssel in Hermes bleiben. Notion gibt Benutzern Sichtbarkeit; Hermes hält das System zuverlässig. Für die Dispatcher- und Konkurzenzmechaniken, die sich hinter diesem Muster in Hermes befinden, sehen Sie Kanban im Hermes-Agent für selbst gehostete LLM-Workflows.

Methode 4: Lang laufende Worker-Schleife

Eine lang laufende Schleife ist die einfachste Implementierung.

while True:
    due_polls = db.find_due_polls()
    for poll in due_polls:
        run_poll(poll)
    sleep(30)

Dieses Muster kombiniert Planung und Ausführung in einem Dienst, was es zum einfachsten möglichen Ausgangspunkt für Hintergrundagentenarbeit macht.

Wie es läuft

Der Worker-Prozess läuft kontinuierlich. Alle paar Sekunden oder Minuten prüft er die Datenbank auf fällige Polls und führt sie aus. Es ist einfach zu bauen, einfach zu verstehen und schnell zu iterieren während der Entwicklung.

Zustandsmodell

Die Datenbank speichert immer noch persistenten Zustand:

Poll-Konfiguration
next_run_at
cursor
last result
failure count
status

Der Prozessspeicher sollte nur temporären Zustand enthalten:

aktueller Batch
kurzlebiger Cache
in-flight run

Speichern Sie niemals wichtigen Fortschritt nur im Speicher. Wenn der Prozess abstürzt, ist jeder Zustand, der nicht in persistentem Speicher geschrieben wurde, weg, und der nächste Lauf wird keine Möglichkeit haben zu wissen, wo die Dinge aufgehört haben.

Best Fit

Verwenden Sie lang laufende Schleifen für:

  • Prototypen.
  • Lokale Entwicklung.
  • Interne Tools.
  • Single-Tenant-Systeme.
  • Agenten mit niedrigem Volumen.

Schwächen

Dieses Muster wird riskant mit mehreren Replikaten. Ohne Leases können zwei Worker denselben Poll ausführen. Es fehlt auch die operativen Funktionen einer echten Warteschlange oder Workflow-Engine.

Eine lang laufende Schleife ist nicht falsch als Ausgangspunkt, aber sie ist kein verteilter Scheduler und sollte nicht als solcher behandelt werden. Sobald Sie mehrere Replikate oder stärkere Zuverlässigkeitsgarantien benötigen, müssen Sie zu einem der strukturierten Muster oben wechseln.

Methode 5: Webhook-First mit Polling-Fallback

Wenn die Quelle Webhooks unterstützt, verwenden Sie sie. Polling sollte oft die Backup-Lösung sein, nicht der primäre Mechanismus.

externes System
  -> Webhook-Endpunkt
  -> Ereignisspeicher
  -> Assistentenaktion

Rekonkiliations-Poll
  -> Quell-API
  -> vergleichen mit Ereignisspeicher
  -> verpasste Ereignisse reparieren

Wie es läuft

Das externe System sendet Ereignisse an Ihren Webhook-Endpunkt, wenn sich etwas ändert. Ihr System speichert das Ereignis und verarbeitet es asynchron.

Ein langsamerer Rekonkiliations-Poll läuft alle paar Stunden oder einmal täglich. Er prüft, ob Ereignisse verpasst wurden.

Zustandsmodell

Der Ereignisspeicher zeichnet eingehende Webhooks auf:

event_id
source_type
source_object_id
event_type
received_at
payload_hash
processed_at
signature_valid

Der Rekonkiliations-Poll speichert:

last_reconciliation_at
last_seen_cursor
last_seen_version

Die Quell-Objekt-Tabelle speichert den neuesten bekannten Zustand:

external_id
current_status
external_updated_at
last_processed_event_id

Best Fit

Verwenden Sie Webhook-First-Architektur für:

  • GitHub-Ereignisse.
  • Stripe-Ereignisse.
  • Slack-Ereignisse.
  • CRM-Updates.
  • Bereitstellungsbenachrichtigungen.
  • Ticketing-Systeme.

Schwächen

Webhooks erfordern einen öffentlichen Endpunkt, Signaturvalidierung, Replay-Schutz und Ereignisdeduplizierung. Einige Anbieter senden auch unvollständige Ereignisse, sodass Sie möglicherweise trotzdem das vollständige Objekt abrufen müssen.

Trotzdem: Wenn gute Webhooks existieren, ist Polling jede Minute normalerweise verschwenderisch.

Methode 6: Anbieterseitiges Hintergrundjob-Polling

Manchmal ist das, was gepollt wird, der KI-Job selbst.

Die Anwendung startet einen lang laufenden Anbieterjob, speichert die Job-ID und prüft später, ob er abgeschlossen ist.

App
  -> KI-Hintergrundjob starten
  -> Anbieter-Job-ID speichern
  -> Status pollen
  -> Ergebnis abrufen
  -> Benutzer benachrichtigen

Wie es läuft

Der Assistent startet einen Job mit dem Anbieter. Der Anbieter gibt eine ID zurück. Ihr Backend speichert diese ID und prüft ihren Status, bis der Job erfolgreich ist, fehlschlägt, abläuft oder zeitüberschreitet.

Zustandsmodell

Ihr Backend speichert:

assistant_task_id
provider_job_id
user_id
status
created_at
last_checked_at
expires_at
result_ref

Der Anbieter speichert den temporären Jobzustand und die Ausgabe.

Wenn die Ausgabe wichtig ist, kopieren Sie sie so bald wie möglich nach Abschluss des Jobs in Ihren eigenen persistenten Speicher. Anbieterseitige Ergebnisspeicherung hat kurze Aufbewahrungszeiten und ist kein Ersatz für ein ordnungsgemäßes Archiv in Ihrem eigenen System.

Best Fit

Verwenden Sie anbieterseitiges Hintergrundjob-Polling für:

  • Lange KI-Forschungsaufgaben.
  • Verarbeitung großer Dokumente.
  • Codebasis-Analyse.
  • Berichterstellung.
  • Datenextraktionsjobs.
  • Aufgaben, die normale HTTP-Anforderungs-Timeouts überschreiten.

Schwächen

Dieses Muster löst ein Problem: Warten auf einen langen Anbieterjob. Es ersetzt nicht Ihre Workflow-Engine, Ihren Scheduler, Ihre Warteschlange oder Ihren Geschäftszustandsspeicher.

Methode 7: Dauerhafte Workflow-Engine

Eine dauerhafte Workflow-Engine verwaltet lang laufende Ausführung, Timer, Wiederholungen und Wiederherstellung. Temporal ist die häufigste Wahl für Go- und Python-basierte Assistenten-Backends; für eine vollständige Implementierungsanleitung sehen Sie Implementierung von Workflow-Anwendungen mit Temporal in Go.

Statt jedes Warten und jede Wiederholung manuell zu verdrahten, modellieren Sie den Prozess als Workflow.

Workflow-Engine
  -> Aktivität: Quelle prüfen
  -> Timer: warten
  -> Aktivität: Ergebnis bewerten
  -> Aktivität: Benutzer benachrichtigen

Wie es läuft

Der Workflow startet einmal und steuert dann sein eigenes Warten. Er kann minuten-, tageweise oder wochenweise schlafen. Wenn der Worker-Prozess abstürzt, kann die Workflow-Engine vom aufgezeichneten Zustand aus fortsetzen.

Zustandsmodell

Die Workflow-Engine speichert:

workflow_id
execution history
timer state
activity attempts
retry policy
current workflow state

Ihre Anwendungsdatenbank speichert:

user-facing poll definition
authorization references
business records
notification records

Die Workflow-Engine besitzt Prozesszustand – Ausführungshistorie, Timer, Wiederholungen und Aktivitätsversuche. Ihre Datenbank besitzt Geschäftszustand – Benutzerkonfigurationen, Autorisierungsprotokolle, Benachrichtigungen und Audit-Logs. Das Trennen dieser Schichten verhindert, dass jede Schicht zu einem verwirrten Hybrid aus beidem wird.

Best Fit

Verwenden Sie dauerhafte Workflows für:

  • Mehrstufige Geschäftsprozesse.
  • Lang laufende Automatisierungen.
  • Human-Approval-Flows.
  • Zuverlässige Wiederholungen.
  • Auditierbare Hintergrundarbeit.
  • Prozesse, die nach einem Fehler fortgesetzt werden müssen.

Schwächen

Workflow-Engines fügen Konzepte und Infrastruktur hinzu. Sie sind hervorragend, wenn der Prozess wichtig ist, aber schwer für einfache stündliche Prüfungen.

Methode 8: Persistenter Agenten-Runtime

Einige Agenten-Frameworks können Agentenzustand persistieren, Ausführung checkpointen und später fortsetzen.

Dies ist nützlich, wenn der Agent selbst einen mehrstufigen Reasoning-Prozess hat.

Scheduler oder Workflow
  -> Agenten-Runtime
  -> Checkpoint laden
  -> Tools aufrufen
  -> Checkpoint speichern
  -> später fortsetzen

Wie es läuft

Ein externer Scheduler oder Workflow startet den Agenten. Die Agenten-Runtime lädt vorherigen Zustand, führt den nächsten Schritt aus, ruft Tools bei Bedarf auf und schreibt einen Checkpoint.

Die Agenten-Runtime sollte nicht Ihr einziger Scheduler sein. Sie ist besser als Reasoning-Schicht innerhalb einer größeren Backend-Architektur zu behandeln.

Zustandsmodell

Agenten-Checkpoint-Speicher enthält:

current node
messages
tool outputs
intermediate reasoning state
pending action

Langzeitspeicher enthält:

stable user preferences
facts
project context
source references

Operativer Zustand gehört immer noch woanders hin:

poll schedule
cursor
status
retry count
dedupe records

Eine nützliche Regel: Speicher ist kein Cursor, und ein Checkpoint ist keine Warteschlange. Agentenspeicher speichert, was das Modell weiß; operativer Zustand verfolgt, wo der Prozess ist und was er getan hat. Das Vermischen der beiden führt zu subtilen Bugs, die nur unter Konkurrenz oder nach einem Neustart auftreten. Der gesamte Designraum für Arbeitspeicher, persistenten Zustand und Retrieval-Schichten wird in Speichersysteme in KI-Assistenten abgedeckt.

Best Fit

Verwenden Sie persistente Agenten-Runtime für:

  • Mehrstufige Forschung.
  • Agenten, die pausieren und fortsetzen.
  • Human-in-the-Loop-Arbeit.
  • Tool-lastiges Reasoning.
  • Aufgaben, bei denen Kontext im Laufe der Zeit anwächst.

Schwächen

Agenten-Persistenz ist nicht dasselbe wie operative Zuverlässigkeit. Sie benötigen immer noch Planung, Sperren, Wiederholungen, Ratenlimits und Audit-Logs.

Methode 9: Datenbanksynchronisation plus Änderungsbewertung

In diesem Muster wird Polling verwendet, um externe Daten in Ihre eigene Datenbank zu synchronisieren. Der Assistent reagiert dann auf lokale Datenbankänderungen, anstatt bei jedem Bewertungszyklus externe APIs direkt abzufragen.

Sync-Poller
  -> externe API
  -> lokale Datenbank
  -> Änderungsbewerter
  -> Assistentenaktion

Dies trennt Datensynchronisation von Assistentenintelligenz. Der Sync-Worker ist dafür verantwortlich, lokale Datensätze aktuell zu halten; der Bewerter ist dafür verantwortlich, zu entscheiden, was mit Änderungen geschehen soll. Jede Schicht kann unabhängig getestet, überwacht und skaliert werden.

Wie es läuft

Der Sync-Worker ruft periodisch externe Änderungen ab und schreibt normalisierte Datensätze in Ihre Datenbank. Ein zweiter Worker oder Change Stream erkennt aktualisierte Zeilen und entscheidet, ob der Assistent handeln soll.

Zustandsmodell

Die Sync-Tabelle speichert:

external_id
source_type
raw_payload
normalized_fields
external_updated_at
synced_at
version
content_hash

Der Sync-Zustand speichert:

source_cursor
last_sync_at
rate_limit_status
failure_count

Die Assistentenbewertungstabelle speichert:

object_id
evaluation_status
last_evaluated_hash
decision
notification_id

Best Fit

Verwenden Sie dieses Muster für:

  • CRM-Synchronisation.
  • Ticketing-Systeme.
  • Buchhaltungsunterlagen.
  • Produktinventar.
  • Compliance-Prüfung.
  • Suchindexierung.
  • Interne Dashboards.

Schwächen

Das Synchronisieren von allem kann teuer und unnötig sein. Es kann auch Datenschutz- und Aufbewahrungspflichten schaffen. Verwenden Sie dieses Muster, wenn lokale Daten einen Wert über eine einzelne Assistentenaktion hinaus haben.

Methode 10: Adaptives Polling

Adaptives Polling ändert die Frequenz basierend auf Zustand, Dringlichkeit oder letzter Aktivität.

aktives Objekt: pollen alle 1 Minute
wartendes Objekt: pollen alle 1 Stunde
veraltetes Objekt: pollen einmal pro Tag
abgeschlossenes Objekt: Polling stoppen

Wie es läuft

Nach jedem Lauf entscheidet der Worker, wann der nächste Lauf stattfinden soll.

Wenn sich das Objekt kürzlich geändert hat, pollen Sie früher. Wenn sich lange nichts geändert hat, verlangsamen Sie. Wenn die Aufgabe abgeschlossen ist, stoppen Sie.

Zustandsmodell

Der Poll-Zustand enthält:

current_interval
minimum_interval
maximum_interval
backoff_policy
last_activity_at
priority
stop_condition

Der Quell-Snapshot enthält:

status
updated_at
activity_level
expected_next_change

Best Fit

Verwenden Sie adaptives Polling für:

  • Bereitstellungsstatus.
  • Sendungsverfolgung.
  • Kalenderplatzverfügbarkeit.
  • Preisüberwachung.
  • Build-Jobs.
  • Lang laufende Anbieteraufgaben.
  • Jede Quelle mit burstigen Updates.

Schwächen

Adaptives Polling kann schwieriger zu verstehen sein. Wenn eine Aufgabe zu einer strengen Zeit laufen muss, halten Sie sie streng. Machen Sie Compliance-Jobs nicht clever.

Methode 11: Semantisches Polling mit einem LLM-Bewerter

Semantisches Polling wird verwendet, wenn die Bedingung ungenau ist.

Code kann beantworten:

Ist Status gleich Completed?
Ist Preis unter 100?
Gibt es eine neue Nachricht?

Ein LLM kann helfen zu beantworten:

Klingt diese E-Mail dringend?
Ist dieser Kunde wahrscheinlich unzufrieden?
Ist diese Forschungsarbeit relevant?
Erfordert diese Änderung meine Aufmerksamkeit?

Wie es läuft

Der Worker wendet zuerst günstige deterministische Filter an. Nur Kandidatenelemente gehen zum LLM.

neues Element?
entspricht Quellfiltern?
nicht bereits verarbeitet?
nicht offensichtlich irrelevant?

Dann bewertet der LLM die kleinere Kandidatensammlung und gibt strukturierte Ausgabe zurück.

{
  "should_notify": true,
  "urgency": "high",
  "reason": "Der Kunde meldet einen Produktionsausfall."
}

Zustandsmodell

Die Poll-Definition speichert:

semantic_condition
examples
negative_examples
user_preference_summary
model_config

Das Bewertungsprotokoll speichert:

input_reference
model
prompt_version
structured_output
confidence
cost
latency

Der Poll-Zustand speichert:

last_seen_ids
last_evaluated_hashes
last_decision
last_decision_reason

Best Fit

Verwenden Sie semantisches Polling für:

  • Erkennung wichtiger E-Mails.
  • Überwachung der Kundenstimmung.
  • Forschungsalarme.
  • Erkennung von Verkaufschancen.
  • Sicherheitstriage.
  • Executive-Briefings.

Schwächen

LLM-Aufrufe kosten Geld und fügen Latenz hinzu. Sie können auch inkonsistent sein, wenn Prompts und Schemas lose sind. Verwenden Sie zuerst deterministische Filter. Fragen Sie das Modell nur dann, wenn Urteil tatsächlich benötigt wird.

Entscheidungstabelle: Wahl einer Polling-Agenten-Methode

Methode Beste Anwendung Vorteile Nachteile
Geplanter Polling-Worker Einfache wiederkehrende Assistentenaufgaben Einfach zu bauen, einfach zu debuggen, minimale Infrastruktur Begrenzte Skalierung, grundlegende Wiederholungen, kann Worker überlasten, wenn viele Polls gleichzeitig feuern
Warteschlangenbasierte Polling-Worker Produktions-SaaS-Assistenten mit vielen Benutzern Skalierbar, widerstandsfähig, unterstützt Wiederholungen und Backpressure Erfordert Warteschlangeninfrastruktur, Idempotenz, Dead-Letter-Handling
Externes Tool als Aufgabenwarteschlange Notion, Jira, Linear, Trello-basierte Aufgabenausführung Menschenfreundlich, leicht zu inspizieren, funktioniert mit bestehenden Workflows Externe Tools sind keine perfekten Warteschlangen, atomarer Claim kann schwierig sein
Lang laufende Worker-Schleife Prototypen und interne Tools Sehr einfach, schnell zu implementieren, wenige bewegliche Teile Schlechte Zuverlässigkeit, schlechtes Multi-Replikat-Verhalten, begrenzter operativer Kontrolle
Webhook-First mit Polling-Fallback Ereignisgesteuerte Integrationen Schnelle Reaktion, weniger API-Aufrufe, Rekonkiliation fängt verpasste Ereignisse Benötigt öffentlichen Endpunkt, Ereignisvalidierung, Deduplizierung, Anbieter-Webhook-Unterstützung
Anbieterseitiges Hintergrundjob-Polling Lang laufende KI-Anbieterjobs Handhabt langsame KI-Aufgaben, einfaches Statusmodell, gut für asynchrone UX Verwaltet nur Anbieterjob-Status, nicht vollständigen Geschäftsworkflow
Dauerhafte Workflow-Engine Lang laufende mehrstufige Prozesse Starke Wiederholungen, Timer, Audit-Historie, Wiederherstellung nach Abstürzen Mehr Infrastruktur und Konzepte, schwer für einfaches Polling
Persistenter Agenten-Runtime Mehrstufige Reasoning-Agenten Bewahrt Agentenkontext, unterstützt Pause und Fortsetzung, gut für tool-lastige Aufgaben Kein Ersatz für Scheduler oder Warteschlange, benötigt immer noch operatives Backend
Datenbanksynchronisation plus Änderungsbewertung Systeme, wo externe Daten lokalen Wert haben Sauber Trennung, lokaler Bericht, weniger wiederholte externe Aufrufe Mehr Speicher, mehr Sync-Komplexität, mögliche Datenschutz- und Aufbewahrungsbedenken
Adaptives Polling Burstige Quellen oder Aufgaben mit variabler Dringlichkeit Reduziert Kosten, respektiert Ratenlimits, reagiert schneller bei hoher Aktivität Schwerer zu verstehen, nicht ideal für strenge Zeitpläne
Semantisches Polling mit LLM-Bewerter Ungenaue Bedingungen, die Urteil erfordern Handhabt natürliche Sprachabsicht, nützliche Zusammenfassungen, flexible Entscheidungen Kosten, Latenz, Prompt-Qualitätsrisiko, sollte nicht einfache Codeprüfungen ersetzen

Empfohlene Standardarchitektur

Für die meisten Produktions-KI-Assistenten, beginnen Sie damit:

polls table
  -> scheduler
  -> queue
  -> stateless workers
  -> deterministic filters
  -> optional LLM evaluator
  -> notification or assistant action

Ein minimales Schema:

CREATE TABLE polls (
    id TEXT PRIMARY KEY,
    user_id TEXT NOT NULL,
    source_type TEXT NOT NULL,
    source_ref TEXT NOT NULL,
    condition_text TEXT NOT NULL,
    schedule_type TEXT NOT NULL,
    interval_seconds INTEGER,
    timezone TEXT,
    next_run_at TIMESTAMP NOT NULL,
    last_run_at TIMESTAMP,
    cursor_value TEXT,
    last_hash TEXT,
    status TEXT NOT NULL,
    failure_count INTEGER NOT NULL DEFAULT 0,
    last_error TEXT,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

CREATE TABLE poll_runs (
    id TEXT PRIMARY KEY,
    poll_id TEXT NOT NULL,
    started_at TIMESTAMP NOT NULL,
    finished_at TIMESTAMP,
    status TEXT NOT NULL,
    items_checked INTEGER,
    items_matched INTEGER,
    decision_summary TEXT,
    error TEXT
);

CREATE TABLE notifications (
    id TEXT PRIMARY KEY,
    poll_id TEXT NOT NULL,
    user_id TEXT NOT NULL,
    dedupe_key TEXT NOT NULL,
    title TEXT NOT NULL,
    body TEXT NOT NULL,
    delivered_at TIMESTAMP,
    UNIQUE (dedupe_key)
);

Dies gibt Ihnen eine saubere Trennung:

scheduler owns time
queue owns buffering
worker owns execution
database owns state
LLM owns semantic judgment
assistant owns user interaction

Diese Trennung ist das Herz eines zuverlässigen Polling-Agenten.

Beispiel: Hermes-Agent verarbeitet Notion-Aufgaben

Wenden wir nun die Architektur auf einen konkreten Fall an.

Angenommen, eine Notion-Datenbank enthält Aufgaben. Hermes sollte alle 10 Minuten laufen, eine Aufgabe im Zustand Todo aufnehmen, sie auf InProgress setzen, sie ausführen und dann als Complete markieren.

Dies ist am besten beschrieben als:

externes Tool als Aufgabenwarteschlange
+
geplanter Polling-Worker
+
claim- oder lease-basierte Ausführung

Für eine Produktionsversion wird es zu:

warteschlangenbasiertes Polling mit Notion als menschenfreundlichem Aufgabenposteingang

Notion-Aufgabeneigenschaften

Die Notion-Datenbank sollte Felder wie diese enthalten:

Name
Status: Todo | InProgress | Complete | Failed
Priorität
CreatedAt
ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId
RetryCount
LastError
CompletedAt

Die wichtigen Felder sind ClaimedAt, ClaimExpiresAt und RunId. Sie machen den Aufgabenclass sichtbar und wiederherstellbar.

Hermes-Ausführungszustand

Hermes sollte auch sein eigenes Ausführungsprotokoll behalten:

run_id
notion_page_id
started_at
finished_at
status
input_snapshot
tool_calls
result_summary
error
idempotency_key

Dies schützt Sie, wenn Notion manuell bearbeitet wird, wenn ein API-Aufruf fehlschlägt oder wenn Sie prüfen müssen, was Hermes tatsächlich getan hat.

Ausführungsablauf

Alle 10 Minuten:
  Hermes-Scheduler erstellt einen Lauf

Hermes-Worker:
  findet eine Notion-Aufgabe, wo Status = Todo
  sortiert nach Priorität und CreatedAt
  übernimmt die Aufgabe, indem er Status = InProgress setzt
  schreibt ClaimedBy, ClaimedAt, ClaimExpiresAt und RunId
  führt die Aufgabe aus
  schreibt Ausführungslogs zum Hermes-Backend
  setzt Notion-Status auf Complete bei Erfolg
  setzt Notion-Status auf Failed bei Fehler

Wenn Hermes nach dem Übernehmen einer Aufgabe abstürzt, kann die Miete ablaufen:

Status = InProgress
ClaimExpiresAt < jetzt

Ein zukünftiger Lauf kann dann die Aufgabe wiederherstellen oder sie als fehlgeschlagen markieren.

Fehlerbehandlung

Bei Erfolg:

Status = Complete
CompletedAt = jetzt
LastError = leer

Bei wiederholbarem Fehler:

Status = Todo
RetryCount = RetryCount + 1
LastError = kurze Fehlermeldung

Bei nicht wiederholbarem Fehler:

Status = Failed
LastError = klare Erklärung

Zur Sicherheit sollte Hermes auch einen Idempotenz-Schlüssel verwenden:

notion_page_id + task_version + action_type

Dies verhindert, dass dieselbe Aufgabe zweimal ausgeführt wird, wenn ein Wiederholungsversuch zum falschen Zeitpunkt erfolgt.

Warum dies nicht nur Polling ist

Der Polling-Teil ist nur der Aufweckmechanismus. Die echte Architektur ist Aufgabenübernahme und zuverlässige Ausführung.

Eine naive Implementierung sagt:

Alle 10 Minuten, finde eine Todo-Aufgabe und mache sie.

Eine zuverlässige Implementierung sagt:

Alle 10 Minuten, übernimm genau eine geeignete Aufgabe, protokolliere den Lauf, führe idempotent aus und bewege die Aufgabe in einen Endzustand.

Das ist der Unterschied zwischen einer Demo und einem Agenten, dem man vertrauen kann.

Häufige Polling-Agenten-Fehler

Fehler 1: Kein Claim-Protokoll

Wenn zwei Worker dieselbe Aufgabe sehen können, können sie beide sie ausführen.

Verwenden Sie:

ClaimedBy
ClaimedAt
ClaimExpiresAt
RunId

Selbst wenn Sie aktuell nur einen Worker ausführen, entwerfen Sie so, als ob ein zweiter Worker später erscheinen könnte.

Fehler 2: Kein Deduplizierungsschlüssel

Jede externe Aktion sollte einen Deduplizierungsschlüssel haben.

user_id + poll_id + source_object_id + action_type + condition_version

Dies verhindert wiederholte Benachrichtigungen, wiederholte E-Mails, wiederholte Aufgabenausführung und wiederholte Tool-Aufrufe. Die breiteren Prinzipien hinter dem Scoping, Speichern und Testen dieser Schlüssel gelten hier gleichermaßen – sehen Sie Idempotenz in verteilten Systemen, die tatsächlich funktioniert.

Fehler 3: LLM zu früh aufrufen

Fragen Sie das Modell nicht, Datenbankfilterung zu machen.

Schlecht:

Senden Sie alle Aufgaben an den LLM und fragen Sie, welche Todo ist.

Besser:

Verwenden Sie den Notion-API-Filter, um Todo-Aufgaben abzurufen.
Verwenden Sie dann den LLM nur, wenn Aufgabeninterpretation benötigt wird.

Fehler 4: Notion als einzigen Backend behandeln

Notion ist eine gute menschliche Schnittstelle. Es ist kein vollständiger Ausführungsbackend.

Behalten Sie Ausführungslogs, Wiederholungen, Traces und Idempotenz-Protokolle in Hermes.

Fehler 5: Unendliches Polling

Jeder Poll sollte eine Stop-Bedingung haben.

Beispiele:

stop after success
stop after date
stop after max retries
stop when user disables it
stop after repeated authorization failure

Ein Polling-Agent ohne Stop-Bedingung ist eine stille Kostenleakage.

Fehler 6: Keine Observabilität

Sie sollten in der Lage sein zu beantworten:

What did the agent run?
Why did it run?
What did it read?
What did it change?
Why did it fail?
Did it notify the user?
Did it run twice?

Wenn Sie diese Fragen nicht beantworten können, ist das System nicht bereit für wichtige Arbeit.

Observabilitäts-Checkliste

Verfolgen Sie Metriken wie:

polls_due
polls_started
polls_succeeded
polls_failed
tasks_claimed
tasks_completed
tasks_failed
claim_expired_count
duplicate_suppressed_count
llm_calls
llm_cost
rate_limit_count
average_run_duration

Loggen Sie Felder wie:

poll_id
run_id
source_type
source_object_id
claim_id
cursor_before
cursor_after
decision
dedupe_key
error

Erstellen Sie eine Admin-Ansicht für:

active polls
stuck InProgress tasks
recent failures
high retry tasks
dead letter jobs
expensive LLM evaluations
disabled integrations

Polling-Agenten laufen im Hintergrund, wo Fehler leise sind und Probleme sich anhäufen können, bevor jemand es bemerkt. Hintergrundsysteme benötigen von Anfang an eingebaute Sichtbarkeit, nicht als nachträglichen Gedanken, wenn etwas schiefgeht. Für den vollständigen Observabilitäts-Stack für KI- und LLM-gestützte Systeme – Metriken, Traces, strukturierte Logs und SLOs – sehen Sie Observabilität für LLM-Systeme: Metriken, Traces, Logs und Testing in Production.

Finale Empfehlung

Für einen ernsthaften KI-Assistenten, beginnen Sie mit warteschlangenbasierten Polling-Workern und einem persistenten Zustandspeicher. Fügen Sie Webhooks hinzu, wo Anbieter sie unterstützen. Verwenden Sie adaptives Polling, wenn Ratenlimits wichtig sind. Verwenden Sie eine dauerhafte Workflow-Engine, wenn der Prozess lang läuft und mehrstufig ist. Verwenden Sie persistente Agenten-Runtime, wenn der Agent im Laufe der Zeit reasonieren muss.

Für das Hermes- und Notion-Beispiel ist die richtige Architektur:

Notion als menschenfreundlicher Aufgabenposteingang
Hermes-Scheduler alle 10 Minuten
Hermes-Worker mit Claim- oder Lease-Logik
Hermes-Backend für Ausführungslogs und Idempotenz
Notion-Statusupdates für Sichtbarkeit

Das Polling-Intervall ist nicht der harte Teil. Der harte Teil ist sicherzustellen, dass der Agent eine Aufgabe übernimmt, sie einmal ausführt, aufzeichnet, was passierte, und das System in einem Zustand lässt, den Menschen verstehen können.

Das ist es, was ein Polling-Skript in einen zuverlässigen KI-Assistenten verwandelt – nicht das Intervall, nicht das Modell, sondern die Disziplin beim Übernehmen von Arbeit, beim Aufzeichnen und beim Verlassen des Systems in einem Zustand, den Menschen und zukünftige Läufe beide verstehen können.

Abonnieren

Neue Beiträge zu Systemen, Infrastruktur und KI-Engineering.