Stärken Sie Ihre Alexa, indem Sie sie als ChatGPT reagieren lassen.
Dieses Repository enthält ein Tutorial zum Erstellen eines einfachen Alexa-Skills, der die OpenAI-API verwendet, um Antworten aus dem ChatGPT-Modell zu generieren.
Melden Sie sich bei Ihrem Amazon Developer-Konto an und navigieren Sie zur Alexa Developer Console.
Klicken Sie auf „Skill erstellen“ und nennen Sie den Skill „Chat“. Wählen Sie das primäre Gebietsschema entsprechend Ihrer Sprache.
Wählen Sie „Andere“ und „Benutzerdefiniert“ für das Modell.
Wählen Sie „Alexa-hosted (Python)“ für die Backend-Ressourcen.
Sie haben nun zwei Möglichkeiten:
Oder wenn Sie den Skill manuell erstellen möchten
Navigieren Sie im Abschnitt „Build“ zur Registerkarte „JSON Editor“.
Wenn Sie den Skill direkt aus diesem Repository importiert haben, ändern Sie einfach den „invocationName“ in „chat“ oder ein anderes bevorzugtes Wort zur Aktivierung und fahren Sie mit Schritt 12 fort.
Wenn Sie sich jedoch dafür entscheiden, den Skill manuell zu erstellen, ersetzen Sie den vorhandenen JSON-Inhalt durch den bereitgestellten JSON-Inhalt:
{
"interactionModel" : {
"languageModel" : {
"invocationName" : " chat " ,
"intents" : [
{
"name" : " GptQueryIntent " ,
"slots" : [
{
"name" : " query " ,
"type" : " AMAZON.Person "
}
],
"samples" : [
" {query} "
]
},
{
"name" : " AMAZON.CancelIntent " ,
"samples" : []
},
{
"name" : " AMAZON.HelpIntent " ,
"samples" : []
},
{
"name" : " AMAZON.StopIntent " ,
"samples" : []
},
{
"name" : " AMAZON.NavigateHomeIntent " ,
"samples" : []
}
],
"types" : []
}
}
}
Speichern Sie das Modell und klicken Sie auf „Modell erstellen“.
Gehen Sie zum Abschnitt „Code“ und fügen Sie „openai“ zu „requirements.txt“ hinzu. Ihre „requirements.txt“-Datei sollte so aussehen:
ask-sdk-core==1.11.0
boto3==1.9.216
requests>=2.20.0
Erstellen Sie auf der Seite „API-Schlüssel“ einen OpenAI-API-Schlüssel, indem Sie auf „+ Neuen geheimen Schlüssel erstellen“ klicken.
Ersetzen Sie Ihre Datei lambda_functions.py durch die bereitgestellte Datei lambda_function.py.
from ask_sdk_core . dispatch_components import AbstractExceptionHandler
from ask_sdk_core . dispatch_components import AbstractRequestHandler
from ask_sdk_core . skill_builder import SkillBuilder
from ask_sdk_core . handler_input import HandlerInput
from ask_sdk_model import Response
import ask_sdk_core . utils as ask_utils
import requests
import logging
import json
# Set your OpenAI API key
api_key = "YOUR_API_KEY"
logger = logging . getLogger ( __name__ )
logger . setLevel ( logging . INFO )
class LaunchRequestHandler ( AbstractRequestHandler ):
"""Handler for Skill Launch."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ask_utils . is_request_type ( "LaunchRequest" )( handler_input )
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
speak_output = "Chat G.P.T. mode activated"
session_attr = handler_input . attributes_manager . session_attributes
session_attr [ "chat_history" ] = []
return (
handler_input . response_builder
. speak ( speak_output )
. ask ( speak_output )
. response
)
class GptQueryIntentHandler ( AbstractRequestHandler ):
"""Handler for Gpt Query Intent."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ask_utils . is_intent_name ( "GptQueryIntent" )( handler_input )
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
query = handler_input . request_envelope . request . intent . slots [ "query" ]. value
session_attr = handler_input . attributes_manager . session_attributes
if "chat_history" not in session_attr :
session_attr [ "chat_history" ] = []
response = generate_gpt_response ( session_attr [ "chat_history" ], query )
session_attr [ "chat_history" ]. append (( query , response ))
return (
handler_input . response_builder
. speak ( response )
. ask ( "Any other questions?" )
. response
)
class CatchAllExceptionHandler ( AbstractExceptionHandler ):
"""Generic error handling to capture any syntax or routing errors."""
def can_handle ( self , handler_input , exception ):
# type: (HandlerInput, Exception) -> bool
return True
def handle ( self , handler_input , exception ):
# type: (HandlerInput, Exception) -> Response
logger . error ( exception , exc_info = True )
speak_output = "Sorry, I had trouble doing what you asked. Please try again."
return (
handler_input . response_builder
. speak ( speak_output )
. ask ( speak_output )
. response
)
class CancelOrStopIntentHandler ( AbstractRequestHandler ):
"""Single handler for Cancel and Stop Intent."""
def can_handle ( self , handler_input ):
# type: (HandlerInput) -> bool
return ( ask_utils . is_intent_name ( "AMAZON.CancelIntent" )( handler_input ) or
ask_utils . is_intent_name ( "AMAZON.StopIntent" )( handler_input ))
def handle ( self , handler_input ):
# type: (HandlerInput) -> Response
speak_output = "Leaving Chat G.P.T. mode"
return (
handler_input . response_builder
. speak ( speak_output )
. response
)
def generate_gpt_response ( chat_history , new_question ):
"""Generates a GPT response to a new question"""
headers = {
"Authorization" : f"Bearer { api_key } " ,
"Content-Type" : "application/json"
}
url = "https://api.openai.com/v1/chat/completions"
messages = [{ "role" : "system" , "content" : "You are a helpful assistant. Answer in 50 words or less." }]
for question , answer in chat_history [ - 10 :]:
messages . append ({ "role" : "user" , "content" : question })
messages . append ({ "role" : "assistant" , "content" : answer })
messages . append ({ "role" : "user" , "content" : new_question })
data = {
"model" : "gpt-4o-mini" ,
"messages" : messages ,
"max_tokens" : 300 ,
"temperature" : 0.5
}
try :
response = requests . post ( url , headers = headers , data = json . dumps ( data ))
response_data = response . json ()
if response . ok :
return response_data [ 'choices' ][ 0 ][ 'message' ][ 'content' ]
else :
return f"Error { response . status_code } : { response_data [ 'error' ][ 'message' ] } "
except Exception as e :
return f"Error generating response: { str ( e ) } "
sb = SkillBuilder ()
sb . add_request_handler ( LaunchRequestHandler ())
sb . add_request_handler ( GptQueryIntentHandler ())
sb . add_request_handler ( CancelOrStopIntentHandler ())
sb . add_exception_handler ( CatchAllExceptionHandler ())
lambda_handler = sb . lambda_handler ()
Geben Sie Ihren OpenAI-API-Schlüssel ein, den Sie von Ihrem OpenAI-Konto erhalten haben
Speichern und bereitstellen. Gehen Sie zum Abschnitt „Test“ und aktivieren Sie „Skill-Test“ unter „Entwicklung“.
Sie können Ihre Alexa jetzt im ChatGPT-Modus verwenden. Sie sollten Ergebnisse wie diese sehen:
Bitte beachten Sie, dass für die Ausführung dieses Skills Kosten für die Nutzung von AWS Lambda und der OpenAI-API anfallen. Stellen Sie sicher, dass Sie die Preisstruktur verstehen und Ihre Nutzung überwachen, um unerwartete Gebühren zu vermeiden.