Dwaj agenci AI mogą edytować ten sam plik, obaj otrzymują potwierdzenie „success”, a mimo to tylko jedna z ich zmian zostaje zachowana. W prostym teście z pięcioma równoległymi agentami, cztery z pięciu zapisów zniknęły bez żadnego błędu czy wpisu w logach — to klasyczna anomalia „lost-update” (utraconej aktualizacji), która marnuje tokeny zapłacone za pracę, która przepadła.
Dlaczego ten problem jest istotny
Gdy agent AI zapisuje wynik, podległa usługa nalicza opłaty za każdy wygenerowany token. Jeśli zapis zostanie po cichu nadpisany, dostawca i tak wystawi rachunek za obliczenia, które wyprodukowały odrzucony wynik. W potokach wieloagentowych — rojach agentów, równoległych pracownikach czyszczących dane lub w dowolnym systemie, w którym kilka botów współdzieli plik planu lub notatnik — te ukryte straty mogą przerodzić się w znaczący wyciek kosztów. Anomalia ta zagraża także integralności danych: kolejne kroki mogą działać na niekompletnych lub nieaktualnych informacjach, co prowadzi do kaskadowych błędów.
Jak dochodzi do anomalii
Przyczyną źródłową jest wyścig (race condition):
- Dwaj (lub więcej) agenci odczytują tę samą wersję zasobu, np. plik planu JSON.
- Każdy z nich przeprowadza własne rozumowanie lub transformację na podstawie tej migawki (snapshot).
- Obaj agenci wysyłają operację zapisu do współdzielonego magazynu.
- System magazynowania akceptuje drugi zapis, nadpisując pierwszy bez wykrycia konfliktu.
- Obaj agenci otrzymują „ACK” potwierdzający powodzenie zapisu, mimo że pierwsza zmiana przepadła.
Potwierdzenie systemu magazynowania dowodzi jedynie, że zapis nastąpił; nie gwarantuje on jednak, że zapis był bezpieczny względem innych równoległych aktualizacji. Log typu „append-only” (tylko dopisywanie), często reklamowany jako zabezpieczenie, zachowuje się w ten sam sposób: rejestruje, że zapis wystąpił, ale nie zapobiega nadpisywaniu wcześniejszych wpisów przez późniejsze.
Co robi bramka compare-and-set
Bramka compare-and-set (CAS) dodaje sprawdzanie wersji przed zaakceptowaniem zapisu:
- Read (Odczyt): Agent pobiera aktualny numer wersji (lub hash) pliku.
- Compute (Obliczenia): Agent wykonuje swoją pracę, tworząc nową wersję pliku.
- Write (Zapis): Agent wysyła nową zawartość wraz z wersją, którą pierwotnie odczytał.
- Validate (Walidacja): Warstwa magazynowania porównuje dostarczoną wersję z aktualną. Jeśli się różnią, zapis zostaje odrzucony; w przeciwnym razie proces przebiega pomyślnie, a wersja zostaje zwiększona.
Jeśli wersja uległa zmianie, agent wie, że jego widok był nieaktualny i musi powtórzyć cały cykl — odczyt, obliczenia, zapis — używając nowej wersji. Zamienia to niewidoczne nadpisanie w jawny błąd, który można zarejestrować w logach, powtórzyć i rozliczyć.
Cena bezpieczeństwa
Bramka CAS nie jest darmowa. W tej samej symulacji z pięcioma agentami:
| Scenariusz | Próby zapisu | Udane wkłady | Koszt tokenów |
|---|---|---|---|
| Bez bramki CAS | 5 | 1 | 5 jednostek |
| Z bramką CAS | 5 | 5 (po powtórzeniach) | 9 jednostek |
Bramka dodaje dodatkowe cykle odczyt-oblicz-zapis dla agentów, którzy napotkają konflikt wersji, co zwiększa wydatki na tokeny. Kompromis jest jasny: bez bramki tracisz dane po cichu; z bramką płacisz niewielką premię, ale zyskujesz wgląd w każdy konflikt.
Jak często dochodzi do awarii?
Nawet przy zaledwie dwóch agentach test wykazał 75% szans na utratę jednego z zapisów. Przy pięciu agentach wskaźnik strat zbliżył się do 100%. Liczby te sugerują, że założenie „zazwyczaj jest w porządku” jest niebezpieczne dla każdego wieloagentowego przepływu pracy na poziomie produkcyjnym.
Kontrargument: kiedy można pominąć bramkę
Jeśli system uruchamia jednego agenta na zasób lub wymusza ścisłą serializację na wyższym poziomie, dodatkowe kontrole CAS mogą być niepotrzebne. Jednak kalkulacja ryzyka musi uwzględniać ukryty koszt ponownego wykonywania nieudanej pracy oraz potencjalny wpływ brakujących danych na kolejne etapy.
Na co zwrócić uwagę w następnej kolejności
- Wsparcie narzędziowe: Szukaj API magazynujących, które udostępniają numery wersji lub znaczniki ETag i oferują natywne operacje atomowe CAS.
- Metryki: Skonfiguruj swoich agentów tak, aby rejestrowali, jak często zapis jest odrzucany z powodu niezgodności wersji. Rosnąca liczba konfliktów sygnalizuje potrzebę skalowania zasobów lub przeprojektowania przepływu pracy.
- Strategie ponawiania (Retry): Prosty wykładniczy czas oczekiwania (exponential back-off) sprawdza się dobrze, ale pamiętaj, że wielokrotne próby zwiększają zużycie tokenów. Wyważ limity ponowień względem akceptowalnej utraty danych.
- Podejścia hybrydowe: Niektóre zespoły łączą log typu „append-only” (dla celów audytowych) z bramką CAS (dla zapewnienia spójności), co gwarantuje zarówno zapis tego, co się wydarzyło, jak i ochronę przed nadpisywaniem.
Podsumowanie
Anomalie utraconych aktualizacji (lost-update) zmieniają potoki AI oparte na tokenach w czarne dziury generujące straty finansowe. Mechanizm bramkowania wersji typu compare-and-set dodaje niewielki narzut tokenowy, ale zamienia cichą utratę danych w widoczne zdarzenie, które można ponowić. W każdym systemie, w którym wielu agentów współdzieli stan — bazy danych, pliki planów czy notatniki (scratchpads) — zaimplementowanie sprawdzania wersji przed zapisem jest najtańszym ubezpieczeniem przed ukrytymi kosztami i uszkodzonymi przepływami pracy.
