a milk tea waiter chatbot for chinese, if you don't know rasa yet, refer to mini rasa tutorial
below
或 read the rasa offical docs
you need to download bert_chinese_model and unzip it first: chinese_L-12_H-768_A-12
git clone https://github.com/BI4O/rasa_milktea_chatbot.git
cd rasa_milktea_chatbot
pip install -r requirements.txt -i https://pypi.tuan.tsinghua.edu.cn/simple
start bert server
bert-serving-start -model_dir path/to/chinese_L-12_H-768_A-12/ -num_worker=1
jump to milktea
cd milktea
start action server
rasa run actions
train a model
rasa train
talk to your chatbot
rasa shell
you can order 3 different products,more can be added to model yourself
and choose 3 sizes
- 建立一個新的項目
- 查看NLU培訓數據
- 定義模型配置,寫下第一個故事Story
- 定義這個故事story的作用域domain
- 訓練模型
- 測試你寫好的助手
路徑指向一個新的空白資料夾cd path/to/a/blank/folder
在這個資料夾裡面建立新的rasa專案rasa init --no-prompt
資料夾中將會產生以下的檔案:
__init__.py | 空文件用於定位 |
---|---|
actions.py | 用於定義動作(自訂腳本程式碼) |
config.yml | 配置NLU和core模型 |
credentials.yml | 連接到其他伺服器的細節(不常用) |
data/nlu.md | 我的自訂NLU訓練數據 |
data/stories.md | 我的自訂故事stories |
domain.yml | 助手的定義域domian |
endpoints.yml | 連接到fb message等的軌道(不常用) |
models/ | 模型及其參數文件 |
cat data/nlu.md
顯示如下
# # intent:order
- [奶茶](type)
- [咖啡](type)
- 我想要一杯[奶茶](type)
- 要杯[奶茶](type)
- 有[奶茶](type)吗
- 有[奶茶](type)卖吗
- 想要一杯[咖啡](type)
- 要杯[咖啡](type)
- 有[咖啡](type)吗
- 我想要一杯[卡布奇诺](type)
- 要杯[卡布奇诺](type)
- [卡布奇诺](type)
# # intent:inform_size
- [中](size)
- [中](size)的
- [中](size)杯
- [中](size)杯吧
- 要[中](size)杯
- [大](size)
- [大](size)的
- [大](size)杯
- [大](size)杯吧
- 要[大](size)杯
- [特大](size)
- [特大](size)的
- [特大](size)杯
- [特大](size)杯吧
- 要[特大](size)杯
intent 表示意圖,需要以##開頭,以換行結尾。比如說這裡顯示的是兩個意圖1. 下單,2. 告知奶茶的規格,所有客戶可能會用的說辭都應該放在這裡,用於nlu模型學習怎麼去理解一個人說的話
[value](entity)
entity表示實體,value表示實體具體的值,經過訓練後,nlu模型就可以給core模型返回類似這樣的變數: {"type":"奶茶","size":"大"}
,這樣core模型就可以根據type
和size
這兩個參數做出對應的回應
config.yml
將定義前面的NLU模組和你的模型會用到的Core元素,這次使用的是來自大神寫好的組件,這裡也強烈推薦大家前往學習https://github.com/GaoQ1 /rasa_nlu_gq查看寫好的故事
cat data/stories.md
# # order naicha
- order{ " type " : "奶茶" }
- slot{ " type " : "奶茶" }
- utter_ask_size
- inform_size{ " size " : "大" }
- slot{ " size " : "大" }
- utter_affirm
- confirm
- action_charge
- utter_goodbye
故事的組成
##
開頭表示的是這個故事的名稱,一個描述性的名字##
開頭*
開頭的表示為使用者意圖intent{"entity1": "value", "entity2": "value"}
-
開頭的表示為機器人執行的動作actions使用者資訊
動作acitons
actions有兩種類型
utter_xxx 可以直接回傳要回覆的話術,只需要在domain.yml中說明就可以用了
action_xxx 可以執行你想要的自訂操作,除了需要在domain.yml中說明外,還需要在aciton.py檔案中新增。例如你想有一個自訂動作action_HelloWorld
首先把這個自訂動作加到domain.yml的acitons下
actions:
- aciton_HelloWorld
然後在acitons.py檔案中新增的類
class YourCustomAction ( Action ):
def name ( self ):
# 这个返回的值必须和stories.md和domain.yml中说明的一致
return "action_HelloWorld"
def run ( self , dispatcher , tracker , domain ):
# 定义这个动作要执行的你想要的操作
# 比如我想在对话中返回给用户的是HellowWorld!
dispatcher . utter_message ( 'HelloWorld!' )
return []
cat domain.yml
intents:
- greet:
triggers: utter_greet
- goodbye:
triggers: utter_goodbye
- confirm
- deny
- order
- thanks
- inform_size
- unknown_intent
actions:
- utter_greet
- utter_ask_order_what
- utter_ask_size
entities:
- type
- size
slots:
type:
type: text
size:
type: text
templates:
utter_greet:
- text: "你好"
utter_ask_order_what:
- text: "想要喝点什么? "
utter_ask_size:
- text: "想要什么规格的呢?我们有中/大/特大杯"
其中
因為在這種情況下,我們的動作action只是向用戶發送話語作為回复,這些簡單的actions都是utter_
開頭的動作actions,這種動作需要助手在templates中選擇語句進行回复,實際上還可以定義更多的動作見Custom Actions
使用下面的指令,會自動檢查domain/stories/NLU中的不同而重新對模型進行訓練,訓練好的模型將會被打上時間戳time stamp作為新的模型rasa train
rasa shell