Principios de diseño — lee esto primero
Cómo configurar agentes que realmente funcionen — una tarea por agente, pocas habilidades, fundamentados, verificados.
get_agentsearch_knowledge_baseLa mayoría de los problemas de "el agente da malas respuestas" son de configuración, no del modelo. Sigue estos pasos antes de construir, y los resultados serán sólidos. Ignóralos y es fácil armar algo que parece plausible y se comporta mal, para luego confundir eso con un límite de la plataforma.
Descubre antes de construir — entrevista, no solo ejecutes
"Crear un agente de soporte" es el inicio de la conversación, no la especificación. Nunca respondas esto con un único create_agent y devuelvas una carcasa vacía. Trabaja como el asistente de configuración: entrevista primero, planifica toda la configuración, repítela, y luego construye. Pregunta en lenguaje claro — unas pocas preguntas a la vez, sobre su situación real, no sobre parámetros de herramientas — hasta que puedas visualizar el resultado final:
- El trabajo y a quién sirve. ¿Para qué es este agente, quién habla con él, cómo se ve una respuesta buena? Un trabajo por agente — si describen tres, son tres agentes.
- Lo que debe responder desde → una base de conocimientos. ¿Tienen documentos, un sitio web, políticas, una lista de precios? Si los hechos deben ser correctos, esos se convierten en una base de conocimientos que tú construyes y adjuntas — no texto del prompt. Si aún no tienen nada, diles qué recopilar.
- Procedimientos que ejecuta → habilidades. ¿Comportamientos de "cuando X, haz estos pasos" (reservar, verificar, cotizar)? Cada uno se convierte en una habilidad de carga bajo demanda con un "usa esto cuando…" claro.
- Cosas que debe hacer en otros sistemas → MCP. ¿Revisar un calendario, buscar un pedido, abrir un ticket? Esos son MCP tools para vincular — pregunta por el sistema y si pueden conectarlo.
- Un flujo guiado y con estado → un Storyline. ¿Es un proceso con memoria (captación → calificación → seguimiento) en lugar de preguntas y respuestas únicas? Eso es un Storyline, no solo un agente.
- Cómo se abre y sus límites duros. La primera línea que ven los visitantes (→ un page playbook) y los límites que van en
task("nunca cites un precio", "nunca des asesoramiento legal").
Luego repite el plan antes de tocar una herramienta — "así que construiré: el agente Soporte, una base de conocimientos a partir de tus PDFs de políticas, una habilidad de reserva, y vincularé tu calendario vía MCP — ¿correcto?" — y construye solo una vez que confirmen. Saltarse esto es exactamente cómo terminas con un agente vacío que nadie quería. Una solicitud vaga es una señal para preguntar, nunca una señal para adivinar.
Un agente, un trabajo
Asigna a cada agente una tarea única y claramente delimitada. Un agente "que hace todo" — soporte y ventas y programación — tiene una task difusa, compite consigo mismo por la atención, y responde peor a cada cosa. Si tienes tres trabajos, construye tres agentes.
Mantén el número de habilidades pequeño
Adjunta solo las habilidades que el trabajo de este agente necesita — aproximadamente cinco o menos. Las habilidades son elegidas por el modelo a partir de su description de una línea; cuanto más adjuntes, más difícil esa elección, y más a menudo cargará la incorrecta o ninguna. Un conjunto enfocado con descripciones claras de "usa esto cuando…" supera a un gran montón.
- La
descriptionde cada habilidad dice cuándo recurrir a ella, en una línea. - Los procedimientos viven en
instructions(cargados bajo demanda), nunca ensoul(pagado por cada turno). - Si dos habilidades se superponen en cuándo, fusionalas — los disparadores superpuestos hacen que la elección sea como lanzar una moneda.
Fundamenta los hechos; pon los límites en la task
- Los hechos (tasas, política, catálogo) pertenecen a una base de conocimientos, que se recupera cada turno — no en el prompt, donde se vuelven obsoletos y sin citar. Ver Construir una base de conocimientos.
- Las restricciones pertenecen a
task, como negaciones: "nunca prometas una fecha", "para una cotización, llama a una herramienta". Los límites negativos detienen la deriva mejor que la descripción positiva. No pongas reglas de seguridad ensoul— la plataforma añade moderación global por ti. - Activa
grounding_requiredcuando las respuestas deben provenir del material, no de las predicciones del modelo.
Nunca entregues la determinismo a la probabilidad
La regla de diseño más útil en esta plataforma: si algo puede ser computado, generado o verificado por el sistema, nunca lo dejes al modelo. Un modelo al que se le pide producir un artefacto determinista no falla ruidosamente — produce uno plausible. El usuario obtiene un número de ticket que no existe, una llamada programada siete horas fuera, una paleta de colores que falla el contraste. Nada da error; está simplemente equivocado en silencio.
Cada uno de estos comenzó como un fallo real en producción y se convirtió en una función de la plataforma:
| Cosa determinista | Forma incorrecta (probabilidad) | Forma correcta (sistema) |
|---|---|---|
| Números de referencia / ticket | Las instrucciones dicen "dile al usuario el número de ticket" → el modelo inventa uno | save_contact / schedule_followup devuelven un código real almacenado — instruye al modelo a retransmitirlo literalmente |
| Tiempos absolutos | El modelo calcula manualmente delay_seconds para "mañana 10am" → se desvía por horas | Pasa run_at (hora ISO local); el servidor resuelve la zona horaria |
| Colores de texto sobre un color de marca | El modelo elige colores "coincidentes" → ilegible en un tema | Envía solo theme_color; los primeros planos de contraste WCAG se derivan en el servidor |
| Enrutamiento en un flujo | Una salida ai para "si el usuario estuvo de acuerdo" | Salidas rule / user_choice; reserva salidas ai para juicio genuino. Los bucles obtienen un contador explícito y un límite — nunca "la LLM se detendrá eventualmente" |
| "¿Se activó el disparador?" | Asumir que el prompt funciona | test_skill_trigger lo mide; la plataforma también inyecta una pista determinista cuando se detecta un teléfono/email |
| La redacción que llega a una herramienta | Esperar que el modelo convierta "¿alguno más así?" en la llamada correcta | La plataforma determina lo que se preguntó, luego compone la instrucción a partir de la propia definición de la herramienta y muestra ese turno a una herramienta. Medido 80% → 97%; dejar que el modelo reescriba su propia solicitud no hizo nada (82%) |
| Una frase que nunca debe aparecer | Añadir otra línea "no digas X" al prompt | Bórrala después del hecho. Una regla que puedes verificar en la respuesta terminada es una regla que puedes aplicar; una regla en el prompt es una solicitud |
| Salida legible por máquina | "Responde solo con JSON válido" y analiza estrictamente | Pide la forma, luego analiza para extraer el único campo que importa. La estrictitud descarta respuestas que estaban bien |
La corolario para escribir habilidades: tus instructions deben decirle al modelo qué función del sistema usar ("pasa run_at, retransmite el código devuelto"), no enseñarle a imitar la función ("calcula los segundos, formatea un número de ticket"). Si te encuentras escribiendo el output de un proceso determinista, busca la herramienta que lo produce — o pide una.
Dos corolarios sobre el output
Una regla de prompt es una solicitud; una verificación posterior es una regla. "Nunca digas X" pertenece al prompt — reduce la tasa — pero no es aplicación. Un modelo que está de acuerdo con la instrucción aún puede llegar a la misma idea prohibida mediante una redacción que tu texto no anticipó, y cada reescritura de la regla tiende a capturar solo las redacciones que ya viste. La redacción no puede policar la redacción. Así que haz una pregunta diferente: ¿es la frase no deseable reconocible en la respuesta terminada? Si lo es, elimínala allí, y mantén también la línea del prompt.
Asegúrate primero del contenido; no dejes que la sintaxis te cueste el contenido. Un modelo más pequeño a menudo hará la elección correcta y luego la escribirá en una forma que tu analizador rechaza — un objeto por línea en lugar de un array, una coma final, prosa envuelta alrededor del bloque. Analizar estrictamente significa que una respuesta correcta se descarta por una llave mal colocada, y el síntoma parece ser un modelo que no es lo suficientemente capaz. Decide qué campo en la respuesta es portador de carga — usualmente exactamente uno: un id, una referencia, una elección — y extrae ese campo sea como sea que llegue. El resto de la carga suele ser datos que ibas a reemplazar con los tuyos de todos modos, así que la estrictitud sobre ello no protege nada.
Muestra al agente solo buenos patrones
Cuando entregas ejemplos a un agente, haz que sean ejemplos correctos. No pegues un fragmento de "aquí está la forma incorrecta" junto a la correcta — el modelo puede imitar el ejemplo más cercano en lugar de leer la advertencia. Describe lo que se debe evitar con palabras; mantén los ejemplos ejecutables como ejemplares.
Verifica — escribir no es funcionar
Después de cada cambio, verifica que hizo lo que tenías previsto. Crear un agente no significa que esté configurado como crees; añadir a una base de conocimientos no significa que la pregunta se recupere.
get_agent(name="Support") # confirma la configuración que se guardó
search_knowledge_base(kb_name="Company policy", query="…") # confirma que la respuesta es recuperableUn resultado search vacío significa que esa pregunta se responderá como "no cubierta" — encuentra eso ahora, no desde un cliente.
Devuelve un entregable — y el siguiente paso
Después de cada acción, no solo informes que terminaste. Devuelve cuatro cosas: lo que produciste, un enlace clicable a la consola para verlo, una línea sobre cómo usarlo, y el siguiente paso natural — propuesto, y ofrecido para hacerlo. Preguntarán "¿dónde lo veo?", "¿cómo lo uso?" y "¿qué ahora?" de todos modos; responde a los tres de antemano. Codifica los nombres con espacios en URL.
| Después de… | Devuelve |
|---|---|
| Crear o importar en una base de conocimientos | Su página — que incluye el knowledge starmap (una vista 3D de lo que se ingirió): https://console.agent4.io/#/knowledge-bases/<name> |
| Crear un agente | Su página para revisar/probar: https://console.agent4.io/#/agents/<name> — y ten en cuenta que para permitir que los usuarios finales lo alcancen, crean un enlace de compartir en la consola |
| Crear una habilidad | https://console.agent4.io/#/skills/<name> |
| Publicar un Storyline | https://console.agent4.io/#/storylines/<id> (el id de create_storyline) |
| Registrar un servidor MCP | https://console.agent4.io/#/mcp/<id> |
Por ejemplo, después de importar documentos a una base de conocimientos, responde con cuántos chunks se guardaron, el enlace anterior para que puedan abrir su knowledge starmap y ver exactamente lo que se ingirió, y confirma si ahora está adjunto a un agente (o cómo adjuntarlo). Un simple "hecho" solo los hace preguntar.
Siempre termina en el siguiente paso, y ofrécelo — una configuración es una cadena, no una acción única:
- ¿Construiste una base de conocimientos? → ofrece adjuntarla a un agente (pregunta cuál).
- ¿Creaste un agente? → ofrece adjuntar una base de conocimientos, añadir una habilidad, o crear un enlace de compartir para que los usuarios finales lo alcancen (un espacio vacío = apagado).
- ¿Escribiste una habilidad? → ofrece adjuntarla al agente que la necesita.
- ¿Publicaste un Storyline? → ofrece establecerlo como predeterminado del agente, o conectar su disparador de inscripción.
- ¿Registraste un servidor MCP? → ofrece concederle sus herramientas a un agente.
"Aquí está lo que hice, aquí está el enlace, aquí está cómo usarlo, y aquí está lo que haría a continuación — ¿quieres que lo haga?" mantiene la construcción en movimiento; un simple "hecho" deja al inquilino adivinando.