명령줄에서 Alexa 앱을 실행하세요. Slack에서 실행하세요. 어디서나 실행하세요! Amazon Alexa 기술과 의도를 지원합니다.
$ npm install chatskills
Chatskills는 Amazon 외부에서 Alexa 앱을 실행하는 빠르고 쉬운 방법입니다. 기술과 의도를 쉽게 생성하고 명령줄에서 바로 실행하세요!
Chatskills는 서버가 필요하지 않으며 콘솔에서 직접 실행할 수 있습니다. 웹이나 Slack 등 어디에서나 실행할 수도 있습니다. 여러 사용자의 요청을 처리하고 세션 메모리를 유지 관리합니다. 사용자가 기술 중 하나로 대화를 시작하면 해당 기술은 해당 기술이 종료될 때까지 세션 컨텍스트 내에서 계속 실행됩니다.
명령줄에서 실행되는 Amazon Alexa 앱의 모습은 다음과 같습니다.
> chatskills, ask hello to say hi.
Hello, World!
> chatskills, ask horoscope for Scorpio.
Things are looking up today for Scorpio.
> chatskills, ask funny to tell me a joke
Knock knock.
> who's there?
Banana.
> banana who
Knock knock.
> whos there
Orange.
> orange who?
Orange you glad I didn't say banana?
이 예에서 사용자는 안녕하세요, 별점, 재미라는 세 가지 기술에 액세스합니다.
chatskill을 사용하는 것은 쉽습니다. Alexa 구문을 사용하여 새 기술을 추가한 다음 몇 가지 인텐트를 생성합니다. 다음은 간단한 예입니다.
var chatskills = require ( 'chatskills' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Respond to input.
chatskills . respond ( 'chatskills, ask hello to say hi' , function ( response ) {
console . log ( response ) ;
} ) ;
위의 예에서 발화 문법은 다음 문구와 일치하도록 자동으로 확장됩니다.
helloWorld to say hi
helloWorld say hi
helloWorld to speak hi
helloWorld speak hi
helloWorld to tell me hi
helloWorld tell me hi
helloWorld to say hello
helloWorld say hello
helloWorld to speak hello
helloWorld speak hello
helloWorld to tell me hello
helloWorld tell me hello
helloWorld to say howdy
...
이 스킬을 사용하여 챗봇과 상호 작용하려면 대상 문구 중 하나를 말하세요. 위의 예에서는 "안녕하세요"라는 문구를 사용했지만 생성된 모든 문구와 일치시킬 수 있습니다. 예를 들어:
> chatskills, ask hello to tell me hi
Hello, World!
> chatskills, ask hello to say hello
Hello, World!
> chatskills, ask hello to say howdy
Hello, World!
콘솔에서 로컬로 실행되는 챗봇을 만들려면 입력을 읽는 루프를 포함하면 됩니다.
var readlineSync = require ( 'readline-sync' ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
기술(예: 요청 등)에서 비동기 호출을 사용하는 경우 위의 while 루프 대신 비동기 루프를 사용하는 것이 좋습니다. 여기에 예가 있습니다.
콘솔만 사용할 필요는 없습니다! Slack과 같이 어디서나 챗봇을 실행할 수 있습니다. 전체 예는 여기를 참조하세요.
var SlackBot = require ( 'slackbots' ) ;
var bot = new SlackBot ( { token : token , name : 'awesome' } ) ;
// Listen to slack messages.
bot . on ( 'message' , function ( message ) {
// Reply to humans.
if ( message . type == 'message' && message . text && message . subtype != 'bot_message' ) {
var author = getUserById ( message . user ) ;
var channel = getChannelById ( message . channel ) ;
// Respond to input, use author.name as the session id.
chatskills . respond ( message . text , author . name , function ( response ) {
if ( channel ) {
// Public channel message.
bot . postMessageToChannel ( channel . name , response ) ;
}
else {
// Private message.
bot . postMessageToUser ( author . name , response ) ;
}
} ) ;
}
} ) ;
스킬은 챗봇이 실행할 수 있는 프로그램입니다. 이는 발화(사용자 입력에서 일치시킬 문구), 응답 및 세션 메모리로 구성된 의도로 구성됩니다. 각 스킬은 세션 메모리에 액세스할 수 있으므로 사용자에게 지능적으로 응답하는 데 도움이 되는 변수를 저장하고 검색할 수 있습니다.
다음은 "별점"이라는 새 스킬을 만드는 예입니다.
var horoscope = chatskills . app ( 'horoscope' ) ;
기술은 의도로 구성됩니다. 여기서는 사용자의 입력이 발화 배열과 일치됩니다. 일치하는 항목이 발견되면 해당 의도가 실행됩니다. 인텐트는 req.get('variable')
및 req.set('variable', value)
호출하여 사용자 세션에서 변수를 가져오거나 설정할 수 있습니다. 인텐트는 res.say('hello')
호출하여 응답을 출력할 수 있습니다.
다음은 "별점" 스킬에 대한 새 인텐트를 생성하는 예입니다.
horoscope . intent ( 'predict' , {
'slots' : { 'SIGN' : 'LITERAL' } ,
'utterances' : [ 'for {signs|SIGN}' ]
} ,
function ( req , res ) {
res . say ( 'Things are looking up today for ' + req . get ( 'SIGN' ) + '.' ) ;
}
) ;
이 인텐트는 다음과 같이 상호작용할 수 있습니다.
> chatskills, ask horoscope for Scorpio
Things are looking up today for Scorpio.
스킬 실행을 시작하는 방법에는 두 가지가 있습니다.
스킬을 실행하는 첫 번째 방법은 "실행"과 같은 의도를 생성하는 것입니다. 이렇게 하면 "chatskills, [skillname]에 실행을 요청하세요."라고 입력할 수 있습니다. 인텐트의 반환 값이 true인 경우(세션을 활성 상태로 유지하기 위해) 이제 스킬이 실행됩니다.
"달리기" 스킬의 예는 추측 게임에서 찾을 수 있습니다.
app . intent ( 'run' , {
"slots" : { } ,
"utterances" : [ "{to|} {run|start|go|launch}" ]
} , function ( req , res ) {
var prompt = "Guess a number between 1 and 100!" ;
res . say ( prompt ) . reprompt ( prompt ) . shouldEndSession ( false ) ;
}
) ;
스킬을 시작하는 두 번째 방법은 앱 시작 시 자동으로 실행되는 시작 방법을 만드는 것입니다. 그런 다음 chatskills.launch(app)
호출하여 스킬을 시작하세요. 스킬이나 스킬 이름을 전달할 수 있습니다. 선택적으로 고유한 sessionId를 제공할 수도 있습니다.
예: chatskills.launch(app)
또는 chatskills.launch('horoscope')
또는 chatskills.launch('horoscope', 'some-unique-id')
.
다음은 완전한 예입니다.
var chatskills = require ( './lib/chatskills' ) ;
var readlineSync = require ( 'readline-sync' ) ;
// Create a skill.
var hello = chatskills . app ( 'hello' ) ;
// Launch method to run at startup.
hello . launch ( function ( req , res ) {
res . say ( "Ask me to say hi!" ) ;
// Keep session open.
res . shouldEndSession ( false ) ;
} ) ;
// Create an intent.
hello . intent ( 'helloWorld' , {
'slots' : { } ,
'utterances' : [ '{to |}{say|speak|tell me} {hi|hello|howdy|hi there|hiya|hi ya|hey|hay|heya}' ]
} ,
function ( req , res ) {
res . say ( 'Hello, World!' ) ;
}
) ;
// Start running our skill.
chatskills . launch ( hello ) ;
// Console client.
var text = ' ' ;
while ( text . length > 0 && text != 'quit' ) {
text = readlineSync . question ( '> ' ) ;
// Respond to input.
chatskills . respond ( text , function ( response ) {
console . log ( response ) ;
} ) ;
}
사용자가 입력을 제공하면 입력이 각 기술 및 해당 의도 목록과 일치됩니다. 일치하는 항목이 발견되면 새 세션이 시작되고 스킬이 실행되기 시작합니다.
사용자에 대한 세션이 시작되면 활성화된 스킬의 의도는 세션 내에서 변수 값을 가져오거나 설정할 수 있습니다. 이를 통해 데이터를 저장하고 검색할 수 있습니다.
사용자에 대한 세션이 열려 있는 동안 사용자의 모든 입력은 활성화된 스킬로 전달됩니다. 이러한 방식으로 사용자는 기술을 다시 요청할 필요가 없습니다("채팅 기술, 안부 인사를 요청하세요"). 대신 사용자는 현재 실행 중인 스킬의 의도와 일치하는 텍스트를 제공하기만 하면 됩니다.
인텐트는 true
반환하거나 res.shouldEndSession(false)
호출하여 세션을 열린 상태로 유지할 수 있고, false
반환하거나 res.shouldEndSession(true)
호출하여 세션을 종료할 수 있습니다. 인텐트는 false를 반환하는 것과 동일한 return 문을 생략할 수도 있습니다.
세션 사용 예시는 별자리 스킬을 참조하세요. 인텐트는 사용자에게 질문을 한 다음 세션을 계속 진행하기 위해 true를 반환합니다. 인텐트는 유효한 응답이 제공된 경우에만 false를 반환하므로 세션이 종료됩니다.
요약하면 사용자 세션이 열리면 사용자의 모든 입력이 스킬로 전달됩니다. 사용자 세션이 종료되면 "chatskills, Ask [SKILL] text" 형식으로 사용자로부터 입력을 받아야 새 스킬을 실행할 수 있습니다.
기본 세션 시간 초과는 사용자 입력이 없을 때 1시간입니다. 세션 시간 제한을 변경하려면 chatskills.timeout = 3600
설정하세요. 여기서 값은 초 단위로 지정됩니다. 세션 시간 초과를 비활성화하려면 값을 0으로 설정합니다.
기본 챗봇 이름은 "chatskills"입니다. 기술 실행을 위한 모든 요청은 챗봇 이름으로 시작해야 합니다. 예를 들어, "chatskills, 인사를 해달라고 요청하세요." 챗봇 이름을 사용자 정의하려면 다음을 사용하십시오.
chatskills . name ( 'awesome' ) ;
경고 및 오류를 표시하려면 chatskills.verbose = true
설정하세요.
Chatskills는 alexa-app을 사용하여 의도에서 많은 샘플 발화를 생성합니다. 발화에 대한 자세한 설명은 여기를 참조하세요.
슬롯과 발화라는 두 가지 속성이 있는 개체를 전달합니다.
app . intent ( 'sampleIntent' ,
{
"slots" : { "NAME" : "LITERAL" , "AGE" : "NUMBER" } ,
"utterances" : [ "my {name is|name's} {names|NAME} and {I am|I'm} {1-100|AGE}{ years old|}" ]
} ,
function ( request , response ) { ... }
) ;
슬롯 객체는 단순한 이름:유형 매핑입니다. 유형은 Amazon에서 지원하는 슬롯 유형(LITERAL, NUMBER, DATE, TIME, DURATION) 중 하나여야 합니다.
Amazon에서 더 이상 지원하지 않는 LITERAL
슬롯 유형을 대신하여 사용자 지정 슬롯 유형을 사용하는 것이 좋습니다. 다음은 DragonType
에 대한 사용자 정의 슬롯 유형을 정의하는 예입니다.
app . intent ( 'attack' ,
{
'slots' : { 'DragonType' : 'DRAGONTYPE' } ,
'utterances' : [ '{attack|fight|hit|use} {sword|dagger|wand} on {-|DragonType} dragon' ]
} , function ( request , response ) {
response . say ( 'You are attacking the ' + request . slot ( 'DragonType' ) + ' dragon!' ) ;
}
) ;
{-|CustomTypeName}
구문을 사용하여 발화 내에 사용자 지정 슬롯 유형을 포함할 수 있습니다. 이는 해당 용어가 사용자 정의 슬롯 유형의 값 목록에서 나와야 함을 나타냅니다. 위의 예에서 발언은 {-|DragonType}
이라는 용어를 사용하며, 이는 해당 용어가 값 목록(아래 표시)에서 나와야 함을 나타냅니다. 채팅 스킬의 경우 값 목록을 제공할 필요가 없습니다. 모든 단어는 사용자 정의 슬롯 유형에 허용되고 해당 값으로 사용됩니다.
Amazon Alexa 서비스에 게시하는 경우 유형 이름과 값 목록을 지정하여 DragonType
에 대한 사용자 지정 슬롯 유형을 제공합니다. 예를 들어:
유형: DRAGONTYPE
값:
golden
fire
ice
water
snow
chatskills 및 Amazon Alexa는 실제로 사용자 정의 슬롯 값에 대한 모든 단어를 허용합니다. 값 목록의 단어와 일치할 필요는 없습니다. 이러한 방식으로 사용자 정의 슬롯 유형은 LITERAL
과 유사합니다.
발언 구문을 사용하면 자동 확장되는 몇 가지 샘플만 사용하여 수백 또는 수천 개의 샘플 발언을 생성할 수 있습니다. 발언 배열에는 원하는 수의 샘플 발언이 전달될 수 있습니다. 다음은 몇 가지 샘플 발화 매크로와 확장 대상입니다.
"my favorite color is {red|green|blue|NAME}"
=>
"my favorite color is {red|NAME}"
"my favorite color is {green|NAME}"
"my favorite color is {blue|NAME}"
이를 통해 문구를 말하는 여러 방법을 정의할 수 있지만 단일 샘플 발화로 결합됩니다.
"{what is the|what's the|check the} status"
=>
"what is the status"
"what's the status"
"check the status"
숫자 슬롯 값을 캡처할 때 다양한 숫자 값을 사용하여 많은 샘플 발화를 생성하는 것이 도움이 됩니다.
"buy {2-5|NUMBER} items"
=>
"buy {two|NUMBER} items"
"buy {three|NUMBER} items"
"buy {four|NUMBER} items"
"buy {five|NUMBER} items"
숫자 범위는 단계적으로 증가할 수도 있습니다.
"buy {5-20 by 5|NUMBER} items"
=>
"buy {five|NUMBER} items"
"buy {ten|NUMBER} items"
"buy {fifteen|NUMBER} items"
"buy {twenty|NUMBER} items"
"what is your {favorite |}color"
=>
"what is your color"
"what is your favorite color"
여러 인텐트가 동일한 가능한 값 목록을 사용할 수 있으므로 각 인텐트 스키마가 아닌 한 곳에서 정의하는 것이 좋습니다. 앱의 사전을 사용하세요.
app.dictionary = {"colors":["red","green","blue"]};
...
"my favorite color is {colors|FAVEORITE_COLOR}"
"I like {colors|COLOR}"
응답 메서드에서 반환된 카드 객체를 처리하여 Amazon Alexa 홈 카드를 표시할 수 있습니다. Alexa-app을 사용하면 홈 카드가 모바일 장치의 Amazon Alexa 앱에 표시됩니다. chatskills를 사용할 때 홈 카드는 두 개의 인수 response
및 card
를 반환하는 chatskills.respond()
콜백 메서드에서 처리될 수 있습니다.
카드 개체를 사용하면 카드의 텍스트와 이미지를 원하는 방식으로 표시할 수 있습니다. 예를 들어 Slack에서 chatskills 앱을 호스팅하는 경우 이미지를 내장된 미디어로 표시할 수 있습니다. 마찬가지로 콘솔에서 텍스트 챗봇으로 호스팅하는 경우 간단히 카드를 텍스트로 출력하고 싶을 수도 있습니다.
아래는 예시입니다.
app . intent ( 'example' , {
"slots" : { } ,
"utterances" : [ "show a card" ]
} , function ( req , res ) {
// Show home card in Alexa app.
res . card ( {
type : 'Standard' ,
title : 'My Awesome Card' , // this is not required for type Simple or Standard
text : 'This is an example of an Alexa home card.' ,
image : { // image is optional
smallImageUrl : 'http://www.yoursite.com/image.jpg' , // required
largeImageUrl : null
}
} ) ;
} ) ;
// Respond to input.
chatskills . respond ( text , function ( response , card ) {
if ( ! card ) {
// Text response from res.say() method.
console . log ( response ) ;
}
else {
// Home card response from res.card() method.
console . log ( '[DISPLAYING CARD: Title=' + card . title + ', Text=' + card . text + ']' ) ;
}
} ) ;
MIT
코리 베커 http://www.primaryobjects.com/kory-becker