Ostatnio pisałem o prostym flow, dzisiaj testuję architekturę kilku agentów i supervisora który nimi zarządza.
Wydawało się, że najtrudniejszy będzie kod, a wyszło coś całkowicie innego.
Założenie proste: Supervisor dostaje request i decyduje kto działa: data agent pobiera dane, analysis agent liczy wskaźniki, report agent generuje raport. Supervisor tylko deleguje, sam nigdy nie rozwiązuje zadania.
A w praktyce…
Data agent chciał robić za dużo – zmiast pobrać dane i przekazać je dalej, zaczął pisać wstępny raport. Supervisor przez to nie widział adekwatnego outputu, nie wiedział że krok skończony i po prostu zgłupiał. Reszta agentów nie dostała nic i cały workflow się zatrzymał.
Pomogło zawężenie zakresu przez prompt i structured output. Supervisor dostaje Pydantic model z jednym polem – kogo wywołać dalej. Zero wolnej interpretacji. Albo “data_agent”, albo “analysis_agent”, ewentualnie “report_agent” albo “FINISH”.
Drugi problem wyszedł przy narzędziu do generowania raportu. Przyjmowało dict z danymi finansowymi – model nie wiedział co w nim umieścić, zgadywał albo zostawiał puste pola. Zmieniłem to po prostu na flat params: revenue: float, expenses: float, każde pole z nazwą i typem. Model zaczął poprawnie wypełniać dane z historii konwersacji.
Jedna zmiana sygnatury funkcji, całkowicie inne zachowanie.
Przy okazji – zdaję sobie sprawę, że przy tak przewidywalnym flow wystarczyłby prosty sekwencyjny pipeline. Ale celem było zrozumienie wzorca supervisor od środka, zobaczyć jak to działa w kodzie i jak LLM faktycznie podejmuje decyzje o routingu.
Teraz widzę, że w systemach multi-agent nie walczysz z kodem, ale z tym żeby każdy agent robił tylko to, co do niego należy.
Repo w komentarzu.
A Wy mieliście do czynienia z agentami które wychodziły poza swoją rolę? Jak to rozwiązywaliście?
#LangGraph #LangChain #AIAgents #Python #AIEngineering #MultiAgent
