Opinión

Agente de IA estrecho frente a navaja suiza: cómo recortamos la latencia de respuesta de 17 a 7,7 segundos

Sustituir el perfil de herramientas universal por un plugin estrecho y especializado, junto con la desactivación de las sondas del entorno y de un paso de razonamiento innecesario, comprimió el prefijo del sistema de 15 266 a 1 424 tokens (10,7 veces) y aceleró la respuesta de 17 a 7,7 segundos. Todos los cálculos en los que el modelo de lenguaje tiende a equivocarse o a dejarse convencer por el usuario —rachas de días de estudio, cómputo de experiencia, rúbrica de calificaciones y legalidad de las jugadas de ajedrez— se trasladan a un plugin determinista en Python sobre SQLite. Para que el progreso del usuario sea estable hace falta normalizar de forma explícita el identificador de sesión; de lo contrario, la rotación de una clave interna al reiniciar la pasarela pone a cero en silencio el historial del alumno.

Agente de IA estrecho frente a navaja suiza: cómo recortamos la latencia de respuesta de 17 a 7,7 segundos
Hamidun News.
Escuchar artículo
Ficha técnica y cifras clave
ParámetroDatos
Editor jefe
Reducción de la latencia de respuestala mediana bajó de ~17 s (13,3–20,6 s) a 7,7 s (7,25–7,93 s)
Compresión del prefijo de entradade 15 266 a 1 424 tokens por solicitud (ahorro de 10,7 veces sin cambiar la lógica de negocio)
Tamaño del núcleo determinista766 líneas de plugin de gamificación en Python sobre SQLite y 342 líneas del verificador de notación
Techo práctico del archivo de personalidadunos 20 000 bytes para `SOUL.md`, sin que el modelo pierda atención en la parte central de las instrucciones

La primera tentación al montar un agente de IA es darle acceso a todo a la vez: terminal, navegador, búsqueda web, archivos y servidores MCP. El baño de realidad llegó con un entrenador de ajedrez infantil desplegado mediante un endpoint local /v1/chat/completions. El niño movía una pieza en el tablero y el comentario del entrenador llegaba 17 segundos después, cuando el joven jugador ya había hecho dos jugadas más.

El análisis mostró que, de los 15 266 tokens del prefijo de entrada, casi 14 000 los ocupaban esquemas JSON de herramientas que no se invocaron ni una sola vez en una partida de ajedrez, además de la recogida automática de datos del sistema operativo al arrancar. Es más, ante la menor dificultad, un agente con acceso a execute_code empezaba a escribir y ejecutar scripts en un sandbox, y convertía una sola jugada en veinte llamadas a la API.

¿Cómo reducen tres líneas de configuración el prompt 10,7 veces y eliminan la latencia?

Para convertir a un generalista cavilador en un servicio rápido no hizo falta reescribir el código del plugin. Ajustamos tres parámetros en la configuración del runtime:

  1. Dejamos a la plataforma api_server un solo conjunto de herramientas de dominio ([chess]) y quitamos los de archivos y shell.
  2. Desactivamos environment_probe, que en cada arranque consultaba el host y volcaba una instantánea del entorno en el prompt del sistema.
  3. Fijamos reasoning_effort: none: como los hechos tácticos ya los calcula el motor Stockfish, el modelo no necesita construir una cadena de razonamiento antes de responder; su tarea es comunicar con viveza un veredicto ya listo.

En las mediciones de control con la caché caliente, el tiempo de respuesta pasó de 13,3 / 17,3 / 20,6 s a 7,25 / 7,74 / 7,93 s (mediana de 7,7 s), y el consumo de tokens de entrada cayó 10,7 veces: de 15 266 a 1 424. Recortar el conjunto de herramientas ahorra tokens y protege el circuito de iniciativas improvisadas en la terminal, mientras que desactivar el paso de razonamiento superfluo aporta la mayor parte del beneficio en segundos. Un detalle importante: los perfiles de herramientas para el mensajero y para el planificador (cron) se definen por separado; si olvidas registrar el plugin en la sección cron, el envío matutino se pondrá en silencio a buscar datos leyendo archivos.

¿Cómo separar la personalidad en dos capas y trasladar el cálculo de rachas a SQLite?

La personalidad de un agente estrecho se diseña en dos niveles: un bloque breve de disparadores en config.yaml (10–15 líneas) define el despacho (tutor_state al inicio del diálogo, tutor_record_lesson tras el ejercicio), y el reglamento de tono y pedagogía vive en SOUL.md. El techo de trabajo de este archivo ronda los 20 000 bytes (en mis bots, de 6,7 a 19,9 KB): si se infla más, el modelo pierde las reglas del centro.

Un modelo de lenguaje interpreta de maravilla las emociones, pero calcula mal las fechas, los puntos de experiencia y las notas por rúbrica. En el tutor de idiomas, toda la matemática de la gamificación (10 niveles de 0 a 8000 XP, hitos de racha de 3 a 365 días, 15 insignias y cristales) se ha trasladado a un plugin de Python de 766 líneas sobre SQLite:

``python if last_date == today: streak = max(1, prev_streak) elif last_date == yesterday or not last_date: streak = (prev_streak + 1) if last_date == yesterday else 1 else: gap_days = (parse_date(today) - parse_date(last_date)).days if freezes > 0 and gap_days == 2: freezes -= 1 streak = prev_streak + 1 events.append({"type": "freeze_used", "msg": "Заморозка спасла серию дней!"}) else: if prev_streak > 1: events.append({"type": "streak_reset", "old": prev_streak}) streak = 1 ``

La herramienta devuelve un array events, y en el campo description del propio esquema JSON de la función va incrustada una directiva: felicitar con emoción al alumno por cada evento de events y no inventar nada por su cuenta sobre el saldo. De forma análoga, en el simulador de negociaciones de compras, una rúbrica de 4 módulos con escala de 40 puntos comprueba mediante código los marcadores de raíz (riesgos, verificación de hechos, regateo), para que el participante no pueda «convencer» a la red neuronal de subirle la nota.

¿Por qué el progreso se ponía a cero en silencio tras un reinicio y cómo arreglar el framework?

En las primeras versiones, el motor pasaba al manejador de la herramienta un parámetro task_id, igual al ID de la sesión actual, y yo lo usaba como clave primaria del alumno. Al pulsar /new o reiniciar el contenedor se generaba un nuevo task_id, y la persona veía una hoja en blanco en lugar de 30 días de estudio. El problema lo resolvió un resolvedor de clave de dos niveles que extrae con una expresión regular el ID permanente de la cuenta a partir de telegram:dm:<user_id> o lo contrasta con sessions.json, lo que garantiza una clave estable tg:<id>.

Para no reconstruir una imagen de gigabytes por cada librería, el despliegue instala los paquetes con pip install --target en el volumen data/pylibs, aplica chown -R para un usuario sin privilegios de root y limpia __pycache__. Y donde al transporte base le faltaba el teclado inferior o se tragaba /start, unos parches autorreparables de bootstrap.sh comprueban al arrancar los anclajes en el código del adaptador, insertan el bloque y verifican el archivo con py_compile.

El patrón «un plugin determinista calcula, un modelo estrecho interpreta» está integrado en la base de Nomad AI y del entorno en la nube agent.nomadnet.ai. Los laboratorios para construir este tipo de agentes están disponibles en Hamidun Academy (72 horas de prueba gratuita), y los plugins ya hechos y más de 370 habilidades los analizamos en Vibe Club.

Historia

Preguntas frecuentes sobre la noticia

¿Cómo reducen tres líneas de configuración el prompt 10,7 veces y eliminan la latencia?

Para convertir a un generalista cavilador en un servicio rápido no hizo falta reescribir el código del plugin. Ajustamos tres parámetros en la configuración del runtime: Dejamos a la plataforma api_server un solo conjunto de herramientas de dominio ([chess]) y quitamos los de archivos y shell. Desactivamos environment_probe, que en cada arranque consultaba el host y volcaba una instantánea del entorno en el prompt del sistema.

¿Cómo separar la personalidad en dos capas y trasladar el cálculo de rachas a SQLite?

La personalidad de un agente estrecho se diseña en dos niveles: un bloque breve de disparadores en config.yaml (10–15 líneas) define el despacho (tutor_state al inicio del diálogo, tutor_record_lesson tras el ejercicio), y el reglamento de tono y pedagogía vive en SOUL.md. El techo de trabajo de este archivo ronda los 20 000 bytes (en mis bots, de 6,7 a 19,9 KB): si se infla más, el modelo pierde las reglas del centro.

¿Por qué el progreso se ponía a cero en silencio tras un reinicio y cómo arreglar el framework?

En las primeras versiones, el motor pasaba al manejador de la herramienta un parámetro task_id, igual al ID de la sesión actual, y yo lo usaba como clave primaria del alumno. Al pulsar /new o reiniciar el contenedor se generaba un nuevo task_id, y la persona veía una hoja en blanco en lugar de 30 días de estudio.

ZK
Zhemal Khamidun — CPO de Alpina Digital, product manager de AlpinaGPT. Crea productos de IA desde 2019. Hamidun News es un proyecto personal que creció hasta ser un agregador en producción con más de 6.000 lectores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
¿Qué te parece?
Cargando comentarios…