Một số trường hợp intent với training phrases khá giống nhau thì rất khó để intent trigger cái nào chính xác
Có 2 cách sau
- Sử dung slot filling vơi prompt input
- Sử dụng followeup Intent
Trường hợp 1 thì có vẻ ổn nhưng nó bắt buộc người dùng phải nhập chính xác. Nếu nhập không chính xác thì máy sẽ lưu sai.
Sử dung mô hình sau để dùng traning phrase hiệu chỉnh lại nếu người dùng nhập không chính xác ký tự
VD trường hợp cần lấy tên, Residence ID và Driver ID. Trong đó Residence ID và Driver ID hơi hơi giống nhau. Nhưng chữ o và số 0 đôi lúc cũng làm sai số. Nó có thể tự chỉnh sai nhờ Entity khi nhảy vào intent. Điều mà prompt ko thể làm được vì prompt chỉ phụ thuộc vào kiểu dữ liệu nhập vào. Không có traning phrases
Vậy để giải quyết ta dùng 3 intents. 1 Intents lấy name và 2 cái còn lại lấy 2 cái ID. Để thuận tiện cho người dùng nhập ta sử dụng followup Intent (hoặc cơ chế Context tương tự). Followup Intent mặc định của Dialogflow chỉ là thực thi Yes/No. Khi mở rộng ra thì nó vấp nhiều thứ. Bản chất nó cũng giống như ta sử dụng Context input và output thôi. Chỉ khác lúc Dialogflow trình bày thì có theo cấp bậc hay không
NameIntent sẽ tạo ra 2 context. NameContext và ResidenceContext
NameContext dùng để lưu dữ liệu khi vào vòng hỏi này vì vậy lifespan phải lớn đảm bảo xong cuộc hội thoại lấy dữ liệu khoảng 50-100 tuỳ ý.
ResidenceContext còn lại dùng chỉ để kích hoạt intent ResidenceID mà không kích hoạt DriverID để đảm bảo lưu dữ liệu chính xác trên ResidenceID. Vậy ResidenceContext có lifespan 1. Sau khi kích hoạt ResidenceID intent thì nó bị xoá để không tái kích hoạt intent này
ResidenceID intent sẽ có 2 context. ResidenceContext input từ Name intent và nó có nhiệm vụ tạo ra DriverContext để kích hoạt intent tiếp theo. Tương tự DriverContex chỉ có lifespan =1
DriverID intent sẽ có input context là DriverContext
Sau khi hoàn tất thì tất cả dữ liệu lưu tại NameContext. Còn phần ResidenceContext và DriverContext sẽ bị huỷ do lifespan =1. Sử dụng đoạn lệnh sau phần response để xem kết quả
Vấn đề mới. Nếu lúc ResidenceID intent được kích hoạt nhưng người nhập sai. Nó chạy vào Fallback Intent thì lúc này ResidenceContext bị xoá do lifespan =1 nên không thể kích hoạt lại ResidenceID intent. Tương tự cho việc khi vào DriverIntent.
Để giải quyết vấn đề này ta tạo Fallback intent cho từng tình huống có thể nhập sai. Tương tự 1 exception
Fallback intent phục vụ cho ResidenceID. Nếu khi ResidenceID kích hoạt mà người dùng nhập sai nó sẽ nhảy vào intent này do inputcontext là ResidenceContext để tránh thoát ra Fallback mặc định. Trong intent ResidenceIDFallback này sẽ yêu cầu nhập lại ID. Nó sẽ tạo ra lại ResidenceContext để đảm bảo cho kích hoạt lại intent ResidenceID
Để tạo Fallbackintent nhấn vào 3 chấm bên cạnh nút Create Intent và chọn tạo Fallback Intent
Tương tự như vậy cho DriverID intent. Ta cũng tạo DriverIDFallback
Sau khi hoàn tất ta có đến 5 intent thay vì 3 intent. Nhưng đảm bảo chính xác 100% không bao giờ bị sai
Về cơ bản thì qua vòng lặp này nó hoạt động tương tự như Slotfilling. Nhưng ở slotfilling thì không có traning phrase nên chỉ có 1 trường hợp nhập chính xác thôi. Còn ở cách này thì có nhiều traning phrase nên có thể cho phép sai số. Dialogflow sẽ tự động chỉnh lại giá trị tham chiếu trong Entity
Để thoát khỏi vòng lặp vô tận trong trường hợp người dùng thường nhập sai thì chúng ta có thể code trong fulfillment bao nhiêu lần sai đó thì xoá context để thoát.
Hoặc tạo 1 intent QuitIntent bằng cách truyền cho nó 1 input context là QuitContext. Output context của intent này là ResidenceContext và DriverContext đều có lifespan = 0;
Cần khai báo trong ResidenceID, ResidenceIDfallback, DriverID, DriverIDfallback intent có output là QuitContex lifespan = 1 để giúp kích hoạt intent này khi cần thiết
Đương nhiên traning phrase của nó vd Quit, Give up. Shut up…
Mình hy vọng các bạn hiểu ý tưởng này và áp dụng để tăng mức độ chính xác để kích hoạt đúng intent cần thiết.