Rasa NLU中的元件

2023-11-08 06:00:32

  Rasa NLU部分主要是解決NER(序列建模)和意圖識別(分類建模)這2個任務。Rasa NLP是一個基於DAG的通用框架,圖中的頂點即元件。元件特徵包括有順序關係、可相互替換、可互斥和可同時使用。有向無環圖(DAG)在很多地方都有用到,比如Spark中等。雖然問答系統型別很多,比如閒聊問答、檔案問答、知識庫問答、知識圖譜問答、任務型問答等,但在實際場景中任務型多輪問答最實用。通過構建任務引導型人機輔助系統,在溝通前/溝通中/溝通後全鏈路,實時通過語音的識別、意圖的檢測、話術&解決方案的推薦等,輔助銷售在多渠道與商家溝通提效、提高任務完成率。

一.典型Rasa NLU元件
  一個典型的Rasa NLP管道包含各類元件,如下所示:
1.語言模型元件
  為了載入模型檔案,為後續的元件提供框架支援,如初始化spaCy和BERT。
2.分詞元件
  將文字分割成詞,為後續的高階NLP任務提供基礎資料。
3.特徵提取元件
  提取詞語序列的文字特徵,可以同時使用多個特徵提取元件。
4.NER元件
  根據前面提供的特徵對文字進行命名實體的識別。
5.意圖分類元件
  按照語意對文字進行意圖的分類,也稱意圖識別元件。
6.結構化輸出元件
  將預測結果整理成結構化資料並輸出。這一部分功能不是以元件的形式提供的,而是流水線內建的功能,開發者不可見。

二.語言模型元件
  主要是載入預訓練的詞向量模型或預訓練模型,如下所示:
1.SpacyNLP
  該元件所需的模型需要提前下載到本地,否則會出錯。
2.MitieNLP
  需要有預先訓練好的模型。
3.預訓練Tokenizer

model_tokenizer_dict: Dict[Text, Type[PreTrainedTokenizer]] = {
    "bert": BertTokenizer,
    "gpt": OpenAIGPTTokenizer,
    "gpt2": GPT2Tokenizer,
    "xlnet": XLNetTokenizer,
    # "xlm": XLMTokenizer,
    "distilbert": DistilBertTokenizer,
    "roberta": RobertaTokenizer,
    "camembert": CamembertTokenizer,
}

三.分詞元件
1.jieba_tokenizer.py
  這個分詞器是Jieba的一個包裝器(https://github.com/fxsjy/jieba)。
2.mitie_tokenizer.py
  使用MitieNLP庫對訊息進行Tokenizer。
3.spacy_tokenizer.py
  使用SpaCy庫對訊息進行Tokenizer。
4.whitespace_tokenizer.py
  為實體提取建立特徵。

四.特徵提取元件
1.稀疏特徵
  SparseFeaturizer所有稀疏特徵featurizers的基礎類別。稀疏特徵如下所示:
(1)count_vectors_featurizer.py
  基於sklearn的CountVectorizer建立一系列token計數特徵。所有僅由數位組成的token(例如123和99但不是ab12d)將由單個特徵表示。將analyzer設定為char_wb使用了Subword Semantic Hashing的思想(https://arxiv.org/abs/1810.07150)。
(2)lexical_syntactic_featurizer.py
  提取和編碼詞彙句法特徵。給定一系列tokens,該特徵提取器會生成一系列特徵,其中第t個特徵編碼第t個token及其周圍token的詞彙和句法資訊。
(3)regex_featurizer.py
  基於正規表示式的訊息特徵。

2.稠密特徵
  DenseFeaturizer所有稠密特徵featurizers的基礎類別。稠密特徵如下所示:
(1)convert_featurizer.py
  使用ConveRT模型的Featurizer。從TFHub載入ConveRT(https://github.com/PolyAI-LDN/polyai-models#convert)模型,併為每個訊息物件的密集可特徵屬性計算句子和序列級特徵表示。
(2)lm_featurizer.py
  基於transformer的語言模型的featurizer。這個元件從transformers庫中載入預訓練的語言模型,包括BERT、GPT、GPT-2、xlnet、distilbert和roberta。它還對每個訊息的可特徵化的密集屬性進行tokenizes和featurizes。
(3)spacy_featurizer.py
  使用SpaCy對訊息進行特徵化。
(4)mitie_featurizer.py
  使用Mitie對訊息進行特徵化。

五.NER元件
1.crf_entity_extractor.py
  實現條件隨機場(CRF)來進行命名實體識別。
2.duckling_entity_extractor.py
  使用duckling伺服器搜尋結構化實體,例如日期。
3.mitie_entity_extractor.py
  一個Mitie實體提取器(它是Dlib-ml的薄包裝器)。
4.regex_entity_extractor.py
  通過在訓練資料中定義的查詢表和正規表示式提取實體。
5.spacy_entity_extractor.py
  使用SpaCy進行實體提取器。

六.意圖分類元件
1.diet_classifier.py
  用於意圖分類和實體提取的多工模型。DIET是雙意圖和實體Transformer。該架構基於Transformer,該Transformer用於兩個任務。通過在與輸入token序列對應的transformer輸出序列上方的條件隨機場(CRF)標記層預測實體標籤序列。用於__CLS__ token和意圖示籤的transformer輸出被嵌入到單個語意向量空間中。使用點積損失來最大化與目標標籤的相似性,並最小化與負樣本的相似性。
2.fallback_classifier.py
  處理NLU置信度低的傳入訊息。
3.keyword_intent_classifier.py
  使用簡單的關鍵字匹配的意圖分類器。分類器將關鍵字列表和關聯的意圖作為輸入。輸入句子將檢查關鍵字並返回意圖。
4.logistic_regression_classifier.py
  使用邏輯迴歸的意圖分類器。
5.mitie_intent_classifier.py
  意圖分類器使用mitie庫。
6.sklearn_intent_classifier.py
  使用sklearn框架的意圖分類器。

  除此之外,Rasa提供DIETClassifier元件,基於Rasa自行研發的DIET(Dual Intent Entity Transformer)技術,實現使用者實體和意圖的聯合建模;對於FQA等簡單的QA問題,只需要使用NLU部分就可以輕鬆完成,因此Rasa提供了回覆選擇器(ResponseSelector)元件。

  個人認為LLM基本上解決了NLU和NLG的絕大部分問題,但是DM部分的表現還很邋遢。後續嘗試將Rasa+LangChain+LLM+NebulaGraph技術進行融合來構建任務型多輪對話系統。對話管理(Dialog Management,DM)是指根據對話歷史狀態決定當前的動作或對使用者的反應。DM模組是人機對話流程的控制中心,在多輪對話的任務型對話系統中有著重要的應用。DM模組的首要任務是負責管理整個對話的流程。通過對上下文的維護和解析,DM模組要決定使用者提供的意圖是否明確,以及實體槽的資訊是否足夠,以進行資料庫查詢或開始執行相應的任務。
  當DM模組認為使用者提供的資訊不全或模稜兩可時,就要維護一個多輪對話的語境,不斷引導式地詢問使用者以得到更多的資訊,或者提供不同的可能選項讓使用者選擇。DM模組要儲存和維護當前對話的狀態、使用者的歷史行為、系統的歷史行為、知識庫中的可能結果等。當DM模組認為已經清楚得到了全部需要的資訊後,就會將使用者的查詢變成相應的資料庫查詢語句去知識庫(如知識圖譜)中查詢相應資料,或者實現和完成相應的任務(如購物下單,或者類似Siri撥打朋友的電話,或者類似智慧家居去拉起窗簾等)。
  因此,在新的研究中,將DM模組的狀態建模成一個序列標註的監督學習問題,甚至用強化學習(reinforcement learning)加入一個使用者模擬器來將DM模組訓練成一個深度學習的模型。

參考文獻:
[1]《Rasa實戰》