Mis llamados a la IA duran 15 segundos (Título anterior: En las escenas, poder elegir aleatoriamente entre una serie de textos)

Cuando lanzo una escena Gladys con un botón, me parece útil en algunas de estas escenas tener una confirmación de audio de que la escena se ha lanzado, o que se ha completado un paso. Por ejemplo, lanzo la escena que hace circular el agua caliente para que suba al baño de la planta superior, y tengo una primera confirmación que me dice « Ok, me encargo », luego una segunda que me dice « Ahí tienes, la ducha está lista ».

Pero estas frases siempre son las mismas.

Me las he arreglado con node-red para aportar un poco de variación (ver este tutorial). Pero sería genial tener esto directamente en Gladys.

Una forma de poder hacerlo sería tener una nueva acción en las escenas, llamada por ejemplo « Texto aleatorio », en la que se podrían definir varios textos (con la posibilidad de incluir variables), y cuyo resultado sería uno de estos textos elegido aleatoriamente y utilizable como una variable en los bloques siguientes.

Por ejemplo, definiría los siguientes textos en esta acción:

  • texto 1: « Ok, me encargo »
  • texto 2: « Voy a subir el agua caliente. Y está a {{ 1.1 Temperatura agua }} grados »
  • texto 3: « Tus deseos son órdenes »
  • texto 4: « Voy a ver qué puedo hacer… »

Y en el bloque siguiente, podría usar la acción « Hablar en un altavoz » con el texto {{ 2.1 Texto aleatorio}}

@pierre-gilles ¿Con tu forma de basarte en la IA para desarrollar, sigue siendo útil crear un prototipo o no es necesario?

¿Usas Gladys Plus @StephaneB? :slight_smile:

Si es así, ¡ya es posible con la acción « Pedir a la IA »!

Además, tendrás una respuesta completamente personalizada porque es una IA quien la escribe, con variaciones cada vez :wink:

@pierre-gilles, Lo probé con Pedir a la IA y técnicamente funciona, efectivamente.

Pero como esta acción pasa por la IA, tiene un tiempo de reacción demasiado largo (entre 5 y 10 segundos) para que pueda ser percibido como una confirmación de que se ha presionado el botón.
Y por lo tanto, cuando una persona presiona el botón, tiende a creer, después de 2-3 segundos sin reacción, que la presión no se ha realizado correctamente y vuelve a presionar…

Por lo tanto, me gustaría mantener mi solicitud.

Hola @StephaneB y @pierre-gilles

Estoy de acuerdo con @StephaneB, tanto en el nivel de la solicitud (me ha adelantado, lo habría propuesto durante este fin de semana…) como en la interactividad con la IA (latencia en la respuesta). Añado una reflexión totalmente personal sobre la IA: intento, en la medida de lo posible, hacer que Gladys sea autónoma en mi casa (al menos para el control de los dispositivos conectados), por lo que introducir IA en la nube iría en contra de mi enfoque. De hecho, voy a aprovechar este fin de semana para intentar formular una solicitud en ese sentido :stuck_out_tongue:

Que tengáis un buen día los dos,

Jean

Me encantaría entender qué pasa en tu caso, porque la API de IA suele responder en 500 ms para respuestas relativamente simples :slight_smile:

¿Cuál es el prompt?

En este caso, la respuesta correcta probablemente sea la IA local, ¿no? :slightly_smiling_face: De hecho, es un tema que ya está previsto y, de hecho, parcialmente desarrollado.

Volviendo a la solicitud inicial, debo admitir que no estoy convencido con el enfoque propuesto.

Estamos en una época en la que existen modelos de IA extremadamente ligeros, capaces de ejecutarse directamente en un teléfono. No veo realmente el interés de volver a una lógica de « elegir aleatoriamente una frase entre 3 o 4 », como se hacía hace unos quince años.

En mi opinión, la verdadera necesidad no es tener respuestas predefinidas, sino obtener una respuesta natural y contextualizada. Por ejemplo:

  • « Vale, me encargo. »
  • « Inicio la circulación de agua caliente. Actualmente está a 24 °C. »
  • « Vamos allá, el agua caliente estará lista en unos instantes. »

Todo generado dinámicamente en función del contexto, en lugar de mantener una lista de variantes a mano.

Creo que este enfoque será más fácil de usar, más flexible y dará un resultado mucho más natural.

Mi prompt es el siguiente:
"Acabo de encender el circulador de agua caliente para que suba al baño y pueda ducharme. Crea una frase corta pero original para informarme de que estará listo en un minuto, especificando que la temperatura del agua caliente (no la del aire ambiente del baño) es de {{variable recuperada}} grados. No es necesario que me des los décimos de grado.

Dame solo esa frase como respuesta, sin más explicaciones. No difundes ningún mensaje, y no crees ninguna escena."

Me da respuestas de este estilo:

  • ¡Prepárate! En 1 minuto, el agua de tu ducha estará a 46°C.
  • ¡Tu ducha estará lista en 1 minuto! El agua caliente ya alcanza los 46°C.
  • Cuenta hasta 60… ¡y sumérgete! Agua caliente a 46°C en 1 minuto.

… y es cierto que es más agradable que definir algunas frases para elegir al azar.

Pero confirmo mis malos resultados: la escena tardó entre 15 y 20 segundos en generarme estas 3 frases (solo visualización en Telegram, por lo que no hay retraso relacionado con el altavoz).

Aclaro que hice estas pruebas en un momento en el que mi servidor Gladys es bastante reactivo (por lo que, quizás, sin el problema relacionado con Enedis, descrito en el otro tema).

¿Es posible pedirle a la IA que sugiera frases para decirlas en Google Cast?

Con el prompt que he dado antes (o uno similar), la acción « pedir a la IA » genera una frase. Y luego, si usas la acción « hablar en un altavoz », puedes poner en el campo ‹ frase › la variable {{ respuesta de la ia }}. Y funciona. :wink:

¡Buena noticia @StephaneB :smiling_face:
¿Podemos cerrar la solicitud entonces?

Antes que nada, me gustaría conocer la opinión de @pierre-gilles para entender por qué este prompt de IA tarda 15-20 segundos en responder en mi caso, cuando en el suyo solo tarda 0.5 segundos…

No había especificado mi configuración, por si puede ayudar a entender: mini-PC Intel NUC5PPYB, procesador N3700 de 4 núcleos a 1.6GHz, 8GB de RAM, con Ubuntu 22.04, conectado a mi red de fibra mediante ethernet.

Gracias, funciona.

Hola @StephaneB, lo siento por el retraso.

En cuanto al fondo, no voy a partir de una lista de frases preescritas seleccionadas al azar. La dirección de Gladys es la IA: una respuesta generada y contextual, no un diccionario fijo. Por lo tanto, el tema a resolver aquí no es « cómo evitar la IA », sino « por qué la IA tarda 15 segundos en tu caso ».

Y 15-20 segundos no es normal. Para ser transparente sobre la arquitectura: la acción « Preguntar a la IA » no hace una sola llamada. Primero hay una llamada rápida de clasificación de intención, luego la llamada principal, y luego uno o varios intercambios adicionales si el modelo decide llamar a una herramienta (por ejemplo, ir a leer una temperatura). Pero incluso con 3 intercambios deberíamos estar alrededor de 1,5-2 segundos, no 15. Por lo tanto, algo más específico está sucediendo en tu instalación.

No tengo tiempo para investigar yo mismo, pero la buena noticia es que tienes todo lo que necesitas para hacerlo sin esperar por mí — sin línea de comandos, y Gladys ya registra todo lo necesario. Aquí están las claves.


1. Ver exactamente lo que hizo la IA, llamada de herramienta por llamada de herramienta

Este es el corazón del diagnóstico. Activa tu escena, espera la respuesta vocal, luego ve a Integraciones → Inteligencia Artificial, sección « Depuración de IA » → « Descargar el contexto JSON para depuración ».

Abre el archivo obtenido (un editor de texto es suficiente) y mira la sección _debug → conversationHistory. Contiene dos cosas:

  • toolCalls: la lista exacta de todas las herramientas que la IA ha llamado, con el nombre de cada una (tool_name), su resultado (tool_status: success o error), los argumentos que se le pasaron y la hora exacta (created_at).
  • messages: la conversación completa en orden cronológico — tu mensaje, cada llamada de herramienta, la respuesta final — cada entrada con hora.

Restando los created_at, ves exactamente cuántas herramientas se llamaron durante tu ejecución de escena, cuáles y cuál consumió el tiempo. Dos señales a vigilar:

  • varias llamadas de herramientas para una simple frase de confirmación → cada llamada es un intercambio completo con el modelo, probablemente ahí es donde se van tus segundos;
  • un tool_status: "error" → una herramienta que falla hace que el modelo vuelva a empezar para otra ronda, lo que puede duplicar o triplicar el tiempo total. Es el tipo de cosa que no se sospecha y que salta a la vista en este archivo.

Las llamadas desencadenadas por una escena se registran bien aquí: el historial es el del usuario elegido en la acción « Preguntar a la IA ». Por lo tanto, piensa en activar la escena antes de descargar el archivo.

Accidentalmente, la sección tools del mismo archivo lista todas las herramientas enviadas al modelo en cada llamada. Si es muy voluminosa (muchos dispositivos), también pesa cada solicitud.

2. Complementar con los registros si es necesario

Si el archivo de arriba no es suficiente para decidir, Configuración → Sistema → Descargar registros, luego busca [AI_CHAT] en el archivo. Obtienes la traza del lado del servidor, horaria línea por línea:

[AI_CHAT] Nueva solicitud userId=... mensaje=...
[AI_CHAT] Forzando tool_choice=required para categorías=device_query
[AI_CHAT] Turno del asistente iteración=1 tool_calls=1 tool_choice=required herramientas=[...]
[AI_CHAT] Ejecutando herramienta=...
[AI_CHAT] Herramienta finalizada herramienta=... estado=success longitudResultado=...
[AI_CHAT] Turno del asistente iteración=2 tool_calls=0 ...
[AI_CHAT] Respuesta completada longitudRespuesta=...

La lectura:

Dónde se va el tiempo Qué significa
Entre Nueva solicitud y el primer Turno del asistente Preparación local (Gladys reconstruye la lista de herramientas desde tu base) + llamada de clasificación
Muchas líneas Turno del asistente iteración= El número de intercambios con el modelo explota
Entre Ejecutando herramienta= y Herramienta finalizada herramienta= La ejecución de la herramienta en tu instancia que se ralentiza
Un solo Turno del asistente, pero 10 s para alcanzarlo El modelo o tu conexión de red

3. Una prueba comparativa inmediata

En el chat con Gladys, haz sucesivamente tu prompt completo, luego una versión corta sin ninguna referencia a un sensor: « Dame una frase corta para confirmar que te ocupas de la solicitud ». Cronometra los dos con un reloj.

Si el corto responde en 2 segundos y el largo en 15 segundos, está confirmado: es tu prompt el que desencadena llamadas de herramientas. Mencionar la temperatura del agua hace que el modelo entienda que debe ir a leer un sensor antes de responder. En este caso, tienes un beneficio inmediato reescribiendo tu prompt para que no necesite ningún dato — y el archivo del paso 1 te lo mostrará en blanco y negro.


Déjate ayudar por una IA para analizar todo esto

Este es típicamente el tipo de tarea en la que Claude (o tu asistente favorito) es muy efectivo, y te evita esperar por mí. Dale el contenido de _debug.conversationHistory con una instrucción como:

« Aquí tienes el historial horario de una llamada de IA en Gladys Assistant, en formato JSON. Lista las herramientas llamadas en orden, calcula la duración entre cada etapa y dime dónde se va la mayoría del tiempo total. Señala cualquier herramienta con error. »

Gladys es de código abierto, por lo que también puedes darle el archivo que maneja todo este flujo para que razone sobre el código real: server/lib/gateway/gateway.forwardMessageToAiChat.js en el repositorio GitHub del proyecto.

Pequeña precaución: este archivo contiene tus mensajes, los nombres de tus habitaciones y dispositivos. Elimina lo que no quieres compartir antes de pegarlo en cualquier lugar, aquí como en cualquier otro lugar.

Gracias por las pistas de análisis, Pierre-Gilles. Las voy a explorar este fin de semana.