ChatGPT ist ein heiß diskutiertes Thema und die Verwendung im Browser mittels Texteingabe ist mittlerweile einigen bekannt. Mit einem Apple iPhone lässt sich allerdings auch ein sogenannter Kurzbefehl erstellen, mit dem Anfragen an die OpenAI API gestellt und mittels Sprache beantwortet werden! Es gibt zwar bereits in der Kurzbefehle Gallery einen fertigen Kurzbefehl, allerdings finde ich diesen sehr groß und umständlich. Dieses kleine Hands-on soll außerdem zeigen, dass die Kurzbefehle App einiges kann, wenn man weiß wie sie anzuwenden ist. Auch User:innen ohne Programmierkenntnisse können hiermit kleine „Apps“ schreiben. Um dies zu demonstrieren bietet sich ein einfacher API Call mit der hervorragenden API von OpenAI sehr gut an.
Los gehts!
Voraussetzungen:
- iPhone mit mind. iOS 12 bzw. aktuelles MacOS
- OpenAI Entwickler Account für den benötigten Api-Key
- Aktive Internetverbindung
Teil 1: Spracheingabe einrichten und in Variable speichern
Im ersten Schritt wird die App Kurzbefehle geöffnet. Dies funktioniert bspw. über die Suche:
Im nächsten Schritt klickt man auf das „+“-Zeichen oben rechts in der Ecke, um einen neuen Kurzbefehl zu erstellen:
Nun habe ich einen leeren Kurzbefehl erstellt, bei dem noch alle notwendigen Aktionen fehlen. Um diese hinzufügen, klicke ich auf Aktion hinzufügen, oder klicken unten in das Suchfeld Apps und Aktionen suchen.
Daraufhin öffnet sich dieses Fenster. Ich habe die für dieses Tutorial relevanten Bereich ausgeschnitten:
Als erstes muss die Aktion Text diktieren hinzugefügt werden:
Der eingesprochene Text muss dann in eine Variable gespeichert werden. Dafür wird im nächsten Schritt eine Variable angelegt. Unten wieder auf Apps und Aktionen suchen klicken und nach Variable konfigurieren suchen. Anschließend sieht man folgende Oberfläche. Für die Variable kann ich nun einen Namen vergeben. In dem Fall nenne ich sie Prompt – der Name ist komplett frei wählbar. Der Eintrag Diktierter Text sollte automatisch befüllt werden:
Kurze Zusammenfassung bis hierhin: wenn man den Kurzbefehl jetzt starten würde, käme ein Popup, dass um eine Spracheingabe bittet und einen Hinweis, ob man dem Kurzbefehl die Verwendung des Mikrofons gestatten möchte. Anschließend würde das Gesprochene von Sprache zu Text konvertiert werden und in die Variable Prompt gespeichert werden. Sehen würde man davon aber aktuell noch gar nichts.
Den Inhalt der Variable Prompt übergebe ich jetzt an die OpenAI Schnittstelle, die bspw. auch ChatGPT benutzt.
Teil 2 – Anbinden der OpenAI Schnittstelle und Einstellungen setzen:
Für den API Aufruf binde ich die Aktion Inhalte von URL abrufen ein. Nun müssen die Einstellungen angezeigt werden über den kleinen Pfeil rechts von der Aktion. Da ich eine Information zu der API schicken und nicht nur abrufen möchte, ist es zunächst wichtig die Methode von GET auf POST umzustellen.
Nun müssen bestimmte Parameter (Überschrift bei der App Kurzbefehle genannt) im Header eingetragen werden, um eine gültige Anfrage schicken zu können. Hier ist jetzt der API-Key notwendig, den ich mir zuvor bei OpenAI erstellt habe, in meinem Entwickler Account. Achtung: der API-Key kommt ohne das vorstehende Bearer. Dies ist aber notwendig und muss in diesem Fall von mir manuell hinzugefügt werden.
Ich trage also bei „Header“ als erste Überschrift „Authorization“ ein und in das dazugehörige Value Feld (rechts daneben) Bearer meinApiKey.
Nun kommt der sogenannte Body, hier „Haupttext“ genannt. Dieser besteht im Wesentlichen aus 4 Keys Value Paaren, nämlich model, prompt, max_tokens und temperature. Das model definiert welches Sprachmodel ich benutzen möchte. text-davinci-003 ist das Model, das sehr nah an die „Menschlichkeit“ der Antworten von ChatGPT rankommt. prompt erwartet den Input des Users, in meinem Fall die Spracheingabe, die bereits in Text umgewandelt worden ist – also die Variable „Prompt“. max_tokens definiert der Anzahl der auszugebenden Tokens für die Anfrage. Die Anfrage hat einen gewissen Preis, daher muss ich der Anfrage mitteilen, wie viel ich maximal ausgeben willf. Jedem Nutzer steht anfangs ein gewisses kostenloses Kontingent bereit, das zum Testen mehr als ausreichend ist. Grundsätzlich ist ein Token ca. 4 Buchstaben. Je nachdem wie viele Tokens man spendiert, ist die Antwort auch länger oder kürzer. Der letzte Parameter ist die temperature. Hierbei kann ein Wert von 0 – 2 vergeben werden. Je höher der Wert, desto allgemeiner die Antwort, je niedriger desto deterministischer. Alle weiteren Informationen sind hier sehr gut dokumentiert: https://platform.openai.com/docs/api-reference/completions/create
Nun ist der API Aufruf soweit fertig und könnte auch schon ausgeführt werden. Leider sehe ich jetzt immer noch nichts von der Antwort.
Teil 3 – Antwort erhalten und JSON decodieren
Wie viele andere APIs auf dieser Welt, die tagtäglich Milliarden Informationen bereitstellen, bekomme ich auch hier eine Antwort im JSON Format.
Im vorherigen Teil wurde bereits von Key-Value Paaren geschrieben. Sogenannte Dictionaries, oder auch in diesem Kontext von Apple Wörterbuch genannt, funktionieren mit diesen Key-Value Paaren. Ähnlich wie bei einem richtigen Wörterbuch finde ich auf der einen Seite einen Key, bspw. das Wort „Essen“ und auf der anderen Seite einen dazugehörigen Value – „Food“. Wichtig: die Keys sind dabei immer statisch und der Value ist dynamisch. So kann ich in meiner Dekodierung festlegen nach welchem Key gesucht werden soll, um dann den dynamischen Inhalt auszugeben. Konkret sieht die Struktur der Antwort von OpenAI auf die Frage: Schmeckt Pepsi oder Coca-Cola besser? so aus:
{
"id": "cmpl-6u2CIMjktuOioUpKScsSmWe1jR70S",
"object": "text_completion",
"created": 1678812834,
"model": "text-davinci-003",
"choices": [
{
"text": "\n\nDas ist eine Frage des Geschmacks. Beide Marken haben eine lange Geschichte und sind beliebt, so dass es schwer ist, eine zu bevorzugen.",
"index": 0,
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 15,
"completion_tokens": 54,
"total_tokens": 69
}
}
Die für mich relevanten Inhalte habe ich fett hervorgehoben. Meine Aktion soll nach dem Key „text“ suchen, in dem Array „choices“. Dafür müssen folgende Aktionen hinzugefügt werden: „Wörterbuch abrufen“ und „Wörterbuch aus Eingabe abrufen“. Als Variablenwert wähle ich nun „choices“ aus, wie im vorherigen Screenshot gezeigt.
„Choices“ ist ein Array, also im Grunde eine Liste von Einträgen. Daher muss ich jetzt noch eine Schleife einbauen, die alle Einträge durchsucht und diese ausgibt.
Dies wird mit der Aktion „Wiederholen mit jedem“ gemacht. Nun habe ich das „choices“-Array durchsucht, es fehlt aber noch der eigentliche Eintrag, den ich unter dem Key „text“ finde. Hierfür brauche ich wieder die Aktion „Wörterbuch aus Eingabe abrufen“, dieses Mal aber innerhalb der Schleife. Dazu muss ich die Aktion etwas länger gedrückt halten und rücke sie dann ein. Anschließend wird das „Wiederholen“ beendet.
Wie man im oberen Screenshot sieht, habe ich auch einen Kommentar hinzugefügt. In der Programmierung ist es gute Praxis Code zu kommentieren. An dieser Stelle habe ich beispielhaft einen Kommentar hinzugefügt, um darauf hinzuweisen, was als nächstes folgt.
Teil 4 – Ergebnis vorlesen lassen
Der letzte Teil beschäftigt sich nun mit dem Vorlesen lassen der Antwort von OpenAI. Im Gegensatz zu ChatGPT wird in meinem Beispiel nämlich kein Text an den User ausgegeben, sondern eine Audioausgabe.
Die letzten beiden Aktionen sind „Text in Sprache“ umwandeln und „Übersicht“. Bei „Text in Sprache“ wird die Variable „Wiederholungsergebnisse“ übergeben. Hier sind noch verschiedene Parameter für den Stimmengenerator möglich, wie Geschwindigkeit, Ton und Stimme. Abschließend wird die erstellte Audiodatei an die Aktion „Übersicht“ übergeben, die in diesem Fall einen kleinen Mediaplayer anzeigt, mit dem der Ton abgespielt werden kann.
Teil 5 – Zusammenfassung
In diesem Tutorial habe ich gezeigt, wie mit Hilfe der Kurzbefehle App, die auf iOS und MacOS verfügbar ist, eine Anfrage an die Schnittstelle von OpenAI geschickt werden kann. Im Gegensatz zum ChatGPT Ansatz kann hierbei mit einer Spracheingabe eine Frage bzw. Aufgabe an die KI gestellt werden und die Antwort anschließend als Ton auch wieder akustisch ausgegeben.
Vielen Dank fürs Lesen und ich freue mich über Kommentare.