Agentes de 12 factores: patrones para aplicaciones LLM confiables
(github.com/humanlayer)- 12-Factor Agents es una guía abierta que reúne 12 principios para crear software basado en LLM lo suficientemente confiable como para ofrecerlo a clientes en producción.
- Plantea que un buen agente no se parece tanto a “darle un prompt y un conjunto de herramientas para que itere hasta alcanzar un objetivo”, sino más bien a una estructura en la que la mayor parte es software determinista con pasos de LLM insertados donde hacen falta.
- Un loop típico de agente hace que el LLM decida el siguiente paso como una llamada estructurada a herramientas en JSON; luego código determinista la ejecuta, agrega el resultado a la ventana de contexto y repite hasta completar la tarea.
- Según la guía, muchos creadores de SaaS empiezan rápido con un framework y llegan a una calidad del 70–80%, pero eso no alcanza para funciones de cara al cliente, por lo que terminan haciendo ingeniería inversa del framework, los prompts y el flujo, o empezando de nuevo desde cero.
- La forma más rápida de entregar software de IA de alta calidad a clientes no es adoptar un framework completo de agentes, sino integrar conceptos pequeños y modularizados de construcción de agentes en el producto existente.
El problema que aborda el proyecto
- 12-Factor Agents es un proyecto abierto que busca aplicar el espíritu de 12 Factor Apps a los principios para construir aplicaciones LLM.
- La pregunta central es: “¿Qué principios podemos usar para crear software basado en LLM que sea realmente bueno y lo bastante confiable como para ponerlo en manos de clientes en producción?”.
- Parte de la experiencia de probar diversos frameworks de agentes y conversar con fundadores técnicos dentro y fuera de YC.
- Muchos fundadores están construyendo su propio stack en lugar de usar intensivamente frameworks para agentes de cara al cliente en producción.
- Considera que muchos productos llamados “AI Agent” no son completamente agénticos, sino que en su mayoría combinan código determinista con pasos de LLM en los puntos adecuados.
Perspectiva básica sobre los agentes
- Un buen agente no se compone solo del patrón “prompt, conjunto de herramientas e iteración hasta alcanzar el objetivo”.
- El software puede verse como un grafo dirigido (DG), y esa es también la razón por la que antes se representaban los programas como diagramas de flujo.
- Desde hace unos 20 años se empezaron a usar ampliamente los orquestadores DAG.
- La promesa de los agentes es que, en lugar de que el ingeniero codifique todos los pasos y excepciones, solo proporcione el objetivo y las transiciones, y que el LLM decida la ruta en tiempo real.
- Este enfoque genera la expectativa de escribir menos código, recuperarse de errores y permitir que el LLM encuentre soluciones nuevas.
- Pero en la práctica, considera que este enfoque no funciona tan bien como se espera.
Modelo de ejecución del loop de agente
- El loop básico de un agente se compone de juicio del LLM → ejecución de herramienta → agregar resultado al contexto → repetición.
- El flujo es el siguiente:
- El contexto inicial es un evento de inicio, como un mensaje del usuario, una ejecución de cron o un webhook.
- El LLM decide el siguiente paso o si la tarea está completa.
- El siguiente paso se emite como una llamada a herramienta en formato JSON estructurado.
- Código determinista ejecuta la llamada a la herramienta.
- El resultado de la ejecución se agrega a la ventana de contexto.
- Si el siguiente paso es
done, se devuelve la respuesta final.
- El ejemplo del README muestra un loop que determina el siguiente paso con
llm.determine_next_step(context), lo ejecuta conexecute_step(next_step)y luego adjunta el resultado al contexto.
Por qué hacen falta 12 principios
- Mientras construía HumanLayer, el autor conversó con al menos 100 creadores de SaaS, en general fundadores técnicos que buscaban hacer que sus productos existentes fueran más agénticos.
- El recorrido típico es el siguiente:
- Deciden construir un agente.
- Definen el diseño del producto, el mapeo de UX y el problema a resolver.
- Para avanzar rápido, eligen un framework específico.
- Llegan a un nivel de calidad del 70–80%.
- Se dan cuenta de que una calidad del 80% no es suficiente para la mayoría de las funciones de cara al cliente.
- Para superar ese 80%, deben hacer ingeniería inversa del framework, los prompts, los flujos, etc.
- Al final, empiezan de nuevo desde cero.
- Esta crítica no pretende atacar a los frameworks ni a sus creadores, y se aclara que los frameworks han acelerado el ecosistema de IA.
- No aborda MCP; los ejemplos usan principalmente TypeScript, pero se afirma que también pueden aplicarse en Python u otros lenguajes.
Los 12 factores
- Aunque los LLM sigan volviéndose más potentes, considera que se mantendrán las técnicas de ingeniería clave para hacer que el software basado en LLM sea más confiable, escalable y fácil de mantener.
- Los 12 factores son los siguientes:
- Factor 1: Natural Language to Tool Calls: convertir lenguaje natural en llamadas a herramientas
- Factor 2: Own your prompts: hacerse cargo directamente de los prompts
- Factor 3: Own your context window: hacerse cargo directamente de la ventana de contexto
- Factor 4: Tools are just structured outputs: las herramientas son solo salidas estructuradas
- Factor 5: Unify execution state and business state: unificar el estado de ejecución y el estado de negocio
- Factor 6: Launch/Pause/Resume with simple APIs: iniciar, pausar y reanudar con APIs simples
- Factor 7: Contact humans with tool calls: contactar a personas mediante llamadas a herramientas
- Factor 8: Own your control flow: hacerse cargo directamente del flujo de control
- Factor 9: Compact Errors into Context Window: compactar errores dentro de la ventana de contexto
- Factor 10: Small, Focused Agents: agentes pequeños y enfocados
- Factor 11: Trigger from anywhere, meet users where they are: activar desde cualquier lugar y encontrarse con los usuarios donde estén
- Factor 12: Make your agent a stateless reducer: convertir el agente en un reducer sin estado
- Como consejo adicional, se incluye Factor 13: Pre-fetch all the context you might need.
Forma de aplicación y materiales relacionados
- Considera que adoptar un framework completo y terminar prácticamente en una reescritura greenfield puede ser contraproducente.
- Aunque al adoptar un framework se pueden obtener la mayoría de los principios clave que hacen bueno a un agente, el camino para entregar rápidamente software de IA de alta calidad a clientes es integrar conceptos más pequeños y modularizados en el producto existente.
- Señala que estos conceptos modulares también pueden ser definidos y aplicados por ingenieros de software experimentados sin experiencia previa en IA.
- Como materiales relacionados se enlazan Building Effective Agents de Anthropic, Prompts are Functions, Library patterns: Why frameworks are evil y The Wrong Abstraction, entre otros.
- El contenido y las imágenes se ofrecen bajo licencia CC BY-SA 4.0, y el código bajo licencia Apache 2.0.
1 comentarios
Comentarios de Hacker News
Los puntos de este artículo son excelentes. También hay una lista de lecciones aprendidas tras varios años haciéndolo en la práctica: https://mg.dev/lessons-learned-building-ai-agents/
Si tuviera que agregar algo importante hoy, sería adueñarte del bucle de planificación del nivel más bajo. La planificación dinámica está bien, pero hay que tener tu propio bucle de observar-evaluar-decidir-actuar (OODA), además de heurísticas para determinar si está convergiendo hacia una solución (por ejemplo, puntuación) o condiciones de salida (por ejemplo, número máximo de iteraciones)
También valdría la pena considerar meter un motor de workflows. En vez de hacer que el modelo mantenga y avance un workflow implícito a lo largo de varios turnos, es mejor que el modelo genere una especificación de workflow para que se ejecute en ese motor, y volver a invocar al modelo en cada etapa si hace falta
Me pregunto cómo encajan librerías como DSPY con el factor 2: https://dspy.ai/, https://github.com/humanlayer/12-factor-agents/blob/main/con...
Mientras leía, vi que mencionaban generar prompts con BAML. Personalmente, nunca me resultó fácil escribir a mano prompts para extraer información estructurada de datos no estructurados, y hasta ahora he tenido bastante buenas experiencias con DSPY
Si usan los prompts crudos de BAML, me interesa saber qué opinan del enfoque de usar prompts crudos en DSPY: https://dspy.ai/tutorials/observability/#using-inspect_histo...
No coincido del todo con este artículo, https://www.chrismdp.com/beyond-prompting/, pero la comparación de tarjetas perforadas → ensamblador → C → lenguajes de alto nivel sirve bastante aquí
Todavía no sé cuándo aparecerán las abstracciones adecuadas, y no creo que LangChain o DSPY sean todavía el “lenguaje de programación C” de la IA. Tal vez algún día lo sean
Por ahora, yo usaría un banco de trabajo de bajo nivel donde pueda inspeccionar tokens, cambiar el orden de tokens especiales como system/user/JSON, y ajustar rápido las rarezas de los modelos nuevos sin quedar atado mientras espero soporte de una librería
Hay un artículo viejo, conocido pero no tanto, sobre patrones de frameworks que me ha resonado durante toda mi carrera, y creo que también aplica aquí: https://tomasp.net/blog/2015/library-frameworks/
Con los LLM, por las razones que explica el artículo y más aún, especialmente en una etapa como la actual donde todo cambia rápido, es mejor usarlos como librerías que como frameworks. Pero los frameworks son más sexys y más fáciles de vender, y como llevan al lock-in y a servicios adicionales, se promocionan más
Hicimos público hace poco nuestro propio “framework de agentes de IA”, SecAI, construido sobre el modelo de actores, máquinas de estado y programación orientada a aspectos: https://github.com/pancsta/secai
En particular me gustaron el punto 5, “unifica el estado de ejecución y el estado de negocio”, y el 8, “adueñate del flujo de control”. El núcleo de SecAI es una librería de flujo de control basada en grafos; usa multigrafos en lugar de DAG, y las llamadas al LLM vienen integradas en los nodos del grafo
Los flujos se refuerzan con negociación, cancelación y relaciones con estado para funcionar de forma más orgánica. También incluye herramientas de desarrollo dedicadas que suelen faltar en otros frameworks (dbg, repl, svg), programación asumiendo fallas, inspección detallada de cada paso, exportación automática de datos (métricas, trazas, logs, SQL) e integraciones simples (bash)
También publicamos la primera demo técnica, que muestra las herramientas de desarrollo con una implementación de referencia de deepresearch portada desde AtomicAgents: https://youtu.be/0VJzO1S-gV0
Los botones Send/Stop son, en la práctica, “Factor 6. iniciar/pausar/reanudar con una API simple”, y además tiene transparencia de red, así que escala
Yo agregaría una más: hay que planificar el costo cuando esto escale
Estos sistemas no salen baratos cuando crecen, así que si alguna tarea puede resolverse con un componente determinista, conviene intentar eso primero. No solo reduce alucinaciones y latencia, también puede marcar una gran diferencia en la rentabilidad final
Para que sea más fácil seguir cada principio, estaría bueno tener una narrativa consistente que cruce varios factores. Si se usara de forma continua un ejemplo de sistema cercano a la realidad, creo que sería más fácil de entender
Me gustaría seguir desarrollándolo en público junto con la comunidad
Excelente. Ya aprendí el 80% a las malas, y el 20% restante parece valer la pena leerlo
En lo personal, me ha funcionado la combinación de LangGraph + esquemas de pydantic. También me da curiosidad qué otras herramientas le han resultado útiles a los demás
Este artículo salió justo cuando lo necesitaba
Estoy experimentando con una idea de sandbox audiovisual. Es algo como vvvv, pero mucho más simple y con funciones mínimas: https://kfs.mkj.lt/#audiovisllm, https://vvvv.org/
La idea es insertar “nodos” de LM o redes neuronales locales simples que se encarguen de tareas específicas y tengan una salida muy restringida. Por eso ejemplos como “question -> answer: float” me resultan muy atractivos. En mi caso, algunas de las preguntas pueden ser bastante abstractas, pero las pipelines de varias etapas también me parecen interesantes
No lo he leído a fondo, pero quiero usar la mayor cantidad posible de código determinista y recurrir lo menos posible al LLM
Así se obtienen resultados predecibles, costos operativos bajos y además se da la señal de que a otros no les será tan fácil copiar la misma app rápidamente. En vez de usar tal cual el pegamento de moda para conectar LLM con otros sistemas, prefiero crear mis propias herramientas
Si estas condiciones no se cumplen o no hacen falta, creo que alguien puede sacar la misma solución en un instante con vibe coding. Hay que mantener el control. Soy de la postura de morir en la colina del control. Eso no significa que no me impresionen los LLM; de hecho, es todo lo contrario