2021/8/2

Chatbot

系統分類

  • 問答 QA 系統

    一問一答,一般沒有對話管理的功能。偏重問句分析,取得問句的主題、問題詞、中心動詞。問句分析目前主要採用 template 比對和語意分析兩種方法

  • 任務導向型對話系統

    目的是解決使用者的明確需求。透過對話管理追蹤目前狀態,確定目的與需求。重點在對話管理,將自然語言映射為使用者的意圖和對應的槽位。

  • 閒聊系統

    使用者無特定目的,沒有具體的需求的多輪人機對話。

  • 主動推薦系統

    人機自然互動

不同類型的系統都包含這三個模組

  • 自然語言理解 NLU
  • 自然語音生成 NLG
  • 對話管理

自然語言理解 NLU

可從語音、音韻、詞態、文法、語意、語用六個維度理解自然語言

  • 語音

    跟發音有關,例如中文拼音

  • 音韻

    由語音組合起來的讀音,例如中文拼音 + 四種聲調

  • 詞態

    詞態封裝可用 NLU,資訊量大小取決於具體的語言種類。拉丁語系有很詞態變化,中文沒有太多的詞態變化,只有偏旁的差異,例如:他 她

  • 文法

    主要研究詞語如何組成合乎語法的句子,文法提供單字組成句子的約束條件,為語意的合成提供框架

  • 語意、語用

    自然語言包含和表達的意思

自然語言的難度

  • 沒有固定的格式,相同的意思有多種句式表達,改了一個字、調整語調、語序,都可能改變語意
  • 不斷有新的詞彙出現
  • 不同的場景(上下文),同樣的句子有不同的意思

問句 + 上下文 ------> 自然語言理解 NLU -------> 語意

英文單字以空格分隔,但中文詞語沒有自然分隔符號,故要先進行分詞處理

NLU 需要提供的模組功能

  • 實體識別 Named Entity Recognition

    識別具有特定意義的實體,例如:人名、時間、地名及專有名詞

  • 使用者意圖識別

    顯式及隱式意圖

    ex: "好熱啊" -> 可能是想知道現在的氣溫,或是控制空調

  • 情感識別

    顯式及隱式情感

    ex: "今天心情很好" -> 正面 -> 顯式、容易判斷

    ex: "今天跟客戶談判出了問題" -> 負面情感 -> 程式很難判斷

  • 指代消解、省略恢復

    在聊天主題背景一致的情況下,對話過程通常會習慣使用代詞,取代出現過的實體。或為了方便表述,省略部分句子。

  • 回覆確認

    如果發生判斷模糊的狀況,chatbot 要主動詢問意圖,也就是回覆確認

  • 拒識判斷

    chatbot 要能主動拒絕識別,及回覆超過自身理解/回覆範圍,或涉及敏感話題

NLU 的方法分為基於規則和統計兩種

  • 基於規則

    人工定義很多語法規則,利用規則定義如何從文字中提取語意。NLU 根據規則解析輸入該模組的文字。

    優點:靈活,可定義各式各樣的規則

    缺點:需要大量不同場景的規則,隨著規則數量增加,維護規則的難度也增加

    適合簡單的場景,可快速時做一個簡單可用的 NLU

  • 基於統計

    資料量大,就要用統計方法訓練模型。

    優點:資料驅動

    缺點:訓練資料難以取得,模型難以解釋和偵錯

    適合處理分類和序列標註的問題。可將意圖識別定義為分類問題:輸入句子的文字特徵,輸出該特徵所屬的意圖分類。 SVM、AdaBoost 演算法

    實體識別就是序列標註問題:輸入句子的文字特徵,輸出特徵中,每個字詞屬於某個實體的機率。HMM、CRF(Conditional Radom Field) 演算法

採用 deep learning 方法時,需要大量的資料,因為長尾資料普遍存在,基於統計的方法,受訓練資料品質影響很大

實作通常結合使用兩種方法

  1. 沒有資料及資料較少,先採用基於規則的方法,累積資料後,再採用基於統計的方法
  2. 基於統計的方法可涵蓋大部分的場景,在涵蓋不到的場景,改用基於規則的方法

NLU 產品,強調通用性,很難客製

  • Facebook 的 Wit.ai

  • Google 的 api.ai

  • MS 的 LUIS.AI

NLU 基本技術

詞法分析 (分詞 + 詞性標註) ----> 句法分析 ---> 語意分析

  • 詞法分析 lexical analysis

    常用漢字有六、七千字,遠多於 26 個英文字母,中文詞之間沒有明確的分隔標記,多音現象嚴重,缺少詞態變化(單複數、時態、陰陽性),這些特性帶來了中文分詞方法、重疊詞區分(黑 / 黑黑的)、歧義欄位切分、專有名詞識別等等問題

    詞法分析包含 分詞 + 詞性標註 兩個部分

    • 分詞 word segmentation 有基於詞表和基於統計兩種方法

    基於詞表:逐字掃瞄字串,當子字串跟詞表的詞相同就算吻合。再細分為 最大比對法、逆向最大比對法、雙向掃描法、逐詞巡訪法等等。ex: IKAnalyzer

    基於統計:根據人工標註的詞性和統計特徵,對中文進行建模,透過模型計算各分詞出現的機率,以機率最大的分詞作為結果,常用 HMM、CRF、LSTM+CRF 演算法。ex: ICTCLAS、Standford Word Segmenter * 詞性是詞語最基本的文法屬性之一,詞性標註 Part-Of-Speech Tagging (POS Tagging) 是詞法分析的一部分

    將句子的每一個詞賦予特定類別,ex: 動詞、名詞、介系詞,句子中最能代表資訊的是名詞、動詞、形容詞、副詞,這四種是 Open Class,詞量會隨著時間增加,Closed Class 包含冠詞、介系詞、連接詞,數量固定

    主要採用 HMM,陸續採用判別式的最大熵模型、支援向量機模型等。有基於規則、基於統計兩種方法

    基於規則:依照詞性關係與上下文情境建造詞類消岐規則

    基於統計:將機率最大的詞性作為結果

    工具:Stanford Log-linear Part-Of-Speech Tagger、LTP

  • 句法分析 Syntactic Parsing

    分析輸入的文句,得到句法結構。從字串得到句法結構的過程。ex: 句法驅動和統計的機器翻譯

    不同的句法形式,對應到不同的句法分析演算法,片語結構及依存結構,是最常用的兩類文法體系。以片語結構樹為目標的句法分析器應用範圍最廣。

    分析結果以樹狀結構的形式呈現,稱為句法分析樹。

    根據句法結構不同的表示形式,可將句法分析分為以下三種

    • 依存句法分析 Dependency Syntactic Parsing:識別詞彙之間的相互依存關係

    基本假設:一個句子存在主體(被修飾詞)和修飾詞,句子中,詞的修飾關係具有方向性,通常是一個詞支配另一個詞,這種支配關係就是依存文法。

    詞和詞之間的依存(修飾)關係,本質上包含在句法結構中。

    一個依存關係連接的兩個詞,分別是 head 核心詞與 dependent 依存詞

    依存關係的五條公理:

    1. 一個句子只有一個成分是獨立的
    2. 其他成分直接依存於某一個成分
    3. 任一個成分都不能依存於兩個或兩個以上的成分
    4. 如果 A 直接依存於 B,C在句子中位於 A, B 之間,則 C 直接依存於 B,或依存於 A, B之間某一個成分
    5. 中心成分左右兩邊的其他成分,相互之間不發生關係

    常見依存關係

    關係類型 標籤 描述 例子
    主謂關係 SBV subject-verb 他邀請我跳舞 (他 <- 邀請)
    動賓關係 VOB 直接賓語 verb-object 媽媽給我一個吻 (給 -> 吻)
    間賓關係 IOB 間接賓語 indirect-object 媽媽給我一個吻 (給 -> 我)
    前置賓語 FOB 前置賓語 fronting-object 莫我肯顧 (我 <- 顧)
    兼語 DBL double 他邀請我跳舞 (邀請 -> 我)
    定中關係 ATT attribute 紅寶石 (紅 <- 寶石)
    狀中結構 ADV adverbial 特別嚴厲(特別 <- 嚴厲)
    動補結構 CMP complement 打掃完衛生(打掃 -> 完)
    同位語 APS appositive 我本人非常高興(我 <- 本人)
    並列關係 COO coordinate 天空和海洋 (和 -> 海洋)
    介賓關係 POB preposition-object 在陽光下 (在 -> 下)
    左附加關係 LAD left adjunct 天空和海洋 (和 <- 海洋)
    右附加關係 RAD right adjunct 朋友們 (朋友 -> 們)
    獨立結構 IS independent structure 我五歲,他四歲 (各自獨立)
    核心關係 HED head 美麗的花朵爭相開放 (花朵 是整個句子的核心)

    目前採用資料驅動的依存句法分析,將資料分為訓練集和測試集。基於圖 graph-based 和 基於轉移 transition-based 兩種分析方法。

    基於圖 graph-based:

    ​ 將句子(字串)和對應的依存樹組成的資料做為訓練資料,訓練目的是,學習一個可以預測一句依存樹未知的最佳依存樹。建模過程需要增加依存樹限制條件,例如圖的邊是有向邊,在有向的路徑上,一個詞只能被存取一次,每個詞只能有一個支配節點。

    基於轉移 transition-based:

    ​ 將圖預測轉變為序列標註問題,主要的轉移系統有 arg-eager, arc-standard, easy-first 等等,基於轉移的系統有三個操作

    1. 將單字從 buffer 移入 stack,或將單字從 stack 移回
    2. 從 stack 將單字 pop
    3. 建立帶有 label 的有向邊(左向邊或右向邊)

    基於圖在短句的表現較好,但長句容易受到早期錯誤的影響。基於轉移在長句有較好的表現,但是缺乏豐富的結構化特徵。

    • 片語結構句法分析 Phrase-structure Syntactic Parsing,也稱為成分句法分析 Constituent Syntatic Parsing:識別句子中的片語結構和片語之間的層級句法關係

    基於 Context Free Grammar (CFG),其規則分為人工編寫規則和資料驅動的自動學習規則兩類。

    人工編寫的缺點:規則之間的衝突會隨規則數量的增多而加劇,不易增加新規則。資料驅動的自動學習規則,開發週期短,且規則運作良好,目前為主流方法。

    為了在句法分析導入統計資訊,需要將 CFG 擴充為 PCFG: Probabilistic Context Free Grammar,最後利用 Maxmimum Likelihood Estimation (MLE) 計算每一條規則的機率。

    因為 CFG 的獨立性假設過於嚴格(一條文法規則的確定,僅與該規則左側句子的非終結符號有關,與上下文資訊無關),導致文法中缺乏其他資訊用於規則消岐,因此分析器的效能較低。這個問題有兩種弱化 CFG 假設的方法:一種是使用詞彙化 Lexicalization 方法,一種是使用符號重標記 Symbol Refinement 的方法,透過改寫非終結符號的方式,將上下文資訊導入句法分析器。

    • 深層文法句法分析,利用深層文法,對句子進行深層句法及語意分析,包含詞彙化樹鄰接文法 Lexicalized Tree Adjoining Grammar (LTAG)、詞彙功能文法 Lexical Functional Grammar (LFG)、組合範疇文法 Combinatory Categorial Grammar (CCG)

    依存句法分析是淺層句法分析,適合用在多語言環境,深層文法採用相對複雜的文法,句法和語意資訊較為豐富,分析器複雜。

    先將句子的基礎特徵(詞、詞性、類別標籤)向量化,再利用 MLP 進行特徵提取。

    深層學習的優點:

    1. 只需要句子的基礎特徵,利用向量乘法組合向量化特徵,理論上可達到任意元的特徵組合
    2. 能使用更多基礎特徵
  • 語意分析 semantic analysis

    語意是資料對應現實世界中,事物所代表的涵義。語意分析涉及語言學、計算語言學、人工智慧、機器學習、認知語言等多個學科,最終目的是理解句子表達的真實涵義。

    1. 語意分析在機器翻譯的應用,統計機器翻譯提升了翻譯的效能
    2. 語意搜尋:搜尋不在拘泥於根據輸入關鍵字字面的意思,而是要了解背後真正的意圖
    3. 實現大數據的理解與價值發現的有效手段

    Chatbot 利用語意分析可得知使用者的意圖、情感,藉由上下文情境的語意建模,保持 chatbot 的個性一致

自然語言表示

三種常用的文字特徵表示模型,將自然語言表示為電腦可以理解的形式

  • 詞袋模型 Bag Of Words, BOW

    最初用在資訊檢索 Information Retrieval (IR)。每個詞的出現都不依賴於其他詞是否出現的假設。在表示文件時,可忽略文字的語序、文法、句法,將其視為片語的組合

    ex: 以下兩份文件

    (1) 台北今天下雨,台中也下。

    (2) 台北和台中今天都下雨。

    建構辭典(前面是索引):

    Dictionary = {1: "台北", 2: "今天", 3: "下", 4: "雨", 5: "台中", 6: "也", 7: "和", 8: "都"}

    根據索引,可用向量表示該單詞在文件中出現的次數

    下:在第一句話出現 2 次,第二句話中出現 1 次

    (1) [1, 1, 2, 1, 1, 1, 0, 0]
    (2) [1, 1, 1, 1, 1, 0, 1, 1]

    詞袋模型可將文件轉換為次數的向量,但沒有表示單詞在原句中出現的位置,這是明顯的缺點。

  • 詞頻-逆向文件頻率 TF-IDF: Term Frequency-Inverse Document Frequency

    基於統計的加權方法,常用於 IR,用具體詞彙在文件中出現的次數,和其在語料庫出現的次數,評估該詞彙對相關文件的重要程度。TF-IDF 常被搜尋引擎用來評估文件與查詢之間的相關程度。

    TF (Term Frequency 詞頻) 就是詞語在文件出現的次數

    IDF (Inverse Document Frequency 逆向文件頻率) 詞語普遍重要性的度量。

    詞彙在指定文件內的高 TF,高 IDF,將使該詞彙在文件內享有較高權重的 TF-IDF

    TF-IDF 傾向於過濾常見詞彙,保留重要詞彙的做法。核心概念是:在一篇文件中出現頻率高,但在其他文件很少出現的詞彙,有較好的類別區分效果。

    但實際上,同一類文件頻繁出現的詞彙,往往代表該類文件的特徵,這類詞彙有較高的權重,應該視為該類文件的特徵詞,這是 IDF 的不足處。

  • 詞嵌入 Word Embedding

    將深度學習導入 NLP 的核心技術之一。

    要在 NLP 使用機器學習,必須找到一種適合將自然語言數學化的方法。最初用 one hot representation 方法,利用詞表大小維度的向量描述單詞,每個向量中多數元素為 0,只有該詞彙在詞表對應位置的維度為 1。

    ex: 詞表 H,包含 N 個詞彙,「雨傘」是 H 的第 2 個詞彙,「傘」是 H 的第 4 個詞彙

    「雨傘」的 one hot representation 為 [0, 1, 0 , 0, 0, 0 .....]

    「傘」的 one hot representation 為 [0, 0, 0 , 1, 0, 0 .....]

    同時分配 ID,「雨傘」的 ID 為 2,「傘」的 ID 為 4

    One-Hot Encoding 將所有詞彙單獨考慮,以向量表示,難於發現同義及反義的詞彙關係。另外因向量過於稀疏,在機器學習容易造成維度災難。

    Word Embedding 在基於 One-Hot Encoding 時,增加了單詞間的語意聯繫,並降低詞向量維度。

    一個包含 t 個詞彙 \[ w_1, w_2, ..., w_t \] 的句子,自然語言的機率 (也稱為語言模型)為 \[ p(w_1, w_2, ..., w_t) \\ = p(w_1)*p(w_2|w_1)*...*p(w_t|w_1,w_2,...,w_{t-1}) \\ = p(w_t|w_1,w_2,...,w_{t-1}) \]

    對於 N-gram 模型來說

    \[ p(w_1, w_2, ..., w_t) ≌ p(w_t|w_{t-n+1},w_{t-n+2},...,w_{t-1}) \]

    Yoshua Bengio 發表三層神經網路建構語言模型的方法

    第一層:輸入層,輸入句子內已知前 n-1 個詞彙的詞向量,將前 n-1 個詞向量拼接成一個向量

    第二層:隱藏層

    第三層:輸出層,第 i 個節點的值,等於下一個詞為 \( w_i \) 的機率的對數

    在最佳化模型的過程中,同時對單詞的詞向量進行優化。最佳化後可得到語言模型及詞向量。

    Encoder-Decoder 是文字處理的框架,可用於 chatbot、機器翻譯、文字摘要、句法分析。也就是由句子 (篇章)X,產生句子(篇章) Y 的通用模型。如果 X, Y 是相異語言,就是自動翻譯器。

    Encoder 負責將 X 變換為中間語意 C,Decoder 將 C 和歷史存在的 Y,產生 i 時刻的 \(Y_i\)

    Google 於 2008 年發表 BERT

    對於基於生成的 chatbot,除了 Encoder-Decoder 解決核心問題外,還需要注意多輪對話、安全回答、個性一致的問題

    • 多輪對話問題

      要將前文聊天資料,導入Encoder-Decoder,可產生更好的回應

      簡單拼接 context 及本次輸入句子的方法,因為 RNN 輸入模型的長度增長而減低成效 -> RNN 對於過長輸入資料敏感的問題

      以多層前饋神經網路替代 RNN:多層前饋神經網路的輸出,代表上下文聊天資訊,和目前輸入內容的中間語意表示,Decoder 根據中間語意產生回覆。

      另一種方法:階層式神經網路 Hierarchical Neural Network (HNN),本質類似 Encode-Decoder框架。Encoder 採用二級結構,以第一級句子 RNN(Sentence RNN) 編碼句子的每一個單詞,形成中間語意,第二級句子 RNN 根據上下文句子出現的先後順序序列,對第一級中間語意進行編碼。這個 RNN 稱為 Context RNN

      RNN 對出現在多輪對話的語言片段進行編碼,Context RNN 對時間進行編碼,解碼 RNN 負責對下一個對話回覆進行預測

    • 避免安全回答

      生成式 chatbot 的問題是「安全回答」,例如不管使用者輸入什麼,都回答 I Don't Know、Sure、呵呵、是嗎

      會發生這個現象的原因是,訓練的資料確實包含很多無意義的回答。問題在於訓練資料的詞語在句子不同位置的機率分佈,呈現出明顯的長尾狀況。也就是神經網路回覆陷入局部最佳解,可藉由給模型增加一些干擾,使其跳出局部最佳解。因此就把 Generative Adversarial Network (GAN) 導入聊天回覆生成系統,以解決安全回答的問題

      將系統分為生成器 Generator、判別器 Discriminator 兩個子系統,生成器使用 seq2seq 模型,以前文為輸入,再輸出對話語句,判別器用來判斷前文產生的回答是否接近人類行為。生成器不斷改良答案欺騙判別器,判別器不斷以生成器的回答作為負例。直到兩者收斂。

    • 個性一致問題

      chatbot 會被當作有個性的虛擬人物,該人物必須要有一致的年齡、喜好、習慣、語言風格。

      seq2seq 訓練都是單句資訊對單據回覆的映射關係,沒有統一的個性資訊。利用 seq2seq 很難保持個性資訊一致

      方法:將預定義的個性化資訊,透過 word embedding 方法呈現,仍然採用 seq2seq,也就是把個性資訊匯入 Decoder,

  • 基於知識圖譜的 NLU

    知識圖譜是結構化的語意知識庫,以符號形式描述真實世界存在的各種實體、概念、及其相互關係,其基本單位是「實體-關係-實體」形式的三元組,以及實體及其相關屬性的「屬性-值」對(Attribute-Value Pair、AVP)

    知識圖譜用 global 唯一的識別字來標籤知識圖譜的每個實體或概念。每個「屬性-值」都是對實體內在具體特型的刻畫,利用關係連接兩個實體,描述實體間的關係,構成網路知識結構。知識圖譜可視為一張巨大、包含節點與邊的圖,其中節點表示真實世界的實體或概念,網路的邊代表實體間的各種語意關係,這個圖模型可用 W3C 提出的 Resource Description Framework (RDF) 或屬性圖表示

    知識圖譜是知識表示與推理、資料庫、資訊檢索、自然語言處理等多種技術融合的產物

    • 知識表示

      知識在電腦內儲存和處理格式,一般以三元組表示一筆知識,頭尾實體是圖譜的節點,關係是圖譜的邊。

      知識表示使用的資料結構,最常見的是 graph 和 tree。每個邊和節點都有中繼資料。現有圖形式資料庫的缺點:在知識表示存在侷限,導致專案成本高,無法混合表示結構與非結構化資料。

      知識酷的資料由結構與非結構化資料混合而成,專案上,廣為接受是使用 Tree,其中 JSON 滿足了結構與非結構化混合的需求,是目前最常用的知識表示方式。缺點是無法結合 machine learning

      為解決以上問題,提出基於幾何空間的知識表示方法,每個實體是空間中的一點,關係是平移向量,每個元組都以平移原則作為基本幾何表示形式,頭實體可按照關係向量移動到尾實體。根據這種方法,可設計出基於統計的AI演算法。

    • 知識建構

      結構化資料可用簡單的映射,對應到知識圖譜

      半結構化資料 ex: html,可用 wrapper,提取資訊存放到特定格式的知識圖譜

      非結構化資料,以 text mining 發現文字隱含的模式

    • 知識融合

      由各來源提取知識後,要融合為一個知識庫,融合過程。

      本體 ontology,提供統一的術語字典,構成術語間的關係,根據具體業務建立或修改資料模型的功能

      本體比對演算法:模式比對 schema matching和實例比對 instance matching 兩種

      模式比對 schema matching:尋找本體中屬性和概念之間的對應關係,大規模本體比對一般使用 anchor 技術,將來自兩個本體的相似概念作為起點,根據這兩個相似概念的父概念、子概念,逐漸建構小型的相似片段,進而找出相符的概念。同時利用反覆運算,將新的相符概念作為新的 anchor,再根據 anchor 相關本體的鄰居資訊,建置新的片段。不斷反覆此過程,直到找不到新的相符概念為止。分而治之的方法

      實例比對可評估來自不同異質資料實例對的相似度,評估的結果用來判斷這些實力是否指向特定領域的相同實體。利用 Locality-Sensitive Hashing 提高實例比對的可擴充性方法,與使用向量空間模型表示實例,基於規則採用 inverted index,取得最初相符候選的方法


      chatbot 特殊需求

    • 需要個性化的知識圖譜

    • 需要動態知識圖譜

      要有生活規律,描述生活軌跡

    • 需要刻畫主觀情感的知識圖譜

      回覆時,除客觀事實外,要增加個性化主觀認知的情感元素

    • 要提供 API

    • 要有多媒體知識圖譜

      結合圖片、語音、文字

自然語言生成

分為 pipeline, integrated 兩種

pipeline 個模組間互相獨立,只有輸入、輸出界面。

integrated 系統模組之間緊密結合

integrated 符合人腦設計,但實作困難,現時常用的是 pipeline,有文字規劃(說什麼)、句子規劃(怎麼說)、句法實現(讓句子連貫)三個模組。

chatbot 對話生成技術

  • 檢索式

    由對話資料庫找出最佳回覆,只能用固定語言回覆

  • 生成式

    由 chatbot 創造句子

    • 需要關聯文法結構和應用特有的語意表徵
    • context sensitive,語言要整合時間、地點、位置等資訊
    • 基於 machine learning 產生的回覆很難解釋,難以被理解

基於範本的 NLG

範本由 sentence和 word 組成,是含有變數的 sentence,word 是範本中變數對應的可能值

適合任務驅動的對話系統

  1. 對話管理模組會根據目前的對話狀態,使用者輸入的資料,生成下一步動作的相關資訊,也就是選擇句子範本,及可選的詞彙範本
  2. NLU 需要利用詞彙範本、句子範本、有限狀態機,進行 slot filling 的相關工作

基於深度學習的 NLG

GAN 在電腦視覺,尤其是圖形生成方面有顯著成果。

對話管理

維護更新對話狀態與動作選擇,對話狀態是一種能夠處理聊天資料的表徵。包含所有可能會影響機器下一步決策的資訊。

動作選擇是基於目前狀態,選擇下一步合適的動作,例如向 user 詢問需要補充的資訊,執行要求的動作等等。

ex: user 輸入「幫我給媽媽預定一束花」,接下來可能是

  1. 詢問可接受的價位「請問預期價位如何?」
  2. 確認可接受的價位「像上次買兩百元的花可以嗎?」
  3. 直接預訂「好的,已預訂價值兩百元的紅玫瑰」

模組

  • 對話行為識別

    預先定義或動態產生,使用者對話意圖的抽象表示形式。分為封閉式、開放式兩種。

    封閉式:將對話意圖映射到預先定義好的對話行為類別體系,通常用在特定領域/任務,ex: 設定鬧鐘、票務預訂、酒店預訂

    開放式:對話行為沒有預先定義好的對話行為類別體系,ex: 閒聊系統

  • 對話狀態識別

    狀態跟 context 及對話行為相關,狀態轉移由前一時刻的對話狀態,與目前使用者輸入的對話行為決定

  • 對話策略學習

    讓機器從「人-人」的真實對話資料學習對話的行為與狀態

  • 對話獎勵

    通常將槽位填充效率、回覆流行度等參數納入考量

    基於強化學習的長期獎勵機制


常見的對話管理方法

  1. Finite State Machine FSM

    要人工定義對話系統可能出現的所有狀態,簡單易用,但需要人工設計,無法用於複雜場景

  2. 基於統計

    將對話過程表示為部分可見的馬可夫決策過程,只需要定義決策過程的狀態和動作,機器可透過學習得到不同狀態間的轉移關係

  3. 基於神經網路

    用神經網路學習動作選擇的策略,將自然語言理解的輸出,及其他特徵,都作為神經網路的輸入,把選擇的動作作為神經網路的輸出。需要大量訓練資料,為獲得大規模應用驗證

  4. 基於框架

    slot-value pair

    用於特定領域的對話系統


對話管理的挑戰

  1. 手工編寫的對話策略,難以涵蓋所有對話場景
  2. 基於統計與神經網路的方法,需要大量對話資料
  3. 要求大量的領域知識、對話知識,以產生有意義的回覆

One-shot Learning 和 Zero-shot Learning 可用少量(無)樣本進行訓練,以解決對話系統「冷開機」問題,透過 reward function 學習,不斷增加對話模型

seqGAN 採用對抗網路實作離散序列的生成模型,解決 GAN 難以應用於自然語言處理領域的問題,並可用來選擇最佳的獎勵函數與參數

2021/7/26

如何查看遠端機器的 mnesia

要先知道 remote erlang node 的 cookie 值

在 local 機器先啟動一個 erlang node, setcookie 的部分要設定跟 remote erlang node 一樣

erl -setcookie cookievalue -sname obs1
% 啟動 observer
(obs1@cmbp)1> observer:start().

在上面選單的 Nodes -> Connect to Node,輸入遠端 nodename@hostname

larzio1@larzio

就可以查看遠端的 mnesia 資料了

Note: 只要點 Application 頁籤就會 crash,不知道原因

2021/7/19

Distributed OTP Applications

OTP application 可以轉換為 distributed application,用途是在多個 erlang cluster nodes 之間,distributed application 能夠在這些節點中間,只運作一個 application。

OTP distributed application 能夠設定為一個運作的主節點,其他節點則是在該主節點失效時,能夠接手選擇產生另一個 application 繼續運作,這是 failover。當主節點恢復時,這個 application 會重新在主節點啟動,原本接手的節點會停止該 application,這是 takeover。運作的細節可參考 Distributed OTP Applications

以該文章的 8ball 實例,測試三個節點運作 OTP distributed application 的狀況。

產生 app

# 透過 rebar 產生 app
rebar create-app appid=m8ball

修改 src 裡面的檔案

m8ball.app.src

{application, m8ball,
 [{vsn, "1.0.0"},
  {description, "Answer vital questions"},
%%  {modules, [m8ball, m8ball_sup, m8ball_server]},
  {applications, [stdlib, kernel, crypto]},
%%  {registered, [m8ball, m8ball_sup, m8ball_server]},
  {mod, {m8ball, []}},
  {env, [
    {answers, {<<"Yes">>, <<"No">>, <<"Doubtful">>,
               <<"I don't like your tone">>, <<"Of course">>,
               <<"Of course not">>, <<"*backs away slowly and runs away*">>}}
  ]}
 ]}.

m8ball.erl

-module(m8ball).
-behaviour(application).
-export([start/2, stop/1]).
-export([ask/1]).

%%%%%%%%%%%%%%%%%
%%% CALLBACKS %%%
%%%%%%%%%%%%%%%%%

%% start({failover, Node}, Args) is only called
%% when a start_phase key is defined.
%% application:which_applications().
start(normal, []) ->
    io:format("application normal start m8ball~n"),
    m8ball_sup:start_link();
start({takeover, OtherNode}, []) ->
    io:format("application takeover m8ball from ~p~n", [OtherNode]),
    m8ball_sup:start_link().

stop(_State) ->
    io:format("application stop m8ball~n"),
    ok.

%%%%%%%%%%%%%%%%%
%%% INTERFACE %%%
%%%%%%%%%%%%%%%%%
ask(Question) ->
    m8ball_server:ask(Question).

m8ball_server.erl

-module(m8ball_server).
-behaviour(gen_server).
-export([start_link/0, stop/0, ask/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         code_change/3, terminate/2]).

%%%%%%%%%%%%%%%%%
%%% INTERFACE %%%
%%%%%%%%%%%%%%%%%
start_link() ->
    gen_server:start_link({global, ?MODULE}, ?MODULE, [], []).

stop() ->
    gen_server:call({global, ?MODULE}, stop).

ask(_Question) -> % the question doesn't matter!
    gen_server:call({global, ?MODULE}, question).

%%%%%%%%%%%%%%%%%
%%% CALLBACKS %%%
%%%%%%%%%%%%%%%%%
init([]) ->
    % <<A:32, B:32, C:32>> = crypto:strong_rand_bytes(12),
    % rand:seed(A,B,C),
    <<I1:32/unsigned-integer, I2:32/unsigned-integer, I3:32/unsigned-integer>> = crypto:strong_rand_bytes(12),
    rand:seed(exsplus, {I1, I2, I3}),
    {ok, []}.

handle_call(question, _From, State) ->
    {ok, Answers} = application:get_env(m8ball, answers),
    Answer = element(rand:uniform(tuple_size(Answers)), Answers),
    {reply, Answer, State};
handle_call(stop, _From, State) ->
    {stop, normal, ok, State};
handle_call(_Call, _From, State) ->
    {noreply, State}.

handle_cast(_Cast, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

terminate(_Reason, _State) ->
    ok.

m8ball_sup.erl

-module(m8ball_sup).
-behaviour(supervisor).
-export([start_link/0, init/1]).

start_link() ->
    supervisor:start_link({global,?MODULE}, ?MODULE, []).

init([]) ->
    {ok, {{one_for_one, 1, 10},
          [{m8ball,
            {m8ball_server, start_link, []},
            permanent,
            5000,
            worker,
            [m8ball_server]
          }]}}.

config files

a.config

[{kernel,
  [{distributed, [{m8ball,
                   3000,
                  [a@cmbp, {b@cmbp, c@cmbp}]}]},
   {sync_nodes_mandatory, []},
   {sync_nodes_optional, [b@cmbp, c@cmbp]},
   {sync_nodes_timeout, 5000}
  ]
 }
].

b.config

[{kernel,
  [{distributed, [{m8ball,
                   3000,
                  [a@cmbp, {b@cmbp, c@cmbp}]}]},
   {sync_nodes_mandatory, []},
   {sync_nodes_optional, [a@cmbp, c@cmbp]},
   {sync_nodes_timeout, 5000}
  ]
 }
].

c.config

[{kernel,
  [{distributed, [{m8ball,
                   3000,
                  [a@cmbp, {b@cmbp, c@cmbp}]}]},
   {sync_nodes_mandatory, []},
   {sync_nodes_optional, [a@cmbp, b@cmbp]},
   {sync_nodes_timeout, 5000}
  ]
 }
].

startup script

runa.sh

# erl -sname a -config a.config -pa ebin -eval 'application:start(crypto), application:start(m8ball)'

erl -sname a -config a.config -pa ebin -eval 'application:ensure_all_started(m8ball)'

runb.sh

# erl -sname b -config b.config -pa ebin -eval 'application:start(crypto), application:start(m8ball)'

erl -sname b -config b.config -pa ebin -eval 'application:ensure_all_started(m8ball)'

runc.sh

# erl -sname c -config c.config -pa ebin -eval 'application:start(crypto), application:start(m8ball)'

erl -sname c -config c.config -pa ebin -eval 'application:ensure_all_started(m8ball)'

compile

rebar compile

測試

先啟動 node a,因為 b, c 還沒有啟動,這時候, a 在啟動時,會等 5s,看看 b, c 是不是有啟動。 5s 後,才會進入 console。

以 application:which_applications(). 可以查詢目前運作的 applications

./runa.sh

Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
(a@cmbp)1> application:which_applications().
[{m8ball,"Answer vital questions","1.0.0"},
 {crypto,"CRYPTO","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","3.4.4"},
 {kernel,"ERTS  CXC 138 10","5.4.3"}]

如果啟動 b,一樣會等 5s。但如果同時再啟動 c,就會直接進入 console。

./runb.sh
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
(b@cmbp)1> application:which_applications().
[{crypto,"CRYPTO","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","3.4.4"},
 {kernel,"ERTS  CXC 138 10","5.4.3"}]
./runc.sh
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
(c@cmbp)1> application:which_applications().
[{crypto,"CRYPTO","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","3.4.4"},
 {kernel,"ERTS  CXC 138 10","5.4.3"}]

透過 application 查詢,可得知 m8ball 運作在 node a

如果把 node a 關掉,等待 5s 後,進行 application 查詢,可發現 m8ball 運作在 node b

(b@cmbp)2> application:which_applications().
[{m8ball,"Answer vital questions","1.0.0"},
 {crypto,"CRYPTO","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","3.4.4"},
 {kernel,"ERTS  CXC 138 10","5.4.3"}]

再把 node b 關掉,等待 5s 後,進行 application 查詢,可發現 m8ball 運作在 node c。

重新啟動 node a,這時候 node c 的 application 會被停止

(c@cmbp)6>
=INFO REPORT==== 26-Mar-2021::15:45:28 ===
    application: m8ball
    exited: stopped
    type: temporary

但是並沒有回到 node a 運作。這邊認為有可能是 erlang 的問題。

(a@cmbp)1>
=INFO REPORT==== 26-Mar-2021::15:45:28 ===
    application: m8ball
    exited: {{already_started,<5269.88.0>},
             {m8ball,start,[{takeover,c@cmbp},[]]}}
    type: temporary

=INFO REPORT==== 26-Mar-2021::15:45:28 ===
    application: crypto
    exited: stopped
    type: temporary

在 takeover 時, b,c 兩個 node 如果少了一個,就會發生問題。

再重新執行一次 a

$ ./runa.sh
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
(a@cmbp)1> application:which_applications().
[{m8ball,"Answer vital questions","1.0.0"},
 {crypto,"CRYPTO","4.2.1"},
 {stdlib,"ERTS  CXC 138 10","3.4.4"},
 {kernel,"ERTS  CXC 138 10","5.4.3"}]

Note:如果只做兩個 Node,這時候就沒有發生上面 takeover 的問題。


在任意一個節點,只要 m8ball 有在某一個節點運作,就可以使用 m8ball

(b@cmbp)3> m8ball:ask("Questions?").
<<"*backs away slowly and runs away*">>
(b@cmbp)4> m8ball:ask("Questions?").
<<"No">>
(b@cmbp)5> m8ball:ask("Questions?").
<<"Of course">>

References

Distributed OTP Applications

2021/7/12

當上主管後,難道只能默默崩潰?

當上主管後,難道只能默默崩潰? 作者 Julie Zhuo 在 Facebook 晉升設計主管後,以他自己的個人經驗,告訴大家一個管理職應該/不應該做什麼事情,並提出了許多實用的建議,重點在於有關「人」的工作,必須不斷地檢討調整做法。

什麼是管理?

想辦法讓一群人合作,得出更好的結果。

管理者每天要處理的事情,分為三大類:目標 purpose、人 people、流程 process

目標:why

​ 為什麼這項工作很重要

​ 確保團隊知道成功的狀況,而且想要成功

人:who

​ 團隊成員有成功的條件、技能、動力嗎?

流程:how

​ 如何一起工作

優秀經理是後天培養出來的。

管理者的成就,在於團隊的表現,工作內容是協助團隊成功。願意視情況扮演不同的角色。

隨機應變:目標轉向、成員異動、流程改變...

管理者要花大量時間與人相處。能夠在充滿情緒的情境下,依然穩若泰山。

領導者與管理者不同

領導是特質,要能影響他人,不是工作

管理是被指派

新官上任

接下管理職的途徑:

  1. 學徒:成長的團隊,需要有人分擔管理工作

    可得到舊主管的引導,知道什麼可以做、什麼不行

    • 該從哪裡下手
    • 要如何跟團隊溝通職務變化
    • 被管理者,有哪些要注意的事
    • 有哪些重要團隊目標或流程
    • 前3~6個月,要完成哪些事情
    • 兩個人如何協調、分工

    大家開始用不同的方式對待你,或是不再分享更多資訊

  2. 開拓者:新團隊的創始成員

    打造出自己要的團隊,跟大家協調目標、價值觀、流程

    • 希望團隊成員具備哪些特質
    • 希望成員具備哪些技能
    • 這個團隊一年後將會如何運作
    • 自己的角色與責任

    背後沒有太多支援

  3. 新進主管:進入已經運作的團隊

    一開始有蜜月期 -> 該問的就要問

    努力建立新關係

    不了解工作 -> 跟上司溝通

  4. 繼任者:原管理者離開

    責任大增

    原本平行的同事建立新互動會尷尬

    大家期待你要跟前主管一樣

帶領小型團隊

團隊成長至八人時,開始每週 critique 互評會議

妨礙人把工作做好的原因

  1. 不知道如何能做好工作
  2. 沒有動力

信任是重要元素

信任:人們覺得可以告訴你自己犯的錯、遇到的挑戰、心中的恐懼

如果連續幾週,大家都說「每一件事都很好」,那就可能有問題

指標:我帶的人願意再當我的部屬

尊重與關心你管理的人:管理就是關懷

花時間協助你管理的人

  • 討論優先事項
  • 協調什麼叫「優秀表現」
  • 分享回饋意見
  • 檢討現況

用這些問題引導對話

  • 找出癥結
    • 你現在最煩心的事情是什麼
    • 你打算先處理哪些事
    • 你認為今天這個時間應該討論什麼
  • 理解
    • 你理想中的結果是什麼樣子
    • 得出那樣的結果難在哪裡
    • 你真正在意的事是什麼
    • 你認為最理想的辦法是什麼
    • 你最擔心的情況是什麼
  • 支持
    • 你希望我怎麼幫你
    • 我怎麼做能讓你更成功
    • 我們今天的對話,最有用的地方是哪裡

誠實告知部屬的表現

承認自己也會犯錯,依然有成長的空間

人們會忘記你說過什麼、做過什麼,但永遠不會忘記你帶來的感受

發生問題時,最重要的不是建議或答案,而是同理心

協助他人發揮長處

團隊中不該容忍的事:有優秀孤狼

沒必要永遠都要「解決問題」:如果真有不對盤的人,就不要放在一起

快刀斬亂麻:當你決定讓某人離開,態度要直接,但也要表現出尊重

提供回饋的技巧

有很多人不擅長給回饋意見

理想的回饋

一開始就清楚設定期待

一有機會就給「特定任務的回饋」:對事不對人

仔細思考後,定期分享「行為回饋」

蒐集「360度回饋」,力求客觀

重大失望的起因都是沒有設定期待

事情有改善,回饋才算數

1. 回饋要越明確越好
2. 說明成功的樣貌與感受
3. 建議接下來的步驟

給批評性的回饋或宣布壞消息:不要用好聽的話包裝壞消息

「三明治評論法」:先講正面觀察,然後提出建議,最後拍肩膀鼓勵

Feedback is a gift.

管理自己

每個人偶爾都會感到自己是冒牌者

冒牌者症候群 imposter syndrome:每個主管偶爾都會感到自己是冒牌者

  1. 人們經常仰賴你提供答案
  2. 你得不斷做從前沒做過的事

完全對自己誠實:找出自己的優點與缺點

了解自己表現最好與最糟的情境

陷入谷底時找回自信

​ 不要怪自己心情低落

​ 跟著說「我腦中的聲音不夠理性」

​ 閉上眼睛想像

​ 讓你能卸下心防的人協助

​ 小事也要慶祝

​ 區分上下班,照顧自己

努力變得更優秀

​ 請他人提供回饋

​ 把主管當教練

​ 人人都能成為導師

​ 找時間反省與設定目標

​ 利用正式訓練

精彩會議

好的會議簡單明瞭

會議的結果

​ 作出決定

​ 分享資訊

​ 提供回饋

​ 想出點子

​ 強化關係

邀請正確人選

給人機會,準備好再出席

讓與會者能安心發言

​ 明確說出原則

​ 改善會議形式,增加參與程度

​ 讓每個人都有平等的發言時間

​ 請大家提供會議回饋

不需要參加每一個會議

雇用正確人選

事先想好如何規劃你的團隊

​ 找人是你的責任

​ 描述理想中的人選,越明確越好

​ 擬定找人策略

​ 提供令人驚豔的面試體驗

​ 讓應徵者感受到你求才若渴

雇用是一場賭博

​ 檢視應徵者過去做過的類似工作

​ 找可信人士推薦

​ 多找幾位面試官

​ 一個熱心的打包票掛保證,勝過大家覺得普通也沒人反對

​ 事先備妥面試題目

​ 不收會讓工作環境烏煙瘴氣的人

​ 打造具備多元視野的團隊

​ 雇用具備成長空間的人

​ 要對流程有信心

如果需要雇用五人、十人、數百人

​ 成功的聘僱關鍵在於肯下功夫

​ 主管級的聘僱要先做功課

​ 招募頂尖人才,目光要放遠

​ 建立堅強的板凳陣容

​ 培養把找到人才當成第一要務的文化

讓事情發生

先有明確的願景

​ 擬定可信的行動方案

​ 依據團隊的長處制定計劃

​ 專心做好一兩件事

​ 分配好哪些是由誰負責

​ 把大目標拆成小目標

完美執行比完美策略重要

​ 衡量短期與長期效益

​ 立下長期願景,接著往回推

​ 採取「組合法」

​ 說明每一件事與願景之間的關聯

理想的流程一直在變動

帶領成長中的團隊

大團隊 vs 小團隊

​ 直接管理轉變為間接管理

​ 人們以不同方式待你

​ 每天隨時都得轉換心境

​ 挑選自己要投入的戰役

​ 關鍵技能越來越與「人」有關

授權的程度不好拿捏

委以重任象徵著信任

不同層級的主管要統一願景

當主管表現不佳時,要怎麼辦

努力讓自己「沒工作」

培養文化

Nothing at Facebook Is Somebody Else's Problem.

找出你想成為哪種團隊的一份子

​ 了解目前的團隊

​ 了解你渴望擁有的文化

​ 找出差異

重要的是可以隨時提醒

身體力行

製造正確誘因

建立宣揚你的價值觀的傳統

2021/7/5

RPA: Robotic Process Automation

RPA: Robotic Process Automation 是 2018 年開始的一個新興領域,用來取代辦公室內的人力,目標是,只要是電腦能夠處理的重複性工作,因為 RPA 能夠模擬我們操作電腦的動作,例如打開 Browser,在網頁擷取資料,打開 email,登入應用程式等等,都可透過 RPA Tool 重複運作。目前 RPA 領域中的領導者是 UiPath。

目前 RPA 的產品有

  1. UiPath
  2. Automation Anywhere
  3. blueprism
  4. WorkFusion
  5. PEGA
  6. RedWOOD

RPA 分析

淺談RPA: Robotic Process Automation

https://miro.medium.com/max/700/0*DMRvUjFQv_QENu1b.jpeg

以前有個名詞 OA 辦公室自動化,這個階段是要利用 IT 技術開發一些工具,簡化工作流程與時間,節省人力。RPA 是因為 IT 系統太多樣化,又有許多工具跟資料各自獨立,沒有整合在一起。RPA 是一個能在電腦中跨越多個系統互相傳遞資訊的工具。

RPA的目標『模擬』人工操作電腦的行為,解決過往跨系統資料串連不易、跨平台資料比對問題,讓原本人工作業的流程變得自動化,並減少人為疏失或錯誤。在討論到跨系統整合,一般都會從系統資料串接的角度來想,但這樣一個跨系統整合專案,不僅耗時,成本高,而且無法因應系統的升級或更新,立刻做調整與改變。

RPA 是從使用者與成本的角度產生的,等於是認為目前資訊系統的異質性與多樣性是無法解決與處理的,乾脆從各系統的既有介面為出發點,讓 RPA 直接模擬操作過程,已達到低成本跨系統的整合目的。

IA

從流程機器人(RPA)進階到智能自動化(IA)

智能自動化是流程機器人與認知科技(Cognitive Technology)的結合,能處理較複雜的作業情境,並針對各種結構化與非結構化的資料進行擷取、重組、分析及驗證,以下列舉三項可將複雜的作業流程進行自動化的情境:

  1. 圖像資訊轉為文字訊息的工作,例如:從不同格式的紙本發票擷取收據內容,並轉為文字清單。
  2. 語音訊息轉為文字訊息的工作,例如:將客戶透過電話預約的通話內容,轉為文字記錄。
  3. 統整與分析結構鬆散的巨量資料,例如:將每月收支產生的紙本單據轉為數位資料後,擷取特定的欄位數據,彙整成當月的結算報告。

隨著圖像辨識與語意識別的技術逐漸成熟,結合這些科技能將過去不易處理的資料型態進行辨識與轉換,進一步達到智能自動化。相較於流程機器人擅長將重複性高、帶有固定規則的作業內容自動化;智能自動化則是強調能夠識別不同的作業情境,並將資料結構鬆散、具複雜邏輯的作業內容自動化(圖2)。

IA 智能自動化,是下一個階段的目標。最終目標當然是 AI,但這應該還離我們很遠。

UiPath

UiPath Tutorial 10 - Real Time Project in UiPath | Data Scraping | Send Email with Attachment

類似 巨集 Editor

【UiPath課程】沒有程式背景,花2天上課的心得筆記(Day1)

UiPath的平台架構主要有三部分

  • UiPath Studio:設計工作室,用來設計流程的工具。(製作Robot)
  • UiPath Robot:那個幫你做事的機器人,實際執行自動化流程的機器人。(執行Robot)
  • UiPath Orchestrator:中控管理平台,當機器人越來越多的時候,需要集中管理這些每天做事的機器人,可以排程、安全控管、監控與分析效能等。(管理Robots)

Automation Anywhere

https://www.automationanywhere.com/tw/rpa/robotic-process-automation

機器人能夠複製貼上、抓取網頁資料、進行計算、開啟和移動檔案、剖析電子郵件、登入程式、連接到 API,以及擷取非結構化資料。而且,由於機器人可以適應任何介面或工作流程,因此無需變更業務系統、應用程式或現有流程,即可實現自動化。


https://medium.com/alexchanglife/什麼是rpa機器人流程自動化-robot-process-automation-d6c6de75f28d

Automation Anywhere的設計架構主要包含三個元件:Control Room、Bot Creator、Bot Runner。

1. Control Room 中控室

Control Room做為Automation Anywhere架構設計的核心,負責管理、維護從Bot Creator開發後上傳的各式機器人,並根據自動化排程的設定,分派這些機器人至Bot Runner中,執行自動化任務。

2. Bot Creator 機器人開發者

主要負責開發、設計各種執行自動化任務的機器人。

Bot Creator可以於本機電腦上進行機器人的開發(客戶端),開發完成後,透過網路傳輸的方式,將其開發的機器人上傳至Control Room(伺服端),讓Control Room可以根據預先設定好的執行排程,分配這些機器人於Bot Runner中,執行自動化任務。此外Bot Creator也可以從Control Room上下載已開發完成的機器人,進行調整、優化機器人的作業。

3. Bot Runner 機器人執行者

主要負責執行從Control Room分派下來的各種自動化機器人。

Control Room會依據設定好的執行排程(伺服端),經由網路傳輸的方式,將機器人分派至Bot Runner上執行自動化任務(客戶端),Bot Runner可同時執行多個自動化機器人,已完成不同的類型的任務腳本,但無法新增、更新自動化機器人

而當Bot Creator完成機器人開發,並上傳至Control Room的機器人,其機器人會被儲存至Bot Repository中,搭配如同Git的版本控制功能(Version Control),讓Control Room的管理者可以追蹤過往此機器人的修改歷程,清楚知道要使用哪個版本的機器人,做為執行自動化任務使用。

此外我們先前提到Control Room是經由網路的方式,連結Bot Creator與Bot Runner,為了防止於分派任務的過程中產生資料外泄的風險,Control Room於傳送前,會採用AES-256的資料加密方式,並搭配TLS 1.2的資料傳輸規格,確保資訊安全無虞。

最後Control Room也提供Single-Sign on的登入功能,提供系統管理者可經由帳號綁定的方式快速登入Automation Anywhere進行監控、管理、安排自動化機器人等任務。

AI + RPA

智慧文件辨識2.0應用,AI+RPA 發票/文件處理自動化

利用 RPA Tool 裡面內建的 OCR,做到自動化

但實務上下游關係的所有電子表單格式不同,文件掃描後的解析度,位置可能會稍微不同,傳統的 OCR Engine 無法處理非結構化的資料。因為 RPA 還無法處理不同範本的文件檔案,具有 AI 能力的 OCR Engine,可以解決這樣的問題。