Después del tutorial de LangGraph: aristas duras, esquemas y capas de seguridad
Convierta un agente SQL funcional en uno seguro mediante protecciones tipadas, actualización de esquemas, enrutamiento basado en costos y verificaciones en capas.
Después del tutorial, la marca de verificación verde
Los tutoriales de LangGraph permiten ejecutar un grafo. La evaluación comienza cuando alguien pregunta por qué cada decisión es segura. Esta reescritura abarca una semana de trabajo para transformar un agente al estilo de analista SQL funcional en algo defendible: arquitecturas que no pueden ignorar la seguridad, salidas estructuradas, actualización constante del esquema, conciencia de costos y errores detectados durante su desarrollo.
Situación y tarea
Los tutoriales proporcionan rutas de códigos, no invariantes. La tarea consistía en mantener un proyecto funcional mientras se garantizaba que cada ramificación fuera explicable durante la revisión, especialmente aquellas que ejecutan SQL.
Acción 1: dos arquitecturas para que ninguna pueda omitir la protección
Una barrera de seguridad debe ser una regla estricta, no una sugerencia basada en un prompt. Las evaluaciones estructuradas deben formar parte de esquemas tipados:
class JudgeAgentSchema(BaseModel):
answer: Literal["yes", "no"] = Field(
description="Return 'yes' if the SQL query ONLY retrieves data (like SELECT). "
"Return 'no' if it modifies data (like INSERT, UPDATE, DELETE, DROP)."
)
comments: str = Field(default="", description="Reasoning behind the verdict")
llm_judge = llm.with_structured_output(schema=JudgeAgentSchema)
Ruta con una condición explícita:
def is_safe_sql_condition(state: AgentSchema) -> str:
if state.is_safe.lower() == "yes":
return "Execute_SQL"
return "Cancel_SQL_if_Not_Safe"
Los errores de validación aparecen cuando el modelo se desvía del vocabulario literal:
ValidationError: Input should be 'yes' or 'no'
[type=literal_error, input_value='No', input_type=str]
@field_validator('answer', mode='before')
@classmethod
def normalize_answer(cls, v):
if isinstance(v, str):
v = v.strip().lower()
return v if v in ("yes", "no") else "no" # fail closed
ValidationError: Input should be 'yes' or 'no'
[type=literal_error, input_value='', input_type=str]
Fije cuidadosamente los valores enumerados y las opciones predeterminadas:
is_safe: Literal["yes", "no"] = Field(default="no") # fail closed
generated_sql_query: str = Field(default="")
messages: Annotated[list, add] = Field(default_factory=list) # not default=[]
PydanticJsonSchemaWarning: Default value (...) is not JSON serializable
comments: str = (
Field(..., description="..."), # ← trailing comma makes this a tuple
)
def prompt_query_context(state: AgentSchema) -> AgentSchema:
database_object = Database(connection_details)
schema_info = database_object.get_schema_details("public")
Acción 2: salida estructurada como componente programable
Una vez que las respuestas de seguridad son literales, los flujos se convierten en código. El modelo es un componente con un contrato, no quien describe el flujo de control.
Acción 3: volver a obtener el esquema en cada ejecución
Un esquema obsoleto en las instrucciones provoca la generación de SQL incorrecto. Actualizarlo consume tokens; dejarlo obsoleto genera incidentes. Prefiera obtener el esquema en cada ejecución para bases de datos en evolución, a menos que se especifique explícitamente una versión fija.
Acción 4: costo del agente ≠ costo de la pipeline
Los agentes realizan bucles. Asigne un presupuesto teniendo en cuenta límites de recursión y modelos más económicos para el enrutamiento:
def pick_llm(model_level: str) -> ChatAnthropic:
if normalized_level == "basic":
return ChatAnthropic(model="claude-haiku-4-5", temperature=0)
elif normalized_level == "advanced":
return ChatAnthropic(model="claude-sonnet-4-6", temperature=0)
elif normalized_level == "premium":
return ChatAnthropic(model="claude-opus-4-6", temperature=0)
Se exponen los errores de escritura
Tanto el reductor como el nodo están añadiendo contenido
messages: Annotated[list, add] = Field(default_factory=list)
state.messages = state.messages + [response] # full list: old + new
return state # reducer adds it AGAIN
def sql_node(state: DataAgentSchema):
response = sql_analyst.invoke({...})
return {"messages": [AIMessage(content=response["final_answer"])]}
Elige a un único escritor: reductor o nodo, pero no ambos.
Transmisión del estado completo del subagente hacia arriba
response = sql_analyst.invoke({...}) # returns the full AgentSchema dict
state.messages = state.messages + [response]
Envía solo los campos que necesita el padre.
Seguridad probabilística de una sola capa
Las credenciales de la base de datos y el análisis SQL deben respaldar las decisiones del modelo:
POSTGRES_USER: agent_user
POSTGRES_PASSWORD: agent_pass
import sqlparse
def is_read_only(sql: str) -> bool:
statements = sqlparse.parse(sql)
if len(statements) != 1: # blocks stacked queries
return False
return statements[0].get_type() == "SELECT"
CREATE ROLE agent_readonly LOGIN PASSWORD '...';
GRANT CONNECT ON DATABASE agent_db TO agent_readonly;
GRANT USAGE ON SCHEMA public TO agent_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_readonly;
Defensa en profundidad: puerta de control del modelo + analizador + usuario de la base de datos con los menores privilegios.
Resultado y límite máximo
El grafo se volvió revisable: los bordes garantizan la seguridad, los esquemas evitan fallos, los costos son intencionales y las capas se superponen. El límite máximo son las evaluaciones continuas y las pruebas de caos, no otro capítulo de tutorial.
Prácticas a mantener
Escriba ADRs para bifurcaciones arquitectónicas. Pruebe rutas no elegibles. Registre las versiones del esquema. Separe la IAM de las herramientas. Vuelva a leer los reducers después de cada cambio de estado. Las tutoriales terminan al ejecutar código; la producción comienza con decisiones bien fundamentadas.
Intuición numérica probada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación baja a ~1 token, el esquema fracasa. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, pruebe los mensajes fijos en las pruebas de conocimientos factuales, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de acierto en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los beneficios obtenidos. Tenga en cuenta la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen dicha carga en condiciones medibles. Implemente estas funcionalidades con la misma disciplina que cualquier característica de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Información para los revisores
Explique en la solicitud de cambio por qué existen dos arquitecturas: un camino demuestra que es imposible omitir una protección porque ese caso límite no existe. Ese diagrama es lo que quieren los auditores de artefactos. Combínelo con pruebas fallidas que intentan invocar el nodo SQL sin un valor de seguridad válido.
Explique los paneles de costos junto a los paneles de calidad para que la idea de “simplemente usar el modelo más grande” no pueda pasar desapercibida. Explique la actualización del esquema con una historia sobre una columna que fue renombrada. Las historias tienen más impacto que las listas de verificación por sí solas, pero mantenga también esas listas.
Intuición numérica probada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor en comparación con los pasos de un solo token, incluso después de los costos adicionales del borrador, siempre y cuando la tasa de aceptación siga siendo alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema falla. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, pruebe los mensajes fijos en las pruebas de conocimientos factuales, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de acierto en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los beneficios obtenidos. Tenga en cuenta la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir experimentando demoras en las llamadas a las herramientas, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen dicha carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.