チャットボットアプリケーションを開発するためのフレームワーク。
ノードと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
などの代替実装を渡すことができます。これについては、後で「構成オプション」セクションで説明します。
ボットを初期化したら、最初にボットをトレーニングする必要があります。一度に 1 つのドキュメントを同期的にトレーニングするには、 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 are you doing
how is it going
の場合はトピックhow_are_you
を認識するようにボットをトレーニングしますが、テキストがhow can you help
またはi need some help
の場合はトピックのhelp
を認識します。また、 how can you assist me
。これがボットをトレーニングする方法です。
trainAll
メソッドは、 TrainingDocument
オブジェクトの配列とコールバック関数を受け入れます。 TrainingDocument
オブジェクト コンストラクターは 2 つのパラメーターを受け入れます。これらはtopicName
とtrainingData
です。 topicName
パラメーターは、 trainingData
トレーニングするトピックの名前であり、 trainingData
トレーニング データとしてボットに供給する文です。 topicName
、後でボットが応答できる実際のスキルにマップされます。
trainAll
メソッドのコールバックは、トレーニングの完了時にボットが呼び出すことができる関数です。トレーニング データが多すぎる場合は、これを適切に実装する必要があります。この例では、トレーニング データがあまりないため、空のfunction
を渡しています。
言うまでもなく、ボットはトレーニング データが増えるほど改良されます。このチュートリアルでは、デフォルトの分類子を使用しています。これは現在、talkify-natural-classifier ライブラリのLogisticRegression
分類子です。この分類子は通常、開始するにはもう少し多くのトレーニング データを必要としますが、ほとんどの条件で他の分類子よりも正確です。
いくつかのトピックについてボットをトレーニングしたら、いくつかのスキルを追加する必要があります。スキルは、ボットがトピックを認識したときに実行するアクションです。したがって、トピックとスキルは 1 対 1 にマッピングされます。
スキルを追加するには、まずスキルを作成する必要があります。スキルには 3 つのことが必要です。ボット固有のスキルの名前。この名前は、後でコンテキスト内でスキルを関連付けるために使用されます。マップ先のトピックと、スキルを実行するためにボットが呼び出す関数。この関数は 4 つのパラメータ、つまりcontext, request, response, next
を取ります。 context
パラメーターは、そのスキルからの有用なコンテキスト情報を保存するために使用されます。 request
パラメータには、 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 ) ;
追加すると、ボットに何かを解決するように依頼できるようになります。ここでボットに文をクエリすると、ボットは非同期にメッセージで応答します。 solve 関数は、 contextId, text, callback
の 3 つのパラメータを受け取ります。 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 ) ;
一度に 2 つのことを質問しましょう。 bot.resolve
次のように再度変更します。
bot . resolve ( 456 , 'How's it going? Assistance required please.' , resolved ) ;
コードを実行すると、次の 2 つのメッセージが返されるはずです。
[ { 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 です。この分類子は 2 つの実装を提供します。
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
} ) ;
ボット コアは、init でスキル解決戦略オブジェクトのインスタンスを作成し、それをすべての解決にわたって単一のインスタンスとして使用します。
トピック解決戦略の独自の実装を提供するには、次のように構成オブジェクトで関数定義を渡すだけです。
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
} ) ;
ボット コアは、resolve メソッドを呼び出すたびに、トピック解決戦略の新しいインスタンスを作成します。
デフォルトでは、ボット コアは組み込みバージョンの 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
の現在の仕様では、3 つの関数を実装する必要があります。これらは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
使用して構築されるためです。
トピック解決のプロセスは 2 つの部分で行われます。
トピック解決プロセスの最初の段階は収集フェーズです。ここで、ボット コアは、分類器から返されたすべての分類セットの分類を、必要なコンテキストとともに送信します。ボット コアは、呼び出しが成功したことをボット コアに知らせるために呼び出す必要があるコールバック関数も渡します。
+------------------+ +
| Classification | |
+------------------+ |
| +-----------+
+--------> Collect |
| +-----------+
+-----------+ |
| Context | |
+-----------+ +
第 2 段階は解決フェーズです。ここで、ボット コアは分類のリストが返されることを期待しています。解決は、すべてのコレクションの実行が終了した後にのみ呼び出されます。
+-----------+ +---------+-+-+
| Resolve +---->+ Topic | | |
+-----------+ +---------+ | |
|-----------+ |
+-------------+
トピック解決戦略オブジェクトは、次の 2 つのメソッドを公開する必要があります。
分類子が分類を返すたびに、collect メソッドが呼び出されます。これはclassification, context, callback
署名を使用して呼び出されます。 classification
オブジェクトには、分類子 (クォーラムを使用している場合は一連の分類子) から返された分類が含まれます。 context
オブジェクトは、リクエスト コンテキストを含むオブジェクトです。最後のパラメーターcallback
、渡されたパラメーターの収集が完了したことをボット コアに知らせるために呼び出す必要がある関数です。
ボット コアがトピック解決戦略に基づいてcollect
を呼び出した後、resolve メソッドが 1 回呼び出されます。これはボット コアからの最後の呼び出しであり、トピック解決情報を収集することを目的としています。 resolve
メソッドは、 callback
パラメーターを使用して呼び出されます。これは、2 つのパラメーターerror, topics
指定して呼び出す必要があるコールバック関数です。トピックの解決時にエラーが発生した場合に備えて、error パラメーターをエラー オブジェクトとして定義する必要があります。それ以外の場合は、このオブジェクトはundefined
でなければなりません。 2 番目のtopics
パラメーターは、解決戦略によって解決されるトピックの配列である必要があります。
詳細については、貢献ガイドをご覧ください。