În dezvoltarea de aplicații AI, distincția dintre workflow-uri deterministe și agenți autonomi este crucială pentru scalabilitate și costuri. Workflow-urile sunt ideale când pașii sunt cunoscuți și secvența este fixă, oferind predictibilitate și control total. Agenții, în schimb, excelă în scenarii complexe unde rezultatul final este clar, dar calea spre el necesită adaptare dinamică. Alegerea corectă depinde de gradul de incertitudine al task-ului: dacă ai nevoie de fiabilitate 100% pentru procese repetitive, alege workflow-ul; dacă ai nevoie de rezolvare creativă de probleme, alege agentul.

Concepte cheie

  • Workflow determinist: O serie de pași predefiniți, executați în ordine strictă, unde ieșirea fiecărui pas este inputul următorului, garantând consistență.
  • Agent autonom: Un sistem bazat pe LLM care planifică, ia decizii și execută acțiuni iterativ pentru a atinge un obiectiv, fără a cunoaște pașii intermediari beforehand.
  • Planificare (Planning): Capacitatea agentului de a descompune un obiectiv complex în sub-task-uri mai mici și de a decide ordinea execuției lor.
  • Memorie: Mecanismul prin care agentul își amintește contextul conversației sau rezultatele anterioare pentru a menține coerența în timp lung.
  • Instrumente (Tools): Funcții externe (API-uri, baze de date) pe care agentul le poate apela dinamic pentru a obține informații sau a efectua acțiuni.
  • Observabilitate: Vizibilitatea asupra deciziilor agentului, esențială pentru debugging, deoarece fluxul nu este liniar și predictibil ca în workflow-uri.
  • Cost și Latency: Agenții tind să fie mai scumpi și mai lenti decât workflow-urile datorită numărului mare de apeluri către LLM și iterațiilor necesare.

Exemplu practic

Să comparăm două abordări pentru task-ul: „Găsește ultimele știri despre AI și rezumă-le”.

Abordarea Workflow (LangChain Expression Language):

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Pași fixi: Căutare -> Extrage text -> Rezumat
search_chain = create_search_chain()
summarize_prompt = ChatPromptTemplate.from_template("Rezuma: {text}")
summarize_chain = summarize_prompt | llm | StrOutputParser()

# Execuție secvențială
result = search_chain | summarize_chain.invoke({"query": "AI news"})

Aici, codul știe exact că va căuta, apoi va rezuma. Este rapid, ieftin și ușor de testat unitar.

Abordarea Agent (ReAct Pattern): Agentul primește promptul. Dacă nu găsește suficiente detalii, decide să caute termeni sinonimi. Dacă rezultatele sunt tehnice, decide să traducă termenii înainte de rezumat.

agent = initialize_agent(tools=[search_tool, translate_tool], llm=llm, verbose=True)
agent.run("Găsește știri AI și explică-le unui începător.")

Agentul poate decide să nu folosească tool-ul de traducere dacă conținutul este deja simplu, sau să facă o căutare suplimentară. Este flexibil, dar mai greu de urmărit.

Greșeli frecvente

  1. Supra-ingineria: Folosirea unui agent complex pentru un task simplu (ex: extragere date dintr-un JSON fix), ceea ce duce la costuri inutile și latență mare.
  2. Lipsa guard-rails: Permițerea agentului să execute acțiuni destructive (ștergere date) fără verificări umane sau sandboxing, riscând integritatea sistemului.
  3. Ignorarea memoriei: Neconfigurarea corectă a memoriei pe termen scurt/lung duce la pierderea contextului în conversații lungi sau task-uri multi-pas.
  4. Debugging orb: Încercarea de a depana un agent fără logging detaliat al fiecărei decizii și a fiecărui tool call, făcând imposibilă identificarea unde s-a blocat logica.

Întrebări de interviu

Când ai prefera un workflow în loc de un agent? Răspuns: Când fluxul de lucru este stabil, pașii sunt cunoscuți dinainte și cerințele de latență/cost sunt stricte. Workflow-urile oferă determinism și ușurință în testing.

Cum gestionezi eroarea dacă un tool al agentului eșuează? Răspuns: Implementez mecanisme de retry cu backoff exponențial și fallback-uri (ex: alt tool similar). De asemenea, pot instrui LLM-ul să interpreteze mesajul de eroare și să încerce o abordare diferită.

Ce este problema „hallucination” în agenți și cum o mitigăm? Răspuns: Agentul inventează fapte sau tool calls inexistente. Se mitigatează prin RAG (Retrieval-Augmented Generation) pentru grounding factual, validarea strictă a output-ului și utilizarea de sisteme de verificare (verifiers) post-execuție.

Exercițiu

Sarcină: Creează un script Python simplu (folosind LangChain sau similar) care simulează un workflow determinist pentru generarea unui raport.

  1. Definește o funcție mock get_data() care returnează un dicționar cu date.
  2. Definește o funcție mock format_report(data) care formatează textul.
  3. Definește o funcție mock send_email(report) care printează „Email sent”.
  4. Leagă aceste funcții într-o pipeline secvențială.
  5. Adaugă o verificare condițională: dacă datele sunt goale, oprește execuția și loghează o eroare, fără a ajunge la email. Timp estimat: 45 minute. Scopul este să exersezi modularitatea și gestionarea erorilor în fluxuri deterministe, fundamentul oricărui sistem AI robust.

Resurse gratuite

Alte subiecte din „Introducere în agenți AI”