Meine Anrufe an die KI dauern 15 Sekunden (Alter Titel: In Szenen zufällig zwischen einer Reihe von Texten auswählen können)

Wenn ich eine Gladys-Szene mit einem Knopf starte, finde ich es nett, bei einigen dieser Szenen eine Audiobestätigung zu haben, dass die Szene gestartet wurde oder ein Schritt ausgeführt wurde. Zum Beispiel starte ich die Szene, die das heiße Wasser zirkulieren lässt, damit es ins Badezimmer im Obergeschoss steigt, und ich habe eine erste Bestätigung, die mir sagt „Okay, ich kümmere mich darum“, und dann eine zweite, die mir sagt „Da, die Dusche ist bereit“.

Aber diese Sätze sind immer die gleichen!

Ich habe mich mit node-red beholfen, um ein wenig Abwechslung zu bringen (siehe dieses Tutorial). Aber es wäre schön, das direkt in Gladys zu haben.

Eine Möglichkeit, dies umzusetzen, wäre eine neue Aktion in den Szenen, die zum Beispiel „Zufälliger Text“ genannt wird, in der man mehrere Texte definieren könnte (mit der Möglichkeit, Variablen einzuschließen), und deren Ergebnis einer dieser Texte wäre, der zufällig ausgewählt und als Variable in den folgenden Blöcken verwendet werden könnte.

Zum Beispiel würde ich in dieser Aktion die folgenden Texte definieren:

  • Text 1: „Okay, ich kümmere mich darum“
  • Text 2: „Ich lasse das heiße Wasser steigen. Und es ist bei {{ 1.1 Wassertemperatur }} Grad“
  • Text 3: „Dein Wunsch ist mir Befehl“
  • Text 4: „Ich schau mal, was ich tun kann…“

Und im nächsten Block könnte ich die Aktion „Auf einem Lautsprecher sprechen“ mit dem Text {{ 2.1 Zufälliger Text }} verwenden.

@pierre-gilles Ist es mit deiner Art, sich auf KI zu stützen, um zu entwickeln, noch sinnvoll, ein Mockup zu erstellen, oder ist das nicht notwendig?

Nutzt du Gladys Plus @StephaneB? :slight_smile:

Falls ja, ist das bereits mit der Aktion „AI fragen“ möglich!

Als Bonus erhältst du eine vollständig personalisierte Antwort, da eine KI sie schreibt, mit Variationen jedes Mal :wink:

@pierre-gilles, Ich habe es mit AI fragen getestet und technisch gesehen funktioniert es tatsächlich.

Allerdings dauert diese Aktion über die KI viel zu lange (zwischen 5 und 10 Sekunden), um als Bestätigung der Berücksichtigung des Drucks auf den Knopf wahrgenommen zu werden.
Und wenn eine Person auf den Knopf drückt, neigt sie dazu, nach 2-3 Sekunden ohne Reaktion zu glauben, dass der Druck nicht richtig war, und drückt erneut…

Daher möchte ich meine Anfrage aufrechterhalten.

Hallo @StephaneB und @pierre-gilles

Ich stimme @StephaneB zu, sowohl in Bezug auf die Anforderung (er hat mich überholt, ich hätte es dieses Wochenende vorgeschlagen …) als auch auf die Interaktivität mit der KI (Latenz in der Antwort). Ich füge eine ganz persönliche Überlegung zur KI hinzu: Ich versuche so weit wie möglich, Gladys bei mir zu Hause autonom zu machen (zumindest für die Steuerung der vernetzten Geräte), daher wird die Einführung von KI in der Cloud meiner Vorgehensweise zwangsläufig entgegenlaufen. Ich werde dieses Wochenende übrigens die Gelegenheit nutzen, um eine Anforderung in diesem Sinne zu formulieren :stuck_out_tongue:

Schönen Tag noch euch beiden,

Jean

Ich wäre neugierig zu verstehen, was bei dir passiert, denn die KI-API antwortet normalerweise in 500 ms für relativ einfache Antworten :slight_smile:

Was ist der Prompt?

In diesem Fall ist die richtige Antwort wahrscheinlich die lokale KI, nicht wahr? :slightly_smiling_face: Es ist übrigens ein Thema, das bereits geplant ist und sogar teilweise entwickelt wurde.

Zurück zur ursprünglichen Anfrage, ich muss zugeben, dass ich von dem vorgeschlagenen Ansatz nicht überzeugt bin.

Wir leben in einer Zeit, in der es extrem leichte KI-Modelle gibt, die direkt auf einem Telefon laufen können. Ich sehe nicht wirklich den Sinn darin, zu einer Logik zurückzukehren, bei der „zufällig ein Satz aus 3 oder 4 ausgewählt wird“, wie wir es vor etwa 15 Jahren getan haben.

Meiner Meinung nach besteht der echte Bedarf nicht darin, vorgegebene Antworten zu haben, sondern eine natürliche und kontextbezogene Antwort zu erhalten. Zum Beispiel:

  • „Okay, ich kümmere mich darum.“
  • „Ich starte die Warmwasserzirkulation. Sie beträgt derzeit 24 °C.“
  • „Los geht’s, das Warmwasser wird in wenigen Augenblicken bereit sein.“

Alles dynamisch generiert in Abhängigkeit vom Kontext, anstatt eine Liste von Varianten manuell zu pflegen.

Ich denke, dieser Ansatz wird einfacher zu verwenden, flexibler sein und ein viel natürlicheres Ergebnis liefern.

Mein Prompt lautet wie folgt:
"Ich habe gerade den Warmwasserzirkulator eingeschaltet, damit das Wasser ins Badezimmer steigt und ich duschen kann. Erstelle einen kurzen, aber originellen Satz, um mich zu informieren, dass es in einer Minute bereit sein wird, wobei die Temperatur des Warmwassers (nicht die der Raumtemperatur im Badezimmer) bei {{abgerufene Variable}} Grad liegt. Es ist nicht nötig, die Zehntelgrade anzugeben.

Gib mir nur diesen Satz als Antwort, ohne weitere Erklärungen. Sende keine Nachrichten und erstelle keine Szene."

Dadurch erhalte ich Antworten wie diese:

  • Bereiten Sie sich vor! In 1 Minute wird Ihr Duschwasser 46°C haben.
  • Ihre Dusche wird in 1 Minute bereit sein! Das Warmwasser hat bereits 46°C.
  • Zählen Sie bis 60… und tauchen Sie ein! Warmwasser bei 46°C in 1 Minute!

… und es stimmt, dass es nett ist, anstatt einige Sätze zu definieren, die zufällig ausgewählt werden.

Aber ich bestätige meine schlechten Leistungen: Die Szene hat jedes Mal 15 bis 20 Sekunden gedauert, um mir diese 3 Sätze zu generieren (einfache Anzeige in Telegram, also keine Verzögerung durch den Lautsprecher).

Ich präzisiere, dass ich diese Tests zu einem Zeitpunkt durchgeführt habe, an dem mein Gladys-Server sehr reaktiv ist (also ohne das mögliche Problem, das mit Enedis verbunden ist, wie im anderen Thema beschrieben).

Kann man die KI bitten, Sätze vorzuschlagen, die man über Google Cast sagen kann?

Mit dem Prompt, den ich oben angegeben habe (oder einem ähnlichen), erzeugt die Aktion „AI fragen“ einen Satz. Und wenn du dann die Aktion „Über Lautsprecher sprechen“ verwendest, kannst du im Feld „Satz“ die Variable {{ antwort der künstlichen intelligenz }} einfügen. Und es funktioniert. :wink:

Gute Nachricht @StephaneB :smiling_face:
Können wir dann den Antrag schließen?

Bevor ich das gerne die Meinung von @pierre-gilles dazu hören würde, um zu verstehen, warum dieser KI-Prompt bei mir 15-20 Sekunden zum Reagieren braucht, während es bei ihm nur 0,5 Sekunden dauert…

Ich hatte meine Konfiguration nicht angegeben, falls das hilft, es zu verstehen: Mini-PC Intel NUC5PPYB, Prozessor N3700 4 Kerne 1,6GHz, 8GB RAM, unter Ubuntu 22.04, per Ethernet mit meinem Glasfasernetzwerk verbunden.

Danke, das funktioniert.

Hallo @StephaneB, entschuldige die Verzögerung.

Zum Kern der Sache: Ich werde keine Liste von vorab geschriebenen, zufällig ausgewählten Sätzen verwenden. Gladys’ Richtung ist KI: eine generierte und kontextuelle Antwort, kein starres Wörterbuch. Also ist das hier zu klärende Thema nicht „wie man die KI umgeht“, sondern „warum die KI bei dir 15 Sekunden braucht“.

Und 15-20 Sekunden sind nicht normal. Um transparent über die Architektur zu sein: Die Aktion „KI fragen“ macht nicht nur einen einzigen Aufruf. Zuerst gibt es einen schnellen Klassifizierungsaufruf, dann den Hauptaufruf und ein oder mehrere Hin- und Her-Gespräche, wenn das Modell entscheidet, ein Tool zu verwenden (z. B. eine Temperatur lesen). Aber selbst bei drei Hin- und Her-Gesprächen sollte es bei 1,5-2 Sekunden liegen, nicht bei 15. Also passiert bei deiner Installation etwas Spezifisches.

Ich habe keine Zeit, selbst zu ermitteln, aber die gute Nachricht ist, dass du alles hast, was du brauchst, um es ohne mich zu tun — ohne Befehlszeile, und Gladys zeichnet bereits alles Notwendige auf. Hier sind die Schlüssel.


1. Genau sehen, was die KI gemacht hat, Aufruf für Aufruf

Das ist der Kern der Diagnose. Starte deine Szene, warte auf die Sprachantwort, dann gehe zu Integrationen → Künstliche Intelligenz, Abschnitt „KI-Debug“ → „JSON-Kontext für Debug herunterladen“.

Öffne die erhaltene Datei (ein Texteditor reicht aus) und schaue in den Abschnitt _debug → conversationHistory. Sie enthält zwei Dinge:

  • toolCalls: Die genaue Liste aller Tools, die die KI aufgerufen hat, mit jeweils ihrem Namen (tool_name), ihrem Ergebnis (tool_status: success oder error), den Argumenten, die ihnen übergeben wurden, und der genauen Uhrzeit (created_at).
  • messages: Das vollständige Gespräch in chronologischer Reihenfolge — deine Nachricht, jeder Tool-Aufruf, die endgültige Antwort — jeder Eintrag mit Zeitstempel.

Durch Subtraktion der created_at-Zeiten siehst du genau, wie viele Tools während deiner Szenenausführung aufgerufen wurden, welche und welches die Zeit in Anspruch genommen hat. Zwei Signale, auf die du achten solltest:

  • mehrere Tool-Aufrufe für einen einfachen Bestätigungssatz → jeder Aufruf ist eine vollständige Hin- und Rückfahrt zum Modell, wahrscheinlich verschwinden dort deine Sekunden;
  • ein tool_status: "error" → ein fehlgeschlagenes Tool lässt das Modell für eine weitere Runde neu starten, was die Gesamtzeit verdoppeln oder verdreifachen kann. Das ist etwas, das man nicht vermutet und das einem in dieser Datei ins Auge springt.

Die von einer Szene ausgelösten Aufrufe werden hier gut aufgezeichnet: Der Verlauf ist der des in der Aktion „KI fragen“ ausgewählten Benutzers. Denke also daran, die Szene vor dem Herunterladen der Datei auszulösen.

Zusätzlich listet der Abschnitt tools derselben Datei alle Tools auf, die dem Modell bei jedem Aufruf gesendet wurden. Wenn er sehr umfangreich ist (viele Geräte), belastet das auch jede Anfrage.

2. Bei Bedarf mit den Logs ergänzen

Wenn die obige Datei nicht ausreicht, um eine Entscheidung zu treffen, Einstellungen → System → Logs herunterladen, dann suche nach [AI_CHAT] in der Datei. Du erhältst die Server-Seiten-Spur, zeilenweise zeitgestempelt:

[AI_CHAT] New request userId=... message=...
[AI_CHAT] Forcing tool_choice=required for categories=device_query
[AI_CHAT] Assistant turn iteration=1 tool_calls=1 tool_choice=required tools=[...]
[AI_CHAT] Running tool=...
[AI_CHAT] Tool finished tool=... status=success resultLength=...
[AI_CHAT] Assistant turn iteration=2 tool_calls=0 ...
[AI_CHAT] Completed answerLength=...

Die Lesart:

Wo die Zeit vergeht Was das bedeutet
Zwischen New request und dem ersten Assistant turn Lokale Vorbereitung (Gladys baut die Liste der Tools aus deiner Datenbank auf) + Klassifizierungsaufruf
Viele Zeilen Assistant turn iteration= Die Anzahl der Hin- und Rückfahrten zum Modell explodiert
Zwischen Running tool= und Tool finished tool= Die Ausführung des Tools auf deiner langsamen Instanz
Ein einzelner Assistant turn, aber 10 Sekunden, um ihn zu erreichen Das Modell oder deine Netzwerkverbindung

3. Ein sofortiger Vergleichstest

Im Chat mit Gladys stelle nacheinander deine vollständige Eingabeaufforderung und dann eine kurze Version ohne jeden Verweis auf einen Sensor: „Gib mir einen kurzen Satz, um zu bestätigen, dass du dich um die Anfrage kümmerst“. Zeit beide mit der Stoppuhr.

Wenn die kurze in 2 Sekunden antwortet und die lange in 15 Sekunden, ist es bestätigt: Es ist deine Eingabeaufforderung, die Tool-Aufrufe auslöst. Die Erwähnung der Wassertemperatur lässt das Modell verstehen, dass es einen Sensor lesen muss, bevor es antwortet. In diesem Fall hast du einen sofortigen Gewinn, indem du deine Eingabeaufforderung umschreibst, damit sie keine Daten benötigt — und die Datei aus Schritt 1 wird es dir schwarz auf weiß zeigen.


Lass dich von einer KI bei der Auswertung helfen

Das ist genau die Art von Aufgabe, bei der Claude (oder dein bevorzugter Assistent) sehr effektiv ist, und es erspart dir das Warten auf mich. Gib ihm den Inhalt von _debug.conversationHistory mit einer Anweisung wie:

„Hier ist der zeitgestempelte Verlauf eines KI-Aufrufs in Gladys Assistant im JSON-Format. Liste die aufgerufenen Tools in der Reihenfolge auf, berechne die Dauer zwischen jedem Schritt und sage mir, wo die Mehrheit der Gesamtzeit vergeht. Melde jedes fehlgeschlagene Tool.“

Gladys ist Open Source, also kannst du ihm auch die Datei geben, die den gesamten Datenstrom verwaltet, damit er über den echten Code nachdenken kann: server/lib/gateway/gateway.forwardMessageToAiChat.js im GitHub-Repository des Projekts.

Kleine Vorsichtsmaßnahme: Diese Datei enthält deine Nachrichten, deine Raum- und Gerätenamen. Entferne alles, was du nicht teilen möchtest, bevor du es irgendwo einfügst, hier wie anderswo.

Danke für die Analysetipps, Pierre-Gilles. Ich werde das am Wochenende mal ausprobieren.