Skip to main content

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.



Comments

Popular posts from this blog

Phân biệt biến kiểu Property, Public, Protected, Private trong ngôn ngữ Objective C

- Theo kinh nghiệm làm việc của mình với các bạn trong nhóm khi lập trình Objective-C và cũng đọc qua code của những project cũ. Ít khi nào mọi người để ý và khai báo đúng với ý đồ của từng đối tượng, và vi phạm quy tắc tính đóng gói, tính bảo mật thông tin của đối tượng trong lập trình hướng đối tượng (Tham khảo lý thuyết Lập trình hướng đối tượng tại trang Wiki ). - Theo ngôn ngữ lập trình Java, người ta khuyến khích mỗi khi dùng biến kiểu public thì nên đặt 1 biến private và hỗ trợ những hàm getter/setter để truy suất biến private đó.     + Nguyên nhân họ nói là đảm bảo tính đóng gói, và nếu sau này có thay đổi gì trên biến đó bạn có thể sửa được dễ dàng, chi tiết về vấn đề này ở đây .     + Nói tóm tại thì nguyên nhân chính là có thể kiểm soát được truy xuất đến giá trị của 1 đối tượng từ bên ngoài, có thể dễ dàng mở rộng code bằng cách override lại những hàm getter/setter. - Các bạn có thể áp dụng nguyên tắc đó từ bên Java qua ngôn ngữ lập trình Object...

(Kinh nghiệm) Auto layout và Size classes trong iOS - Phần 1

Trước đây khi viết những ứng dụng chạy trên nhiều màn hình hoặc hỗ trợ màn hình xoay ngang, xoay dọc mọi người hay dùng code để có thể chỉnh được những vị trí cũng như kích thước của những đối tượng. Hoặc có thể dùng Autosizing để tự động canh chỉnh những đối tượng nhưng không tối ưu và tiện lợi cho lắm, hình minh hoạ ở dưới: Vì thế từ lúc Apple phát hành ra iPhone 5, iPhone 5s với kích thước màn hình là 4 inch, làm phát sinh thêm vấn đề " Làm thế nào ta có thể thiết kế giao diện có thể chạy được trên nhiều màn hình? " mà không làm thay đổi nhiều code để có thể dễ dàng bảo trì ứng dụng. Apple mới phát triển chức năng Auto Layout và Size Classes để thực hiện nhiệm vụ này. Nếu bạn đã quen dùng Autosizing để thiết kế giao diện thì bạn có thể vẫn sử dụng chúng. Nhưng tuỳ theo từng dự án mà khách hàng hay người PM hoặc leader của bạn muốn bạn dùng công nghệ mới Auto Layout và Size Classes   để làm layout trên iOS mà không cần dùng bất cứ đoạn code nào và chỉ viết trên 1 storyboard...

(Căn bản) Bài 1: Hướng dẫn tạo tài khoản Apple ID và iTune không cần thẻ Visa hoặc MasterCard

Nếu bạn muốn lập trình trên iOs hoặc trên MacOs thì bạn nên có tài khoản Apple ID và tài khoản iTune. Sẽ hữa ích cho bạn khi cài đặt và nân cấp chương trình XCode. Nhưng khó khăn ở chỗ nếu bạn không có thẻ Visa hoặc Master Card, mà vẫn muốn có tài khoản để có thể cài ứng dụng trên AppStore. Sau đây mình xin hướng dẫn cách tạo tài khoản mà không cần những thẻ đó và có thể tạo tài khoản trên những store ở các nước khác. Đầu tiên bạn mở chương trình iTune lên và vào tab "App Store", sau đó bạn kiếm chương trình nào Free và nhấn vào đó nó sẽ hiển thị ra màn hình như sau:    Khi đang ở màn hình này bạn nhấn vào chữ "Free" bên dưới hình sẽ hiển thị ô cho bạn nhập Apple ID và Password.Vì bạn chưa có nên hãy nhấn vào nút "Create Apple ID" để tạo tài khoản. Sau khi bạn nhấn vào nút "Create Apple ID" bạn sẽ qua màn hình như bên dưới. Tại đây bạn có thể chuyển AppStore của các nước (Vì có những chương trình chỉ cài được trên từng AppStore mỗi nước thôi) hi...