rasa算法_(十八)基于RASA开始中文机器人实现机制
前文介紹了基于RASA的總體架構,本文著重介紹一下實現細節。
機器人管理概述
框架是多租戶SAAS系統,每個用戶可以創建多個機器人,每個機器人關聯獨立的語料庫,機器人能力,話術流程,在RASA中對應一個RASA運行實例。機器人管理應用系統需要給用戶提供最精簡的配置UI,且可以完成Rasa需要的相關配置。然后將這些數據轉成Rasa可以識別的yaml格式,保存在HDFS中。RASA到HDFS中獲取配置數據,進行訓練,測試。測試通過后將模型保存在HDFS中,部署上線時候,在啟動一個容器,加載HDFS中的模型,并啟動RASA服務。對話管理應用系統接收用戶消息,調用RASA endpoint完成響應消息預測。
機器人創建應用系統中創建唯一標識
調用rasa init接口,在rasa中初始化機器人
在git中創建版本庫
在hdfs分配存儲路徑和空間
在train server上啟動docker
機器人話術設計
RASA本身支持是多輪對話,需要做一個可視化流程圖,然后轉成Rasa的story和rule的配置。檢索型機器人,少量Faq可以直接使用rasa的response selector完成。但是海量知識庫的檢索,需要單獨系統,這個后續在機器人擴展能力里面再闡述。
因為機器人創建的時候,已經分配了訓練數據的存儲路徑,話術設計的內容可以直接生成配置文件放在訓練數據的路徑里面。
機器人訓練
訓練數據生成以后,用戶可以啟動訓練。每次數據訓練,會自動在git中生成一個版本節點。訓練是一個異步任務,放入對話管理平臺調度服務統一調度。訓練完成后,可以直接啟動測試。這時候rasa的服務是在訓練服務器啟動。當訓練新數據的時候,必須停止當前的測試任務。
機器人上線
測試通過后,啟動上線。如果是第一次上線,需要在生產環境創建容器,然后使用新訓練的模型,啟動生產環境對應的docker。如果是升級更新,只是使用新模型重啟docker。
機器人能力擴展
假如,我們已經有了KBQA的服務,那么用戶要開通這個服務,那只需要點擊開通,然后用戶需要選擇哪類問題由KBQA回答,那么對話管理服務,要做的事情,根據用戶提供的問題分類訓練一個意圖,然后配置規則將這個意圖關聯到KBQA Action上。能力擴充就完成了。用戶關閉KBQA,在配置文件中刪除這個意圖就可以了。
關于如何創建KBQA服務,如何使用用戶數據Fine turn模型等,后續會按不同的能力單獨討論。
機器人領域動態擴充
前面我們講的訓練數據,都基于一個前提,那就是字典或者說語言模型是固定的。我們在此基礎上擴展訓練數據。
當我們使用一個新的領域的時候,會有很多字庫中不存在的詞,這個時候需要Fine turn語言模型和字庫。比如我們使用的分詞是語言模型分詞,用的BERT作為基礎Featurizer,因此,機器人領域擴充是Fineturn BERT模型。我們在訓練服務器上單獨啟動BERT服務,由用戶傳入訓練數據,然后加入訓練調度隊列,成功后生成模型文件,供RASA啟動的時候引用。
在線學習
在線學習,訓練數據和上線的流程前面已經有了,這里關鍵是錯誤回答的標注問題。如何根據用戶的標注,重新更新訓練數據。
業務能力集成
業務模塊提供接口,rasa action server調用自定義action去調用業務模塊的接口,完成業務能力集成。
算法層架構圖
1、生產服務器和訓練服務器通過HDFS做文件共享,訓練服務器從HDFS取訓練數據進行訓練,生成模型,模型文件依舊保存于HDFS,而生產服務器從HDFS取訓練好的模型應用于推理。
2、每個robot使用的模型都可能不同,因此使用容器隔離,每個機器人啟動一個容器,容器內運行自己的rasa及各個能力組件。
3、語言模型也在各自的容器內訓練,啟動的時候使用各自的語言模型。
RASA相關配置
nlu和dm的配置
nlu和dm的配置都在config.yml里面,語言模型采用BERT,主要分了器使用DIET。
# Configuration for Rasa NLU.
# https://rasa.com/docs/rasa/nlu/components/
language: zh
pipeline:
- name: LanguageModelTokenizer #需要改代碼,去掉不支持中文的限制
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: LanguageModelFeaturizer
model_name: bert
model_weights: bert-base-chinese
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
- name: FallbackClassifier
threshold: 0.3
ambiguity_threshold: 0.1
policies:
- name: MemoizationPolicy
- name: TEDPolicy
max_history: 5
epochs: 100
- name: RulePolicy
Tracker Store配置
Tracker Store主要功能是存儲用戶對話,我們使用PostgreSQL存儲。Rasa默認就支持。PostgreSQL的參數在endpoints.yml中配置。
endpoints.yml
tracker_store:
type: SQL
dialect: "postgresql" # the dialect used to interact with the db
url: "postgres"
db: "rasa" # path to your db
username: # username used for authentication
password: # password used for authentication
query: # optional dictionary to be added as a query string to the connection URL
driver: my-driver
Event Broker
事件代理主要作用是講機器人的對話異步傳給其他服務,比如將機器人的消息轉發給ES等。Event Broker支持kafka,數據庫方式等,我們采用kafka。配置也在endpoints.yml中配置。
endpoints.yml
event_broker:
type: kafka
security_protocol: SASL_PLAINTEXT
topic: topic
url: localhost
sasl_username: username
sasl_password: password
Lock Store配置
Rasa使用token鎖定機制來確保以正確的順序處理給定會話ID的傳入消息,并在消息處于活動狀態時鎖定會話。這意味著多個Rasa服務器可以作為復制服務并行運行,并且客戶端在發送給定會話ID的消息時不一定需要尋址同一節點。我們采用Redis作為Lock存儲。redis參數的配置,也是在endpoints.yml中。
lock_store:
type: "redis"
url:
port:
password:
db:
key_prefix:
模型加載路徑
模型保存在hdfs上,為了和rasa服務解耦,我們在rasa中使用從server加載,這樣模型保存以后,啟動一個http服務,通過http服務可以下載模型,然后再rasa的endpoints.yml中配置server地址
models:
url: http://model-server.com/models/default
wait_time_between_pulls: 10 # In seconds, optional, default: 100
Action Server配置
需要運行ActionServer才可以調用自定義Action。Actionserver的配置也在endpoints.yml里面。
action_endpoint:
url: "http://localhost:5055/webhook"
Action server的啟動方式
rasa run actions
啟動Action Server的時候,需要在配置文件的路徑下,且里面必須包含actions路徑,如典型一個機器人的配置如下,其中helloworld.py就是一個自定義action。
├── actions
│ ├── helloworld.py
│ └── __init__.py
├── config.yml
├── credentials.yml
├── data
│ ├── nlu.yml
│ ├── rules.yml
│ └── stories.yml
├── domain.yml
├── endpoints.yml
├── models
│ └── 20201228-084711.tar.gz
└── tests
└── test_stories.yml
自定義action
KBQA、DrQA 、閑聊機器人、檢索機器人、業務系統相關查詢,都是基于自定義Action實現的。actions路徑下有如下文件:
├── actions
│ ├── drqa_action.py
│ ├── kbqa_action.py
│ ├── chat_action.py
│ ├── retrival_action.py
│ ├── business_action.py
│ └── __init__.py
這些自定義action主要是實現了rasa_sdk的api和各個能力之間的適配。具體能力的實現在不同的系統中,后續我們會依次介紹各個系統的實現。
機器人能力擴展開發規范
由于機器人能力是動態擴展的,而且要嵌入到rasa系統中,因此要有遵循一定規則:支持命令行啟動訓練和推理
支持http調用,并滿足統一的接口規范
支持訓練數據和模型遠程存儲
總結
以上是生活随笔為你收集整理的rasa算法_(十八)基于RASA开始中文机器人实现机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux /proc 详解
- 下一篇: C/C++中的typedef 和 #de