Làm cách nào để chuyển đổi giữa Bot và người

Bot không thể giải quyết được mọi vấn đề. Có nhiều tình huống nó không được training nên không biết trả lời sao cho đúng. Nó sẽ nhảy vào vòng fallback với những câu được cài sẵn như “mình không hiểu” “mình chưa hiểu”. Các câu này được kích hoạt 1 lần thì ok, nhưng nếu nó rơi vào vòng này nhiều lần sẽ làm cho người chat thấy bực mình.

Những lúc như thế này nó cần sự trợ giúp của con người. Rất tiếc là Google không có 1 cơ chế nào có thể tắt Bot tạm thời để chúng ta can thiệp những tình huống khó.

Cách tắt bot bằng code của Dialogflow team

Trên diễn đàn Github có 1 sample về vấn đề này. Nhưng để hiểu và ứng dụng ví dụ này khá là khó. Tại sao chúng ta phải bỏ nhiều công sức để giải quyết 1 vấn đề đơn giản chỉ là tắt Bot tạm thời. Nếu chúng ta quá lạm dụng code như vậy thì tài nguyên bạn sẽ bị hạn chế vd tốc độ xử lý hay quá nhiều code sẽ tạo ra nhiều Bugs thôi.

Cách tắt bot của mình (Simple is the best).

Mình có viết bài này trên Medium. Vì có nhiều bạn nước ngoài email cho mình về vấn đề này nên mình dùng tiếng anh trên Medium. Nhưng trên dialogflowmaster thì dành cho người Việt Nam nên mình chuyển về đây cho các bạn dễ tham khảo.

Mình sử dụng cơ chế Context của Bot. Context chính là ký ức của bot. VD bạn đang trao đổi về thời tiết ở Sài Gòn (trong đầu Bot là giữ ký ức Sài Gòn) thì lúc nói chuyện đến nhiệt độ nghĩa là mình trao đổi về nhiệt độ tại Sài Gòn chứ không phải tỉnh thành nào khác.

Ký ức này chỉ được xoá khi nó hết lifespan (thời gian tồn tại của ký ức thông qua bao nhiêu câu hội thoại) hoặc rơi vào trạng thái Fallback.

Bước 1 Tạo Context khi bắt đầu 1 cuộc nói chuyện

Tạo context khi người dùng lần đầu tiên say hello với bot của bạn. Khi người dùng say hello, Welcome Intent sẽ được kích hoạt. Ngay trong hàm thụ lý welcome Intent bạn tạo ra một Context với Lifespan khoảng 200.

  • Context: Robot_Context
  • Lifespan: 200
function welcome(agent) {
agent.add(`Welcome to my agent!`);
agent.setContext({ name: ‘Robot_Context’, lifespan: 200});
}

Khi tạo ra các intents để xử lý các tác vụ bất kỳ, kể cả Fallback intent. Bạn hãy đặt input Context cho mọi intent này là Robot_Context

Lý do là tất cả các intent này chỉ được kích hoạt khi nó có Input Context là Robot_Cotext đang hiện hữu. Bạn có thể xem Robot_Context như lá cờ, khi lá cờ được phất lên. Các intent được gắn lá cờ input sẽ được kích hoạt khi xảy ra tình huống. Còn khi lá cờ không có thì các intent này sẽ không được kích hoạt cho dù đúng tình huống

Bước 2. Tạo intent để con người thụ lý thay bot

Mục đích của intent này là để xoá Robot_Context (xem như xoá lá cờ đang phất) để khi người hỏi tiếp theo thì do không có Robot_Context đầu vào vì vậy các intents thụ lý sẽ không được kích hoạt. Bot ở trạng thái câm. Lúc này chúng ta chat tự do.

Với intent human này thì chúng ta sử dụng các ký tự đặc biệt để đảm bảo người dùng không thể gõ trong quá trình chat và người dùng lúc đọc các ký tự này cũng không phải bận tâm. Mình chọn ám hiệu là ***. Bạn chú ý trong intent này vẫn phải có input context là Robot_Context nha.

function human(agent){
agent.setContext({ name: ‘Robot_Context’, lifespan: ‘0’});
}

Cuối cùng trả lại quyền cho bot.

Việc trả lại quyền cho bot rất đơn giản, chúng ta chỉ cần phất cờ lên là các intents được kích hoạt. Nghĩa là tạo lại Robot_Context. Phần trên chúng ta tạo ra context này trong welcome. Vậy chỉ cần kích hoạt lại intent welcome này là xong thôi. Tuy nhiên chúng ta không thể gõ hello… lại mà thay vào đó là 1 training phrase ám hiệu khác mình chọn là !!!. Trong intent welcome không có input Cotext nhé

Kịch bản như vậy nè

  1. Khách: Hello, cho mình hỏi tí…
  2. Bot: Chào bạn, cần mình trợ giúp gì (welcome intent kích hoạt và tạo ra context Robot_Context)
  3. Khách: bạn có bán bút Artline để vẽ lên trời không
  4. Bot: mình không hiểu?? (nhảy vào Fallback Intent lần 1)
  5. Khách: Thì bút dùng để vẽ lên mây á
  6. Bot: Hok hỉu (nhảy vào Fallback Intent lần 2) Lúc này cần bạn ra tay
  7. Bạn: *** (Intent Human kích hoạt xoá Robot_Context)
  8. Bạn: Bút đó chỉ có máy bay làm được thoi 😀
  9. Khách: Cám ơn nhiều
  10. Bạn: Hok có chi
  11. Bạn: !!! (bật lại Robot_Context để bot tiếp quản tiếp)

Sau đây là toàn bộ đoạn code ở Fulfillment. Phần Intents các bạn tự làm nha.

‘use strict’;

const functions = require(‘firebase-functions’);
const { WebhookClient } = require(‘dialogflow-fulfillment’);
const { Card, Suggestion } = require(‘dialogflow-fulfillment’);

process.env.DEBUG = ‘dialogflow:debug’; // enables lib debugging statements

const linkUrl = ‘https://assistant.google.com/';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
console.log(‘Dialogflow Request headers: ‘ + JSON.stringify(request.headers));
console.log(‘Dialogflow Request body: ‘ + JSON.stringify(request.body));

function welcome(agent) {
agent.add(`Welcome to my agent!`);
agent.setContext({ name: ‘Robot_Context’, lifespan: 200});
}

function fallback(agent) {
agent.add(`I didn’t understand`);
agent.add(`I’m sorry, can you try again? or ask Human to take over by typing ***`);
}
function human(agent){
agent.setContext({ name: ‘Robot_Context’, lifespan: ‘0’});
}

let intentMap = new Map();
intentMap.set(‘Default Welcome Intent’, welcome);
intentMap.set(‘Default Fallback Intent’, fallback);
intentMap.set(‘human’, human);
agent.handleRequest(intentMap);
});

Hy vọng các bạn thấy bài viết này có ích và hãy chia sẽ cho mọi người cùng tham khảo để giúp nhau cùng tiến nha

Mình cám ơn
Ngô Quốc Vinh

Leave a Comment