điện với các chân của Raspberry. Hình 3.6 Raspberry và sơ đồ chân.
CHƢƠNG 4. THI CÔNG HỆ THỐNG
4.1. Giới Thiệu
Hệ thống được xây dựng toàn bộ trên nền Python nên quá trình thi công hệ thống được thực hiện chủ yếu trên phần mềm.
4.2. Lập Trình Hệ Thống 4.2.1. Sơ đồ và lƣu đồ 4.2.1. Sơ đồ và lƣu đồ
Đầu tiên, chúng ta cần xây dựng chương trình trên Dialogflow, thiết lập các ý định ngẫu nhiên (casual intents), các ý định nghiệp vụ (business intents), các phản hồi, các tham số, ngữ cảnh,... để chatbots có thể tương tác với người dùng.
Tiếp theo, chúng ta sẽ viết chương trình trên Pycharm bằng ngơn ngữ Python nhằm đáp ứng cho việc giải quyết các yêu cầu phức tạp hơn từ người dùng (các ý định nghiệp vụ) mà cụ thể ở đây là việc điều khiển các thiết bị điện.
Kế đến, chúng ta đối chiếu các tham số giữa Dialogflow và Pycharm nhằm giúp phát hiện được những lỗi cần khắc phục và thuận tiện cho quá trình chỉnh sửa cũng như giúp bổ sung thêm các thư viện cần thiết.
Sau khi đối chiếu, chúng ta kết nối dữ liệu của Pycharm và Dialogflow với nhau để dữ liệu hai bên được đồng bộ hóa.
Tiếp đến, chúng ta tiến hành đưa dữ liệu của Pycharm và Dialogflow sau khi được kết nối lên Web thông qua công cụ hỗ trợ ngrok. ngrok cho phép chúng ta kết nối một máy chủ web chạy trên máy cục bộ của mình với internet. Khi bắt đầu ngrok, nó sẽ hiển thị giao diện người sử dụng nó trong thiết bị đầu cuối với URL của đường hầm, đồng thời hiển thị thông tin trạng thái và các số liệu khác về các kết nối được tạo trên đường hầm của chúng ta. ngrok cung cấp cho chúng ta thời gian thực, nơi chúng ta có thể quan sát tất cả lưu lượng truy cập HTTP đang chạy trên đường hầm của mình nhằm phục vụ cho việc đẩy dữ liệu, điều khiển và nhận phản hồi tự động. Đây là q trình làm việc với Webhook.
Hồn thành việc đưa dữ liệu lên Web, chúng ta tiếp tục kết nối với phần cứng để xuất tín hiệu đầu ra. Tín hiệu đầu ra này chính là những phản hồi của chatbots cho những ý định của người dùng. Các ý định ngẫu nhiên (casual intents) sẽ được phản hồi trực tiếp qua loa hoặc màn hình. Đối với các ý định nghiệp vụ (business intents) sẽ được phản hồi thông qua Raspberry để hiển thị các tín hiệu theo yêu cầu.
Sau khi hệ thống hoạt động xong, người dùng sẽ nhận được những phản hồi dưới dạng âm thanh thông qua loa, văn bản thơng qua màn hình và tín hiệu của các thiết bị điện thông qua Raspberry từ hệ thống.
Hình 4.2 Lưu đồ chương trình trên Dialogflow.
Đầu tiên, để yêu cầu hệ thống thực hiện những ý định nghiệp vụ (business intents) người dùng có thể mở đầu bằng “Hi Bot” hoặc “Hello Bot”. Khi hệ thống nhận được từ khóa liên qua đến Bot, hệ thống sẽ phản hồi lại câu hỏi “Can I help you?” hoặc có thể một câu hỏi khác tương tự. Sau đó sẽ là các phản hồi có điều kiện cho các yêu cầu của người dùng đối với việc điều khiển các thiết bị điện như: bóng
đèn 1 (lightbult 1), bóng đèn 2 (lightbult 2), motor và có thể nhiều thiết bị điện khác nhưng ở đây nhóm chỉ giới hạn lại trong 3 thiết bị này.
Trong control lightbult 1 (điều khiển đèn 1), nếu người dùng không yêu cầu (hoặc kết quả trả về No), chương trình sẽ xét đến điều kiện 2 - control lightbult 2 (điều khiển đèn 2) và nếu kết quả lại trả về No (người dùng cũng khơng u cầu điều khiển đèn 2), chương trình tiếp tục xét đến điều kiện 3 - control motor (điều khiển motor), lúc này nếu hệ thống không nhận yêu cầu từ người dùng trong việc điều khiển motor, nó sẽ quay trở về để chờ đợi yêu cầu mới từ người dùng.
Ngược lại, trong control lightbult 1 (điều khiển đèn 1) nếu người dùng yêu cầu điều khiển đèn 1 (hoặc kết quả trả về là Yes), hệ thống sẽ tiếp tục xét đến điều kiện Turn on (Có bật/mở hay khơng?). Nếu người dùng đồng ý (kết quả trả về là Yes), hệ thống sẽ xuất ra giá trị là A1. Nếu không đồng ý (kết quả trả về là No), hệ thống sẽ xuất ra giá trị là A2. Tương tự cho control lightbult 2 (điều khiển đèn 2) và control motor (điều khiển motor) sẽ là các giá trị tương ứng lần lượt là B1/B2 và C1/C2.
Các giá trị cuối này (A1, A2, B1, B2, C1, C2) sẽ được gửi xuống backend để xử lý dữ liệu, làm việc với webhook và xuất ra những tín hiệu tương ứng xuống phần cứng nhằm phản hồi lại người dùng.
4.2.2. Phần mềm hệ thống
4.2.2.1. Xây dựng chatbots cơ bản trên Dialogfow
a. Tạo tác nhân
Nếu chưa có tài khoản Dialogflow, để sử dụng, chúng ta đăng ký qua đường link: dialogflow.com. Nếu đã có tài khoản, hãy đăng nhập. Chúng ta cũng có thể đăng nhập bằng tài khoản của Google.
Hình 4.3 Giao diện Dialogflow ban đầu.
Để đăng nhập, chúng ta nhấp chọn “GO TO CONSOLE” nằm góc bên phải phía trên màn hình.
Hình 4.4 Lựa chọn GO TO CONSOLE.
Giao diện lúc này xuất hiện như hình:
Hình 4.5 Đăng nhập Dialogflow qua Google.
Hình 4.6 Chọn tài khoản để đăng nhập Dialogflow.
Chọn địa chỉ mail để đăng nhập như trên hình 4.6.
Giao diện chính lúc này sẽ xuất hiện như hình 4.7 bên dưới.
Hình 4.7 Giao diện chính của Dialogflow.
Nhấp vào Create Agent để tạo tác nhân trong điều hướng bên trái và điền vào các trường. Nhóm sẽ đưa ra một ví dụ về dự báo thời tiết.
Hình 4.8 Tạo tác nhân.
Đặt tên và đặt ngôn ngữ cho tác nhân của chúng ta. Sau đó, nhấp vào nút Save để lưu.
b. Tạo mục đích
Mục đích là những gì người dùng nói để u cầu tác nhân của chúng ta làm. Để tạo mục đích:
Nhấp vào biểu tượng dấu cộng bên cạnh Mục đích (Intents). Chúng ta sẽ nhận thấy một số ý định mặc định đã có trong tác nhân của chúng ta.
Nhập tên cho mục đích của chúng ta, có thể là bất cứ điều gì chúng ta muốn, nhưng nó nên mơ tả trực quan cho những ý định chúng ta sẽ thực hiện.
Trong phần Đào tạo cụm từ (Training Phases), nhập các ví dụ về những gì chúng ta có thể mong đợi người dùng yêu cầu. Ví dụ chúng ta đang tạo đại lý thời tiết, chúng ta muốn bao gồm các câu hỏi về vị trí và thời gian khác nhau. Chúng ta cung cấp càng nhiều thơng tin, thì càng có nhiều cách người dùng có thể đặt câu hỏi và hệ thống sẽ hiểu chính xác hơn.
Nhập các ví dụ sau:
Dự báo thời tiết
Thời tiết ngày hôm nay như thế nào Thời tiết cho ngày mai
Dự báo thời tiết ở San Francisco vào ngày mai
Trong ba ví dụ cuối cùng, chúng ta sẽ nhận thấy các từ ngày hôm nay và ngày mai được đánh dấu bằng một màu và San Francisco được đánh dấu bằng một màu khác. Điều này có nghĩa là chúng được chú thích dưới dạng tham số được gán cho các thực thể hệ thống ngày tháng và thành phố hiện có. Các thơng số ngày tháng và thành phố này cho phép Dialogflow hiểu các ngày và thành phố khác mà người dùng có thể nói và khơng chỉ là “hơm nay”, “ngày mai” và “San Francisco”.
Hình 4.9 Tạo mục đích.
Nhấp vào Save để lưu. c. Thêm phản hồi
Bây giờ chúng ta sẽ thêm các câu trả lời cơ bản vào mục đích để hệ thống có thể phản hồi lại người dùng bằng các câu trả lời. Các phản hồi này được thêm vào ý định khơng sử dụng thơng tin bên ngồi. Vì vậy, điều này sẽ chỉ giải quyết thông tin mà đại lý thu thập được từ yêu cầu của người dùng.
Nếu chúng ta đã thoát khỏi Intents “thời tiết”, để quay lại, chúng ta nhấp vào mục Intents và sau đó lựa chọn lại Intents “thời tiết”.
Trong cùng một ý định chúng ta đã nhập trong phần Training Phases (các cụm từ đào tạo), chúng ta có thể đưa ra một số các phản hồi từ hệ thống như:
Xin lỗi, tôi không biết về thời tiết Tôi không chắc về thời tiết $date
Tôi không biết thời tiết cho $date trong $geo-city nhưng tôi hy vọng $date sẽ là một ngày đẹp trời!
Chúng ta có thể thấy hai tham số phản hồi cuối cùng $date và $geo-city sẽ tương ứng với những giá trị cụ thể. $date sẽ chèn ngày và $geo-city sẽ chèn thành phố từ yêu cầu.
Khi tác nhân phản hồi, nó sẽ tính đến các giá trị tham số được thu thập và sẽ sử dụng câu trả lời bao gồm các giá trị mà nó đã chọn. Ví dụ: nếu yêu cầu chỉ bao gồm ngày, tác nhân sẽ sử dụng phản hồi thứ hai từ danh sách: Tôi không chắc về thời tiết $date.
d. Chạy thử
Trong bảng điều khiển ở bên phải, chúng ta sẽ nhập yêu cầu. Yêu cầu sẽ khác một chút so với các ví dụ mà chúng ta đã cung cấp trong phần Training Phases (Đào tạo cụm từ). Ví dụ “Thời tiết ở Denver ngày mai thế nào” thay vì “Dự báo thời tiết ở San Francisco vào ngày mai”. Sau khi chúng ta nhập yêu cầu, nhấn “Enter / Return”.
Hình 4.11 Chạy thử ví dụ.
e. Thực hiện cơ bản (Webhook)
Tùy thuộc vào nhu cầu của bạn, bạn có thể xác định Webhook tùy chỉnh để sử dụng các API bên ngoài và nhận thêm dữ liệu từ cơ sở dữ liệu bên ngồi. Một webhook có thể được viết bằng Python và Node.js, trong phần này nhóm chọn Python. Nó có thể
được tổ chức trong các máy chủ đám mây như Heroku, AWS và Google Cloud Platform và các máy chủ cục bộ.
4.2.2.2. Phần mềm PyCharm
Giới thiệu
Hình 4.12 Logo Pycharm.
PyCharm là một IDE (Integrated Development Environment) được sử dụng trong lập trình máy tính, đặc biệt cho ngôn ngữ Python, được phát triển bởi công ty Czech JetBrains. Nó cung cấp trình phân tích mã, gỡ lỗi, hỗ trợ phát triển web với Django,...
Ưu điểm của PyCharm:
Trình biên tập nâng cao Python. Sử dụng màu sắc của các mã. Phân tích chất lượng mã viết. Gỡ lỗi nhanh.
Khả năng chỉnh sửa và chỉnh sửa mã Django, JavaScrip và HTML. Hỗ trợ Google App Engine cho Python và nhiều khuôn khổ khác như Pyridam, CYTHON, WEB2PY,...
Tích hợp với Hệ thống kiểm sốt phiên bản (VCSes). Khả năng tùy biến và cá nhân hóa giao diện người dùng.
Hình 4.13 Giao diện Pycharm.
Cài đặt:
Đầu tiên cần download phần mềm PyCharm từ trang web
https://www.jetbrains.com/pycharm/.
Hình 4.14 Tải Pycharm từ website.
Sau đó tiến hành cài đặt PyCharm.
Sau khi cài đặt xong, chúng ta mở PyCharm.
Để tạo một project mới, nhấp chuột chọn File/NewProject trên thanh Toolbar, xuất hiện hộp thoại mới và ta tiến hành đặt tên và nơi lưu trữ cho project.
Hình 4.15 Đặt tên và nơi lưu trữ project.
Chúng ta viết chương trình ở file python có đi .py. Để tạo file python này, chúng ta nhấp chuột phải ở vùng bên trái trong giao diện PyCharm, chọn New/Python File và đặt tên cho file đó.
Hình 4.16 Tạo file Python.
Như hình 4.10, trên giao diện PyCharm có 3 vùng làm việc chính:
Vùng bên trái: lưu các file trong project cũng như các thư viện đã cài đặt.
Vùng bên phải: viết chương trình.
Vùng phía dưới: kết quả của chương trình, ngồi ra cịn có Terminal, Python Console,...
4.2.3 Chƣơng trình.
Dưới đây là chương trình điều khiển các thiết bị điện trong vườn rau. Nhóm viết code thực hiện cho 2 thiết bị đèn và một motor phun nước. #!/usr/bin/env python
import urllib import json import os
from flask import Flask from flask import request
from flask import make_response
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(18, GPIO.OUT) GPIO.setup(17, GPIO.OUT) GPIO.setup(27, GPIO.OUT)
# Flask app should start in global layout app = Flask(__name__)
@app.route('/webhook', methods=['POST']) def webhook():
req = request.get_json(silent=True, force=True)
print(json.dumps(req, indent=4))
res = makeWebhookResult(req)
res = json.dumps(res, indent=4) print(res) r = make_response(res) r.headers['Content-Type'] = 'application/json' return r def makeWebhookResult(req): if req.get("queryResult").get("action") != "on:off": return{} queryResult = req.get("queryResult") parameters = queryResult.get("parameters") val1 = parameters.get("on-off") val2 = parameters.get("device")
if val1 == "on" and val2 =="lightbult1" : GPIO.output(18, GPIO.HIGH)
if val1 == "off" and val2 =="lightbult1": GPIO.output(18, GPIO.LOW)
if val1 == "on" and val2 =="lightbult2": GPIO.output(17, GPIO.HIGH)
if val1 == "off" and val2 =="lightbult2": GPIO.output(17, GPIO.LOW)
if val1 == "on" and val2 =="motor": GPIO.output(27, GPIO.HIGH) if val1 == "off" and val2 =="motor": GPIO.output(27, GPIO.LOW)
print("Response:") print(speech) return { "fulfillmentText": speech } if __name__ == '__main__': port = int(os.getenv('PORT', 8000)) print ("Starting app on port %d" %(port)) app.run(debug=True, port=port, host='0.0.0.0')
CHƢƠNG 5. KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ
5.1. Tổng Quan Kết Quả Đạt Đƣợc
Sau hơn 2 tháng tìm hiểu tài liệu chun mơn, tài liệu trên Internet cùng với sự giúp đỡ tận tình của giáo viên hướng dẫn, nhóm thực hiện đề tài: “Xây dựng hệ thống Chatbots tự động” đã hoàn thành xong theo yêu cầu và đúng thời gian quy định với những nội dung sau:
• Nắm được kiến thức cơ bản về Chatbots, Dialogflow và ứng dụng được chatbots trong thực tiễn.
• Hiểu được các đối tượng Intents, Entities, Context, Fulfillment, Actions and Parameters, Training Phrase, Fulfillment và công dụng của chúng.
• Biết cách sử dụng và khai thác tinh năng của Raspberry.
• Nắm được kiến thức cơ bản về ngrok để kết nối Dialogflow với Raspberry. • Thực hiện trị chuyện tự động được với chatbots.
• Điều khiển tự động được các thiết bị điện.
5.2. Kết Quả Thực Tế
a. Kết quả hiển thị cho Intents.
Hình 5.2 Các cụm từ huấn luyện trong intents được hiển thị.
b. Kết quả hiển thị cho Entities.
Hình 5.4 Entities Devide được trích xuất.
Hình 5.5 Entities on-off được trích xuất.
c. Kết quả người dùng tương tác với chatbots yêu cầu thực hiện các ý định ngẫu nhiên (casual intents).
Hình 5.6 Lời chào.
Bên cạnh đó, khi người dùng trị chuyện với chatbots cùng một câu hỏi trong những thời điểm khác nhau, để tránh phản hồi trùng lặp, chatbots sẽ xử lý thông tin và gửi một câu trả lời khác đến người dùng, nhưng nội dung vẫn khơng đổi. Chúng ta có thể so sánh trong hình 5.7 và 5.8.
Hình 5.8 Lời hỏi thăm 2.
Ngoài ra, người dùng vẫn có thể trị chuyện với chatbots những câu hỏi khác, thậm chí cả những chia sẻ về cảm xúc của người dùng, hình 5.9 và 5.10 là một ví dụ cụ thể.
Hình 5.9 Phản hồi của chatbots.
Tuy nhiên, với những yêu cầu phức tạp đòi hỏi những đáp ứng chuyên sâu hơn và những phản hồi mang tính cụ thể, chẳng hạn như các vấn đề liên quan đến độ chính xác cao, các con số, các dữ liệu biến động, việc điều khiển thiết bị,...lúc này chatbots sẽ cần phải được kết nối với cơ sở dữ liệu của đối tượng tương ứng để đáp ứng được yêu cầu của người dùng. Quá trình này được gọi là việc xử lý các ý định nghiệp vụ. d. Kết quả người dùng tương tác với chatbots, yêu cầu thực hiện các ý định nghiệp vụ (business intents).
Trong đề tài này, nhóm thực hiện việc điều khiển các thiết bị điện phục vụ cho vườn rau. Dưới đây nhóm dùng 3 đèn LED tương ứng cho tín hiệu của 2 bóng đèn chiếu sáng và 1 motor tưới nước.
Hình 5.12 Yêu cầu bật đèn 1 hiển thị trên Dialogflow.
Khi người dùng yêu cầu bật sáng bóng đèn 1 bằng câu lệnh “on lightbult 1” được nhập từ bàn phím (hoặc giọng nói - khi nhấn vào biểu tượng micro) vào ô trống “Try it now”. Câu lệnh của người dùng lúc này sẽ được lưu lại và hiển thị trong ơ “User says”. Hệ thống sau đó sẽ phản hồi lại bằng câu trả lời “OK on lightbult 1” và hiển thị trong ô “Default Response” đồng thời gửi tín hiệu xuống Raspberry để bật sáng đèn 1. Kết quả hiển thị trong hình 5.12 và 5.13.
Hình 5.13 Đèn 1 sáng khi người dùng yêu cầu bật.
Ngược lại, khi người dùng yêu cầu tắt bóng đèn 1 bằng câu lệnh “off lightbult 1” được nhập từ bàn phím (hoặc giọng nói - khi nhấn vào biểu tượng micro) vào ô trống “Try it now”. Câu lệnh của người dùng lúc này sẽ được lưu lại và hiển thị trong ơ “User says”. Hệ thống sau đó sẽ phản hồi lại bằng câu trả lời “OK off lightbult 1” và