เพิ่มประสิทธิภาพ Alexa ของคุณด้วยการทำให้ตอบสนองเป็น ChatGPT
พื้นที่เก็บข้อมูลนี้มีบทช่วยสอนเกี่ยวกับวิธีสร้างทักษะ Alexa แบบง่ายๆ ที่ใช้ OpenAI API เพื่อสร้างการตอบกลับจากโมเดล ChatGPT
เข้าสู่ระบบบัญชี Amazon Developer ของคุณแล้วไปที่ Alexa Developer Console
คลิกที่ "สร้างทักษะ" และตั้งชื่อทักษะ "แชท" เลือกสถานที่หลักตามภาษาของคุณ
เลือก "อื่นๆ" และ "กำหนดเอง" สำหรับโมเดล
เลือก "Alexa-hosted (Python)" สำหรับทรัพยากรแบ็กเอนด์
ตอนนี้คุณมีสองทางเลือก:
หรือถ้าคุณต้องการสร้างทักษะด้วยตนเอง
ในส่วน "สร้าง" ให้ไปที่แท็บ "ตัวแก้ไข JSON"
หากคุณนำเข้าทักษะโดยตรงจากพื้นที่เก็บข้อมูลนี้ เพียงเปลี่ยน "invocationName" เป็น "chat" หรือคำอื่นที่ต้องการสำหรับการเปิดใช้งาน และดำเนินการในขั้นตอนที่ 12
อย่างไรก็ตาม หากคุณเลือกที่จะสร้างทักษะด้วยตนเอง ให้แทนที่เนื้อหา JSON ที่มีอยู่ด้วยเนื้อหา JSON ที่ให้มา:
{
"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" : []
}
}
}
บันทึกโมเดลและคลิกที่ "สร้างโมเดล"
ไปที่ส่วน "รหัส" และเพิ่ม "openai" ลงในข้อกำหนด.txt requirements.txt ของคุณควรมีลักษณะดังนี้:
ask-sdk-core==1.11.0
boto3==1.9.216
requests>=2.20.0
สร้างคีย์ OpenAI API บนหน้าคีย์ API โดยคลิก "+ สร้างคีย์ลับใหม่"
แทนที่ไฟล์ lambda_functions.py ของคุณด้วย 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 ()
ใส่คีย์ OpenAI API ที่คุณได้รับจากบัญชี OpenAI
บันทึกและปรับใช้ ไปที่ส่วน "ทดสอบ" และเปิดใช้งาน "การทดสอบทักษะ" ใน "การพัฒนา"
ตอนนี้คุณพร้อมที่จะใช้ Alexa ของคุณในโหมด ChatGPT แล้ว คุณควรเห็นผลลัพธ์ดังนี้:
โปรดทราบว่าการใช้ทักษะนี้จะมีค่าใช้จ่ายสำหรับการใช้ทั้ง AWS Lambda และ OpenAI API ตรวจสอบให้แน่ใจว่าคุณเข้าใจโครงสร้างราคาและติดตามการใช้งานของคุณเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่ไม่คาดคิด