带有Oracle Digital Assistant和Fn Project的会话式UI
在這里和那里,我們看到許多預測,很快聊天機器人將在用戶與其系統之間的通信中扮演關鍵角色。 我沒有水晶球,也不想等待這個“很快”,所以我決定現在就使這些預言成真,看看它的樣子。
我正在工作的公司的標志產品是FlexDeploy ,它是一種完全自動化的DevOps解決方案。 FlexDeploy中最流行的活動之一是創建一個發行快照,該快照實際上會構建所有可部署的工件,并使用管道在環境之間部署它們。
因此,我決定在周末玩得開心,并為此操作實現了一個對話式UI,可以與FlexDeploy進行對話 。 從字面上看 。 在工作結束時,我的家人看到我正在和筆記本電腦聊天,他們可以聽到類似的聲音:
“ Calypso!” 我說。
“嗨,我能為您提供什么幫助?” 就是答案。
“不確定”我測試了她。
“你在開玩笑吧!” 她明白了。
“您可以建立快照嗎?” 我問。
“當然,您在想什么版本?”
“ 1001”
她報告說: “為版本1001創建了快照” 。
“謝謝”
“今天過得愉快。”她松了一口氣。
因此,基本上,我將實現以下圖表:
作為UI的核心組件,我使用了全新的Oracle產品Oracle Digital Assistant 。 我建立了一種新的技能,可以進行基本的聊天,并實現了一個新的自定義 組件,因此我的機器人可以調用http請求,以使后端系統創建快照。 FlexDeployBot技能以及自定義組件的Node.js源代碼的導出
在本文的GitHub 存儲庫中可以使用custombotcomponent 。
我將MacBook用作能夠聽和說的通信設備,并為機器人定義了一個Webhook 通道 ,以便可以向其發送消息并獲得帶有響應的回調。
在上面的圖上看起來很簡單。 唯一的問題是,我想將我的聊天機器人的大腦與通信設備的詳細信息以及后端系統FlexDeploy的安裝/版本的詳細信息分離。 我需要一個中間的API層,一個緩沖區,在ODA和外部世界之間放置一些東西。 看起來無服務器功能非常適合這項工作。
作為無服務器平臺,我使用了Fn Project 。 它的優點在于,它是一個完全基于Docker容器的無容器平臺的無服務器平臺,它可以輕松地在我的筆記本電腦(我在本文中所做的工作)或在云中的某個地方(例如在Oracle Kubernetes Engine上) 本地運行 。
好的,讓我們從圖的左到右深入了解實現細節。
因此, 偵聽器組件,耳朵,可以識別我的語音并將其轉換為文本的組件是使用Python實現的:
該組件的關鍵代碼片段如下所示(完整的源代碼可在GitHub上找到 ):
r = sr.Recognizer() mic = sr.Microphone()with mic as source:r.energy_threshold = 2000while True: ?try:with mic as source: audio = r.listen(source, phrase_time_limit=5) ? ? ? ? ? transcript = r.recognize_google(audio)print(transcript)if active:requests.post(url = URL, data = transcript)time.sleep(5)except sr.UnknownValueError:print("Sorry, I don't understand you")為什么是Python ? 有很多可用的Python語音識別庫,因此您可以使用它們,并選擇一個更了解您的口音的庫。 我喜歡Python。
因此,一旦聽眾識別出我的語音,它將調用Fn函數,將該短語作為請求主體傳遞。
函數sendToBotFn是通過Node.js實現的:
function buildSignatureHeader(buf, channelSecretKey) {return 'sha256=' + buildSignature(buf, channelSecretKey); }function buildSignature(buf, channelSecretKey) {const hmac = crypto.createHmac('sha256', Buffer.from(channelSecretKey, 'utf8'));hmac.update(buf);return hmac.digest('hex'); }function performRequest(headers, data) {var dataString = JSON.stringify(data);var options = {body: dataString,headers: headers};request('POST', host+endpoint, options); ? ? ? ? ? ? }function sendMessage(message) {let messagePayload = {type: 'text',text: message}let messageToBot = {userId: userId,messagePayload: messagePayload}let body = Buffer.from(JSON.stringify(messageToBot), 'utf8');let headers = {};headers['Content-Type'] = 'application/json; charset=utf-8';headers['X-Hub-Signature'] = buildSignatureHeader(body, channelKey);performRequest(headers, messageToBot); ? }fdk.handle(function(input){ sendMessage(input); return input; })為什么選擇Node.js? 不是因為我喜歡。 不。這是因為有關實現自定義Web掛鉤通道的 Oracle文檔是指Node.js。 他們喜歡。
當聊天機器人響應時,它正在調用Webhook,該Webhook指的是在筆記本電腦上運行的Fn函數receiveFromBotFn 。
我使用ngrok隧道將偵聽localhost:8080的Fn應用程序公開到Internet。 receiveFromBotFn函數也通過Node.js實現:
該功能將http請求發送到在本地運行并監聽4390端口的簡單Web服務器。
我必須承認,使用Node.js實現類似的事情非常容易。 Web服務器使用Mac OS X本機實用程序說出請求正文中出現的所有內容:
var http = require('http'); const exec = require("child_process").exec const request = require('sync-request');http.createServer(function (req, res) {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => { ? ? ? exec('say '+body, (error, stdout, stderr) => {});? ? ? ?res.end('ok');});res.end();}).listen(4390);為了實際調用后端來創建一個快照與FlexDeploy與custombotcomponent的Fn功能createSnapshotFn的聊天機器人所調用:
fdk.handle(function(input){var res=request('POST',fd_url+'/flexdeploy/rest/v1/releases/'+input+'/snapshot', {json: {action : 'createSnapshot'},});return JSON.parse(res.getBody('utf8')); })該函數很簡單,它只是調用FlexDeploy REST API來開始為給定版本構建快照。 它也可以用Node.js實現,但是我將用Java重寫它。 我愛Java。 此外,我將實現一個Fn Flow ,而不是一個簡單的函數,該流程首先檢查給定的發行版是否存在以及該發行版是否有效,然后才為該發行版調用createSnapshotFn函數。 在下一篇文章中。
而已!
翻譯自: https://www.javacodegeeks.com/2018/12/conversational-assistant-fn-project.html
總結
以上是生活随笔為你收集整理的带有Oracle Digital Assistant和Fn Project的会话式UI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux序列号查询命令(linux 序
- 下一篇: 楚留香安卓和苹果互通吗(楚留香安卓苹果互