LangGraph: StateGraph & Definirea Stării (TypedDict) în LangChain & LangGraph

Clasa fundamentală din LangGraph pentru construirea agenților AI ca automate cu stări (State Machines) capabile de bucle, decizii și auto-corecție.

Sintaxă & invocare Python
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

class AgentState(TypedDict):
    messages: Annotated[list, add_messages]

workflow = StateGraph(AgentState)

Descriere & Utilizare

Lanțurile clasice LCEL sunt grafuri aciclice direcționate (merg doar înainte, de la A la B la C). Însă un agent autonom real are nevoie de bucle (cicluri): încearcă să caute ceva, vede că rezultatul e insuficient, reformulează căutarea, apelează o altă unealtă și abia apoi răspunde.

LangGraph modelează această arhitectură în jurul unui StateGraph. Primul pas este definirea schemei de stare (State) folosind un TypedDict sau Pydantic.

Adnotarea specială Annotated[list, add_messages] este un reducer: îi spune lui LangGraph ca, atunci când un nod returnează un mesaj nou, să nu suprascrie toată lista de mesaje, ci să îl adauge (append) inteligent la istoricul existent.

Cum să o reții ușor

💡 Ca tabla albă din sala de ședințe a unei echipe de investigație: fiecare specialist (nod) intră în sală, citește ce s-a scris până atunci pe tablă (`State`), își face munca și adaugă noile sale concluzii pe tablă pentru colegul următor.

Opțiuni și parametri tehnici

  • Inițializează topologia grafului în jurul schemei de date State.
  • Aplică funcțiile de reducere (reducers) pe fiecare cheie a stării după execuția fiecărui nod.
  • Prin apelul app = workflow.compile(), validează graful (să nu existe noduri orfane) și returnează un obiect CompiledGraph care se apelează identic cu un Runnable (app.invoke()).

Exemple practice și cazuri de utilizare

  • Stare extinsă cu contor de pași: class State(TypedDict):
    messages: Annotated[list, add_messages]
    incercari: int
    documente_gasite: list[str]
  • Compilare și rulare: app = workflow.compile(); rez = app.invoke({'messages': [('user', 'Salut!')]})

Sfaturi de configurare & capcane

Nu uita niciodată să pui Annotated[list, add_messages] pe cheia messages! Dacă pui doar messages: list simplu, fiecare nod va șterge mesajele anterioare și va păstra doar ultimul mesaj generat.

Comenzi și ghiduri înrudite