AI Engineering Academy · Lección

Creación de pipelines multiagente con LangGraph

Use LangGraph para definir nodos de agentes, aristas condicionales y un estado compartido en un grafo dirigido, lo que permite flujos de trabajo multiagente complejos con bucles, ramificaciones y puntos de control con intervención humana.

Lección 3 de 413 pasos

Creación de pipelines multiagente con LangGraph es una lección gratuita de AI Engineering Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Engineering Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Engineering Academy incluye 4 lecciones en total.

¿Qué es LangGraph?

LangGraph es una biblioteca construida sobre LangChain que permite definir flujos de trabajo multiagente como grafos dirigidos. Los nodos del grafo representan agentes o pasos de procesamiento, las aristas representan el flujo del estado entre ellos y las aristas condicionales permiten un enrutamiento dinámico basado en el estado actual. LangGraph gestiona el motor de ejecución, la persistencia del estado y los puntos de control con intervención humana.

# pip install langgraph
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

# Define your shared state schema
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]  # append-only list
    research: str
    draft: str
    status: str

Definición del estado en LangGraph

Cada flujo de trabajo de LangGraph opera sobre un objeto de estado compartido que todos los nodos pueden leer y escribir. El estado es un diccionario tipado (TypedDict) que transporta datos por el grafo. Cuando se ejecuta un nodo, recibe el estado actual, realiza su trabajo y devuelve un diccionario de actualizaciones que se fusionan con el estado. Este modelo de estado compartido permite que los agentes se comuniquen sin un acoplamiento directo.

from typing import TypedDict

class ResearchState(TypedDict):
    query: str           # input from user
    research_notes: str  # filled by researcher node
    written_draft: str   # filled by writer node
    review_feedback: str # filled by reviewer node
    final_output: str    # filled by synthesizer node
    iteration_count: int # tracks how many revision loops occurred

# Each node returns a PARTIAL update - only the keys it modifies
def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {'research_notes': notes}  # only update this key

Creación de nodos de agentes

En LangGraph, cada agente es una función de nodo que recibe el estado actual, realiza su llamada al LLM y ejecuta herramientas, y devuelve una actualización del estado. Los nodos son funciones puras: no almacenan estado interno. Todo el estado reside en el objeto de estado compartido del grafo, lo que facilita inspeccionar, reanudar y depurar el flujo de trabajo.

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(model='gpt-4o')

def researcher_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a research specialist. Find accurate information.'),
        HumanMessage(content=f'Research this topic: {state["query"]}')
    ]
    response = llm.invoke(messages)
    return {'research_notes': response.content}

def writer_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a technical writer. Write clear, engaging prose.'),
        HumanMessage(content=f'Write a draft using these notes:\n{state["research_notes"]}')
    ]
    response = llm.invoke(messages)
    return {'written_draft': response.content}

Creación del grafo con StateGraph

Después de definir las funciones de los nodos, puede conectarlas mediante StateGraph. Añada nodos con graph.add_node(), añada aristas entre ellos con graph.add_edge(), establezca el punto de entrada con graph.set_entry_point() y compile el grafo en un ejecutable con graph.compile(). El grafo compilado es un runnable que acepta un estado inicial y devuelve el estado final.

from langgraph.graph import StateGraph, END

# Build the graph
workflow = StateGraph(ResearchState)

# Add nodes
workflow.add_node('researcher', researcher_node)
workflow.add_node('writer', writer_node)
workflow.add_node('reviewer', reviewer_node)

# Add edges (sequential pipeline)
workflow.set_entry_point('researcher')
workflow.add_edge('researcher', 'writer')
workflow.add_edge('writer', 'reviewer')
workflow.add_edge('reviewer', END)

# Compile into an executable
app = workflow.compile()

# Run it
result = app.invoke({'query': 'What is RAG?', 'iteration_count': 0})
print(result['written_draft'])

Aristas condicionales para el enrutamiento dinámico

Las aristas condicionales permiten que el grafo se dirija a distintos nodos según el estado actual. En lugar de una arista fija, se proporciona una función de enrutamiento que inspecciona el estado y devuelve el nombre del siguiente nodo. Esto permite crear ciclos de revisión, controles de calidad, pasos de aprobación humana y bifurcaciones basadas en el contenido de las salidas de los agentes.

def should_revise(state: ResearchState) -> str:
    '''Router function: returns the name of the next node.'''
    if state['iteration_count'] >= 3:
        return 'finalize'  # Too many revisions - accept as is
    if 'insufficient' in state.get('review_feedback', '').lower():
        return 'researcher'  # Need more research
    if 'rewrite' in state.get('review_feedback', '').lower():
        return 'writer'  # Needs rewriting
    return 'finalize'  # Looks good

# Add conditional edge from reviewer
workflow.add_conditional_edges(
    'reviewer',                    # from node
    should_revise,                 # routing function
    {
        'researcher': 'researcher', # route name -> node name
        'writer': 'writer',
        'finalize': 'finalizer'
    }
)

Bucles e iteración en LangGraph

LangGraph admite bucles de forma nativa: un agente puede volver a ejecutarse varias veces. Esto es esencial para los ciclos de revisión, los patrones de reintento en caso de fallo y el refinamiento iterativo. Incluya siempre en el estado una condición de finalización del bucle (como un contador de iteraciones o un umbral de puntuación de calidad) y hágala cumplir en el enrutador de aristas condicionales para evitar bucles infinitos.

def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {
        'research_notes': notes,
        'iteration_count': state['iteration_count'] + 1  # always increment
    }

def should_continue_research(state: ResearchState) -> str:
    # Terminate loop after 3 iterations regardless of quality
    if state['iteration_count'] >= 3:
        return END
    # Continue if research is incomplete
    if len(state.get('research_notes', '')) < 500:
        return 'researcher'  # loop back
    return 'writer'  # proceed to next stage

Ejecución paralela de nodos

LangGraph admite ramas paralelas mediante RunnableParallel dentro de un nodo o distribuyendo el flujo entre varios nodos. Cuando es necesario ejecutar simultáneamente subtareas independientes, puede crear una distribución desde un nodo hacia varios nodos paralelos y, después, un nodo de convergencia que espere a que todos terminen y fusione sus resultados en el estado compartido.

# Fan-out: one node triggers multiple parallel ones
workflow.add_edge('planner', 'researcher_a')
workflow.add_edge('planner', 'researcher_b')
workflow.add_edge('planner', 'researcher_c')

# Fan-in: aggregator waits for all three
workflow.add_edge('researcher_a', 'aggregator')
workflow.add_edge('researcher_b', 'aggregator')
workflow.add_edge('researcher_c', 'aggregator')
workflow.add_edge('aggregator', 'writer')

# Aggregator merges parallel results
def aggregator_node(state: ResearchState) -> dict:
    combined = state.get('notes_a', '') + '\n' + state.get('notes_b', '') + '\n' + state.get('notes_c', '')
    return {'research_notes': combined}

Puntos de control y participación humana

LangGraph admite puntos de control mediante la integración con un backend de puntos de control (SQLite, Redis o PostgreSQL). Con los puntos de control habilitados, el estado del grafo se conserva después de la ejecución de cada nodo. Esto permite pausar, inspeccionar y reanudar flujos de trabajo de larga duración. También permite crear patrones de participación humana en los que el grafo se pausa en un nodo específico y espera a que una persona apruebe o proporcione información antes de continuar.

from langgraph.checkpoint.sqlite import SqliteSaver

# Use SQLite for persistent checkpoints
checkpointer = SqliteSaver.from_conn_string(':memory:')
app = workflow.compile(checkpointer=checkpointer, interrupt_before=['human_review'])

# First run - pauses at human_review node
thread = {'configurable': {'thread_id': 'my-workflow-1'}}
result = app.invoke({'query': 'Analyze competitors'}, config=thread)
# result.next == 'human_review' -- waiting for human input

# Human provides feedback and resumes
app.update_state(thread, {'review_feedback': 'Good research, proceed with writing'})
final = app.invoke(None, config=thread)  # resume from checkpoint

Transmisión de salidas de LangGraph

LangGraph admite un modo de transmisión que emite actualizaciones intermedias del estado a medida que termina cada nodo, en lugar de esperar a que finalice todo el flujo de trabajo. Esto resulta útil en pipelines largos en los que desea mostrar al usuario el progreso parcial. Use app.stream() para obtener un iterador de instantáneas del estado de cada paso.

# Stream intermediate results as each node completes
for event in app.stream({'query': 'What is RAG?'}):
    for node_name, node_output in event.items():
        print(f'Node completed: {node_name}')
        if 'research_notes' in node_output:
            print('Research done:', node_output['research_notes'][:100])
        if 'written_draft' in node_output:
            print('Draft done:', node_output['written_draft'][:100])

Visualización del grafo

LangGraph puede dibujar el grafo como un diagrama de Mermaid, lo que resulta muy útil para comprender flujos de trabajo complejos con muchos nodos y aristas condicionales. Llame a app.get_graph().draw_mermaid_png() para obtener una imagen PNG o a app.get_graph().draw_mermaid() para obtener la sintaxis de Mermaid que puede pegar en cualquier renderizador de Mermaid.

# Visualize the workflow graph
graph_image = app.get_graph().draw_mermaid_png()
with open('workflow.png', 'wb') as f:
    f.write(graph_image)

# Or print Mermaid syntax
print(app.get_graph().draw_mermaid())
# Outputs:
# graph TD
#    __start__ --> researcher
#    researcher --> writer
#    writer --> reviewer
#    reviewer -->|Good| finalize
#    reviewer -->|Needs work| researcher

Ejemplo de un agente LangGraph de extremo a extremo

En conjunto, un pipeline multiagente completo de LangGraph define un estado TypedDict, crea funciones de nodo para cada agente, las conecta con StateGraph, añade aristas condicionales para los ciclos de revisión, compila el grafo con un punto de control y lo invoca con un estado inicial. Esto proporciona un flujo de trabajo multiagente sólido, observable y reanudable, con un mínimo de código adicional.

Comprobación rápida

Compruebe su comprensión de los pipelines multiagente de LangGraph explicados en esta lección.

Resumen de la lección

En esta lección ha aprendido que LangGraph representa los flujos de trabajo multiagente como grafos dirigidos, donde los nodos son agentes y las aristas representan el flujo; las aristas condicionales permiten el enrutamiento dinámico, los bucles y los ciclos de revisión según el estado actual; y los puntos de control permiten pausar y reanudar flujos de trabajo de larga duración con aprobación humana. A continuación, exploraremos la memoria compartida y la comunicación entre agentes.

Gratis para empezar

Aprende Python con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Creación de pipelines multiagente con LangGraph» es gratis?

Sí — el texto completo de «Creación de pipelines multiagente con LangGraph» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Engineering Academy, actualiza a CoddyKit PRO. El curso de AI Engineering Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Creación de pipelines multiagente con LangGraph»?

Use LangGraph para definir nodos de agentes, aristas condicionales y un estado compartido en un grafo dirigido, lo que permite flujos de trabajo multiagente complejos con bucles, ramificaciones y pun… Practicas AI Engineering Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Engineering Academy?

No se requiere experiencia previa. AI Engineering Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Creación de pipelines multiagente con LangGraph»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Engineering Academy?

Sí. Cada lección de AI Engineering Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué los agentes individuales llegan a un límite
  2. Patrón de orquestador y subagentes
  3. Creación de pipelines multiagente con LangGraph
  4. Memoria compartida y comunicación entre agentes
← Volver a AI Engineering Academy