Inicio / Artículos / Graph engineering explicado: nodos, aristas y LangGraph en la práctica

Graph engineering explicado: nodos, aristas y LangGraph en la práctica

¿Es nuevo el graph engineering? Un repaso al prompt, context, harness y loop engineering, a qué define un grafo y a un ejemplo de agente en LangGraph con 11 nodos.

997 palabras

Cada pocos meses, la ingeniería de IA estrena una nueva etiqueta terminada en "-engineering", y la más reciente es graph engineering. La expresión se difundió mucho tras una publicación de Peter Steinberger, creador del agente autónomo de código abierto OpenClaw y que ahora trabaja en OpenAI, así que llegó a muchísimos timelines. La reacción razonable es preguntarse si nombra algo nuevo o si es solo otra palabra de moda.

Respuesta corta: en su mayor parte es un nombre nuevo para algo que quienes construyen agentes ya hacen. Esta es la versión larga.

Breve historia de las etiquetas

El campo ya ha pasado por varias oleadas de nombres.

Primero llegó el prompt engineering. Consiste en escribir prompts lo bastante precisos y claros para que el modelo entienda lo que necesitas.

Después vino el context engineering, cuando un prompt por sí solo ya no podía llevar todo lo que el agente necesita antes de empezar una tarea. Adjuntas más material, como capturas de pantalla, archivos markdown y código, para que el agente comprenda tanto tu intención como tu entorno.

El harness engineering fue probablemente el paso más grande. En lugar de limitarte a darle información al agente, construyes un entorno a su alrededor: detalles del proyecto, las herramientas que puede usar, memoria del trabajo anterior y políticas y barreras que lo mantienen dentro de los límites.

Luego está el loop engineering. Le dices al agente que siga iterando sobre un problema hasta cumplir un criterio de éxito. Un caso típico es un resumidor al que se le pide un informe sobre un tema y que después sigue puliendo su propio borrador hasta alcanzar un nivel de calidad que comprueba él mismo, en lugar de pasarlo a un paso de revisión aparte.

La idea es reducir tu propia intervención delegando en el agente la fase de pruebas. Ya no revisas cada iteración ni das feedback. El agente evalúa el resultado actual según los criterios y corrige su propio enfoque. Tiene una pega, porque un agente que se deja solo también puede desmadrarse y fundirse tus tokens. Aun así, si el ideal es un sistema sin humanos en el bucle, esto avanza en esa dirección.

La mayoría de quienes construyen agentes ya lo hacían mucho antes de que apareciera la etiqueta. Lo nuevo es el vocabulario, no el principio. El graph engineering sigue el mismo patrón.

Qué hace que algo sea un grafo

Tres ingredientes definen un grafo.

  1. Nodos. Un nodo es una unidad de cómputo independiente con una única tarea identificable: una función que recibe el estado actual y devuelve una actualización. En LangGraph se registra con graph.add_node(name, fn).
  2. Aristas. Una arista pasa el control de un nodo a otro. En LangGraph, graph.add_edge(a, b) significa que el nodo b puede ejecutarse en cuanto termina el nodo a. La dirección importa: a lleva a b y no al revés. También existen aristas condicionales. Con graph.add_conditional_edge(a, func), la función se ejecuta después del nodo a y elige el nodo que va a continuación.
  3. La forma. Nodos y aristas forman juntos un patrón, y esa estructura solo aparece cuando miras el conjunto conectado.

Graph engineering en la práctica

Para ver cómo se siente, piensa en un agente construido con LangGraph que elige un lugar de encuentro para un grupo de dos a cinco personas que viven lejos entre sí y discuten qué barrio tiene sentido. Tiene en cuenta factores reales, como el tiempo de trayecto y el número de transbordos de autobús de cada persona, en lugar de quedarse sin más con el punto medio del mapa.

El grafo tiene once nodos y cada uno hace una sola cosa. Acotan la zona de búsqueda, comprueban la accesibilidad para cada persona, preseleccionan barrios, buscan locales, los puntúan y al final revisan el resultado. No hay aristas condicionales, así que sobre el papel la estructura es lineal: cada paso lleva al siguiente, sin bifurcaciones.

El código de LangGraph que lo define es sencillo:

# Initialize the graph with our shared state schema.
graph = StateGraph(MeetingState)
graph.add_node(”node0_search_area”, search_area_node)

# list the nodes
# register one reachability node per possible party member
for index, node in enumerate(REACHABILITY_NODES):
graph.add_node(f”reach_person{index + 1}”, node)
graph.add_node(”nodeC_shortlist”, shortlist_node)
graph.add_node(”nodeD_spots”, spot_finder_node)
graph.add_node(”nodeE_score”, scorer_node)
graph.add_node(”nodeF_review”, reviewer_node)

# list the edges
graph.add_edge(START, “node0_search_area”)
for index in range(len(REACHABILITY_NODES)):
graph.add_edge(”node0_search_area”, f”reach_person{index + 1}”)
graph.add_edge(f”reach_person{index + 1}”, “nodeC_shortlist”)
graph.add_edge(”nodeC_shortlist”, “nodeD_spots”)
graph.add_edge(”nodeD_spots”, “nodeE_score”)
graph.add_edge(”nodeE_score”, “nodeF_review”)
graph.add_edge(”nodeF_review”, END)

# Compile into a runnable graph.
compiled = graph.compile() Engineering w/ a Project

Ese es todo el grafo, y se lee como un pipeline normal y corriente.

Qué te aporta la estructura

Incluso un grafo lineal tiene ventajas prácticas. Cada nodo lee y escribe en un único objeto de estado compartido, así que ves exactamente qué cambió cada paso. Un paso que falla es fácil de aislar y volver a ejecutar, porque es una función pequeña con una entrada definida. Puedes cambiar o mejorar un nodo, por ejemplo la puntuación de locales, sin tocar los demás. Y cuando haga falta una bifurcación o un bucle de reintentos, añadir una arista condicional es un cambio pequeño y no una reescritura.

Nada de esto es exótico. Es diseño de software de toda la vida aplicado a los flujos de trabajo de agentes, y por eso la etiqueta suena más dramática que la idea.

Entonces, ¿qué es?

El graph engineering no es un concepto nuevo. Es un nombre nuevo para un enfoque que se ha vuelto habitual a medida que más gente construye agentes. Si no lo has probado, dale una oportunidad con LangGraph o con el framework que ya te guste. La etiqueta importa menos que el hábito: divide el trabajo en pasos pequeños con un solo propósito, haz explícitas las conexiones entre ellos y mantén claro el estado compartido.