用於開發聊天機器人應用程式的框架。
請確定您已安裝 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 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
物件建構函式接受兩個參數。它們是topicName
和trainingData
。 topicName
參數是您要為其訓練trainingData
主題的名稱, trainingData
是您將其作為訓練資料提供給機器人的句子。 topicName
稍後將對應到機器人可以回應的實際技能。
trainAll
方法的回呼是機器人在訓練完成時可以呼叫的函數。如果你的訓練資料太多,你應該正確實施。在這個例子中,由於沒有太多訓練數據,我們傳入了一個空function
。
不用說,隨著更多的訓練數據,機器人會變得更好。在本教學中,我們使用預設分類器,目前是 talkify-natural-classifier 庫中的LogisticRegression
分類器。這個分類器通常需要更多的訓練資料來開始,但在大多數情況下比其他分類器更準確。
一旦您針對某些主題訓練了機器人,您就需要添加一些技能。技能是機器人識別主題時將執行的操作。所以主題和技能是 1:1 對應的。
要添加技能,您需要先建立它。一項技能需要三件事。機器人獨有的技能名稱。該名稱用於稍後在上下文中關聯技能。它映射到的主題以及機器人將調用以執行技能的函數。函數將採用四個參數,分別為: context, request, response, next
。 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
} ) ;
機器人核心將在 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
} ) ;
機器人核心將為它收到的解析方法的每個呼叫創建一個主題解析策略的新實例。
預設情況下,機器人核心使用其內建版本的 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
。只要提供了這些方法,機器人就不會在乎 config 中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 | | |
+-----------+ +---------+ | |
|-----------+ |
+-------------+
主題解析策略物件必須公開兩個方法:
每當分類器返回分類時都會呼叫收集方法。它是透過classification, context, callback
簽名來呼叫的。 classification
物件包含從分類器(或一組分類器,如果使用仲裁)傳回的分類。 context
物件是包含請求上下文的物件。最後一個參數callback
是必須呼叫的函數,以使機器人核心知道您已完成收集傳入參數。
在機器人核心完成對主題解析策略的collect
呼叫後,將呼叫一次解析方法。這是機器人核心的最終調用,旨在收集主題解析資訊。使用callback
參數呼叫resolve
方法。這是必須使用兩個參數error, topics
呼叫的回呼函數。 error 參數必須定義為錯誤對象,以防解析主題時發生錯誤。在任何其他情況下,該物件必須是undefined
。第二個topics
參數必須是由解析策略解析的主題數組。
請參閱貢獻指南以了解更多詳細資訊。