# Deklaratywna konstrukcja agentów: jak event sourcing rozwiązuje problem mutable state
Współczesne systemy multiagentowe oparte na LLM borykają się z fundamentalnym problemem: zarządzanie stanem poprzez mutable state prowadzi do niestabilności i trudności w debugowaniu. Rozwiązanie znaleziono w nieoczekiwanym miejscu — w podejściach data engineering. Nowy framework zymi stosuje zasady event sourcing i deklaratywnego opisu, znane z dbt, do budowania niezawodnych systemów zorientowanych na agentów.
Deklaratywne podejście zamiast imperatywnego kodu
Tradycyjne frameworki takie jak LangGraph wymagają szczegółowego opisu jak przetwarzać dane poprzez zmienny stan. To powoduje kilka krytycznych problemów:
- State staje się „śmietnikiem” z nieoczywistymi zależnościami
- Każda zmiana wymaga ręcznej synchronizacji
- Debugowanie przeradza się w rutynę przeszukiwania print-logów
zymi zmienia paradygmat: opisujesz co ma być zrobione za pomocą konfiguracji YAML, a silnik samodzielnie zarządza wykonaniem. Struktura projektu przypomina projekt dbt:
zymi-research/
├── agents/
│ ├── researcher.yml
│ └── writer.yml
├── pipelines/
│ └── research.yml
├── tools/
└── project.yml
Każdy agent jest definiowany poprzez deklaratywny manifest. Na przykład agent badawczy:
name: researcher
description: "Research agent — searches the web, scrapes pages, and stores findings in memory"
model: ${default_model}
system_prompt: |
You are a thorough research assistant. Your job is to find accurate,
up-to-date information on the given topic.
tools:
- web_search
- web_scrape
- write_memory
max_iterations: 15
Narzędzia są również opisywane deklaratywnie. Implementacja web_search poprzez Tavily API:
name: web_search
description: "Search the web for information on a given query"
parameters:
type: object
properties:
query:
type: string
description: "Search query"
required: [query]
implementation:
kind: http
method: POST
url: "https://api.tavily.com/search"
headers:
Authorization: "Bearer ${env.TAVILY_API_KEY}"
body_template: '{"query": "${args.query}", "max_results": 5}'
Pipeline łączy agentów w sekwencję kroków z zależnościami:
name: research
steps:
- id: search_web
agent: researcher
task: "Search the web for information about: ${inputs.topic}"
- id: analyze
agent: researcher
task: "Analyze findings and store structured summary"
depends_on: [search_web]
- id: write_report
agent: writer
task: "Write report to ./output/report.md"
depends_on: [analyze]
Uruchomienie pipeline'u poprzez CLI:
zymi run research -i topic="Event sourcing in AI"
Event sourcing: od niemutowalnych zdarzeń do odtwarzalności
Kluczowa różnica zymi od LangGraph to rezygnacja z mutable state na rzecz architektury event-sourced. Wszystkie interakcje są zapisywane jako niemutowalne zdarzenia w łańcuchu z kryptograficzną weryfikacją. Każde zdarzenie zawiera:
- Hash poprzedniego zdarzenia (zapewnia integralność łańcucha)
- Dane operacji
- Znacznik czasu
- Źródło zdarzenia
Ta model daje trzy krytyczne zalety:
- Pełna śledzalność — każdy wynik można odtworzyć z łańcucha zdarzeń
- Naturalny audyt — wszystkie zmiany są logowane bez dodatkowych wysiłków
- Bezpieczeństwo operacji — monitor ocenia intencje przed wykonaniem
Rozważmy fragment logu wykonania:
#4 10:50:52.806 intention_emitted source=orchestrator
call_custom_tool data={"type":"CallCustomTool","data":{"tool_name":"web_search"}}
#5 10:50:52.806 intention_evaluated source=orchestrator
call_custom_tool -> approved
#49 11:20:15.321 intention_emitted source=orchestrator
write_file data={"path":"output/report.md"}
#50 11:20:15.322 intention_evaluated source=orchestrator
write_file -> requires_approval
Widzimy tu, jak system najpierw generuje intencję wykonania operacji (intention_emitted), a monitor decyduje, czy zatwierdzić działanie (intention_evaluated). Przy próbie zapisu do pliku monitor zażądał potwierdzenia — mechanizm niemożliwy przy bezpośredniej modyfikacji state.
Zalety dla programistów i LLM
Deklaratywne podejście daje praktyczne korzyści, zwłaszcza w erze generatywnego AI:
- Zmniejszenie złożoności dla LLM — konfiguracje YAML są prostsze do generowania niż kod imperatywny
- Ścisła walidacja schematu — JSON Schema zapobiega błędom konfiguracji
- Równoległe wykonanie — silnik automatycznie wykrywa niezależne kroki
- Odtwarzalność — każdy uruchomienie można powtórzyć poprzez event log
Eksperymenty pokazują, że generowanie pipeline'ów poprzez LLM dla zymi wymaga o 30-40% mniej iteracji niż pisanie równoważnego kodu w LangGraph. Wynika to z:
- Brak konieczności ręcznego zarządzania stanem
- Wyraźnych granic odpowiedzialności między komponentami
- Statycznej weryfikacji konfiguracji
Co jest ważne
- Deklaratywność zamiast imperatywności — opis co trzeba zrobić, a nie jak, zmniejsza obciążenie poznawcze
- Event sourcing jako podstawa — niemutowalne zdarzenia zapewniają odtwarzalność i bezpieczeństwo
- Integracja z rozwojem LLM — strukturyzowane konfiguracje są łatwiejsze do generowania i korygowania przez AI
- Kryptograficzna integralność — hash-chain gwarantuje wiarygodność historii wykonania
- Monitorowanie intencji — oddzielna warstwa weryfikacji operacji zapobiega niepożądanym działaniom
Framework zymi pokazuje, jak idee z data engineering mogą rozwiązać systemowe problemy w dziedzinie programowania zorientowanego na agentów. Przejście od mutable state do architektury event-sourced nie tylko upraszcza rozwój — tworzy zasadniczo nowe możliwości kontroli i analizy zachowania agentów AI. Dla specjalistów technicznych oznacza to przejście od kruchych systemów do niezawodnych, śledzalnych rozwiązań, gdzie każdy krok wykonania ma jasny dowód i odtwarzalność.
— Editorial Team
Brak komentarzy.