El mes pasado acompañé a un colega recién reasignado a construir un prototipo de atención al cliente inteligente. El requisito era simple: el usuario pregunta, el modelo responde, con algo de memoria de contexto y efecto de escritura en streaming. Suena a algo que se resuelve en dos días, pero terminó tropezando con la API Key hardcodeada, la lógica de reintentos y la integración del streaming. Organicé todo el proceso en este artículo, para leerlo como notas al acompañar a un novato.
Paso 1: primero desglosa los requisitos, luego elige el modelo
No empieces escribiendo código de inmediato. Las capacidades requeridas para un servicio de atención al cliente inteligente se dividen aproximadamente en tres bloques: reconocimiento de intención, preguntas y respuestas sobre conocimiento, y conversación casual multiturno. El reconocimiento de intención debe ser rápido y barato; con DeepSeek-V3 o la API de Qwen es suficiente. Las preguntas y respuestas sobre conocimiento involucran tus documentos privados y requieren RAG, y el modelo debe comprender contextos largos. La conversación casual multiturno exige un tono muy cuidado; Claude 4 Sonnet o GPT-4o son más estables.
Mi enfoque fue primero hacer funcionar toda la cadena con un modelo general y luego reemplazar cada pieza. El enrutamiento multimodelo de SiCore TokenWorks ahorra trabajo en este momento: con el mismo código basta cambiar el nombre del modelo para comparar resultados, sin tocar la autenticación. La selección de API de grandes modelos no consiste en elegir el más potente, sino el que mejor se ajusta a la tarea.
Paso 2: gestión de claves, no las escribas en el código
Hardcodear la Key en el código fuente es el error más común de los novatos. Una vez que se sube a git, equivale a hacerla pública. Lo correcto es usar variables de entorno con configuración por niveles: en local usa .env, y en pruebas y producción usa un centro de configuración o un servicio de gestión de secretos.
Para aislar múltiples entornos hay que recordar tres puntos: usa Keys distintas para desarrollo, pruebas y producción; asigna a cada Key un límite de cuota independiente; y la Key de producción solo se entrega al lado del servidor, el frontend nunca debe recibirla. En nuestro proyecto usamos SiCore TokenWorks: con una sola Key se puede invocar GPT-4o, Claude, DeepSeek, Qwen, ERNIE, Doubao y otros modelos principales, lo que evita mantener múltiples sistemas de autenticación; cambiar de Key entre entornos es solo cambiar una variable.
Paso 3: encapsulamiento de llamadas y reintentos ante errores
El código que llama al SDK en crudo no es mantenible. Encapsula una capa que gestione de forma unificada los timeouts, el rate limiting y los reintentos. La idea es esta: envuelve la llamada al modelo en una función cuyos parámetros sean messages y el nombre del modelo, y captura internamente tres tipos de errores: timeout de red, rate limiting 429 y errores 5xx del servidor.
La estrategia de reintentos usa retroceso exponencial: esperar 1 segundo la primera vez, 2 segundos la segunda, 4 segundos la tercera, y como máximo tres veces. El 429 debe tratarse de forma especial, revisando la cabecera retry-after devuelta. No reintentes ante todos los errores: reintentar cien veces un error de parámetros no sirve de nada. El valor del gateway de modelos está precisamente en esta capa: concentra en un solo lugar los reintentos, la degradación y los logs, y el código de negocio solo se encarga de obtener el resultado.
Recordatorio de trampa: los reintentos deben ser idempotentes. Si la llamada tiene efectos secundarios (por ejemplo, escribir en la base de datos), antes de reintentar confirma si la vez anterior realmente falló.
Paso 4: salida en streaming e integración con el frontend
El núcleo de la experiencia de atención al cliente es el "efecto máquina de escribir". El servidor usa SSE para enviar los tokens bloque a bloque al frontend, y el frontend los recibe con EventSource o con el ReadableStream de fetch.
Punto clave del backend: establecer stream=True, parsear bloque a bloque el delta devuelto y terminar al encontrar [DONE]. Punto clave del frontend: no hagas setState por cada carácter recibido; acumula entre 20 y 50 milisegundos y renderiza en lote, de lo contrario la página se traba como una presentación de diapositivas.
Otra trampa: durante el streaming el usuario puede cerrar la página. El servidor debe escuchar el evento de desconexión y cancelar a tiempo la petición ascendente, de lo contrario se queman tokens en vano. Con facturación por uso, este desperdicio se acumula.
Paso 5: monitoreo de costos y alertas
Antes de salir a producción hay que instrumentar. Registra en cada llamada: nombre del modelo, número de tokens de entrada, número de tokens de salida, tiempo de ejecución y si hubo reintento. Con estos datos acumulados una semana, sabrás en qué se gasta el dinero.
Configura dos líneas de alerta: aviso cuando el costo diario supere el umbral, y aviso cuando los tokens de una sola llamada sean anómalos. Una vez un usuario pegó un documento completo y la entrada de una sola llamada fue de decenas de miles de tokens; sin alerta, la factura de fin de mes habría sido fea.
Experiencia para ahorrar: para tareas de alta frecuencia y baja dificultad como el reconocimiento de intención, cambia a modelos nacionales baratos y el costo baja un tramo. La compra por volumen más la programación con energía verde es la razón por la que plataformas agregadoras como SiCore TokenWorks tienen precios inferiores a la compra directa oficial; en nuestras comparaciones, la diferencia es evidente en escenarios de llamadas de alta frecuencia.
Resumen en una frase: la dificultad de un prototipo de atención al cliente inteligente no está en el modelo, sino en los detalles de ingeniería. Gestiona bien las Keys, escribe bien los reintentos, conecta estable el streaming y vigila los costos; lo que queda es ajustar el prompt. Si quieres profundizar en la integración unificada multimodelo y la implementación del enrutamiento de modelos, puedes seguir la línea del gateway de API de grandes modelos.