Nieustrukturyzowane wejście uzasadnia model w kroku, nie w sterowaniu. Ten skrót kosztuje jedenastokrotnie
Ponowienie w agencie wybiera trasę od nowa, więc skutek bywa podwójny. Trzy miejsca, w których może stać model, i co każde robi z rachunkiem.
- Zdarzenie nowy mail
- Klasyfikacja typ, pilność, klient
- Narzędzia crm_search
- Zatrzymanie odpowiedź do klienta
- Działanie mail_send
- Log wejście, decyzja, wynik
Ponowienie przerwanej próby w układzie, w którym model dobiera kolejność kroków, potrafi zaksięgować tę samą fakturę drugi raz. Nie dlatego, że model się pomylił – dlatego, że ponowienie nie powtarza poprzedniej trasy, tylko wybiera ją od nowa. Pierwsza próba zdążyła wykonać zapis i padła na kroku następnym; druga ruszyła od innego narzędzia i doszła do zapisu jeszcze raz.
To jest różnica, która decyduje o doborze układu, i nie wynika z jakości modelu. Wynika z tego, gdzie w przepływie postawiono decyzję o kolejności kroków. Droga do tego błędu jest przy tym zaskakująco regularna: wejście jest nieustrukturyzowane, więc reguły nie wystarczą, więc bierzemy agenta. Pierwsze dwa ogniwa są poprawne. Trzecie z nich nie wynika.
Trzy miejsca, w których może stać model – nie dwa
Pytanie „agent czy skrypt” jest postawione za ciasno, bo ukrywa układ środkowy, który w praktyce obsługuje większość przepływów w firmie.
- Układ A – bez modelu. Wejście → walidacja schematu → mapowanie pól → zapis. Działa, gdy zbiór wejść jest zamknięty, a odwzorowanie da się wypisać.
- Układ B – model w jednym kroku, sterowanie deterministyczne. Wejście → wywołanie modelu: wyciągnij trzy pola → walidacja wyniku wobec schematu i progu pewności → kod decyduje: zapis albo kolejka wyjątków → zapis z kluczem idempotencji. Wariancja jest zamknięta w jednej wartości, którą da się sprawdzić przed użyciem.
- Układ C – model w sterowaniu. Wejście → model decyduje, które narzędzia wywołać i w jakiej kolejności → wywołania → model ocenia, czy skończył → zapis. Wariancja dotyczy ciągu akcji, nie jednej wartości.
Nieustrukturyzowane wejście jest argumentem za układem B, nie za C. Treść maila jest nieprzewidywalna; to, co firma robi po zaklasyfikowaniu maila, zwykle jest w pełni przewidywalne i opisane w procedurze. Model zamknięty w kroku obsługuje tę pierwszą nieprzewidywalność i nie dokłada drugiej.
| Wymiar | Układ A: reguły | Układ B: model w kroku | Układ C: model w sterowaniu |
|---|---|---|---|
| Co robi ponowienie | to samo | to samo wejście, nowa próba | możliwa inna trasa |
| Gdzie ujawnia się błąd | wyjątek w kodzie | walidacja wyniku kroku | dopiero w skutku |
| Zakres wariancji | brak | jedno pole | cały ciąg akcji |
| Test akceptacyjny | równość | schemat i próg | stan końcowy systemu |
| Czego wymaga bezpieczne ponowienie | niczego | klucza idempotencji na zapisie | klucza na każdym skutku ubocznym |
Układ C zarabia na siebie wtedy, gdy nieznany z góry jest sam zbiór kroków, a różne poprawne trasy do tego samego celu nie mają dla firmy innej ceny. Przykład spełniający oba warunki: zebranie rozproszonych informacji na temat, przy którym nie wiadomo, ile zapytań trzeba wykonać. Przykład niespełniający: księgowanie faktury, gdzie trasa jest przepisana, a dwa różne poprawne sposoby zaksięgowania nie są neutralną różnicą.
Wariancji nie wyłącza się parametrem
Odruchowa odpowiedź brzmi: ustawimy temperaturę na zero i trasa przestanie się zmieniać. Nie przestanie, a przyczyna leży niżej, niż się jej zwykle szuka. Tysiąc wywołań tego samego promptu na temperaturze zero dało 80 różnych odpowiedzi, przy czym pierwsze 102 tokeny były identyczne w każdym przebiegu, a rozjazd zaczął się na tokenie 103.
Sprawcą nie jest współbieżność ani same zaokrąglenia zmiennoprzecinkowe – te są skutkiem. Sprawcą jest brak niezmienniczości jąder obliczeniowych wobec rozmiaru wsadu: wynik dla jednego elementu zależy od tego, co jeszcze trafiło do tej samej partii i jak duża ona była. Autorzy pomiaru pokazali też drugą stronę – po podmianie jąder na niezmiennicze wszystkie 1000 odpowiedzi było identycznych, za cenę czasu: 26 sekund w domyślnej konfiguracji vLLM wobec 42 sekund po poprawieniu jądra uwagi.
Dla kogoś, kto kupuje model jako usługę, wniosek jest jednoznaczny: tej dźwigni nie ma. Obciążenie cudzego endpointu zmienia się w czasie, skład wsadu jest poza kontrolą wywołującego, a jąder się nie podmienia. Powtarzalności nie da się zamówić w umowie – można tylko zdecydować, w którym miejscu przepływu jej brak jest dopuszczalny.
Niedeterminizm ma w przepływie nazwane miejsce
Silniki do długo biegnących przepływów rozwiązały ten problem przed pojawieniem się modeli językowych i ich nazewnictwo jest tu precyzyjniejsze niż marketingowe. W dokumentacji Temporala przepływ jest deterministyczny wtedy, gdy przy tym samym wejściu wykonuje te same wywołania w tej samej kolejności. Przy odtwarzaniu przebiegu silnik porównuje emitowane komendy z zapisaną historią zdarzeń; jeśli komenda nie zgadza się ze zdarzeniem na tej pozycji, przebieg zwraca błąd niedeterminizmu.
Ta sama dokumentacja wskazuje, gdzie należą wywołania modelu: do aktywności, czyli kroków wykonywanych poza ścieżką odtwarzania i ponawianych automatycznie. Wywołanie API, zapytanie do bazy i wywołanie modelu są w tej klasyfikacji tym samym rodzajem operacji – niedeterministycznym – i mają to samo miejsce. Dokumentacja wymienia przy tym jako niebezpieczne przestawianie, dodawanie i usuwanie wywołań generujących komendy bez wersjonowania oraz zmianę typów i identyfikatorów aktywności.
Przełożenie na dobór układu jest bezpośrednie. Układ B to przepływ deterministyczny z wywołaniem modelu zamkniętym w aktywności: wariancja jest ponawiana, a sterowanie zostaje odtwarzalne. Układ C przenosi wybór kolejności kroków dokładnie tam, gdzie silnik wymaga powtarzalności, i przy każdym przebiegu narusza punkt o przestawianiu wywołań. Nie znaczy to, że układu C nie wolno zbudować. Znaczy, że jego odtwarzalności nie zapewni już infrastruktura i trzeba ją dołożyć osobno: dziennikiem decyzji, kluczami idempotencji na każdym skutku ubocznym i punktem zatwierdzenia przed akcjami nieodwracalnymi. W układzie B ta praca jest już wykonana – i to jest właściwa treść zdania o jedenastokrotności, do której zaraz dojdziemy.
Co model w sterowaniu dokłada do rachunku
Rachunek dotyczy jednego procesu: klasyfikacja przychodzącego dokumentu i zapis trzech pól do systemu, 20 000 przebiegów miesięcznie, ten sam model w obu układach. Stawki za milion tokenów dla Sonneta 5.5 pochodzą z cennika Anthropic: 2 USD wejście, 10 USD wyjście, 0,10 USD odczyt z cache.
| Pozycja | Układ B: model w kroku | Układ C: model w sterowaniu |
|---|---|---|
| Wywołań na przebieg | 1 | 6 |
| Tokenów wejścia łącznie | 3 500 | 28 000 |
| z tego odczyt z cache | 3 000 | 18 000 |
| Tokenów wyjścia | 200 | 1 400 |
| Koszt przebiegu | 0,0033 USD | 0,0358 USD |
| 20 000 przebiegów | 66 USD | 716 USD |
Różnica to niemal jedenastokrotność tego samego zadania przy tym samym modelu. Nie bierze się z ceny – bierze się z dwóch rzeczy naraz: liczby wywołań i tego, że w układzie C kontekst narasta między krokami, więc każde kolejne wywołanie wiezie ze sobą poprzednie. Podwojenie liczby kroków w takim układzie nie podwaja rachunku, lecz podnosi go szybciej, bo rośnie też to, co każdy krok ze sobą ciągnie.
Dwie poprawki idą w przeciwnych kierunkach. W dół: przetwarzanie wsadowe, jeśli proces nie jest wrażliwy na opóźnienie, zdejmuje połowę stawki. W górę: ponowienia – a te w układzie C są droższe nie tylko o tokeny, bo ponowienie pełnego przebiegu oznacza ponowny przebieg wszystkich sześciu wywołań, nie powtórzenie jednego kroku, który zawiódł.
Osobno działa cache, który w tym rachunku jest założony jako ciepły. Odczyt prefiksu kosztuje 0,10 USD za milion tokenów, zapis 2,50 USD. Przy przebiegach rozrzuconych rzadko w czasie okno wygasa między nimi i każdy przebieg płaci zapis zamiast odczytu, co w układzie B podnosi koszt tej pozycji dwudziestopięciokrotnie. Mechanika wygasania w przepływach z bramką zatwierdzenia jest opisana osobno w tekście o tym, kiedy cache promptów podnosi rachunek.
Dowód z jednego przebiegu nie jest dowodem
Układ wybiera się zwykle po demie, a demo mierzy jedno: czy zadanie udało się przy jednej próbie. Nazwa tej wielkości to pass^1, a wielkość potrzebna do decyzji jest inna. W pracy wprowadzającej benchmark τ-bench nazwano ją pass^k: prawdopodobieństwo, że wszystkie k niezależnych prób tego samego zadania się udadzą. Autorzy raportowali, że gpt-4o kończył powodzeniem mniej niż 50 proc. zadań, a pass^8 w domenie retail spadał poniżej 25 proc. Liczby są z czerwca 2024 r. i dzisiejsze czołowe modele wypadają znacznie wyżej; mechanika została ta sama, bo pass^k spada wraz z k niezależnie od tego, jak wysoko stoi pass^1.
Ten sam rachunek obowiązuje w poprzek kroków jednego przebiegu, a to właśnie różnicuje oba układy. Przy założeniu niezależności kroków skuteczność końcowa jest iloczynem skuteczności cząstkowych: krok o skuteczności 95 proc. – taki, który na demie nie zawiedzie ani razu na dwadzieścia – w łańcuchu sześciu kroków daje 74 proc. przebiegów bez interwencji, a w łańcuchu dwudziestu 36 proc. Przy 98 proc. na krok te same łańcuchy dają 89 i 67 proc. Założenie niezależności jest idealizacją i myli się w obie strony, bo błąd w kroku trzecim często przesądza o czwartym, a model potrafi też naprawić własną pomyłkę w następnym kroku. Rzecz w tym, że układ B ma w tym iloczynie jeden czynnik, a układ C sześć.
Co rozstrzygnąć przed wyceną
Do wyboru układu nie potrzeba pilotażu, tylko dwóch zdań zapisanych na papierze. Pierwsze: jaki jest test akceptacyjny wyniku jednego kroku – schemat, próg, zakres. Jeśli da się go napisać, miejsce dla modelu jest w kroku, a sterowanie zostaje w kodzie. Drugie: czy zbiór kroków jest znany z góry. Jeśli jest, model w sterowaniu dopłaca za wariancję, której nikt nie zamawiał, i dokłada ponowienia, które nie są powtórzeniem.
Jeśli oba zdania wyjdą na „nie da się napisać” i „nie jest znany”, układ C jest właściwym wyborem – i wtedy do wyceny wchodzą trzy pozycje, które w układzie B są darmowe: dziennik decyzji, klucze idempotencji na każdym nieodwracalnym skutku i punkt zatwierdzenia. Policzone razem z rachunkiem za tokeny zwykle przesuwają próg opłacalności dalej, niż wynikało z demonstracji. To nie jest argument przeciw agentom. To jest różnica między przepływem, za który ktoś odpowiada, a tym, który raz przeszedł.