Dies ist aktuell eine Kopie eines Alexa-hosted skills. Das Projekt sollte umgezogen werden und eigenes CI/CD bekommen, damit eigene AWS resourcen anständig verwendet werden können und man bessere Kontrolle über den code hat. Desweiteren kann man bei Alexa-hosted skills keine Umgebungsvariablen setzen, wesshalb ich für den upload den API Key für OpenAI entfernen musste (s. lambda/chat_gpt.py).
Der Skill ist dazu da, um ChatGPT mit Alexa nutzen zu können. Es gibt bereits einige ziemlich ausgereifte Skills dieser Art, dies ist nur ein Versuch Python ein wenig kennenzulernen und etwas mit Alexa und AI zu machen. Ich werde den Skill nicht veröffentlichen. Dazu wären alle unten aufgeführten TODOs notwendig und noch mehr (API Key Registrierung oder SSO wenn das reicht). Außerdem sollte der Skill dann zumindest Englisch unterstützen, d.h. i18n müsste generell implementiert werden. Eventuell würde ich auch ein Feature entwickeln, mit dem Benutzer einfach Feedback zu fehlenden Ausdrücken geben können, damit sie wissen, dass etwas passieren wird. Das müsste aber gegen Missbrauch abgesichert werden. Ich müsste schauen, was es in der Richtung gerade gibt. Zumindest sollte man den Nutzer darüber informieren, dass der Skill anhand der Logdaten kontinuierlich verbessert wird. Dazu ist es notwendig, die Logs selbstständig im eigenen AWS Account zu speichern (CloudWatch Logs) und weitere Vorkehrungen zu treffen.
Der Skill soll einfach und schnell einen Chat mit ChatGPT starte und so kurz wie möglich antworten. Bei Alexa-Skills muss das Standard-Startmuster verwendet werden. D.h. man benötigt: wake word launch command skill invocation name. Zum Beispiel: "Alexa, starte GPT", oder "Alexa, frage GPT ob ...". Im letzten Beispiel ist "ob" ein Ausdruck (utterance), mit dem letztlich der chat handler gestartet werden kann. Die utterances benötigen zusätzlich einen slot, eine Variable, in der das Gesagte zur Verfügung gestellt wird. Die Einschränkung, dass eine utterance nicht nur aus einem slot bestehen kann, ist hier ein echtes Problem. Es gibt praktisch unendlich viele Möglichkeiten, Fragen zu stellen. Man sollte hier nicht hingehen und alle Verben kodieren, um möglichst natürlich fragen zu können. Ein weiteres Problem ist, dass die intent handler nur die Slot-Werte bekommen, also nicht die Information, welcher launch command und welche utterance verwendet wurden, so dass in den meisten theoretisch möglichen Kombinationen unvollständige Sätze an ChatGPT gesendet würden. Das System ist grundlegend nicht dafür designed AI gesteuerte aktionen durchzuführen. Stattdessen wird auf feingranulare intends gesetzt. Daher werde ich die Möglichkeiten einschränken und wahrscheinlich generische Startkommandos verwenden, die die Fragen grammatikalisch korrekt an ChatGPT übergeben. Wenn ich den skill veröffentlichen würde hätte ich die Möglichkeit intant launch phrases festlegen zu können, wodurch ich eigentlich eine komplett andere Lage hätte, man könnte den launch Request umgehen, jedoch ist man auf 5 extra Ausdrücke beschränkt.
Für den Anfang bleibt es bei diesem Skill zunächst bei einem Befehl (Intent), der wie oben beschrieben leider ohne die W-Fragen und die häufigsten Verben und andere vorstellbare Kombinationen wie "Computer frage GPT ob ..." auskommen muss. Es gibt also nur wenige utterances und man muesste sich auf wenige launch commands beschränken. Dies sind die utterances mit Beispielen:
g. p. t. {input}: "[Computer] [öffne|starte] [GPT] - [GPT]: {Wie hoch ist die Wasserkuppe}"frage {input}: "[Computer] [öffne|starte] [GPT] - [Frage]: {Was soll ich morgen machen}"chat {input}: "[Computer] [frage] [GPT] [Chat] - {Kannst du mir sagen was da los ist}"
Durch testen ist mir aufgefallen, dass man trotzdessen was dokumentiert ist, Alexa dazu bringen kann den launch intent handler zu überschreiten und direkt einen intent handler anzusteuern. Das funktioniert aber nicht systematisch: "[Computer] [starte] [GPT] und [frage] {...}".
Es ist mir auch aufgefallen, dass andere Skills mit ähnlichen skill invocation names durch eben solche verhalten zu Verwechslungen führen können. Daher habe ich den skill invocation name des vorläufig auf "Mein GPT" geändert.
CloudWatch Logssind so schlecht zu benutzen, dass ich mich in mein persönliches AWS-Konto einloggen sollte, um die Dinge zu beschleunigen. Wenn und wenn möglich die Logs in einer Konsole zu verfolgen.- Ich musste
pythonauf3.7downgraden (manuell compilen und im venv linken). In den Alexa-hosted skills wird3.7.v37verwendet was etwas eigenes sein muss, da es eigentlich bei3.7.17das Ende von3.7ist. Aufgefallen ist es mir weilopenainicht funktionierte, aber es macht allgemein Sinn die lokal die gleiche Version zu verwenden. Wenn man den Skill selbst im eigenenAWS Lambdaerstellt, kann manpython 3.11verwenden. Ich müsste noch git hooks und deployment skripte hinzufügen, damit der workflow nicht kaputt geht. - Ein weiterer Grund für die selbsttändige Nutzung von
AWS Lambdaist, dass man ansonsten keine Möglichkeit hat Umgebumgsvariablen zu speichern und in diesem Fall gibt es den API Key für ChatGPT der nicht mit in den code gehört. Sowieso würde ich kompleteten git repo Zugriff haben wollen damit ich gescheit aufräumen kann. - Ich musste ebenso
urllib3auf1.26.18downgraden weil in der python version von Alexa dassslmodul anscheinend zu alt ist und urllib3 v2 es nicht verwenden kann. Das war notwendig umopenaizum laufen zu kriegen. - Intellisense der
importAneweisungen vonask_sdk_Paketen funktionierte nicht richtig, manche Funktionen und Klassen die existieren und verwendbar gewesen sind wurden nicht gefunden. Ich weis nicht ob es ein Problem mit den Paketen ist oder mitPylance. - Auto delegation funktionierte irgendwann nicht mehr, ich habe keine Anung warum und finde keine Lösung
- Reprompting funktioniert ebenfalls nicht und ich habe keine Ahnung warum.
- Local debugging auf dem
devbranch um deployment zeit zu sparen, intellisense verwenden zu können. Wenn man ohne die VSCode extension geht, sollte man gucken dass man den Prozess so startet, dass bei Dateiänderungen der Debugger neu gestartet wird, damit man das nicht ständing manuel tun muss. Am besten man verwendet einen file watcher wiewatchdogoder eben einfachbunx nodemon ./lambda/local_debug.py - Die
ask-clizum testen verwenden, statt diedeveloper consoleim browser d.h.ask dialog -l de-DE