[Coursera] Blockchain Basics

課程鏈結: 這裡

Blockchain Specialization 系列上課心得

前言:

最近開始決定來清理一下 Coursera 上面積欠的課程,但是也想到竟然有這幾天的假期,不如來好好的學習一些有趣的知識. Ethereum 就是一個我之前一直想好好學習,但是沒有時間可以了解的. 剛好看到 Coursera 也有相關的課程,所以決定把這個系列課程剛好這幾天學習了解.

「Blockchain Basics」 算是比較粗淺的入門課程,並沒有任何的 Programming 的部分,主要是做概念的講解與名次的解釋.

課程內容:

Week1:

基本的 Blockchain 結構:

UTXO

UTXO(Unspent Transaction Output): 結構包含如下

  • Unique identifier of the transaction that created the UTXO
  • Index
  • Value
  • (option): Condition under output can be spent

一個 Transaction 會有 Input UTXO 也會有 Output UTXO,

Genesis Block

Genesis Block 指的是第一筆的交易,不論是 Bitcoin 或是 Ethereum 都有他們的 Block #0 ,我們可以透過以下的工具來查看:

  • Block Explorer: https://blockexplorer.com/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
    • 具有 1 個 transaction
    • Reward: 50
    • Difficulty: 1
    • 時間: 2009 (如果你那時候開始玩.. )
  • EtherScan: https://etherscan.io/block/0
    • 具有 8893 個 transactions
    • 0 個 contract
    • Gas: 5
    • Reward: 5

Week2:

Smart Contracts:

Smart contracts 是透過類似 Solidity 的高階程式語言,寫成一段程式碼可以透過 EVM (Ethereum Virtual Machine) 跑在任何的 ethereum client 上面.

Ethereum 貨幣單位

\[1 Ether = 10^{18} Wei\]

交易產生 Smart Contracts 流程:

每一筆交易可以帶有可執行的程式碼 (smart contracts) ,但是執行該 Smart Contracts 的算力(Gas) 會被反映到手續費裡面.並且有嚴格的 Gas Limit 來掌控一個 Block 所能使用的上限.

節點功用:

  • Full node:
    • 交易的啟動,認證
    • 挖礦
    • 區塊的建立
    • 智能合約的執行
  • Minor node:
    • 接收,驗證並且執行交易

Gas Point:

Gas Point 是給所有節點為了執行 Smart Contract 的手續費,計算範例如下:

  • Step: 1
  • Load from memory: 20
  • Store into memory: 100
  • Transaction base fee: 21000
  • Contract creation: 53000

如果 Gas Point 不夠或是消耗完了,該筆交易就會被取消.

Mining incentive model

Prove of work puzzle winner 拿到所有的 Block reward ,但是緊接在後面的 miner 叫做 Ommer miner .而它們挖出來的 Block 也會放著作為 Security check 之死,並且拿到一小筆的 reward.

Ethereum Accounts:

  • EOA(Externally owned account): 透過一組 PK (private key) 來代表你是帳號擁有者,並且可以執行相關操作.
  • Contract: 透過相關 smart contract 的 code 來控制的帳號.

Block creation sequence

  • 交易開始
  • 交易認證 (Validation)
  • 交易綁定與廣播
  • PoW 解決 Puzzle
  • 增加新的 Block 到鍊上

Refer: Life cycle of ethereum transaction

Week 3:

ECC (Elliptic curve cryptographyphy)

Strong than RSA,

256 bits ECC key pair ~= 3072 bits RSA key pair 

Hash function

  • Simple Hashing:
    • Fixed number of items (block header)
  • Tree hashing:
    • Number of items differ from block to block

All hashing output:

  • Account address
  • Digital signiatures
  • State hash
  • Receipt hash

如何保證 block 的一致性 (Integrity)

  • 不可串改的 block header
  • Transaction 不可被串改
  • State 的移轉是透過計算Hash 編碼並且認證過的

Bitcoin 與 Ethereum 都是透過 SHA-3 演算法 Keccak 來作加密

Bitcoin 如何計算這個 block 的 hash value? 需要以下資訊:

  • Previous block hash
  • Version
  • Merkle Root Hash
  • Timestamp
  • Bits
  • Nonce

參考網址: https://cse.buffalo.edu/blockchain/blockhash.html

Ethereum Merkle Tree

用來作用比對交易的一致性 (integrity), leaf node 存放交易(transaction)的資料. Parent node 則存放該子結點的 Hash Value. 而 Root node 存放所有交易的 Hash Value. 這樣做的好處有:

  • 一致性檢查: 所有的 Hash value 環環相扣,不容易被人輕易修改.
  • 修改少: 如果一筆交易有修改,要修改得資料只有由這個子結點一路到 root node

參考:

  • https://www.youtube.com/watch?v=h1wzzhkHfTk
  • https://bitcoin.stackexchange.com/questions/10479/what-is-the-merkle-root

Week4:

Trust Trail flow:

  • 驗證Transaction
  • 驗證 gas 跟 資源(resources)
  • 選擇一群交易 (transactions) 來建立新的 block
  • 執行該 Transaction 來取得新的狀態 (state)
  • 建置一個新 block
  • 通過 consensus 驗證
  • 將 block 加入到 chain 的最尾端

Consensus of blockchain

  • https://www.coindesk.com/short-guide-blockchain-consensus-protocols/
  • https://blog.wavesplatform.com/review-of-blockchain-consensus-mechanisms-f575afae38f2

Double Spending

  • 指的是有兩個 block 在非常接近的時間產生出來.這樣的話兩個 block 會同時連接到 main chain 產生兩條 chain . 但是之後比較長的 子鍊 會取代成為主鍊

  • Ethereum 透過 Global nonce 跟 account number 來解決這樣的問題.

PoW v.s. PoS

這段影片很簡單扼要

簡單記錄一下:

  • Proof -of-Work: (Bitcoin, Ethereum ( 主鍊))
    • Miner 透過消耗算力來解開 puzzle ,驗證是否為適合的 block.
    • Miner 得到相對應的 reward
    • 風險:
      • 51% 攻擊,當有人能夠集結 51% 以上的算力的時候就可以偽造資料,修改 main chain
  • Proof-of-Stake: (目前用在 Ethereum testnet)
    • 所有總資產一開始就存在,而每筆交易需要手續費(賭注)
    • 沒有人負責 mine block 而是作為 validate block
    • 每個人都可以附上一筆手續費來提升自己被選為下一個 block 的費用(賭注)
    • 風險:
      • 只要有人能夠拿出 51% 的錢當手續費,就有機會攻擊.這部分有更多論文正在討論.

Forks:

  • Soft fork: Software patch
  • Hard fork: Protocol change which introduce two chain could not merged.

Soft-fork in Bitcoin

Bitcoin 有過一次 Soft-fork for P2SH Script ( pay-to-script-hash script) refer here https://bitcoin.org/en/developer-guide#p2sh-scripts

Hard-fork in Ethereum (Ethereum Homestead –> Ethereum Metropolis)

包括了以下的 EIP (Ethereum Improvement Proposal):

  • Parallel processing of transactions
  • Proof-Of-Works consesnsus still stay except that every hundren blocks, Proof-of-stake consensus protocol is applied for evaluating latter.
  • Miner incentive was reduce from 5 Ethers to 3 Ethers.

Final Course Project

最後的作業,會讓你跑一個本地端的 VM 內建已經安裝好的 Ethereum client (geth) .並且跑一系列動作新建節點,連線,挖礦,交易.簡單但是可以馬上感受到 Ethereum 的完整感受.

Reference:

  • http://www.takethiscourse.net/blockchain-online-courses-moocs/
  • https://medium.com/blockchannel/life-cycle-of-an-ethereum-transaction-e5c66bae0f6e
  • https://github.com/ethereum/wiki/wiki/Ethereum-Development-Tutorial
  • https://cse.buffalo.edu/blockchain/blockhash.html
  • https://medium.com/@fukuball

[好書分享] 征服世界是可能的嗎?

前言:

最近把一些之前沒看完的書開始拿出來讀完,這一本就是在閒暇時間拿來消遣用的書.但是雖然最近 Kobo 大幅度特價來台灣打廣告,我還是喜歡紙本的書啊(書櫃表示滿了..)

這一本不諱言當初是因為封面的比克大魔王 而買下來的,但是其實內容相當有趣所以當初也是一次幾乎都看完了.一直到了最近才有時間去寫讀書心得.這系列其實跟「空想科學讀本」系列很像,屬於幻想的科學系列.但是作者們都用很嚴謹的角度來看待當初埋藏在各位心裡的奇怪想法.

tldr: 如果你沒有看過以下的漫畫讀物,強烈建議你「不」要買這本書來看.因為作者 岡田斗司夫 是動畫公司的創辦人,並且是美少女夢工廠當初創辦的公司. 裡面的範例也超級「宅」 ,如果是愛看漫畫的人或許可以完全融入作者的幻想科學裡.

內容簡介:

「征服世界」 已經忘記有多少動漫畫的反派夢想似乎都是這個,透過征服世界來達到自己的夢想.這本書也很有趣的由這裡展開.本來只是作者 岡田斗司夫 在暑假一個有趣的研究的分享,「一起征服世界吧」的演講. 卻被出版社聯絡,決定要出了這本有趣的書. 不過作者也不是泛泛之輩,他就認真的開始分析各個動漫反派的動機與方法論.整本書的架構如下:

征服世界的目的是?

一開始作者先透過一些動漫角色 「假面騎士」還有「北斗神拳」裡面的來分析這些反派為何要征服世界.每個人都有不同的目的:

  • 消滅人類: 宇宙戰艦大和號- 科美拉星人
  • 我要錢
  • 老是被人管,想要統治別人
  • 推廣邪惡: 這個酷了吧? 竟然是七龍珠裡面的比克大魔王

哪類的統治者?

這邊就統治者(也就是我們說的大反派)來分析他們的人個特性,你看是不是相當認真.

想要征服世界的大反派,其實分成四型:

  • 魔王型
  • 獨裁者型
  • 昏君型
  • 幕後黑手型

那麼如何征服世界呢?

這邊就認真的討論,如果真的想要征服世界的人該如準備?

  • 設定目的
  • 確保人才
  • 調度資金
  • 作戰計畫管理及肅清屬下
  • 征服世界之後(繼承人問題)

真正有可能征服世界嗎?

這個章節也認真的討論(但是還是舉了很多動漫的例子)征服世界的好處,還有統治世界的重點.

心得:

這本是相當適合當作休閒刊物,當然前提你還是要有相當程度的「宅」才能看懂裡面所舉的範例.作為一個放鬆毒物其實相當的棒.但是除了動漫的角色之外,也是可以看到作者對於歷史與人類管理相關的演進過程有一定程度的研究.有許多相關內容也潛移默化的導入到有趣的範例內.

[好書分享] 知識內容寫作課:寫一篇真材實料的網路爆紅好文章 - 從資訊業來思考

前言:

這本書其實已經看完幾個禮拜了,不過一直到這幾天放長假(?) 之後才有時間來寫. 這一本書是 Redhat 的大大提供建議的好書.雖然書名跟摘要會讓人覺得好像跟資訊技術人員沒有關係,但是裡面的內容其實都是通用的.讀完之後覺得有滿多地方可以推薦給大家.同時我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式.

其實我經常在演討會的摘要或是投影片上面都有運用到相關技巧,也歡迎大家相互討論指教.

內容簡介:

這本書是泛科學總編輯與泛科知識公司的知識長-鄭國威所撰寫的書.主要就是敘述他如何讓泛科學 這樣介紹科學的知識網站如何獲得大眾的青睞. 如何透過「有趣」並且吸引人的內容來讓更多人了解艱澀的科普知識.

整本書的內容圍繞在三個大流程:

  • 如何寫出受人歡迎的知識內容? (知識寫作的九宮格)
  • 如何宣傳你的知識文章
  • 建立個人知識品牌

接下來就簡單介紹一下這本書裡面的內容,希望會讓大家更欣賞這本書.我會一併轉換到資訊技術人員來說,該怎麼去改善自身的撰寫方式.

如何寫出受人歡迎的知識內容? (知識寫作的九宮格)

知識寫作的九宮格是一個工具,幫助你將你的知識鋪成文字並且吸引人來吸收.一個良好的知識需要足夠吸引人的文字來架構,並且需要有足夠好的內容與標題吸引人來閱讀.

1. 熱點:

透過流行文化與名人的話題來吸引人進來,對於資訊相關的知識而言.比如說最近的支付話題相當的盛行,不論是 Line 一卡通的新聞或是麥當勞大麥克之亂的都是很適合拿來寫作並且你腦袋裡面的知識帶入到文字之中.

2. 場景:

透過令人熟悉的故事,場景或是時空來讓讀者更容易吸收一些知識. 比如說透過 棋靈王 吸引人來聽 AlphaGo 甚至是 Tensorflow. 透過 Pokemon Go 的圖片與熱潮來解釋 Kubernetes 如何自動化擴展節點的優點都是.

3. 誰:

你的文章想要寫給誰看? 你的演講想要對誰說? 這個場地大多是哪一些人? 都是我每次一到了演講會場都會花時間去了解的. 如果是 ModernWeb 的場子,大多會是前端的人才, COSCUP 大多會是學生而各種不同的 Conference 都會充滿著各行各業的人. 「你如何透過他們的語言」將你的知識解釋給他們聽? 才是講者真正的功夫.

4. 為什麼? 怎麼做?

先建立好整篇文章(演講)的情境後,接下來就是你要文字(演講)的架構. 為什麼就會是一個很重要的問題,因為你的整篇文章都是圍繞著這個為什麼?

為什麼: 就是讓使用者省思,並且吸引他跟你一樣的思考

以下提供一些我過往的例子:

  • 因為聊天機器人只會回答一般的文字,所以我們希望能幫他加上人工智慧
  • 經常在外面看到一些物品不知道叫什麼名字? 幫你的聊天機器人加上 ImageNet 的人工智慧吧

這些都是「為什麼」你要怎麼做,他是一個 hook 可以鉤住讀者的目光.依照你的脈絡來開始閱讀你的文字.

而怎麼做就是比較有趣的部分,很多時候大家很急著把結果快速地寫出來.對於資訊相關人員而言,直接破題告訴你怎麼解決問題是沒有任何意義的. 因為必須要寫出來如何找到問題點,甚至如果能寫出 debug 的整個流程都是相當的好的.

5. 結果:

對於一般科學而言,這裡提到的是數據,歷史與結論.但是對於資訊從業人員而言,這裡可能就是某些解決方式或是某種現象. 比如說, 使用 Tensorflow 的訓練流程,透過 Kubernetes 來部屬你的服務方式.

6. 展望:

這個部分主要是討論在文章的後端,需要呼應到你一開始的「為什麼?」這個部份.對於資訊人員,舉例而言:了解了如何透過 K8S 來部屬你的服務之後,你必須馬上在文章的末端再給他加強印象.你可以透過 K8S 逐步將你手邊的應用程式方便的部屬,並且有 OOXX 的優點.

這個方式可以再三給讀者強烈的印象,前後呼應並且讓他深刻了解.

7. 感受:

連接者「展望」,讀者再三地強調「為什麼?」而做之後.就需要知道你希望他們產生的相關行動.一篇教導打造聊天機器人的文章,當然就希望讀者自己動作來寫一個.一個 K8S 部署的文章,會告訴讀者可以從哪個方向入手.

8. 參考資料:

這是我很習慣的部分,但是不少寫作的朋友可能都會忘記.附上相關鏈結可以補足你可能遺漏的部分.更可以讓讀者可以去閱讀更多的相關資料.也同時是鼓勵讀者回來回饋,如果有錯誤的話? :p

9. 圖文影音:

這部分屬於觀感部分,人類對於文字的吸收與記憶能力不如圖文與影音.所以可以的話,儘量加上一些圖片可以幫助讀者放鬆.

如何宣傳你的知識文章

文章寫好了,該如何宣傳你的文章? 這邊有幾個很值得分享的內容,你需要「三種關鍵角色來幫你推廣」:

連接者:

如果一篇 DevOps 的文章能夠放在 DevOps 社群的話,當然可以得到更多的讀者共鳴. 所以一個好的文章也需要好的地方「投放」.

專家:

如果你寫了一篇好的文章,你恰巧認識相關領域的專家.可以請他們幫你推薦.一本好的書,一定要能找到專家來寫序或是推薦文.可以為你的知識站台加分.

推銷員:

這邊講的不是像 Sales 那種推銷員,而是很喜歡分享內容的人.透過這樣的人可以讓你的文章獲得更多人的目光.更有可能他們還可能透過一些註解讓你的文章更吸引人進來. (ex: retweet, 臉書分享…)

建立個人知識品牌

這裡有建議的三個階段,快速的整理一下:

熱門平台做可行性測試:

透過 臉書, Twitter 上面直接寫文章的前言.來測試人們對妳話題的感興趣程度.如果很熱門,就可以放更多的心思將它完成.

建立自己渠道:

建立自己獨有的管道,不論是部落格,臉書粉絲頁面,或是社團討論區都可以.你需要建立自己在相關群組人裡面的專業形象.

與其他人合作:

不論是透過其他的社群,其他的討論版面.適當的擴大你的讀者群,是個重要的方向.你需要不僅僅讓你圈圈的人喜歡閱讀你的內容,更要讓不了解你領域的人試著閱讀你的文章.

心得:

這本書真的很棒,雖然大部分的內容都是筆者在通用科學與歷史偏重的泛科學的例子.但是我在閱讀的時候一直都轉換成資訊相關的內容,吸收起來格外的好.希望各位在讀的時候也能有一樣的感受.

[TIL][Golang] 修復 Golang BLE 在 MacOSX High Sierra 上面的問題

前言

Beacon 是具有藍芽連線的小裝置,通常裡面的格式為 Apple 的 iBeacon 或是 Google 的 Eddystone . 一般而言,要開發 Beacon 的話比較好的方式就是架設一個 Raspberry Pi 然後在裡面灌起來相關的藍芽模擬.但是如果你想要在 MacOSX 上面寫 Beacon 模擬程式的話,大部分的人都會使用 Bleno 一套由 nodejs 開發出來的藍芽套件. 支援夠好又熱門.

Golang 是很方便的語言,不論是寫在後端或是系統上來說.當然我也會想說來寫寫一些測試 beacon 範例的. 三年前,我曾經寫了這篇文章 Golang BLE Eddystone 初體驗(包含Beacon模擬器) 的文章.但是事隔三年之後,由於 Mac OSX 的系統更新,整個部分已經無法正常運行,需要做修改.

在 Golang 上面要使用藍牙的相關工具,大部分人都是使用 paypal 所開源的 PayPal/gatt ,但是那個套件兩年沒有維護了.以下會簡單記錄一下出了哪些問題.

tldr: PayPal/gatt 已經沒有在維護這個軟體.. Golang 要寫藍牙請用 https://github.com/go-ble/ble

Mac OSX 改了什麼

首先 Mac 在 High Sierra 上面將藍牙設備名稱改名字(為何要這樣做?) 原本的名字是 com.apple.blued 但是到了 High Sierra 就改成 com.apple.bluetoothd

這樣導致了 PayPal/gatt 的 golang 套件無法順利運行.其實在 nodejs 的套件上面馬上就跟上了這個部分( nodejs bleno fixed )

Paypal/GATT 已經沒有在維護

回過頭來的老問題,這些問題其實不能解決也不難維護.但是 PayPal/gatt 由於沒有在維護了.其實相當的困難繼續開發,而且許多 fork 出來的專案似乎也沒有比較解決大部分的問題.

換 go-ble/ble

換過去整個流程還算簡單, go-ble 提供 Advertisement 跟 iBeaconAdvertisement.方便提供相關的轉換.

參考

  1. paypal/gatt issue: Examples issue “Go pointer to Go pointer”
    1. ` GODEBUG=cgocheck=0 ./server`
  2. currantlabs/ble issue: Not working on macOS High Sierra
    1. Unhandled event: xpc.Dict{"kCBMsgId":4, "kCBMsgArgs":xpc.Dict{"kCBMsgArgState":5}}
  3. Tracking macOS High Sierra Support

[NodeJS][Golang] 玩玩看 LINE Beacon

前言

上週五去參加了 LINE 的技術者聚會活動,也同時聽到如何透過 LINE Beacon 來跟 LINE Bot 結合.於是決定把整個官方範例串接起來,並且將整個流程寫的更容易了解.

LineBot Beacon 流程

在這個流程圖裡面,你可以看到整個流程有一點小複雜:

  • 首先使用者的手機接受到 Beacon 的訊號後,手機會將藍牙訊號傳送到 LINE App
  • LINE App 收到後,發送 Beacon hardware ID 給 LINE Server
  • LINE Server 根據 hardware ID 轉發給相關的 LINE Bot (也附上該使用者的 token)
  • 這時候 LINE Bot Webhook 就會收到使用者發送一個 beacon 的 event
  • 跟據不同 Beacon ID 跟 Event (Enter/Leave) 來定義不同的反應方式

根據這樣的流程,可以知道以下幾件事情:

  • Beacon 的控制的事情其實有限 (Enter/Leave)
  • Beacon event 本身提供訊息也只有以下的部分
string Msg         //beacon string
string type        //beacon type
string hardware ID //beacon hardware ID to determine b

根據這些訊息,其實還是能做出很多有趣的運用就要看各位如何發揮想像力.

沒有 LINE Beacon 可以測試? 先試試看官方 nodejs 範例

官方範例: https://github.com/line/line-simple-beacon

node 10 的 MacOSX 藍芽上似乎有問題

先來透過官方範例來看看,結果似乎有點問題 (20180825):

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'xpc-connection'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/Users/Evan/src/go/src/github.com/kkdai/line-simple-beacon/tools/line-simplebeacon-nodejs-sample/node_modules/bleno/lib/mac/highsierra.js:10:21)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

跟工程師討論的結果,似乎 node10 再 xpc-connection (也就是要跑 mac 藍牙的這個部分) 所以可能還是要使用 node8 是比較穩定的.

那來幫 nodejs 降版吧

如果你跟我一樣使用 Homebrew 作為套件的管理系統,那麼從 node10 降板到 node8 的方式如下.

brew uninstall        //uninstall node10
brew install node@8   //install node8

這裡要注意,如果以之前有透過 npm 安裝的部分.最好砍掉重新安裝比較穩定.

LINE Beacon 綁定在 LINE Bot 上

首先先到 LINE@ Manager 來建立開發者帳號 (developer trial) 的 Beacon Hardware ID

記得要將你的號碼掛在你需要附屬的 LINE Bot 上面.

LINE Bot 上面的相關修改

你必須要在你的相對應的 LINE Bot 上面做了以下的修改,才能讓你的 LINE Bot 在收到 LINE Beacon 訊息的時候給予適當的提醒.

這只是一個最簡單的 code ,但是主要可以顯示出來 Beacon 會傳來 Enter 的 Event 。 (請注意 Leave event 已經於 2019 deprecated)

參考鏈結

  1. https://developers.line.me/en/docs/messaging-api/using-beacons/
  2. https://developers.line.me/en/reference/messaging-api/#beacon-event

[Golang][LineBot][2018 更新部分] 透過微軟的語言學習服務 LUIS 架設具有 AI 對話的聊天機器人

前言:

這篇文章其實講解了兩年前為了去 COSCUP 弄的專案(https://github.com/kkdai/LineBotBabyLuis) ,因為當初其實也沒有花太多時間講解開發的內容. 並且也沒有講解如何實現.

如果有興趣當初演講內容的話,可以查看以下兩份投影片:

這篇文章主要講解最近一週,為了讓這個機器人復原所做的一些修改的部分.並且補充了 LineBotLUIS 的執行循序圖,希望讓有興趣的人能夠更清楚的了解.

關於 LineBotLUIS 的簡單介紹:

LineBotLUIS (https://github.com/kkdai/LineBotBabyLuis) 主要是兩年前開發的實驗性質產品.那時候想要結合 NLP 學習的 AI 引擎 (MSFT LUIS) 並且透過 LineBot 的交互式對談的方式,能夠讓這個機器人做到自我學習.

整個機器人就是模擬一個小孩子啞啞學語機器人,大致上流程如下.細節可以再看(循序圖):

  • 輸入小孩子講的話語 (e.g. shi shi, mi~ mi~, ㄋㄞ ㄋ ㄞ ..)
  • 如果她已經學會了,他會告訴你以往的意圖.如果不會它會問你說這句話的意圖是什麼
  • 你可以從 抱抱,牛奶,奶嘴或是玩具之中選擇一個小孩子可能的意圖.(可能就是你了解你小孩子想什麼之後)
  • 然後透過 LUIS 就會學習到,並且之後打出類似的話語就會辨識出來小孩子的意圖.

聽起來很神奇?其實並不難…

架構與近期修改的部分:

這個部分除了 LineBot Webhook (https://github.com/kkdai/LineBotBabyLuis) 的相關處理外,另外還有一個要處理 LUIS API 的 LUIS SDK .這邊是透過我兩年前開發的套件 (https://github.com/kkdai/luis) ,並且也於日前將 API 升級到了 2.0 .

其實本來也沒有太大問題,不過主要是因為微軟日前已經將 LUIS 1.0 API deprecated 掉了.導致我必須將相關的 API 服務都改成 2.0 的服務.

最後, LineBot SDK 也有一些改動.兩年前的 Token 傳遞方式也有變動,造成我必須更新 LineBot Go SDK 的版本之外,其實他們對於 PostAction 的反應也有修改.這邊也會稍微提一下.

關於 LUIS v2.0 修改的部分:

講到 LUIS,就是微軟開發的語意學習引擎 (luis.ai),他將每一句會區分為 Intent(意圖)Entity (物件) .而學習出來的機器模型會根據你輸入的 utterance(話語) 來 Predict(預測) 你的意圖.

先來提提 LUIS 改變到 v2.0 API 的相關修改:

  • Training 跟 Publish 分開來,Training 後必須要 Publish 才能讓你的 Prediction 拿到最新的資料.
  • Prediction 的 API 網址有變動.這邊比較奇怪的是,他不像是一般的 API 從 1.0 換到 2.0 而是整個網址換掉.並且跟其他的 API entrypoint 都不一樣.
  • 其他還有就是要加入 Intent 變得更加的麻煩,不過還好 LineBotLUIS 本身並沒有提供新增 Intent 的方式.

關於 LineBot SDK 的更新:

那回過頭來談談,這一年多來其實 LineBot Go SDK (https://github.com/line/line-bot-sdk-go) 也有一些修改.加上 Line Bot Webhook 的 calling sequence 也有一些些修改如下.

  • Token 的存放位置有變,這邊並不需要改 code ,你只需要更新 Line-Bot-SDK-Go 套件就可以了.
  • 對於 PostAction 的回覆,之前只會傳回一個 Message Event 為 EventTypePostback .更改過後,會傳兩個進來.一個為原有的 EventTypePostback ,又多傳一個 TextMessage. 根據官方部落格文章 開發LINE聊天機器人不可不知的十件事 ,可以了解官方建議你如果要設定 PostAction 的文字,就必須要設定一個無法再 TextMessage 裡面產生作用的特殊字元組合. (e.g. [我要喝牛奶mileQQ~~~]) 類似..

LineBotLUIS 的學習循序圖 (Sequence Diagram):

以上是如何讓 LUIS LineBOT 學習的循序圖,幾個重點可以跟大家分享一下.

  • 使用者輸入任意的文字
  • 如果是 LUIS model 不認識的,或是無法找到最高分的意圖(intent)
  • 這時候就會透過 LineBot Webhook 傳回 Post Action 也就是會顯示目前系統本來就有的意圖(intent)來讓使用者選擇
  • 這時候使用者選擇相對應的意圖後,馬上就會加入該話語到意圖中.並且啟動訓練(training),這就是故意要造成 Streaming Learning 的狀態.
  • 除了要 Training 之外,還要馬上將訓練好的模型發布(publish)出來.讓下一次輸入類似的話語就會找到相對應的意圖.

找得到的循序圖就相對應的簡單,只要找到相對應的意圖馬上就回覆給使用者.

待續

LineBotLUIS 透過呼叫微軟的 LUIS 人工智慧學習引擎,企圖製造出一個會學習的簡單機器人.並且透過 LUIS 似乎也可以打造出一個雖然沒有任何資料庫,但是也不會因為 Heroku 而會重新開始的學習機器人.