Khóa học
Chatbot nhận biết ngữ cảnh theo dõi các đầu vào trước đó của người dùng và liên hệ chúng với các tương tác gần đây. Điều này cho phép chúng tương tác theo phong cách hội thoại và nâng cao trải nghiệm người dùng. Amazon Lex là một chatbot nhận biết ngữ cảnh thuộc bộ sản phẩm Amazon Web Services (AWS). Nó được phát hành năm 2017, và phiên bản nâng cấp, Lex V2, ra mắt năm 2021.
Trong hướng dẫn này, tôi giới thiệu các khái niệm cơ bản của AWS Lex V2 và minh họa cách sử dụng. Tôi sẽ hướng dẫn cách thiết lập và cấu hình Lex, tạo chatbot Lex đầu tiên, và kết nối với backend bên ngoài. Tôi cũng sẽ tổng quan cách tích hợp Lex với các nền tảng bên thứ ba như website và ứng dụng nhắn tin.
Amazon Lex là gì?
Amazon Lex là một công cụ hội thoại dựa trên AI do AWS cung cấp. Lex chấp nhận đầu vào của người dùng dưới dạng giọng nói và văn bản. Nhà phát triển xác định luồng hội thoại. Dựa trên đó, Lex quản lý đối thoại bằng cách phản hồi đầu vào của người dùng. Giao diện hội thoại sau đó có thể được triển khai thành bot thoại, ứng dụng web, nền tảng chat (như Slack hoặc Facebook Messenger), v.v. Lex cũng được sử dụng để xây dựng Amazon Alexa.
Lex kết hợp hai chức năng cơ bản: hiểu ngôn ngữ tự nhiên (NLU) và nhận dạng giọng nói tự động (ASR). Nó cho phép các nhà phát triển không có chuyên môn sâu về học sâu xây dựng giao diện hội thoại cho chatbot, trợ lý ảo và tương tự.
Là một sản phẩm của Amazon, nó tích hợp với các dịch vụ AWS khác như:
- Amazon Cognito (quản lý danh tính)
- Amazon CloudWatch (giám sát dịch vụ)
- DynamoDB (hệ quản trị cơ sở dữ liệu backend)
- Amazon Lambda (kết nối các nguồn dữ liệu bên ngoài như Salesforce và HubSpot), v.v.
Những tích hợp này giúp dễ dàng triển khai và mở rộng dịch vụ AI hội thoại.
Thiết lập Amazon Lex
Trong phần này, tôi hướng dẫn cách thiết lập Amazon Lex.
Lưu ý rằng giao diện người dùng AWS thay đổi thường xuyên. Do đó, bố cục và văn bản của các phần và tiêu đề trong hướng dẫn và ảnh chụp màn hình có thể thay đổi theo thời gian hoặc theo khu vực.
Bước 1: Đăng nhập vào bảng điều khiển AWS
Tôi giả định bạn đã có tài khoản AWS. Nếu chưa, hãy làm theo hướng dẫn trên trang đăng ký AWS và tạo tài khoản mới.
Trong hướng dẫn này, chúng ta sử dụng bảng điều khiển AWS để thiết lập và sử dụng Lex. Nhập thông tin xác thực AWS của bạn để đăng nhập vào bảng điều khiển AWS Lex và vào trang chủ Lex.
Bước 2: Tạo bot mới
- Để tạo bot mới, truy cập bảng điều khiển Amazon Lex.
- Chọn Get Started.
Mục trên dẫn đến trang chủ Bots (hiển thị bên dưới). Trang này hiển thị danh sách các Bot bạn đã tạo.

Trang chủ Amazon Lex Bots.
- Trên trang này, chọn Create Bot.
Bạn sẽ được chuyển đến trang cấu hình bot mới. Trang này hiển thị hai phương pháp tạo bot: Traditional và Generative AI.

Tạo bot mới.
Chúng ta muốn học quy trình thiết lập và cấu hình bot. Vì vậy, hãy chọn phương thức Traditional và bắt đầu với một bot trống.
- Bot name: Đặt tên và mô tả cho bot. Trong bài này, chúng ta tạo một bot đơn giản tên “CabBookBot” để đặt xe taxi.
- IAM permissions: Chọn vai trò phù hợp để quản lý ủy quyền và xác thực cho bot.
- Nếu bạn đã từng tạo bot trước đây, hãy chọn từ danh sách các vai trò hiện có.
- Nếu đây là bot đầu tiên, chọn “Create a role with basic Amazon Lex permissions.”
- COPPA: Nếu bot này phục vụ trẻ em và trẻ vị thành niên, hãy chỉ định rằng nó tuân theo Đạo luật Bảo vệ Quyền riêng tư Trực tuyến của Trẻ em (COPPA). Chúng ta chọn “No”.
- Idle session timeout: Bot phải ghi nhớ các tin nhắn trước đó của người dùng để duy trì “ngữ cảnh” trong suốt cuộc hội thoại. Nếu người dùng không phản hồi trong một thời gian, ta giả định họ không còn sử dụng bot và đặt lại ngữ cảnh cho người dùng mới. Giữ nguyên giá trị mặc định.
Bạn không cần cập nhật các cài đặt nâng cao tùy chọn; chỉ cần chuyển sang phần tiếp theo.
Bạn cũng phải thiết lập ngôn ngữ cho bot vì các bot Lex được xây dựng dựa trên xử lý ngôn ngữ tự nhiên (NLP).
- Trong ví dụ này, chúng ta dùng ngôn ngữ mặc định English (US).
- Giữ nguyên cài đặt mặc định và chọn Done.
Sau đó, bạn sẽ được chuyển đến trang Intents, chúng ta sẽ cấu hình ở phần tiếp theo.
Sau khi tạo bot cơ bản, tôi sẽ giải thích cách cấu hình nó cho bài toán mong muốn: đặt xe taxi.
Bước 3: Cấu hình intents
Đúng như tên gọi, intent đại diện cho ý định của người dùng hoặc mục tiêu của cuộc hội thoại. Ví dụ, người dùng có thể muốn đặt khách sạn hoặc chuyến bay. Mỗi bot có thể phục vụ nhiều mục tiêu.
Khi cung cấp một vài văn bản ví dụ (gọi là sample utterances) cho mỗi intent, Lex sử dụng NLP để nhận dạng và ghép đầu vào của người dùng với intent phù hợp dựa trên các câu mẫu đó. Ví dụ, một bot đặt taxi có thể có các câu mẫu như “Tôi muốn đặt xe”, “đặt cho tôi một xe từ X đến Y vào ngày này”, v.v.
Sau khi chọn Done ở trang tạo bot trong bước trước, bạn sẽ được đưa đến trang nơi có thể tạo intent mới tên NewIntent.
Trên trang Intent:
- Tìm Conversation Flow ở trên cùng. Mục này minh họa luồng và các tin nhắn mẫu cho từng bước hội thoại.
- Cập nhật tên intent thành một tên có ý nghĩa, ví dụ “CabBookIntent”, và cung cấp mô tả phù hợp.
Bước 4: Thêm sample utterances
Lex cần một vài câu mẫu cho mỗi intent để nhận biết nhu cầu của người dùng có khớp với intent hiện tại hay không.
- Trên trang Intent, cuộn xuống phần Sample utterances.
- Chuyển cửa sổ soạn thảo sang Plain Text.
- Thêm một vài câu mẫu, mỗi câu trên một dòng, ví dụ:
- I want to book a taxi
- Book me a cab
- I need to make a taxi reservation

Câu mẫu.
- Thêm một Initial response, chẳng hạn “Được rồi, tôi sẽ giúp bạn đặt xe”, để xác nhận yêu cầu của người dùng.
Tạo luồng hội thoại
Các bot Lex tuân theo cấu trúc hội thoại được xác định trước. Luồng hội thoại phác thảo và đưa ra đặc tả cho các thành phần của cuộc trò chuyện. Trong phần này, tôi giải thích cách thiết kế hội thoại để giao tiếp với người dùng và lấy thông tin cần thiết nhằm đáp ứng yêu cầu của họ.
Bước 1: Thêm slots để thu thập đầu vào
Bot cần nhắc người dùng cung cấp thông tin liên quan. Slot chứa thông tin mà bot cần để hoàn thành yêu cầu của người dùng. Ví dụ, bot đặt taxi nhận thành phố xuất phát, thành phố đích và ngày đi làm giá trị slot.

Thêm slots vào intent.
Với mỗi slot, bạn cần chỉ định các tham số sau:
- Slot name: Bot dùng tên này làm chỗ trống cho giá trị của slot. Ví dụ, bạn có thể cấu hình phản hồi của bot là “Bạn muốn đi từ {SourceCity}” và nó sẽ tự động thay thế giá trị slot
SourceCitydo người dùng nhập. - Slot type: Tương tự biến trong lập trình, slot của Lex có thể thuộc nhiều kiểu. Có nhiều loại slot dựng sẵn, như
AMAZON.City,AMAZON.Date, v.v. Bạn cũng có thể thêm các loại slot tùy chỉnh (sẽ bàn sau). - Prompt: Cung cấp mẫu văn bản để bot dùng để hỏi (nhắc) người dùng nhập giá trị cho mỗi slot.
- Chọn Add Slot, và thêm các slot sau, đánh dấu là bắt buộc:
|
Slot name |
Slot type |
Prompt |
|
SourceCity |
AMAZON.City |
Bạn sẽ xuất phát từ thành phố nào? |
|
DestinationCity |
AMAZON.City |
Bạn sẽ đi đến thành phố nào? |
|
TravelDate |
AMAZON.Date |
Bạn sẽ đi vào ngày nào? |
- Thêm một vài câu mẫu bổ sung ghi nhận trực tiếp giá trị slot. Ví dụ:
- Book a cab on {TravelDate} from {SourceCity} to {DestinationCity}
- Book a cab from {SourceCity} to {DestinationCity} for {TravelDate}
Custom slots
Các loại slot dựng sẵn không phải lúc nào cũng đủ cho mọi trường hợp. Ví dụ, một dịch vụ đặt taxi có thể cần loại slot cho loại xe (compact, hatchback, sedan, SUV, v.v.) mà người dùng muốn.
Để thêm slot tùy chỉnh:
- Vào Slot types từ menu cột trái:
- CabBookBot > Bot versions > Draft version > All languages > English (US) > Slot types).
- Thêm tên (ví dụ
CabType) và mô tả cho loại slot mới. - Chọn một trong hai kiểu giá trị slot:
- Expand: Bạn cung cấp một vài giá trị mẫu cho slot, và Lex dùng chúng làm ví dụ để học các giá trị mới có thể có. Ví dụ, với danh sách họ, Lex điều chỉnh loại slot để chấp nhận các họ tương tự bạn chưa liệt kê rõ.
- Restrict: Slot chỉ chấp nhận các giá trị từ danh sách bạn cung cấp. Nó sẽ không học giá trị mới.
Trong trường hợp này, chúng ta có một vài loại xe định trước. Vì vậy, giới hạn giá trị slot vào các loại này.
- Bạn cũng có thể cung cấp giá trị thay thế cho mỗi giá trị. Ví dụ, với loại xe,
Limolà giá trị chấp nhận được choLimousine.

Slot tùy chỉnh.
- Chọn Save Slot type. Loại slot mới sẽ khả dụng khi thêm slot vào intent.
Bước 2: Cấu hình nhắc nhập và xử lý lỗi
Khi người dùng cung cấp phản hồi không hợp lệ cho lời nhắc yêu cầu giá trị slot, Lex sẽ lặp lại lời nhắc. Phiên làm việc sẽ kết thúc khi người dùng liên tục không đưa ra phản hồi phù hợp (như tên thành phố hợp lệ).
Thiết lập Lex đưa ra thông báo lỗi (trước khi kết thúc phiên) nếu người dùng liên tục không cung cấp giá trị slot hợp lệ:
- Chọn từng slot và chọn Advanced options cho slot đó.
- Cuộn xuống cửa sổ tùy chọn nâng cao đến phần Slot capture: failure response.
- Cung cấp phản hồi phù hợp cho đầu vào không hợp lệ. Ví dụ, nếu người dùng liên tục nhập một thành phố không được nhận diện, bot có thể trả lời, “Xin lỗi, chúng tôi không phục vụ thành phố đó.”

Xử lý lỗi và phản hồi khi thất bại.
Mọi bot đều có FallbackIntent, được gọi khi đầu vào của người dùng không khớp các intent hiện có. Vì intent này được gọi mặc định, các câu mẫu của nó không thể tùy biến.
- Chỉ định một phản hồi kết thúc có ý nghĩa với
FallbackIntentvà kết thúc cuộc trò chuyện.

Phản hồi kết thúc.
Bước 3: Xác nhận, thực hiện và kết thúc
Xác nhận intent của người dùng sau khi đã có các giá trị slot phù hợp và trước khi thực hiện yêu cầu.
- Sử dụng phần Confirmation để cung cấp lời nhắc xác nhận.
- Lưu ý có một công tắc nhỏ cho hộp thoại Confirmation. Hãy bật nó.
Thông thường, bạn nên đưa giá trị slot vào lời nhắc xác nhận. Ví dụ: “Vui lòng xác nhận (có hoặc không) rằng bạn muốn đặt chuyến từ {SourceCity} đến {DestinationCity} vào {TravelDate}”.
- Cung cấp Decline response trong trường hợp người dùng trả lời phủ định với lời nhắc xác nhận. Ví dụ, “Được, chúng tôi sẽ không thực hiện đặt chỗ này”.

Lời nhắc xác nhận.
Phản hồi thực hiện (fulfillment) cho người dùng biết bot đang bắt đầu xử lý yêu cầu của họ (đặt xe).
- Trong phần Fulfillment, cung cấp một thông điệp khác sau khi thực hiện thành công yêu cầu. Ví dụ, “Được rồi, chúng tôi đã thực hiện đặt chỗ này.”
Phản hồi kết thúc là tin nhắn cuối cùng gửi cho người dùng. Ví dụ, “Cảm ơn bạn đã đồng hành cùng chúng tôi. Chúc bạn có chuyến đi an toàn!”.
- Cập nhật các phản hồi và chọn Save intent.

Phản hồi thực hiện và kết thúc.
Kiểm thử bot Amazon Lex của bạn
Bây giờ chúng ta đã tạo bot và cấu trúc hội thoại, hãy kiểm thử nó!
Bước 1: Kiểm thử trong bảng điều khiển Lex
- Tìm nút Build và Test ở đầu trang Intents.
- Build bot. Bạn phải build lại bot sau mỗi thay đổi.
- Chọn Test để kiểm thử bot trong bảng điều khiển Lex.
- Nhập các tin nhắn liên quan trong cửa sổ chat bật lên và phản hồi các lời nhắc của bot.

Kiểm thử bot Amazon Lex.
Lỗi cấu hình thường gặp
Một số phần như Confirmation, Fulfillment và Closing response về nguyên tắc là tùy chọn. Để bật một phần, hãy bật công tắc của phần đó.
Trong một số trường hợp, bật một phần hoặc phản hồi sẽ tự động bật Lambda function cho phần đó. Nếu phần cụ thể có công tắc Lambda function ở trạng thái “on” nhưng không có Lambda function liên kết, bạn sẽ gặp lỗi như bên dưới:
Cannot call FulfillmentCodeHook for Intent CabBookIntent. BotAlias/LocaleId TestBotAlias/en_US doesn't have an associated Lambda Function.
Lỗi trên xuất phát từ phần Fulfillment. Để khắc phục, vào advanced settings trong phần liên quan và bỏ chọn tùy chọn dùng Lambda function.
Một lỗi tương tự khác xảy ra khi luồng bị cấu hình sai. Ví dụ, xem thông báo lỗi ở giai đoạn build:
'ElicitSlot' next step at 'InitialResponse:CodeHook:Success' in intent 'CabBookIntent' contains invalid slotToElicit setting. slotToElicit must be a required Slot within the intent. Change the slot name in slotToElicit and try your request again.
Để khắc phục lỗi này, vào Advanced options cho Initial response. Lưu ý rằng Dialog Code hook đang bật. Tuy nhiên, ở giai đoạn này, chúng ta chưa bật và cấu hình Lamba functions để khởi tạo hội thoại. Hãy tắt code hook và cập nhật bot; quá trình build sẽ bình thường.

Tùy chọn nâng cao cho phản hồi ban đầu.
Bước 2: Kiểm thử bằng giọng nói (Tùy chọn)
Mặc định, bot Lex hoạt động với cả văn bản và giọng nói.
- Nhấn biểu tượng micro trong cửa sổ chat để giao tiếp bằng giọng nói.
- Văn bản giữ chỗ trong ô nhập thay đổi thành “Listening…” .
- Nói ra ý định của bạn, ví dụ, “I want to book a taxi.”
- Nhấn dấu kiểm ở bên phải ô nhập văn bản.
- Lex sẽ nhanh chóng chuyển giọng nói thành văn bản và phản hồi bằng âm thanh.
Amazon Polly chuyển văn bản thành giọng nói tự nhiên. Nó được dùng trong các ứng dụng dựa trên giọng nói, như máy đọc tin tức, trò chơi, bot, v.v., để tạo giọng nói giống con người từ văn bản. Từ năm 2021, Amazon Lex đã hỗ trợ Amazon Polly Neural Text-to-Speech (NTTS). Do đó, bot Lex có thể trực tiếp tạo phản hồi giọng nói tự nhiên.
Để cấu hình giọng nói của bot:
- Trên trang chủ của bot, chọn View languages.
- Chọn ngôn ngữ phù hợp.
- Bạn cũng có thể chọn ngôn ngữ tương ứng trong mục All languages ở menu trái.
- Trong phần Language details, chọn Edit.
- Thao tác này đưa bạn đến trang Language.
- Trong phần Voice, bạn có thể nghe các mẫu giọng và chọn giọng đọc văn bản thành tiếng ưa thích.
Định nghĩa Fulfillment bằng AWS Lambda
Trên thực tế, một bot cần giao tiếp với các dịch vụ backend khác. Ví dụ, bot đặt taxi cần gửi thông tin chuyến đi đến một API endpoint và nhận phản hồi thành công. Lambda function giúp thực hiện việc này.
AWS Lambda là cách viết logic phía máy chủ và thực thi nó mà không cần thuê máy chủ ảo hoặc phiên bản tính toán một cách tường minh.
Để bắt đầu với Lambda functions:
- Truy cập trang chủ AWS Lambda.
- Chọn Create function.
- Trong ví dụ này, chọn tùy chọn tạo function từ đầu.
- Chọn
Python 3.x(3.13 tại thời điểm viết) làm ngôn ngữ vàx86_64làm kiến trúc xử lý để chạy function. - Nếu đây là Lambda function đầu tiên của bạn, hãy tạo vai trò mới. Bạn cũng có thể dùng một vai trò hiện có nếu biết nó có quyền phù hợp.
- Chọn Create function.
- Nhập mã của function trên thẻ Code trên trang web của Lambda function cụ thể.
Bên dưới, chúng tôi minh họa một Lambda function ngắn gửi thông báo thành công trong phần Fulfillment:
import json
import urllib.request
def lambda_handler(event, context):
slots = event['sessionState']['intent']['slots']
intent = event['sessionState']['intent']['name']
if event['invocationSource'] == 'FulfillmentCodeHook':
message = "Lambda has placed your reservation"
response = {
"sessionState": {
"dialogAction": {
"type": "Close"
},
"intent": {
'name':intent,
'slots': slots,
'state':'Fulfilled'
}
},
"messages": [
{
"contentType": "PlainText",
"content": message
}
]
}
return response
Cấu hình Bot để gọi Lambda function này:
- Vào trang chủ của bot. Ở menu bên trái, chọn mục Aliases (Deployment > Aliases).
- Theo mặc định, đã có một alias tên TestBotAlias.
- Chọn alias này.
- Trên trang alias, dưới phần ngôn ngữ, tìm ngôn ngữ của bot. Ví dụ này dùng English(US).
- Chọn ngôn ngữ.
- Trên trang ngôn ngữ, tìm phần Lambda function.
- Trong mục source, chọn tên Lambda function của bạn.
- Tùy chọn mặc định cho phiên bản là
$LATEST. Giữ nguyên. - Lưu thay đổi.
Trong ví dụ này, chúng ta muốn dùng Lambda function ở giai đoạn fulfillment:
- Trên trang Intent, vào Advanced options dưới phần Fulfillment .
- Trong phần Fulfillment Lambda code hook, đánh dấu vào ô Use a Lambda function for fulfillment.
- Lưu thay đổi (chọn Update options) cho các tùy chọn Fulfillment.
- Lưu Intent.
- Vào trang Intent của bot, build và kiểm thử.
Bây giờ, phản hồi đến từ Lambda function:

Kiểm thử Lambda function tích hợp với bot Lex.
Triển khai bot Amazon Lex của bạn
Sau khi tạo và kiểm thử bot Lex, chúng ta sẵn sàng triển khai. Triển khai là chủ đề phức tạp và chi tiết phụ thuộc vào từng trường hợp sử dụng. Trong phần này, tôi cung cấp cái nhìn tổng quan về các phương pháp triển khai phổ biến.
Bước 1: Triển khai trên ứng dụng web hoặc di động
Lex có thể tích hợp vào ứng dụng web và di động bằng API, SDK hoặc thư viện dựng sẵn:
- CloudFormation: AWS CloudFormation là giải pháp Hạ tầng dưới dạng mã. Nó cho phép dùng tệp YAML để đóng gói, cung cấp, triển khai và quản lý các tài nguyên AWS như một sản phẩm hoàn chỉnh. CloudFormation có template để tích hợp các sản phẩm AWS như S3, Lambda, Lex, và nhiều hơn nữa. Dùng tệp YAML mẫu của Lex để cấu hình bot Lex như một phần của dự án CloudFormation.
- Tích hợp website: AWS cung cấp bộ tệp loader Javascript và AWS SDK để tải bot vào website. Chúng bao gồm các tệp UI Lex dựng sẵn và thư viện loader để tải bot Lex. Bot có thể tích hợp vào website dưới dạng trang độc lập hoặc iframe.
- Ứng dụng di động native: AWS Amplify bao gồm công cụ để tích hợp với nhiều frontend web và di động như ReactJS / React Native, NextJS, Angular, Android, iOS, và hơn thế nữa. Tài liệu Amplify giải thích cách cấu hình bot Lex để hoạt động với các SDK này.
- Lex API: Để kiểm soát hoàn toàn tương tác và giao diện, bạn có thể dùng Lex API. Với API, bạn có thể truyền tin nhắn của người dùng và bot (cho nhau) đồng thời giữ quyền kiểm soát trải nghiệm người dùng qua ứng dụng của bạn. Lex cung cấp hai API:
- Runtime API dùng cho tương tác với người dùng như trên.
- Build API dùng để xây dựng và cấu hình bot Lex bằng lập trình thay vì GUI.
Các bước dưới đây phác thảo cách triển khai chatbot như một trang web:
- Sử dụng thư viện Lex Web UI Loader. Thư viện này tạo đối tượng
ChatBotUiLoader, bao gồm các constructorFullPageLoader()vàIframeLoader. Hàmload()của các constructor này sẽ tải bot trong trang hoặc iFrame tương ứng. - Để tải bot trên trang web, hãy chỉ định cấu hình chatbot:
- Cognito pool ID. Lưu ý rằng bạn cần một AWS Cognito identity pool để kết nối bot. Bạn có thể tạo identity pool từ bảng điều khiển AWS Cognito. Bạn phải liên kết identity pool với bot Lex.
- Tên và chi tiết của bot Lex.
- Tải bot bằng hàm
.load().
Đoạn mã dưới đây phác thảo một hàm JavaScript triển khai bot Lex trên trang web:
<!-- LexWebUi loader -->
<script src="./lex-web-ui-loader.js"></script>
<script>
// instantiate the loader
var lexWebUiLoader = new ChatBotUiLoader.FullPageLoader();
var chatbotUiconfig = {
cognito: {
poolId:
},
lex: {
initialText: 'How can I help you?',
botName: 'CabBookBot'
},
ui: {
toolbarTitle: 'Cab Booking Lex Bot',
toolbarLogo: ''
},
};
lexWebUiLoader.load(chatbotUiConfig)
.then(function () {
console.log('chatbot UI loaded');
})
.catch(function (error) {
console.error('chatbot UI failed to load', error);
});
</script>
Bước 2: Tích hợp với các nền tảng nhắn tin
Bạn có thể tích hợp bot Lex với các dịch vụ nhắn tin bên thứ ba như Facebook Messenger, Slack và Twilio SMS.
Trong phần này, chúng ta bàn về cách tích hợp Lex với Facebook Messenger. Trước khi bắt đầu, bạn cần:
- Một tài khoản nhà phát triển Facebook
- Một trang doanh nghiệp trên Facebook. Lưu ý rằng ứng dụng Facebook cần quyền sử dụng Messaging API với Lex. Chỉ các ứng dụng được Facebook xem xét và phê duyệt là ứng dụng doanh nghiệp xác minh mới được cấp các quyền này.
Bên dưới, tôi phác thảo các bước để tích hợp bot Lex với Facebook Messenger để người dùng nhắn tin cho trang Facebook của bạn có thể nhận phản hồi từ bot.
- Tạo một ứng dụng Business mới nếu bạn chưa có.
- Trong các trường hợp sử dụng của ứng dụng, chọn Other.
- Chọn Business làm loại ứng dụng.
- Bạn có thể thêm nhiều sản phẩm Facebook vào mỗi ứng dụng, như Messenger, Instagram, v.v. Thêm Messenger vào ứng dụng và chọn Set up.
- Trong phần Messenger API Setup:
- Kết nối trang Facebook doanh nghiệp của bạn với ứng dụng này.
- Tạo token mới (với nút Generate ) cho ứng dụng này. Sao chép token vào trình soạn thảo văn bản.
- Lưu ý thông báo, “To send and receive messages, request pages_messaging permission.” Chọn Request Permission để yêu cầu quyền cần thiết.
- Nếu ứng dụng của bạn chưa được Facebook xem xét và phê duyệt, hãy gửi để xét duyệt.
- Trong phần App Settings của menu trái, chọn Basic.
- Chọn Show dưới App Secret và sao chép mã bí mật vào một tệp văn bản.
Bây giờ vào bảng điều khiển Lex và chọn bot bạn muốn tích hợp với Messenger.
- Trong cây menu bên trái, tìm Channel integrations trong mục Deployment.
- Chọn Add Channel trong Create Channel:
- Chọn Facebook trong Platform.
- Chọn KMS Key trong Identity policies.
- Trong Integration configuration:
- Đặt tên cho tích hợp
- Chọn alias (của bot Lex) bạn muốn tích hợp với Messenger
- Chọn ngôn ngữ.
- Trong Additional configuration:
- Trong Alias, nhập một chuỗi để nhận diện ứng dụng gọi Lex. Bạn sẽ cần chuỗi này sau.
- Trong Page access token, nhập access token bạn đã sao chép ở Facebook.
- App secret key, nhập secret key bạn đã sao chép ở Facebook.
- Dùng nút Add để tạo kênh mới.
- Quay lại trang Channel Integrations và chọn kênh bạn đã tạo.
- Sao chép URL dưới mục Endpoint trong phần Callback URL.
Quay lại bảng điều khiển nhà phát triển Facebook và mở ứng dụng bạn đã tạo trước đó.
- Từ menu trái, dưới Messenger, chọn Messenger API Settings.
- Trong Callback URL, nhập callback URL bạn đã sao chép trong bảng điều khiển Lex.
- Trong Verify token, nhập chuỗi alias bạn đã nhập trong bảng điều khiển Lex.
- Verify and save thay đổi.
- Trong Webhooks, chọn Add subscriptions. Chọn messages trong cửa sổ bật lên, sau đó Save.
Giờ đây bạn có thể nhắn tin đến trang Facebook bằng các câu mẫu của bot Lex và nhận phản hồi phù hợp.
Bước 3: Kết nối Lex với AWS Lambda để tăng tính tương tác
Ở phần trước, chúng ta đã viết một Lambda function đơn giản cho phần fulfillment. Nó chỉ trả về một thông báo văn bản: “Lambda has placed your reservation.” Trên thực tế, chúng ta sẽ gửi thông báo thành công sau khi thực sự hoàn thành yêu cầu.
Ví dụ, Lambda function gửi yêu cầu với chi tiết đặt chỗ của người dùng đến API backend, API thực hiện đặt chỗ rồi phản hồi cho người dùng dựa trên kết quả từ API.
Cách thực hiện như sau:
- Đối tượng JSON
slotstrong Lambda function chứa giá trị các slot. Hãy xem cấu trúc của nó bằng công cụ làm đẹp mã để trích xuất các giá trị phù hợp. - Đoạn mã dưới đây cho thấy cách lấy giá trị slot
SourceCityvà truyền giá trị này đến API backend xử lý đặt chỗ. Thêm mã này vào trong hàmlambda_handler():
slots = event['sessionState']['intent']['slots']
print("slots - ", slots)
source_city = slots['SourceCity']['value']['interpretedValue']
print("source city - ", source_city)
Tiếp theo, tôi minh họa cách gửi yêu cầu API từ Lambda function. Trong ví dụ này, chúng ta dùng endpoint API giả lập tại ASDFast. Dịch vụ này cho phép bạn gửi yêu cầu HTTP(S) đến API endpoint và nhận phản hồi có tính thực tế.
- Với đoạn mã dưới đây, chúng ta gửi yêu cầu
GETđến endpoint này. Sau đó tùy biến thông điệp bot gửi đến người dùng tùy thuộc mã trạng thái phản hồi của yêu cầuGET:
res = urllib.request.urlopen(urllib.request.Request(
url='http://asdfast.beobit.net/api/',
headers={'Accept': 'application/json'},
method='GET'),
timeout=5)
message_success = "Lambda has placed your reservation"
message_failure = "Lambda could not place your reservation. Please retry."
message = message_success if res.status == 200 else message_failure
Lambda function hoàn chỉnh như bên dưới:
import json
import urllib.request
def lambda_handler(event, context):
print("event - ", event)
slots = event['sessionState']['intent']['slots']
intent = event['sessionState']['intent']['name']
print("slots - ", slots)
source_city = slots['SourceCity']['value']['interpretedValue']
print("source city - ", source_city)
print("intent - ", intent)
if event['invocationSource'] == 'FulfillmentCodeHook':
print("FulfillmentCodeHook")
res = urllib.request.urlopen(urllib.request.Request(
url='http://asdfast.beobit.net/api/',
headers={'Accept': 'application/json'},
method='GET'),
timeout=5)
message_success = "Lambda has placed your reservation"
message_failure = "Lambda could not place your reservation. Please retry."
message = message_success if res.status == 200 else message_failure
#message = "Lambda has placed your reservation"
response = {
"sessionState": {
"dialogAction": {
"type": "Close"
},
"intent": {
'name':intent,
'slots': slots,
'state':'Fulfilled'
}
},
"messages": [
{
"contentType": "PlainText",
"content": message
}
]
}
return responseThực hành tốt nhất khi xây dựng bot Amazon Lex
Sau khi thảo luận các nguyên tắc cơ bản của bot Lex và các ứng dụng thực tế, trong phần này tôi trình bày một số thực hành tốt nhất khi thiết kế bot.
Thiết kế hội thoại rõ ràng, súc tích
Đảm bảo các nhánh hội thoại và slots của bạn chính xác:
- Mỗi intent phải tập trung vào một tác vụ, và mỗi slot phải ghi nhận giá trị tương ứng với một biến duy nhất.
- Không viết lời nhắc quá dài dòng. Giữ hội thoại ngắn gọn và nhanh chóng đạt được mục tiêu mong muốn.
Cách tiếp cận này giúp tránh gây nhầm lẫn cho người dùng và hạn chế hiểu sai từ phía Lex.
Tận dụng loại slot và xác thực
Bot và các dịch vụ backend liên quan cần thông tin yêu cầu của người dùng chính xác. Sử dụng loại slot phù hợp đảm bảo điều này.
- Nhìn chung, tôi khuyên dùng các slot dựng sẵn cho kiểu dữ liệu phổ biến, như
AMAZON.Datecho ngày,AMAZON.Citycho thành phố, v.v. Các loại slot này đã được kiểm thử rộng rãi và tương thích với nhiều ứng dụng. - Bạn có thể thiết kế loại slot tùy chỉnh trong các trường hợp đặc biệt. Hãy đảm bảo chúng được cấu hình và kiểm thử đúng cách.
- Ngoài việc dùng đúng loại slot, hãy xác thực rằng người dùng đã cung cấp thông tin tương ứng cho tất cả slot bắt buộc. Điều này cho phép API backend đáp ứng yêu cầu và đảm bảo trải nghiệm mượt mà.
Bật hội thoại nhiều lượt
Người dùng có thể thấy quá tải khi nhập tất cả thông tin cần thiết trong một tin nhắn, như “Đặt chuyến cho N người vào ngày/giờ Z từ X đến Y, loại xe T.”
- Hãy dùng hội thoại nhiều lượt để mang lại trải nghiệm tốt hơn. Giống nhiều công cụ hiện đại dựa trên mô hình ngôn ngữ, Lex có thể duy trì ngữ cảnh qua nhiều lượt. Điều này cho phép nó liên hệ các lời nhắc và phản hồi trước đó với các tương tác gần đây.
- Chia một lời nhắc phức tạp thành chuỗi câu hỏi ngắn giúp cải thiện luồng hội thoại.
Giám sát và tối ưu hiệu năng
Với bot chạy sản xuất, việc giám sát hiệu năng theo nhiều chỉ số là rất quan trọng, như:
- Tổng số cuộc hội thoại.
- Thời lượng hội thoại trung bình.
- Số lượt trung bình mỗi cuộc hội thoại.
- Số (và tỷ lệ) câu mẫu được nhận diện và bị bỏ sót.
- Lỗi Lambda, v.v.
Dùng các chỉ số này để đánh giá tương tác người dùng và hiệu năng của bot:
- Trong menu trái trên trang Bot, chọn mục Analytics.
- Truy cập Conversation dashboard, Performance dashboard và CloudWatch metrics để nghiên cứu hiệu năng của bot.
AWS CloudWatch là công cụ giám sát cho các dịch vụ AWS. Nó tổng hợp nhiều chỉ số hiệu năng theo thời gian thực trên một trang. Hãy dùng các chỉ số này để cải thiện và tinh chỉnh hiệu năng của bot.
Kết luận
Trong bài viết này, chúng ta đã khám phá Amazon Lex V2, dịch vụ chatbot nhận biết ngữ cảnh của AWS. Chúng ta đã đi qua quy trình xây dựng một bot cơ bản, cấu hình để tương tác với người dùng, và tích hợp với API backend bằng AWS Lambda. Ngoài ra, chúng ta đã thảo luận thực hành tốt nhất và các tùy chọn triển khai, bao gồm nhúng bot lên website hoặc trang Facebook.
Khi tiếp tục học về các dịch vụ AWS, hãy cân nhắc mở rộng kiến thức với các khóa học sau:
- Nắm nền tảng vững chắc về dịch vụ đám mây AWS với khóa AWS Cloud Technology and Services.
- Học cách quản lý bảo mật và chi phí AWS hiệu quả trong khóa AWS Security and Cost Management.
- Khám phá tương tác AWS bằng lập trình với Boto3, AWS SDK cho Python, trong khóa Introduction to AWS Boto in Python.
Tận dụng những tài nguyên này, bạn sẽ được trang bị tốt để xây dựng, bảo mật và tối ưu các ứng dụng dựa trên AWS, bao gồm chatbot vận hành bởi Amazon Lex!
FAQs
Lex có tích hợp với các dịch vụ AWS khác không?
Có. Lex tích hợp với các dịch vụ như Lambda, S3, CloudWatch và nhiều dịch vụ khác. Điều này cho phép bạn mở rộng chức năng của bot, tích hợp với các sản phẩm khác và giám sát hiệu năng của nó.
Lex có xử lý cả giọng nói và văn bản không?
Có, mặc định Lex có thể xử lý cả đầu vào giọng nói và văn bản. Lex hỗ trợ nhiều giọng cho tương tác bằng lời nói. Bạn cũng có thể dùng AWS Polly để tổng hợp giọng nói và gửi tệp âm thanh đến Lex.
Tôi có thể dùng giao diện người dùng tùy chỉnh cho bot Lex không?
Có. Lex đi kèm runtime API có thể truyền đầu vào của người dùng đến bot và nhận phản hồi từ bot. Như vậy, bot Lex đóng vai trò backend cho giao diện tùy chỉnh.
Tôi có thể dùng Lex mà không cần Lambda functions không?
Về nguyên tắc là có. Bạn có thể thiết kế hội thoại hoàn toàn trong Lex. Trên thực tế, một bot cần giao tiếp với các dịch vụ API backend khác để đáp ứng yêu cầu của người dùng (như đặt vé). Bạn cần AWS Lambda để kết nối với các dịch vụ bên ngoài.
Có thể huấn luyện AWS Lex không?
Ở mức độ hạn chế thì có. Công cụ NLU của Lex có thể nhận diện đầu vào tương tự các câu mẫu. Nó cũng có thể mở rộng các giá trị hợp lệ của một loại slot dựa trên một vài ví dụ. Tuy nhiên, đừng kỳ vọng mức độ huấn luyện được như LLM. Lex được thiết kế cho các tương tác theo nhiệm vụ hạn chế chứ không phải hội thoại kéo dài.
Arun là cựu nhà sáng lập startup, yêu thích xây dựng những điều mới mẻ. Hiện tại, anh đang khám phá các nền tảng kỹ thuật và toán học của Trí tuệ Nhân tạo. Anh thích chia sẻ những gì mình học được, vì thế anh viết về chúng.
Bên cạnh DataCamp, bạn có thể đọc các bài viết của anh trên Medium, Airbyte và Vultr.
