Inicio / Artículos / Después del tutorial de LangGraph: aristas duras, esquemas y capas de seguridad

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.

2742 palabras

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.