Bot 的運作方式

適用于: SDK v4

Bot 是使用者可運用文字、圖形 (例如卡片或影像) 或語音等對話方式進行互動的應用程式。 Azure Bot Service 是一個雲端平臺。 它會裝載 bot,並讓它們可供通道使用。

Bot Framework Service 是 Azure Bot 服務的元件,會在使用者的 Bot 連線應用程式 ((例如 Facebook 或空隙)之間傳送資訊,而我們會呼叫 通道) 和 Bot。 每個通道都可以在其傳送的活動中包含其他資訊。 建立 Bot 之前,請務必了解 Bot 如何使用活動物件來與其使用者通訊。 讓我們先看看當我們執行簡單回應 Bot 時所交換的活動。

活動圖表

這裡說明的兩種活動類型為:「對話更新」和「訊息」。

有對象加入對話時,Bot Framework Service 可以傳送對話更新。 例如,使用 Bot Framework 模擬器開始對話時,您會看到兩個對話更新活動 (一個用於使用者加入對話,另一個用於 Bot 加入對話)。 若要區別這些對話更新活動,請檢查包含在活動的 [ 加入成員 ] 屬性中的人員。

訊息活動會隨附合作對象之間的對話資訊。 在回應 Bot 範例中,訊息活動會隨附簡單的文字,而通道會呈現這段文字。 或者,訊息活動可能隨附要說出的文字、建議的動作或要顯示的卡片。

在此範例中,Bot 建立並傳送了訊息活動,以回應其已接收的輸入訊息活動。 不過,bot 可以透過其他方式回應接收的訊息活動;bot 在訊息活動中傳送一些歡迎文字來回應對話更新活動並不罕見。 如需詳細資訊,請參閱如何 歡迎使用使用者

Bot Framework SDK

Bot Framework SDK 可讓您建立可在 Azure Bot Service 上裝載的 bot。 服務會定義一個 REST API 以及一個活動通訊協定,讓您的 bot 和頻道或使用者能夠進行互動。 SDK 建基於此 REST API 並提供服務的抽象概念,讓您可以將焦點放在對話邏輯上。 雖然您不需要瞭解 REST 服務來使用 SDK,但瞭解其部分功能可能會很有説明。

Bot 是具有對話式介面的應用程式。 在不再需要直接人為介入的自動化系統上,Bot 可用於輪替簡單、重複性工作,例如預訂晚餐或蒐集設定檔資訊。 使用者可使用文字、互動式卡片和語音來與 Bot 交談。 Bot 互動可以是快速的問與答,也可以是以智慧方式提供服務存取權的複雜對話。

注意

SDK 和 REST API 所提供的功能支援會因通道而異。 您可以使用 Bot Framework Emulator 來測試您的 bot,但您也應該在您想要讓 bot 可供使用的每個通道上,測試 bot 的所有功能。

互動牽涉到活動交換,這些 活動 會在 回合 中處理。

活動

使用者 (或通道) 和 bot 之間的每個互動都會表示為 活動。 Bot Framework 活動架構 會定義可在使用者或通道與 Bot 之間交換的活動。 活動可以代表人為文字或語音、應用程式對代理程式更新、其他訊息的反應等等。

回合

在對話中,人們通常一次一個人發言,輪流發言。 Bot 通常會回應使用者輸入。 在 Bot Framework SDK 內,一個「回合」是由使用者對 Bot 的傳入活動,以及 Bot 傳回給使用者作為立即回應的任何活動所組成。 您可以將回合視為與接收指定活動之 bot 相關聯的處理。

例如,使用者可能會要求 bot 執行特定的工作。 Bot 可能會以問題回應,以取得有關工作的詳細資訊,此時會結束此回合。 在下一個回合中,bot 會接收來自使用者的新訊息,其中可能包含 bot 問題的答案,或可能代表主體的變更或忽略初始要求以執行工作的要求。

Bot 應用程式結構

SDK 會定義 bot 類別,以處理 bot 應用程式的交談式推理。 Bot 類別:

  • 辨識並解讀使用者的輸入。
  • 輸入和執行相關工作的原因。
  • 產生 bot 正在執行或已完成的回應。

SDK 也會定義處理通道連接的 介面卡 類別。 介面卡:

  • 提供一種方法,用來處理從和方法產生要求至使用者通道的要求。
  • 包含中介軟體管線,其中包括 bot 回合處理常式以外的回合處理。
  • 呼叫 bot 的回合處理常式,並捕捉在回合處理常式中未以其他方式處理的錯誤。

此外,bot 通常需要取得並儲存每個回合的狀態。 這是透過 儲存體bot 狀態屬性存取 子類別來處理。 SDK 不會提供內建的儲存體,但會提供儲存體的抽象概念和儲存層的幾個執行。 管理狀態主題描述這些狀態和儲存功能。

Bot 具有連線能力和推理元素,以及狀態的抽象概念

SDK 不會要求您使用特定的應用層來傳送和接收 web 要求。 Bot Framework 的範本和範例適用于 ASP.NET (c # ) 、restify (JavaScript) 和 >aioHTTP (Python) 。 不過,您可以選擇對應用程式使用不同的應用層。

當您使用 SDK 建立 bot 時,您會提供程式碼來接收 HTTP 流量,並將其轉送至介面卡。 Bot Framework 提供一些範本和範例,可讓您用來開發自己的 bot。

Bot 邏輯

Bot 物件包含回合的交談式推理或邏輯,並公開 回合處理常式,也就是可以接受來自 bot 介面卡之傳入活動的方法。

SDK 提供幾個不同的範例來管理您的 bot 邏輯。

  • 活動處理常式 會提供事件驅動模型,其中傳入的活動類型和子類型都是事件。 這適用于與使用者進行有限、短暫互動的 bot。
    • 使用 活動處理常式 ,並針對您的 bot 將辨識和回應的每個活動類型或子類型執行處理常式。
    • 使用 小組活動處理常式 來建立可連接到小組頻道的 bot。 (團隊頻道需要 bot 處理某些通道特定的行為。 )
  • 對話方塊程式庫提供以狀態為基礎的模型,以管理長時間執行與使用者的交談。
    • 使用活動處理常式和 元件對話方塊 來進行大部分的連續對話。 如需詳細資訊,請參閱 關於元件和瀑布式對話
    • 使用 對話方塊管理員彈性對話流程 ,可處理更廣泛的使用者互動。 如需詳細資訊,請參閱 適應性對話方塊簡介
  • 執行您自己的 bot 類別,並提供您自己的邏輯來處理每個回合。 請參閱如何 建立您自己的提示,以收集使用者輸入 ,以取得這類內容的範例。

Bot 介面卡

介面卡具有可啟動回合的 處理活動 方法。

  • 它會將要求主體 (要求承載,並轉譯為活動) ,並將要求標頭轉譯為引數。
  • 它會檢查驗證標頭是否有效。
  • 它會建立回合的 內容 物件。
  • 它會透過其 中介軟體 管線來執行此步驟。
  • 它會將活動傳送至 bot 物件的回合處理常式。

介面卡也會:

  • 格式化和傳送回應活動。 這些回應通常是使用者的訊息,但也可以包含使用者通道直接取用的資訊。
  • 顯示 Bot 連接器 REST API 所提供的其他方法,例如 update messagedelete message
  • 攔截不會在回合中攔截到的錯誤或例外狀況。

回合內容

「回合內容」物件會提供活動相關資訊,例如傳送者和接收者、通道、以及處理活動所需的其他資料。 也允許在遍及 Bot 各種階層的回合期間新增資訊。

回合內容是 SDK 中最重要的抽象概念之一。 它不僅會對所有中介軟體元件和應用程式邏輯執行輸入活動,還提供了一種機制,讓中介軟體元件和 bot 邏輯可以傳送輸出活動。

中介軟體

中介軟體就像任何其他傳訊中介軟體,包含一組依序執行的線性元件,可讓每個元件都有機會在活動上運作。 中介軟體管線的最後一個階段是在應用程式已向配接器的 程序活動 方法註冊的 Bot 類別上,回呼回合處理常式。 中介軟體會 針對 介面卡所呼叫的輪流方法執行。

回合處理常式會將回合內容作為其引數,通常在回合處理常式函式內執行的應用程式邏輯會處理輸入活動的內容,並在回應中產生一或多個活動,然後使用回合內容上的 send 活動 函式來傳送這些活動。 對回合內容呼叫「傳送活動」會導致在輸出活動上叫用中介軟體元件。 中介軟體元件會在 bot 的回合處理常式函式之前和之後執行。 執行本質上是嵌套的,因此有時也稱為「繪圖紙」(洋蔥)。

中介軟體主題詳細說明中介軟體。

Bot 狀態和儲存體

如同其他 web 應用程式,bot 原本就是無狀態的。 Bot 內的狀態遵循與新式 web 應用程式相同的架構,而 Bot Framework SDK 提供儲存層和狀態管理抽象概念,讓狀態管理變得更容易。

管理狀態主題描述這些狀態和儲存功能。

訊息端點和布建

一般來說,您的應用程式將需要一個 REST 端點來接收訊息。 此外,也需要根據您決定使用的平臺,為您的 bot 布建資源。

遵循其中一個快速入門 (c #JavaScriptPython) 來建立並測試簡單的 echo bot。

HTTP 詳細資料

活動會透過 HTTP POST 要求從 Bot Framework Service 送達 Bot。 Bot 會以 200 HTTP 狀態碼回應傳入 POST 要求。 從 Bot 傳送至通道的活動,會以個別的 HTTP POST 傳送至 Bot Framework Service。 接著會以 200 HTTP 狀態碼確認。

通訊協定不會指定這些 POST 要求及其通知的發出順序。 不過,為了配合常見的 HTTP 服務架構,這些要求通常為巢狀,表示輸出 HTTP 要求是從輸入 HTTP 要求範圍內的 Bot 提出。 這種模式會在先前的圖表中說明。 由於有兩個不同的背對背 HTTP 連線,所以必須針對兩者提供安全性模型。

注意

Bot 有15秒的時間,可在大多數通道上確認具有狀態200的呼叫。 如果 bot 未在15秒內回應,則會發生 HTTP GatewayTimeout 錯誤 (504) 。

活動處理堆疊

讓我們深入探討先前的順序圖表,並將焦點放在訊息活動的抵達上。

活動處理堆疊

在上述範例中,Bot 使用了包含相同文字訊息的另一個訊息活動回覆訊息活動。 處理會從送達網路伺服器的 HTTP POST 要求 (以 JSON 承載形式隨附活動資訊) 著手。 在 c # 中,這通常是 ASP.NET 專案,在 JavaScript Node.js 專案中,這可能是其中一個熱門架構,例如 Express 或 restify。

「配接器」 (SDK 的整合式元件) 是 SDK 執行階段的核心。 在 HTTP POST 主體中會以 JSON 形式隨附活動。 此 JSON 會還原序列化,以建立 活動 物件,然後透過其 處理活動 方法將其傳遞至介面卡。 接收活動時,配接器會建立「回合內容」並呼叫中介軟體。

如上所述,回合內容會提供 Bot 用以傳送輸出活動的機制,其最常用於回應入活動。 為了達成此目的,回合內容會提供 傳送更新刪除活動 回應方法。 每個回應方法都會以非同步程序執行。

重要

處理主要 Bot 回合的執行緒可在其完成後處置內容物件。 請務必await任何活動呼叫,這樣主要執行緒才能先等候已產生的活動,再結束其正在處理的工作並處置回合內容。 否則,如果回應 (包含其處理常式) 佔用大量時間,並嘗試在內容物件上動作,則可能會取得「內容已處置」 錯誤。

Bot 範本

您需要選擇應用程式的應用層使用;不過,Bot Framework 具有適用于 ASP.NET (c # ) 、restify (JavaScript) 和 >aioHTTP (Python) 的範本和範例。 這份檔是假設您使用上述其中一種平臺,但 SDK 並不需要您所撰寫的。 如需如何存取和安裝範本的指示,請參閱 (c #JavaScriptPython) 快速入門。

Bot 是一種 web 應用程式,而且會針對每個語言版本的 SDK 提供範本。 所有範本都提供預設的端點執行和介面卡。 每個範本都包含:

  • 資源佈建
  • 特定語言的 HTTP 端點執行,可將傳入活動路由傳送至介面卡。
  • 介面卡物件
  • Bot 物件

不同範本類型之間的主要差異在於 bot 物件中。 範本如下:

  • 空白 bot
    • 包含活動處理常式,可讓使用者在交談的第一個回合上傳送 "hello world" 訊息,歡迎使用者進行交談。
  • 回應 Bot
    • 使用活動處理常式歡迎使用者,並回應使用者輸入。
  • 核心 bot
    • 結合了 SDK 的許多功能,並示範 bot 的最佳作法。
    • 使用活動處理常式來歡迎使用者。
    • 使用元件對話方塊和子對話方塊來管理交談。
    • 這些對話方塊會使用 Language Understanding (LUIS) 和 QnA Maker 功能。

其他資訊

管理 bot 資源

Bot 資源 (例如連線服務的應用程式識別碼、密碼、金鑰或祕密) 必須受到適當管理。 如需有關如何這麼做的詳細資訊,請參閱 Bot Framework 安全性指導方針管理 Bot 資源

通道介面卡

SDK 也可讓您使用通道介面卡,其中介面卡本身會額外執行 Bot Connector 服務正常處理通道的工作。

SDK 提供某些語言的一些通道介面卡。 透過 Botkit 和社區存放庫可取得更多通道介面卡。 如需詳細資訊,請參閱 Bot Framework SDK 存放庫的 通道和介面卡表格。

Bot 連接器 REST API

Bot Framework SDK 會在 Bot 連接器 REST API 上進行包裝和建立。 如果您想要瞭解支援 SDK 的基礎 HTTP 要求,請參閱連接器 驗證 和相關文章。 Bot 傳送和接收的活動符合 Bot Framework 活動架構

後續步驟