채팅봇 애플리케이션 개발을 위한 프레임워크입니다.
node와 npm이 설치되어 있는지 확인하세요. 현재 이 모듈은 Travis CI 파이프라인 내에서 0.12 노드 버전에 대해 테스트되었습니다.
간단히 npm install
명령을 실행하여 설치하세요.
npm install --save talkify
기본 모듈, 유형 및 종속성이 필요합니다. 다음 명령은 모듈에서 필요한 모든 것을 로드합니다.
// Core dependency
const talkify = require ( 'talkify' ) ;
const Bot = talkify . Bot ;
// Types dependencies
const BotTypes = talkify . BotTypes ;
const Message = BotTypes . Message ;
const SingleLineMessage = BotTypes . SingleLineMessage ;
const MultiLineMessage = BotTypes . MultiLineMessage ;
// Skills dependencies
const Skill = BotTypes . Skill ;
// Training dependencies
const TrainingDocument = BotTypes . TrainingDocument ;
종속성이 로드되면 봇 코어를 초기화할 수 있습니다.
const bot = new Bot ( ) ;
Bot()
생성자는 구성 객체 형식의 매개변수도 허용합니다. 여기서 구성 스위치 값이나 ContextStore
및 Classifier
등과 같은 대체 구현을 전달할 수 있습니다. 이에 대해서는 나중에 구성 옵션 섹션에서 다루겠습니다.
봇이 초기화되면 가장 먼저 해야 할 일은 봇을 훈련시키는 것입니다. 한 번에 하나의 문서를 동기식으로 훈련하려면 train
방법을 사용할 수 있습니다.
bot . trainAll ( [
new TrainingDocument ( 'how_are_you' , 'how are you' ) ,
new TrainingDocument ( 'how_are_you' , 'how are you going' ) ,
new TrainingDocument ( 'how_are_you' , 'how is it going' ) ,
new TrainingDocument ( 'help' , 'how can you help' ) ,
new TrainingDocument ( 'help' , 'i need some help' ) ,
new TrainingDocument ( 'help' , 'how could you assist me' )
] , function ( ) { } ) ;
위의 코드는 텍스트 how are you
또는 how is it going
how are you doing
와 같이 보일 때 how_are_you
주제를 인식하도록 봇을 훈련시키지만, 텍스트가 how can you help
또는 i need some help
보일 때 주제 help
인식하도록 훈련시킵니다. 그리고 how can you assist me
? 이것이 봇을 훈련시키는 방법입니다.
trainAll
메소드는 TrainingDocument
객체 배열과 콜백 함수를 허용합니다. TrainingDocument
개체 생성자는 두 개의 매개 변수를 허용합니다. topicName
및 trainingData
입니다. topicName
매개변수는 trainingData
훈련시키려는 주제의 이름이고 trainingData
훈련 데이터로 봇에 제공하는 문장입니다. topicName
은 나중에 봇이 응답할 수 있는 실제 기술에 매핑됩니다.
trainAll
메서드에 대한 콜백은 훈련이 완료되면 봇이 호출할 수 있는 함수입니다. 훈련 데이터가 너무 많으면 이를 올바르게 구현해야 합니다. 이 예에서는 훈련 데이터가 많지 않기 때문에 빈 function
를 전달했습니다.
말할 필요도 없이, 훈련 데이터가 많을수록 봇은 더 좋아집니다. 이 튜토리얼에서는 현재 talkify-natural-classifier 라이브러리의 LogisticRegression
분류자인 기본 분류자를 사용하고 있습니다. 이 분류기는 일반적으로 시작하려면 약간 더 많은 훈련 데이터가 필요하지만 대부분의 조건에서 다른 것보다 더 정확합니다.
일부 주제에 대해 봇을 훈련한 후에는 몇 가지 기술을 추가해야 합니다. 기술은 봇이 주제를 인식할 때 실행하는 작업입니다. 따라서 주제와 기술이 1:1로 매핑됩니다.
스킬을 추가하려면 먼저 스킬을 생성해야 합니다. 기술에는 세 가지가 필요합니다. 봇에 고유한 스킬의 이름입니다. 이름은 나중에 컨텍스트 내에서 기술을 연관시키는 데 사용됩니다. 기술을 실행하기 위해 봇이 호출할 기능과 매핑되는 주제입니다. 이 함수는 context, request, response, next
등 4개의 매개변수를 사용합니다. context
매개변수는 해당 스킬의 유용한 컨텍스트 정보를 저장하는 데 사용됩니다. request
매개변수에는 response
와 마찬가지로 요청에 대한 정보가 포함됩니다. next
매개변수는 처리가 완료되었음을 봇에게 알리기 위해 호출할 수 있는 함수입니다. 스킬의 모양은 다음과 같습니다.
var howAction = function ( context , request , response , next ) {
response . message = new SingleLineMessage ( 'You asked: "' + request . message . content + '". I'm doing well. Thanks for asking.' ) ;
next ( ) ;
} ;
var helpAction = function ( context , request , response , next ) {
response . message = new SingleLineMessage ( 'You asked: "' + request . message . content + '". I can tell you how I'm doing if you ask nicely.' ) ;
next ( ) ;
} ;
var howSkill = new Skill ( 'how_skill' , 'how_are_you' , howAction ) ;
var helpSkill = new Skill ( 'help_skill' , 'help' , helpAction ) ;
참고: 스킬 이름은 정의되지 않을 수 있습니다. 그러나 이렇게 하면 주어진 쿼리에 대한 응답에 대한 신뢰 수준이 0이 될 때마다 봇이 해당 기술을 실행한다는 것을 의미합니다.
일부 기술을 정의한 후에는 해당 기술을 봇에 추가해야 합니다. 다음과 같이 봇에 스킬을 추가합니다.
bot . addSkill ( howSkill ) ;
bot . addSkill ( helpSkill ) ;
추가한 후에는 이제 봇에게 문제 해결을 요청할 수 있습니다. 여기서는 문장으로 봇을 쿼리하고 비동기적으로 메시지로 응답합니다. 해결 함수는 contextId, text, callback
세 가지 매개변수를 사용합니다. contextId
봇이 이전 대화의 컨텍스트를 확인하는 데 도움이 됩니다. text
봇이 해석하고 응답해야 하는 질문 또는 자연어 문자열의 일부입니다. 마지막으로 callback
봇이 오류(있는 경우)를 나타내는 err, messages
매개변수 및 응답 메시지를 사용하여 호출하는 콜백 함수입니다.
var resolved = function ( err , messages ) {
if ( err ) return console . error ( err ) ;
return console . log ( messages ) ;
} ;
bot . resolve ( 123 , 'Assistance required' , resolved ) ;
간단한 노드 파일처럼 실행하면 콘솔에 다음이 인쇄됩니다.
[ { type: 'SingleLine',
content: 'You asked: "Assistance required". I can tell you how I'm doing if you ask nicely.' } ]
bot.resolve
이것으로 변경해 보고 응답의 변화를 확인하세요.
bot . resolve ( 456 , 'How's it going?' , resolved ) ;
한 번에 두 가지를 물어보자. bot.resolve
다시 다음으로 변경합니다.
bot . resolve ( 456 , 'How's it going? Assistance required please.' , resolved ) ;
코드를 실행하면 다음 두 가지 메시지가 반환됩니다.
[ { type : 'SingleLine' ,
content : 'You asked: "How's it going? Assistance required please.". I'm doing well. Thanks for asking.' } ,
{ type : 'SingleLine' ,
content : 'You asked: "How's it going? Assistance required please.". I can tell you how I'm doing if you ask nicely.' } ]
현재 train
, addSkill
및 resolve
메서드는 연결 가능합니다. 즉, 아래에 언급된 것처럼 Bot 객체와 계단식 메소드를 생성할 수 있습니다.
new Bot ( ) . train ( topic , sentence ) . addSkill ( skill ) . resolve ( ... . )
봇 코어는 내장된 컨텍스트 저장소에 대한 대체 구현도 허용합니다. 자세한 내용은 컨텍스트 관리를 참조하세요.
자체 버전의 분류자를 봇에 제공할 수도 있습니다. 이 옵션은 주로 테스트를 더 쉽게 하기 위해 사용되었지만 더 나은 버전의 내장 분류기가 있는 경우 프로덕션에서도 계속 사용할 수 있습니다.
내장된 분류자는 talkify-natural-classifier입니다. 이 분류자는 두 가지 구현을 제공합니다.
LogisticRegressionClassifier
BayesClassifier
LogisticRegressionClassifier
는 기본 분류자입니다. talkify-natural-classifier
에서 BayesClassifier
구현하려는 경우 다음을 수행할 수 있습니다.
var BayesClassifier = require ( 'talkify-natural-classifier' ) . BayesClassifier ;
var bot = new Bot ( { classifier : new BayesClassifier ( ) } ) ;
대신 IBM Watson의 자연어 처리 분류기를 사용하려면 talkify-watson-classifier 라이브러리를 대신 사용해야 합니다. 해당 분류자를 사용하는 방법에 대한 자세한 내용은 Github 저장소 페이지의 가이드를 참조하세요.
당신의 것이 더 잘 작동한다고 생각한다면, 나에게 소리쳐주세요! 나는 이를 알고 핵심 모듈 내에서 구현하기 위해 노력할 수 있게 되어 기쁩니다.
기술 해결 전략의 자체 구현을 제공하려면 다음과 같이 구성 개체에 함수 정의를 전달하면 됩니다.
var mySkillResolutionStrategy = function ( ) {
this . addSkill = function ( skill , options ) { ... } ;
this . getSkills = function ( ) { ... } ;
this . resolve = function ( err , resolutionContext , callback ) {
...
} ;
return this ;
} ;
var bot = new Bot ( {
skillResolutionStrategy : mySkillResolutionStrategy
} ) ;
봇 코어는 초기화 시 기술 해결 전략 개체의 인스턴스를 생성하고 이를 모든 해결에서 단일 인스턴스로 사용합니다.
주제 해결 전략의 자체 구현을 제공하려면 다음과 같이 구성 개체에 함수 정의를 전달하면 됩니다.
var myTopicResolutionStrategy = function ( ) {
this . collect = function ( classification , classificationContext , callback ) { callback ( ) } ;
this . resolve = function ( callback ) { callback ( [ { name : "topic_name" , confidence : 0.5 ] ) } ;
return this ;
} ;
var bot = new Bot ( {
topicResolutionStrategy : myTopicResolutionStrategy
} ) ;
봇 코어는 해결 메서드로 수신되는 모든 호출에 대해 주제 해결 전략의 새 인스턴스를 생성합니다.
기본적으로 봇 코어는 내장된 ContextStore 버전을 사용합니다. lib/ContextStore.js를 살펴보면 contextId
가 키이고 컨텍스트 객체가 값인 간단한 메모리 내 맵에 컨텍스트가 저장되는 매우 간단한 구현임을 알 수 있습니다. 물론 이것을 배포할 때 내장된 컨텍스트 저장소는 매우 제한적입니다.
컨텍스트 저장소를 확장하는 것은 매우 쉽습니다. 구성 내에서 ContextStore 객체에 대한 자체 구현을 제공할 수 있습니다. 다음 코드는 단순히 값을 콘솔에 기록하는 매우 간단한 구현을 제공합니다.
var myContextStore = {
put : function ( id , context , callback ) {
console . info ( 'put' ) ;
console . info ( id ) ;
console . info ( context ) ;
} ,
get : function ( id , callback ) {
console . info ( 'get' ) ;
console . info ( id ) ;
} ,
remove : function ( id , callback ) {
console . info ( 'remove' ) ;
console . info ( id ) ;
}
}
var bot = new Bot ( { contextStore : myContextStore } ) ;
ContextStore
의 현재 사양에서는 세 가지 기능을 구현해야 합니다. 이것들은 put, get and remove
입니다. 이러한 메서드가 제공되는 한 봇은 구성의 contextStore
필드 값이 어디에서 왔는지 신경 쓰지 않습니다.
일부 쿼리 해결을 사용하여 해당 코드를 실행하면 제거 함수가 호출되지 않는다는 것을 알 수 있습니다. 현재로서는 컨텍스트를 얼마나 오랫동안 기억해야 하는지에 대한 제한이 없기 때문에 이는 진행 중인 작업입니다.
앞서 언급했듯이 봇이 사용하는 기본 분류자는 talkify-natural-classifier 라이브러리에서 가져온 것입니다. 자신만의 분류자를 자유롭게 작성하여 애플리케이션에서 사용할 수 있습니다. 이렇게 하려면 talkify-classifier 라이브러리에 정의된 분류자 인터페이스를 확장해야 합니다.
해당 구현을 성공적으로 확장한 후에는 다음과 같이 분류자를 봇에 제공할 수 있습니다.
var myClassifier = new MyAwesomeClassifier ( ) ;
var bot = new Bot ( { classifier : myClassifier } ) ;
talkify 분류기의 구현을 보고 싶습니다. 인터페이스를 확장하고 분류기를 성공적으로 구현했다면 나에게 소리쳐주세요! 이 라이브러리를 사용한 귀하의 경험을 알게 되어 기쁩니다.
버전 2.1.0부터 봇에 대해 여러 분류자를 지정할 수 있습니다. 자세한 내용은 분류기에 대한 문서를 참조하세요.
기술 해결 전략은 해결 상황에 따라 기술을 출력할 수 있는 구성 요소입니다. 해결 컨텍스트는 기술을 해결하는 데 필요한 필수 구성 요소인 주제 목록과 원본 문장으로 구성된 개체입니다.
+-------------+
| Topic | | |
+---------+ | +----> +--------------+
|-----------+ | | |
+-------------+ | Skill | +---------+
| Resolution +----> | Skill |
| Strategy | +---------+
+------------+ | |
| Sentence | +---> +--------------+
+------------+
주제 해결 전략을 사용하면 사용자 지정 논리를 연결하여 주어진 분류 데이터에 따라 주제를 해결할 수 있습니다. 사용자 정의 주제 해결 전략을 연결할 때 봇 코어는 함수 실행 결과 대신 함수 정의가 전달될 것으로 예상합니다. 이는 주제 해결 전략 개체가 resolve
메서드를 호출할 때마다 new
사용하여 구성되기 때문입니다.
주제 해결 과정은 두 부분으로 진행됩니다.
주제 해결 프로세스의 첫 번째 단계는 수집 단계입니다. 여기서 봇 코어는 분류자로부터 반환된 모든 분류 세트에 대한 분류를 필요한 컨텍스트와 함께 보냅니다. 또한 봇 코어는 호출이 성공했음을 봇 코어에 알리기 위해 호출하는 데 필요한 콜백 함수를 전달합니다.
+------------------+ +
| Classification | |
+------------------+ |
| +-----------+
+--------> Collect |
| +-----------+
+-----------+ |
| Context | |
+-----------+ +
두 번째 단계는 해결 단계입니다. 여기서 봇 코어는 분류 목록이 반환될 것으로 예상합니다. 해결 방법은 모든 컬렉션의 실행이 완료된 후에만 호출됩니다.
+-----------+ +---------+-+-+
| Resolve +---->+ Topic | | |
+-----------+ +---------+ | |
|-----------+ |
+-------------+
주제 해결 전략 개체는 다음 두 가지 메서드를 노출해야 합니다.
Collect 메소드는 분류자가 분류를 반환할 때마다 호출됩니다. classification, context, callback
서명을 사용하여 호출됩니다. classification
객체에는 분류자(또는 쿼럼을 사용하는 경우 분류자 집합)에서 반환된 분류가 포함되어 있습니다. context
개체는 요청 컨텍스트를 포함하는 개체입니다. 마지막 매개변수 callback
은 전달된 매개변수 수집이 완료되었음을 봇 코어에 알리기 위해 호출되어야 하는 함수입니다.
해결 메서드는 봇 코어가 주제 해결 전략에 대해 collect
호출한 후 한 번 호출됩니다. 이는 봇 코어의 마지막 호출이며 주제 해결 정보를 수집하기 위한 것입니다. resolve
메소드는 callback
매개변수와 함께 호출됩니다. 이는 두 개의 매개변수 error, topics
사용하여 호출해야 하는 콜백 함수입니다. 토픽을 해결할 때 오류가 발생한 경우 error 매개변수를 오류 객체로 정의해야 합니다. 그 외의 경우에는 이 객체 undefined
되지 않아야 합니다. 두 번째 topics
매개변수는 해결 전략에 따라 해결된 주제의 배열이어야 합니다.
자세한 내용은 기여 가이드를 참조하세요.