Poza pismem liniowym: węzły, krawędzie i trwały stan LangGraph
Zastąp kruche pętle LLM grafami LangGraph: specjalistyczne węzły, wyraźne schematy stanów, rozgałęzione krawędzie, bramy i ścieżki zatwierdzane przez ludzi, które przetrwają awarie.
Dlaczego skrypty liniowe przestają być efektywne dla agentów
Budowa agentów, które radzą sobie z chaotycznym językiem i zmieniającymi się celami, to zupełnie inna praca niż tworzenie pętli for, która przegląda listę. Skrypty liniowe doskonale radzą sobie z krokami deterministycznymi; zawodzą, gdy model musi cofnąć się, spróbować ponownie lub zmienić cel w trakcie działania. Grafy agentów zamieniają tę liniową strukturę na wyraźną mapę: kontrolujesz obiekt stanu oraz przejścia, zamiast chować je w nieprzejrzystych narzędziach łańcuchowych.
Klasyczny przepływ sterowania wciąż ma znaczenie dla zwykłego oprogramowania, jednak nie przechodzi trzech testów specyficznych dla agentów. Ścieżki wykonywania pozostają sztywne – nie ma łatwego sposobu na zmianę kierunku, gdy model zwraca nieoczekiwany wynik. Kontekst jest trudny do przenoszenia: powtórzenie zapytania jest proste, natomiast utrzymanie ciągłości rozmowy na różnych etapach nie jest możliwe. Pamięć staje się zbiorem parametrów dostosowywanych indywidualnie, przechodzących przez funkcje, co prowadzi do chaotycznego układu informacji, gdy tylko dodaje się pauzy lub ludzką weryfikację.
Węzły, krawędzie i stan jako zbiór roboczy
Trzy podstawowe elementy obejmują większość projektów. Węzły to jednostki pracy – wywołanie modelu, dostęp do pamięci, walidacja danych. Krawędzie to skierowane ścieżki określające, co ma zostać wykonane dalej. Stan to wspólny zapis, który przetrwa każdy krok procesu, dzięki czemu program nigdy nie zapomina, gdzie przerwał.
W praktyce interakcja jest prosta. Węzły odczytują potrzebne im pola, wykonują jedno zadanie i zapisują aktualizacje z powrotem. Krawędzie sprawdzają zaktualizowany rekord i wybierają następny węzeł. Stan to element, który zapewnia spójność tych kroków. Gdy ten schemat stanie się jasny, graf może naśladować usprawiedliwioną iterację zamiast pojedynczego, zaprogramowanego procesu.
Projektowanie stanu, aby pamięć pozostała użyteczna
Persystencja to to, co odróżnia jednorazowy wrapper do czatowania od trwałego agenta. Praca w kilku krokach, długie czekanie oraz możliwość kontynuacji po przerwie zależą od schematu, któremu ufa cały graf.
Należy preferować wyraźne klucze, takie jak extracted_entities, zamiast niejasnych data1. Zachowaj prostą strukturę; zagnieżdżone słowniki sprzyjają częściowym aktualizacjom, które mogą powodować konflikty lub usuwać dane z sąsiednich pól. Schematy typowane (na przykład Python TypedDict) sprawiają, że umowa jest widoczna dla każdego węzła:
from typing import TypedDict
# TypedDict provides structural type hints for our shared state
class SupportAgentState(TypedDict):
user_input: str # The raw query from the user
agent_response: str # The output generated by the LLM
issue_type: str # Categorization (e.g., 'billing' or 'tech')
retry_count: int # Counter to manage resilience logic
Gdy pamięć jest już przygotowana, specjalistyczne węzły stają się umiejętnościami, które na niej działają.
Specializuj węzły zamiast budować monolity
Koncepcje przywódcze dzielą pracę. Węzły przetwarzające modyfikują tekst lub dane API. Węzły walidacyjne sprawdzają jakość przed kontynuacją procesu. Węzły integracyjne komunikują się z narzędziami i bazami danych. Węzły decyzyjne analizują stan i sterują rozgałęzieniami.
Węzły nie powinny się wzajemnie wywoływać. Trwałym wzorcem jest sekwencja: odczyt → wykonanie → aktualizacja. To właśnie aktualizacja umożliwia kolejną ocenę. Jeśli węzeł nie może zostać przetestowany samodzielnie, oznacza to, że jest już zbyt duży.
Rozgałęzienia, pętle i ludzkie kontrolery
Grafy umożliwiają tworzenie wzorców sterowania, które w surowych skryptach są trudne do zarządzania. Warunkowe krawędzie mogą skierować zadanie na przegląd przez człowieka, gdy retry_count rośnie, zamiast bezustannie próbować uruchomić awaryjną funkcję. Mechanizm z udziałem człowieka powoduje wstrzymanie kluczowych działań, dopóki ktoś je nie zatwierdzi, a następnie kontynuuje je przy zachowaniu pełnego kontekstu. Debugowanie typu „podróż w czasie” pozwala cofnąć się do wcześniejszego punktu kontrolnego, dzięki czemu można dokładnie zobaczyć, który element zmienił bieg działań.
Takie rozwiązania utrzymują złożone procesy pod kontrolą i przekształcają system z kruchej automatyzacji w coś, co potrafi się odbudować.
Traktuj awarie jako część grafu
Reaktywne struktury typu try/except nie wystarczają do zastosowań produkcyjnych. Należy uwzględnić odporność systemu: węzły powtórek prób w przypadku tymczasowych opóźnień, węzły błędów, które rejestrują problemy i eskalują je po powtarzających się awariach, oraz krawędzie awaryjne, które nadal zwracają bezpieczny wynik, gdy integracja przestaje działać.
Punkty z listy kontrolnej, które ciągle sprawiają problemy zespołom: nadmiarowo duże węzły przechowujące wiele zadań; głęboko zagnieżdżony stan; ścieżki błędów odkładane na „później”. Planuj węzeł błędu, dopóki ścieżka prawidłowa jest jeszcze na tablicy.
Wsparcie klienta jako konkretna ewolucja
Klasyczny bot wsparcia może się pętlić, dopóki nie zostanie zweryfikowany identyfikator konta. W trakcie tej pętli użytkownik, który zgłasza utratę karty, psuje listę kontrolną. Graf może rozgałęzić się na ścieżkę bezpieczeństwa, ponownie przeprowadzić weryfikację lub zawiesić działanie w oczekiwaniu na przełożonego, przy jednoczesnym zachowaniu historii rozmowy w stanie. Oddzielenie logiki (węzłów) od pamięci (stanu) sprawia, że takie skrajne przypadki są do opanowania.
Narysuj ten sam projekt w Mermaid przed pisaniem kodu; rozgałęzienia stają się widoczne dla recenzentów, a pętle łatwiejsze do zauważenia.
Praktyczne zasady, które dobrze się sprawdzają
Zacznij od krótkiego łańcucha węzłów, a następnie dodawaj pętle i gałęzie. Zachowuj jasność schematów, aby błędy związane z zagnieżdżonymi stanami nie miały szansy na wystąpienie. Traktuj węzły jako elementy, które można testować niezależnie. Już na wczesnym etapie zaprojektuj ścieżki ponawiania prób i plany awaryjne. Wizualizuj graf, aby ludzie mogli sprawdzić tę samą strukturę, którą przemierza silnik wykonawczy.
Habity operacyjne, które zapewniają uczciwość grafów
Zespoły, które odnoszą sukcesy dzięki pracowitym schematom procesów, traktują pierwszy diagram jako hipotezę, a nie produkt końcowy. Po każdym pilocie sprawdzają, które węzły faktycznie zostały uruchomione, które krawędzie nigdy nie zadziałały oraz które pola stanu uległy rozszerzeniu bez żadnych odczytów. Nie używane pola stanowią „dług” – powodują zwiększenie liczby punktów kontrolnych i mylą nowicjuszy, którzy zakładają, że każda wartość jest ważna. Należy je agresywnie usuwać.
Instrumentacja znajduje się obok definicji grafu. Rejestruj wejście i wyjście węzła logowania wraz z podzbiorem stanu, który uzasadnił następny krawędź. Gdy aktywowany zostanie węzeł decyzyjny obsługiwany przez człowieka, zapisz, kto dokonał zatwierdzenia i co uległo zmianie, a następnie kontynuuj pracę przy tym samym identyfikatorze wątku, aby audyty pozostały powiązane z danym procesem. Taka praktyka przekształca „podróż w czasie” z triku demonstracyjnego w narzędzie do rozwiązywania incydentów.
Na koniec opieraj się pokusie kodowania zasad biznesowych wyłącznie w tekście instrukcji. Wolij węzły decyzyjne, które sprawdzają ustrukturyzowane pola — oceny, typy wybieralne, liczniki — dzięki czemu zmiany w zasadach są efektem przeglądów kodu, a nie „archeologii” instrukcji. Instrukcje wciąż są ważne dla języka; nie powinny być jedynym miejscem, w którym znajduje się kluczowa logika routingu.
Gdy interesariusze proszą o „jeszcze jedną funkcjonalność”, należy upierać się, aby przed opracowaniem jakiejkolwiek prośby określono nazwę nowego węzła, pola stanu, które zapisał, oraz krawędź awarii, do której należy. Ten rytuał sprawia, że rozwój jest celowy i zapobiega temu, by graf cichaczem stał się kolejnym liniowym skryptem z dodatkowymi ceremoniami.