Saturday, August 27, 2016

Hướng dẫn viết ứng dụng ChatBot trên Facebook Messenger bằng node.js (Phần 2)

Trong phần 1 mình có giới thiệu sơ các bạn các bước để viết ứng dụng ChatBot trên Cloud9. Cloud 9 rất tiện khi bạn viết code trên đó giữa nhiều người có thể cùng sửa trên cùng 1 file mà không bị vấn đề gì, nhưng hiện tại mình sử dụng tài khoản free nên gặp vấn đề là khi chạy 1 thời gian thì cloud đó bị sleep và ứng dụng mình đang start bị treo và xài không được nữa, vì thế mỗi lần như vậy phải start lại. Do đó cloud9 chỉ giúp các bạn khi đang phát triển ứng và chạy thử code để test trong thời gian ngắn thôi.

Hôm nay mình hướng dẫn các bạn tự start server ở localhost và dùng ngrok để public server localhost ra bên ngoài.

ngrok là gì?

ngrok là một reserse proxy nó cho phép tạo một secure tunnel từ một public endpoint đến web service đang chạy ở local. Cơ chế của nó rất đơn giản khi bạn start ngrok lên sẽ cung cấp cho bạn 2 url: http và https. Khi bạn truy suất theo những url đó thì nó sẽ chuyển đến webserver mà bạn đang start ở local theo đúng port mà bạn đã start web server và ngrok. Hình minh họa ở bên dưới:

Cài đặt ngrok:

- Bạn vào trang download của ngrok tải bản nào phù hợp với máy của bạn đang dùng.
- Sau đó unzip gói đó ra.
- Mở terminal và cd đến thư mục đã được unzip của ngrok.
- Rồi đánh đoạn lệnh sau để lắng nghe port 4000:
> ./ngrok http 4000
Sau khi start ngrok xong sẽ có giao diện như sau:
Bạn đừng đóng tab này, nếu muốn chạy web service thì mở thêm tab mới.

Để chạy được node.js thì bạn phải cài node.js thông qua nvm (Node Version Manager) hoặc brew cũng được, mình thấy nên dùng nvm cho chính thống của node vì cài thông qua brew đôi khi version không được update mới cho lắm. Cài đặt nvm và node tương đối dễ.

Cài đặt NVM và node 6.x:

- Bạn mở terminal và đánh lệnh sau vào:
> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.6/install.sh | bash
- Sau đó bạn đánh lệnh sau để mở file bash_profile:
> vi ~/.bash_profile
Copy môi trường của nvm vào trong file bash_profile:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
Sau đó gọi lệnh reload lại bash_profile:
> source ~/.bash_profile
- Để cài node bằng nvm thì bạn chỉ cần gõ lệnh sau:
> nvm install node
Sau khi cài đặt xong bạn dùng lệnh 'node -v' và 'npm -v' để kiểm tra version của node và npm bạn vừa mới cài đặt:
Thông thường thì sẽ cài version mới nhất của node, bạn có thể tải version theo mong muốn như 5.x hay 4.x về cũng được.

Bây giờ đã xong phần cài đặt những tool cần thiết để bạn có thể start 1 web server tương tác với Messenger của Facebook. Phần tiếp theo mình sẽ nói tiếp đến AI mà trước kia mình nói để giúp con Bot của mình thông minh hơn.

AI là gì ?

AI là từ viết tắt của Artificial Intelligence, nó được gọi là trí tuệ nhân tạo cho những máy móc. Bạn có thể đọc chi tiết trong wiki. Và AI mình đề cập trong ngôn ngữ và nó được gọi là Natural Language Processing, xử lý ngôn ngữ tự nhiên để dạy cho máy có thể phản hồi lại đúng những mệnh lệnh (bằng giọng nói hay văn bản) mà bạn đã dạy trước đó. Công nghệ này cũng đang phát triển trên những con robot và phạm vi mình ứng dụng là trên Messenger để tạo 1 con bot tự động trả lời 1 cách thông minh với người. Thực chất ra những tool này đang phát triển vì thế thông minh hay không là do bộ dữ liệu mà bạn dạy cho nó có đủ lớn và cover hết những trường hợp để nó biết và xử lý đúng.

Hiện tại có rất nhiều công ty đang viết về xử lý ngôn ngữ tự nhiên như Google, Facebook, ...
  - Google có 1 sản phẩm tên Cloud Natural Language API. Cũng chỉ đang ở giai đoạn Beta những mình đánh giá sơ thì sản phẩm của Google cũng rất tốt. Các bạn muốn tìm hiểu có thể xem thêm những tài liệu của Google về sản phẩm này.
  - Facebook thì mới mua wit.ai (hình như với giá 3 triệu đô mỹ) và đang phát triển chúng theo dạng open source như github. Với tài khoản free thì wit cho phép private 1 project, còn những project kia phải public để đóng góp dữ liệu cho cộng đồng open source, và Facebook cũng có chính sách và quyền sử dụng dữ liệu của mình để giúp Facebook phát triển dữ liệu mặc định của hệ thống cho hoàn chỉnh và lớn mạnh.
+ Những dữ liệu public mẫu các bạn có thể xem qua tại đây.
+ Những sản phẩm demo trên những robot hay ứng dụng mẫu các bạn có thể xem qua tại đây.
Hiện tại sản phẩm này cũng đang giai đoạn Beta và còn nhiều vấn đề gặp phải, mình sử dụng nó cũng rất khó khăn. Nhưng mình đánh giá tiềm năng phát triển sau này của wit cũng khá cao và mình học được rất nhiều khái niệm về xử lý ngôn ngữ tự nhiên từ những tài liệu mà wit công bố. Có thể sau này nó sẽ thành công như Github bây giờ ^^. Vì thế trong bài này mình sẽ ứng dụng wit vào chat bot.

  - Tool cuối cùng mình muốn giới thiệu đó là api.ai. Tool này xài cũng được, dễ xài hơn wit. Nhưng cũng giống như wit bạn phải thêm nhiều dữ liệu để dạy cho con bot nó mới hiểu và thông minh lên được. Tool này chỉ cho free với 6000 queries / 1 tháng. Nếu bạn xài nhiều hơn thì phải nâng cấp tài khoản lên. Mặt hạn chế của tool này là cách tổ chức dữ liệu giống cơ sở dữ liệu bình thường, không tổ chức theo dạng cây được vì thế bạn phải tự vẽ sơ đồ cây để có thể hiểu được dữ liệu này ứng với những câu chuyện chat mà bạn tưởng tượng ra hay sẽ dạy nó thêm, ngoài ra tool này không có chức năng cho thêm người cộng tác vào để cùng nhau phát triển dữ liệu này.

Tích hợp wit.ai vào chat bot:

- Đầu tiên bạn vào trang chủ của wit.ai và đăng nhập theo tài khoản của Github hay Facebook gì cũng được.
- Sau khi đăng nhập thành công, bạn vào màn hình chính nhìn lên góc trên bên phải có biểu tượng dấu cộng và nhấn vào nó để thêm App mới.
Bạn nhập tên App và phần miêu tả App này, sau đó chọn ngôn ngữ chính của App và kiểu Open hay Private.
Hiện tại tiếng Việt đang phát triển thì thế có 1 warning Beta như "Some entities might not work as expected. Help us extend it!".

Giả sử mình viết 1 đoạn chào hỏi như sau:
Trong wit miêu tả những câu chuyện mà giữa người dùng và bot là 1 story, chức năng này đang được phát triển vì thế đang để ở giai đoạn Beta.

Ở đây mình đặt story này với tên là "ChaoHoi". Mỗi một câu người dùng nói thì bạn phải thiết lập cho chúng với mục đích của câu nói đó là gì, ở đây mình thiết lập chữ "Chào bạn" có ý nghĩa với key là intent và giá trị là chao_hoi. Vì lời nói có rất nhiều ý nghĩa, ví dụ như 1 câu nói trịnh trọng hay không trịnh trọng, thân mật hay không thân mật,... Trong tài liệu của wit có bộ dữ liệu entities miêu tả như sau:
Những cái này có gì mình sẽ có chủ đề riêng để nói về nó, còn tại trang này mình sẽ nói sơ qua wit và cách thiết lập làm sao wit tương tác được với con chat bot mình đã viết trong Phần 1.

Với cột bên tay trái là user nói và cột bên tay phải là con Bot trả lời lại. Các bạn thao tác rất đơn giản vì nó rất tường minh.
Phần Bot executesJump dùng để xử lý những hành động phức tạp và xử lý dữ liệu khi người dùng nói, còn nếu trả lời thông thường thì bạn chỉ cần chọn Bot sends là được.

Khi bạn viết xong 1 story nào đó bạn có thể test ngay trên trang wit để xem sơ qua cũng được. Bạn để ý ở góc dưới bên phải có nút "Press ~ to chat with your bot" bạn nhấn vào đó sẽ hiển thị hộp thoại để bạn chat sơ với con bot mà bạn đang xây dựng trên wit.
Ví dụ của mình khi nhập chữ "Chào bạn" thì nó lập tức trả về câu "Chào bạn, bạn tên gì?" mà mình đã dạy như hình trên. Tức là con bot đã trả lời đúng luồng mà mình đã dạy nó.

Tiếp theo sau mình xưng tên và xử lý để có thể lấy dữ liệu là tên người dùng để lưu trữ vào cơ sở dữ liệu, các bạn có thể dùng cách này để khai thác những dữ liệu mà người dùng nhập như email, số điện thoại, địa chỉ, ...

+ Phần User says mình nhập chữ "Mình tên Công", tô phần chữ Công và chọn kiểu dữ liệu hệ thống là "wit/contact", bộ dữ liệu khi bạn khai báo như vậy thì sau này có thể Facebook sẽ thêm vào bộ dữ liệu mặc định của hệ thống, vì hệ thống những tên tiếng Anh như Maria, John... gì đó thì hệ thống tự động biết những những tên của nước Việt Nam hay nước khác thì vẫn đang còn sơ xài nên nó không hiểu được, sau đó chọn intent là xung_ten.
+ Tại phần Bot, bạn nhấn vào Bot executes trước đặt tên action này là getContact, dòng bên dưới đặt biến với tên là user_name. Và nhấn vào nút Bot sends và nhập với nội dung như "Chào bạn {user_name}, mình giúp gì cho bạn?". Kết quả như sau:

Bước thiết lập AI tương đối xong, giờ qua bước tích hợp phần xử lý ngôn ngữ này vào web service trong phần 1 mình đã hướng dẫn viết con Bot đơn giản.

Tích hợp Natural Language Processing vào Chat Bot:

- Bước 1: Tải thư viện cần thiết bằng npm về. Bạn mở terminal và cd đến thư mục gốc chứa những file project (thư mục có chứa file package.json và server.js), sau đó nhập đoạn lệnh này vào:
> npm install node-fetch --save
> npm install node-wit --save
> npm install winston --save
Lệnh npm install mà có thêm tham số --save dùng để vừa tải thư viện về và nó tự động thêm tên thư viện đó vào file package.json dùm mình luôn. Thư viện winston dùng để lưu nội dung mình muốn log vào file txt để dễ dàng theo dõi để debug hơn console, còn 2 thư viện node-fetch và node-wit dùng để tương tác wit và facebook.

- Bước 2: Bạn tạo file mới với tên logger.js trong thư mục utils với nội dung như sau:
Sau đó bạn tạo file tên all-log.log trong folder logs:

- Bước 3: Bạn mở file server.js lên và nhập những nội dung sau vào:
- Bước 4: Ngay tại chỗ web hook mà gởi tin nhắn echo về cho user trong Phần 1, bạn thay thế code đó bằng đoạn code sau:
- Bước 5: Start server lên bằng cách terminal:
> node server.js
Sau khi start server lên bạn thấy nội dung như sau:

Hình sau là nhập link của ngrok sau khi start sẽ chuyển về server local:

Bạn khai báo đường link ngrok như "https://a67fec29.ngrok.io/webhook" vào phần khai báo web hook của Facebook Messenger:

- Bước 6: Bạn mở Facebook Messenger lên và chat với con bot đó thử 2 câu mà bạn đã dạy sẽ như màn hình như sau:

Và mở terminal lên thì thấy đoạn code mình log tên mà khi wit xử lý được và trả về cho mình ở khung màu đỏ:

Các bạn có thể tải source code của mình tại đây và chạy thử. Phần sau mình sẽ nói sâu hơn phần xử lý ngôn ngữ tự nhiên của wit.

Chúc các bạn học được nhiều thứ từ node và wit, cám ơn mọi người đã đón xem blog của mình, nếu mình viết hơi khó hiểu các bạn có thể comment ở dưới để mình giải thích thêm nha.



No comments:

Post a Comment

Note: Only a member of this blog may post a comment.