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.
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: strDefinició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 keyCreació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 stageEjecució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 checkpointTransmisió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| researcherEjemplo 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.
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
- Por qué los agentes individuales llegan a un límite
- Patrón de orquestador y subagentes
- Creación de pipelines multiagente con LangGraph
- Memoria compartida y comunicación entre agentes