rasa_nlu調研報告

RASA_NLU調研報告

一、rasa_nlu模塊

1、rasa簡介

Rasa是一個開源機器學習框架,用於構建上下文AI助手和聊天機器人。
Rasa有兩個主要模塊:
Rasa NLU :用於理解用戶消息,包括意圖識別和實體識別,它會把用戶的輸入轉換爲結構化的數據。
Rasa Core:是一個對話管理平臺,用於舉行對話和決定下一步做什麼。
Rasam框架的基本流程:
在這裏插入圖片描述

2、rasa_nlu簡介

Rasa NLU曾經是一個獨立的庫,但它現在是Rasa框架的一部分。
Rasa_NLU是一個開源的、可本地部署並配套有語料標註工具RASA NLU Trainer。其本身可支持任何語言,中文因其特殊性需要加入特定的tokenizer作爲整個流程的一部分。
Rasa NLU 用於聊天機器人中的意圖識別和實體提取。例如,下面句子:

"I am looking for a Mexican restaurant in the center of town"

返回結構化的數據:
在這裏插入圖片描述

3、rasa_nlu組件

針對中文對話rasa_nlu也提供了中文本的組件,各個組件相互銜接最終以pipeline的形式實現最終的意圖識別和實體抽取功能。
組件模塊主要包括:數據處理(training_data)、文本分詞(tokenizers)、特徵表示(featurizers)、意圖分類(classifiers)、實體抽取(extractors)等模塊。各個組件的數據用Message類進行傳遞。
training_data模塊主要的功能是加載模型訓練所需要的數據,並存儲成文本分詞模塊所需要的數據形式。
tokenizers模塊的主要功能是處理模型訓練、測試數據,對文本進行按照jieba分詞、空格分詞、按單詞分詞等多種方式進行處理,並將處理結果保存成特徵表示模塊需要的數據形式。數據保存在Message[“tokens”]中。
featurizers主要實現將處理後的文本數據轉化成特徵向量表示。組件中配置了sklearn的CountVectorizer方法、mitie特徵表示的方法、spacy特徵表示的方法(先僅支持英文)等來對文本進行表示。最後保存成意圖分類所需要的數據形式,數據保存在Message[“text_features”]中。
Classifiers主要實現對文本的意圖進行分類。組件中配置了計算文本向量距離的方式、mitie.text_categorizer_trainer方式、sklearn.svm.SVC方式實現意圖分類的算法。數據保存在Message [“intent”, “intent_ranking”]中。
Extractors主要實現對文本中實體進行提取。組件中配置了基於CRF模型的方法、Duckling包提取實體的方法、mitil提取實體的方法、Sapcy提u去實體的方法、EntitySynonymMapper類可以將提取到的是實體用同義詞進行替換。數據保存在Message[“entities”]中。

二、rasa_nlu的整理框架

1、nlu模型訓練代碼邏輯

rasa_nlu以組件的形式實現意對文本的意圖識別和實體抽取的功能。管道(pipline)訓練的過程中需要對每個組件進行處理或訓練。整個訓練的過程主要分成一下幾個步驟:
(1) 加載訓練數據
(2) 數據處理
(3) 特徵轉化
(4) 訓練意圖分類模型
(5) 訓練實體抽取模型

2、nlu預測代碼邏輯

Rasa 以server的形式提供服務接口,其進入rasa_nlu模塊的步驟如下:

  1. 啓動server,調用run文件中的app.run()函數啓動server。當然在app.run之前需要加載配置文件以及加載訓練好的模型。
  2. Server開啓之後就一直對程序進監聽,當有對話輸入時就會調用app.handel_request()函數,在函數內調用app.agent.handel_massage()函數來處理接收到信息。接收到的信息存儲在meaasage類中,信息如下圖所示:
    在這裏插入圖片描述
  3. 在agent的handel_massage函數中調用prcocess的handel_message()函數。
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. Process的handel_message函數(如上圖)中調用self.log_message()(如下圖)用message_processor 處理對話 & 獲取當前對話之前的tracker並保存當前對話狀態。調用_handle_message_with_tracker(message, tracker)函數處理數據
    在這裏插入圖片描述
  5. self._handle_message_with_tracker(message, tracker) 用於解析message並且更新tracker。
    在這裏插入圖片描述
  6. self._parse_message(message)調用解釋器interpreter的解析函數pares()調用用pipeline中各組件的解釋函數。
  7. model.py Interpreter.parse,Interpreter中的pipeline保存着nlu模塊的各個component
    在這裏插入圖片描述
    component.process 有Has overridden methods(有重構函數),通過config.pipeline文件配置的組件信息調用各個組件。
    在預測接管nlu模塊的組件受config文件的配置影響,以下面的config.pipeline配置文件爲例,對rasa_nlu模塊預測過程的處理步驟進行說明。
language: "zh"
pipeline:
- name: "JiebaTokenizer"
- name: "RegexFeaturizer"
- name: "CountVectorsFeaturizer"
  stop_words: "english"
  min_df: 1
  max_df: 1.0
  token_pattern: "[\u4e00-\u9fa5_a-zA-Z0-9]{1,}"
- name: "EmbeddingIntentClassifier"
  batch_strategy: sequence
  mu_pos: 0.8
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"

Nlu模塊處理中文時的調用步驟注主要包含一下幾個部分:

  1. 用JiebaTokenizer模塊處理接收到的數據,Message.set(“tokens”)。
  2. 用CountVectorsFeaturizer模塊提取文本的特徵,並結合RegexFeaturizer將用正則表示的文本信息轉化成特徵向量,Message.set(“text_features”)。
  3. 用EmbeddingIntentClassifier模塊對文本的意圖進行分類,message.set(“intent”,“intent_ranking”)。
  4. CRFEntityExtractor組件提取文本的實體,配合EntitySynonymMapper組件將進行同義詞轉化,message.set("entities ")。

三、rasa_nlu實踐

1、目的

用rasa框架實現多輪對話,接入天氣查詢、情感分析、文本審覈、實體抽取、會議檢索等功能。

2、實踐數據

實踐數據是結合實際業務中的意圖類別以及任務型對話中需要的實體等要求人爲整理了一批數據。

3、實踐結果

在實踐中用rasa_nlu模塊完成文本解析的工作,針對天氣查詢業務設計了查詢語句的意圖(request_search_weather)需要的實體爲查詢的地點(laocation_weather)和查詢的時間(date_time)。以“杭州今天的天氣怎麼樣”爲例,nlu模塊對語句進行解析得到的結果如下圖所示:
在這裏插入圖片描述
雖然nlu模塊完成了文本意圖的識別和實體的提取,但是這無法滿足多輪對話的任務。實現完整的對話邏輯需要結合rasa core部分的對話管理和對話跟蹤的功能,對整個對話進行管理。

4、結合業務場景

Rasa框架是一個很好的設計AI機器人的框架,rasa nlu模塊和rasa core模塊的結合能夠實現完整的對話邏輯。Rasa Core是Rasa框架提供的對話管理模塊,它類似於聊天機器人的大腦,主要的任務是維護更新對話狀態和動作選擇,然後對用戶的輸入作出響應。所謂對話狀態是一種機器能夠處理的對聊天數據的表徵,對話狀態中包含所有可能會影響下一步決策的信息,如自然語言理解模塊的輸出、用戶的特徵等;所謂動作選擇,是指基於當前的對話狀態,選擇接下來合適的動作,例如向用戶追問需補充的信息、執行用戶要求的動作等。舉一個具體的例子,用戶說“幫我媽媽預定一束花”,此時對話狀態包括自然語言理解模塊的輸出、用戶的位置、歷史行爲等特徵,根據上述內容core模塊對及其下一步動作進行預測。Core部分的對話管理模塊主要是負責協調聊天機器人的各個模塊,起到維護人機對話的結構和狀態的作用。對話管理模塊涉及到的關鍵技術包括對話行爲識別、對話狀態識別、對話策略學習以及行爲預測、對話獎勵等。下面是Rasa Core消息處理流程:
首先,將用戶輸入的Message傳遞到Interpreter(NLU模塊),該模塊負責識別Message中的"意圖(intent)“和提取所有"實體”(entity)數據;
其次,Rasa Core會將Interpreter提取到的意圖和識別傳給Tracker對象,該對象的主要作用是跟蹤會話狀態(conversation state);
第三,利用policy記錄Tracker對象的當前狀態,並選擇執行相應的action,其中,這個action是被記錄在Track對象中的;
最後,將執行action返回的結果輸出即完成一次人機交互。
Rasa nlu和rasa core模塊的結合可以實現完整的多輪對話內容,但是現階段的研究還不是很透徹有很多不確定的因素,所以未來需要更加深入的研究和學習。

參靠文獻

[1] https://rowl1ng.com/blog/%E6%8A%80%E6%9C%AF/chatbot.html
[2] https://blog.csdn.net/AndrExpert/article/details/92805022
[3] https://rasa.com/docs/rasa/core/about/
[4] https://www.cnblogs.com/huangqihui/p/10978837.html
[5] https://mubu.com/doc/19aK8HlxFw

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章