สร้างการดำเนินการตามคำสั่งซื้อ (Dialogflow)

Fulfillment กำหนดอินเทอร์เฟซแบบบทสนทนาให้การดำเนินการของคุณรับข้อมูลจากผู้ใช้และตรรกะในการประมวลผลอินพุตและดำเนินการสำเร็จในที่สุด

กำหนดการสนทนา

เมื่อกำหนดการดำเนินการแล้ว คุณก็จะสร้างการสนทนาที่สอดคล้องกันสำหรับการดำเนินการเหล่านั้นได้ ซึ่งทำได้โดยสร้าง Intent ของ Dialogflow ที่กำหนดไวยากรณ์หรือสิ่งที่ผู้ใช้ต้องพูดเพื่อทริกเกอร์ Intent และ Fulfillment ที่เกี่ยวข้องให้ประมวลผล Intent เมื่อมีการทริกเกอร์

คุณสามารถสร้าง Intent ได้มากตามต้องการเพื่อกำหนดไวยากรณ์ของการสนทนาทั้งหมด

สร้าง Intent

คลิกเครื่องหมาย + ข้างรายการในเมนู Intent ที่การนำทางด้านซ้ายของ Dialogflow Intent Editor จะปรากฏขึ้น ซึ่งคุณสามารถป้อนข้อมูลต่อไปนี้

  • ชื่อ Intent คือชื่อของ Intent ที่แสดงใน IDE
  • บริบทช่วยให้คุณกำหนดขอบเขตการทริกเกอร์ Intent เป็นกรณีเฉพาะได้ อ่านเอกสารของ Dialogflow เกี่ยวกับ Contexts สำหรับข้อมูลเพิ่มเติม
  • เหตุการณ์จะทริกเกอร์ Intent โดยที่ผู้ใช้ไม่ต้องพูดอะไรเลย เหตุการณ์ตัวอย่างหนึ่งคือเหตุการณ์ GOOGLE_ASSISTANT_WELCOME ซึ่งอนุญาตให้ Google Assistant เรียกใช้การดำเนินการของคุณ เหตุการณ์นี้ใช้กับการดำเนินการเริ่มต้นของการดำเนินการ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับIntent ตัวช่วยในตัวในเอกสารประกอบ
  • วลีการฝึกจะกำหนดสิ่งที่ผู้ใช้ต้องพูด (ไวยากรณ์) เพื่อทริกเกอร์ความตั้งใจ พิมพ์วลี 2-3 วลีที่นี่ (5-10) เพื่อให้ผู้ใช้พูดเพื่อกระตุ้นความตั้งใจ Dialogflow จะจัดการวลีตัวอย่างต่างๆ ที่คุณให้มาโดยอัตโนมัติ
  • การดำเนินการและพารามิเตอร์จะกำหนดข้อมูลที่จะส่งต่อไปยัง Fulfillment หากเปิดใช้ Fulfillment สำหรับ Intent นี้ ซึ่งรวมถึงข้อมูลที่แยกวิเคราะห์จากข้อมูลจากผู้ใช้และชื่อที่คุณใช้ใน Fulfillment ได้เพื่อตรวจหา Intent ที่ทริกเกอร์ คุณจะใช้ชื่อนี้ในภายหลังเพื่อจับคู่ความตั้งใจกับตรรกะ Fulfillment ที่สอดคล้องกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดการดำเนินการได้ที่การดำเนินการและพารามิเตอร์ ในเอกสารประกอบของ Dialogflow

  • Responses คือ Dialogflow Response Builder ที่ให้คุณกําหนดการตอบสนองต่อ Intent นี้ได้โดยตรงภายใน Dialogflow โดยไม่ต้องเรียกใช้ Fulfillment ฟีเจอร์นี้มีประโยชน์สำหรับการตอบกลับแบบคงที่ที่ไม่จำเป็นต้องมี Fulfillment คุณอาจใช้วิธีนี้เพื่อต้อนรับหรือข้อความบอกลาแบบง่ายๆ อย่างไรก็ตาม คุณน่าจะใช้ Fulfillment เพื่อตอบสนองต่อผู้ใช้สำหรับจุดประสงค์ส่วนใหญ่

  • Fulfillment ระบุว่าคุณต้องการเรียกใช้ Fulfillment หรือไม่เมื่อมีการทริกเกอร์ Intent คุณน่าจะเปิดใช้ตัวเลือกนี้สำหรับ ความตั้งใจส่วนใหญ่ใน Agent ของ Dialogflow หากต้องการดูรายการนี้ใน Intent คุณต้องเปิดใช้ Fulfillment สำหรับตัวแทนในเมนูการดำเนินการตามคำสั่งซื้อ

การสร้างคำตอบใน Dialogflow

สำหรับ Intent บางรายการ คุณอาจไม่จำเป็นต้องให้ Fulfillment ของ Google ตอบกลับ ในกรณีเหล่านี้ คุณสามารถใช้เครื่องมือสร้างการตอบกลับใน Dialogflow เพื่อสร้างคำตอบได้

ในส่วน Responses ให้ระบุข้อความตอบกลับที่คุณต้องการส่งคืนให้กับผู้ใช้ คำตอบเริ่มต้นคือข้อความตอบกลับ TTS แบบง่าย ซึ่งทำงานร่วมกับ Dialogflow ที่หลากหลายได้ คําตอบสำหรับ Google Assistant จะอธิบายไว้ในหน้าการตอบกลับ

การสร้างการตอบกลับการดำเนินการตามคำสั่งซื้อ

โค้ด Fulfillment ของคุณโฮสต์อยู่ในตรรกะ Fulfillment ของเว็บฮุคสำหรับการดำเนินการ ตัวอย่างเช่น ในตัวอย่าง Silly Name Maker พบตรรกะนี้ใน index.js สำหรับ Cloud Function สำหรับ Firebase

เมื่อมีการทริกเกอร์ Intent ที่ใช้ Fulfillment คุณจะได้รับคำขอจาก Dialogflow ที่มีข้อมูลเกี่ยวกับ Intent จากนั้นคุณจะตอบกลับคำขอโดยการประมวลผลความตั้งใจและส่งคืนการตอบกลับ คำขอและการตอบกลับนี้กำหนดโดยเว็บฮุคของ Dialogflow

เราขอแนะนำให้คุณใช้ไลบรารีของไคลเอ็นต์ Node.js เพื่อประมวลผลคำขอและส่งกลับคำตอบ ขั้นตอนทั่วไปในการใช้ไลบรารีของไคลเอ็นต์มีดังนี้

  1. เริ่มต้นออบเจ็กต์ Dialogflow ออบเจ็กต์นี้จะจัดการการฟังคำขอและแยกวิเคราะห์โดยอัตโนมัติเพื่อให้คุณประมวลผลใน Fulfillment ได้
  2. สร้างฟังก์ชันเพื่อจัดการคำขอ ฟังก์ชันเหล่านี้จะประมวลผลอินพุตของผู้ใช้และองค์ประกอบอื่นๆ ของ Intent และสร้างการตอบสนองเพื่อกลับไปที่ Dialogflow

เริ่มต้นออบเจ็กต์ Dialogflow

โค้ดต่อไปนี้จะสร้างอินสแตนซ์ Dialogflow และดำเนินการตั้งค่า Node.js บางส่วนสำหรับ Google Cloud Functions:

Node.js
'use strict';

const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');

const app = dialogflow({debug: true});

app.intent('Default Welcome Intent', (conv) => {
  // Do things
});
exports.yourAction = functions.https.onRequest(app);
Java
public class DfFulfillment extends DialogflowApp {
  private static final Logger LOGGER = LoggerFactory.getLogger(DfFulfillment.class);

  @ForIntent("Default Welcome Intent")
  public ActionResponse welcome(ActionRequest request) {
    // Do things
    // ...
  }

สร้างฟังก์ชันเพื่อจัดการคำขอ

เมื่อผู้ใช้พูดวลีที่เรียก Intent คุณจะได้รับคำขอจาก Dialogflow ให้คุณจัดการด้วยฟังก์ชันใน Fulfillment ในฟังก์ชันนี้ โดยทั่วไปคุณจะต้องดำเนินการต่อไปนี้

  1. ใช้ตรรกะที่จำเป็นสำหรับการประมวลผลข้อมูลจากผู้ใช้
  2. สร้างการตอบสนองเพื่อตอบสนองต่อ Intent ที่ทริกเกอร์ พิจารณาแพลตฟอร์มที่ผู้ใช้ใช้ในการสร้างคำตอบที่เหมาะสม ดูความสามารถของแพลตฟอร์มเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดระดับการตอบสนองของแพลตฟอร์มต่างๆ
  3. เรียกใช้ฟังก์ชัน ask() ด้วยการตอบกลับของคุณ

โค้ดต่อไปนี้แสดงวิธีสร้างการตอบสนอง TTS 2 รายการที่จัดการ Intent การเรียกใช้ (input.welcome) และกล่องโต้ตอบ Intent ของกล่องโต้ตอบ (input.number) ที่ต้อนรับผู้ใช้ไปยังการดำเนินการและพูดตัวเลขที่ผู้ใช้พูดสำหรับ Intent ของ Dialogflow โดยใช้ชื่อ

Node.js
const app = dialogflow();
app.intent('Default Welcome Intent', (conv) => {
conv.ask('Welcome to number echo! Say a number.');
});
app.intent('Input Number', (conv, {num}) => {
// extract the num parameter as a local string variable
conv.close(`You said ${num}`);
});
Java
@ForIntent("Default Welcome Intent")
public ActionResponse defaultWelcome(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  rb.add("Welcome to number echo! Say a number.");
  return rb.build();
}

@ForIntent("Input Number")
public ActionResponse inputNumber(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  Integer number = (Integer) request.getParameter("num");
  rb.add("You said " + number.toString());
  return rb.endConversation().build();
}

หมายเลขอินพุต Intent แบบกำหนดเองที่มาพร้อมกับโค้ดข้างต้นใช้เอนทิตี @sys.number เพื่อดึงหมายเลขจากคำพูดของผู้ใช้ จากนั้น Intent จะส่งพารามิเตอร์ num ซึ่งมีหมายเลขจากผู้ใช้ไปยังฟังก์ชันใน Fulfillment

คุณจะเพิ่มฟังก์ชันสำรองได้ แทนที่จะมีตัวแฮนเดิลแต่ละรายการสำหรับแต่ละ Intent ในฟังก์ชันทางเลือก ให้ตรวจสอบว่า Intent ใดเรียกใช้ Intent แล้ว และดำเนินการตามความเหมาะสม

Node.js
const WELCOME_INTENT = 'Default Welcome Intent';
const NUMBER_INTENT = 'Input Number';
const NUMBER_PARAMETER = 'num';
// you can add a fallback function instead of a function for individual intents
app.fallback((conv) => {
 // intent contains the name of the intent
 // you defined in the Intents area of Dialogflow
 const intent = conv.intent;
 switch (intent) {
   case WELCOME_INTENT:
     conv.ask('Welcome! Say a number.');
     break;
   case NUMBER_INTENT:
     const num = conv.parameters[NUMBER_PARAMETER];
     conv.close(`You said ${num}`);
     break;
 }
});
Java
// you can add a fallback function instead of a function for individual intents
@ForIntent("Default Fallback Intent")
public ActionResponse fallback(ActionRequest request) {
  final String WELCOME_INTENT = "Default Welcome Intent";
  final String NUMBER_INTENT = "Input Number";
  final String NUMBER_ARGUMENT = "num";
  // intent contains the name of the intent
  // you defined in the Intents area of Dialogflow
  ResponseBuilder rb = getResponseBuilder(request);
  String intent = request.getIntent();
  switch (intent) {
    case WELCOME_INTENT:
      rb.add("Welcome! Say a number.");
      break;
    case NUMBER_INTENT:
      Integer num = (Integer) request.getParameter(NUMBER_ARGUMENT);
      rb.add("You said " + num).endConversation();
      break;
  }
  return rb.build();
}

การแสดงซ้ำที่ไม่มีรายการที่ตรงกัน

เมื่อ Dialogflow จับคู่ไวยากรณ์อินพุตใดๆ ที่กำหนดไว้ในวลีการฝึกของ Intent ไม่ได้ ระบบจะทริกเกอร์ Intent สำรอง โดยทั่วไป Intent สำรองจะแจ้งเตือนให้ผู้ใช้ป้อนข้อมูลที่จำเป็นสำหรับการดำเนินการของคุณ คุณระบุวลีที่ซ้ำกันได้โดยการระบุวลีดังกล่าวในส่วนการตอบสนองของ Intent สำรอง หรือจะใช้เว็บฮุคเพื่อระบุคำตอบก็ได้

เมื่อคำตอบของผู้ใช้ไม่ตรงกับวลีการฝึกของการดำเนินการของคุณ Google Assistant จะพยายามจัดการอินพุตนั้น พฤติกรรมนี้ช่วยให้ผู้ใช้เปลี่ยน การดำเนินการในระหว่างการสนทนาได้ ตัวอย่างเช่น ผู้ใช้ถามว่า "สัปดาห์นี้มีหนังเรื่องอะไรฉายบ้าง" แล้วเปลี่ยนบริบทในระหว่างการสนทนาว่า "พรุ่งนี้อากาศเป็นยังไงบ้าง" ในตัวอย่างนี้ เพราะ "พรุ่งนี้อากาศเป็นยังไงบ้าง" เป็นคำตอบที่ไม่ถูกต้องสำหรับการสนทนาที่เริ่มโดยข้อความแจ้งเริ่มต้น Assistant จะพยายามจัดการการจับคู่โดยอัตโนมัติและนำผู้ใช้เข้าสู่การสนทนาที่เหมาะสม

หาก Assistant ไม่พบการดำเนินการที่เหมาะสมซึ่งตรงกับข้อมูลที่ผู้ใช้ป้อนไว้ ระบบจะส่งผู้ใช้กลับไปที่บริบทของการดำเนินการของคุณ

อย่าใช้ Intent สำรองเพื่อดำเนินการตามคำขอของผู้ใช้เนื่องจาก Assistant อาจขัดจังหวะการดำเนินการของคุณเพื่อตอบสนองต่อสถานการณ์ที่ไม่มีการจับคู่อย่างถูกต้อง คุณควรใช้ Intent สำรองเพื่อเตือนผู้ใช้ซ้ำว่าป้อนข้อมูลที่ถูกต้องเท่านั้น

วิธีสร้าง Intent สำรอง

  1. คลิก Intent ในเมนูการนำทางของ Dialogflow
  2. คลิก ⋮ ข้าง Create Intent แล้วเลือก สร้าง Intent สำรอง (หรือคลิก Intent สำรองเริ่มต้นเพื่อแก้ไข)
  3. ระบุวลีที่ซ้ำๆ เพื่อพูดตอบผู้ใช้ วลีเหล่านี้ควรเป็นบทสนทนา และมีประโยชน์ต่อบริบทปัจจุบันของผู้ใช้มากที่สุด

    วิธีการนี้โดยไม่ดําเนินการตาม Fulfillment: ระบุวลีในพื้นที่ Response ของ Intent Dialogflow สุ่มเลือกวลีจากรายการนี้เพื่อตอบกลับผู้ใช้จนกว่าจะเรียกความตั้งใจที่เจาะจงมากขึ้น

    หากต้องการดำเนินการโดยใช้ Fulfillment

    1. เปิด/ปิดเปิดใช้การเรียกใช้เว็บฮุคสำหรับ Intent นี้ในส่วนการดำเนินการตามคำสั่งซื้อของ Intent
    2. ในตรรกะ Fulfillment ให้จัดการ Intent สำรองเหมือนกับ Intent อื่นๆ ตามที่อธิบายไว้ในส่วนสร้างฟังก์ชันเพื่อจัดการคำขอ

    ตัวอย่างเช่น ฟังก์ชันต่อไปนี้ใช้ออบเจ็กต์ conv.data (เพย์โหลดข้อมูลที่กำหนดเองที่คุณจะใช้เพื่อรักษาสถานะได้) จากไลบรารีของไคลเอ็นต์ Node.js เพื่อจัดเก็บตัวนับที่ติดตามจำนวนครั้งที่ทริกเกอร์ Intent สำรอง หากมีการทริกเกอร์มากกว่า 1 ครั้ง การดำเนินการจะปิดลง แม้ว่าจะไม่แสดงในโค้ด คุณก็ควรทำให้ Intent อื่นๆ รีเซ็ตตัวนับนี้เป็น 0 เมื่อมีการทริกเกอร์ Intent ที่ไม่ใช่แบบสำรอง (ดู ตัวอย่าง Genie ของ Number สำหรับรายละเอียดเกี่ยวกับวิธีใช้งานฟีเจอร์นี้)

    Node.js
    app.intent('Default Fallback Intent', (conv) => {
     conv.data.fallbackCount++;
     // Provide two prompts before ending game
     if (conv.data.fallbackCount === 1) {
       conv.contexts.set(DONE_YES_NO_CONTEXT, 5);
       conv.ask('Are you done playing Number Genie?');
     } else {
       conv.close(`Since I'm still having trouble, so I'll stop here. ` +
         `Let's play again soon.`);
     }
    });
    Java
    @ForIntent("Default Fallback Intent")
    public ActionResponse defaultFallback(ActionRequest request) {
      final String DONE_YES_NO_CONTEXT = "done_yes_no_context";
      ResponseBuilder rb = getResponseBuilder(request);
    
      int fallbackCount =
          request.getConversationData().get("fallbackCount") == null
              ? 0
              : (Integer) request.getConversationData().get("fallbackCount");
      fallbackCount++;
      request.getConversationData().put("fallbackCount", fallbackCount);
    
      if (fallbackCount == 1) {
        rb.add(new ActionContext(DONE_YES_NO_CONTEXT, 5));
        rb.add("Are you done playing Number Genie?");
      } else {
        rb.add("Since I'm still having trouble, so I'll stop here. Let's play again soon")
            .endConversation();
      }
      return rb.build();
    }

การใช้บริบท

ใช้บริบทหากต้องการให้ Dialogflow ทริกเกอร์ Intent สำรองในบางสถานการณ์เท่านั้น วิธีนี้มีประโยชน์หากต้องการ Intent สำรองที่แตกต่างกันสำหรับสถานการณ์ที่ไม่ตรงกันที่ต่างกัน

  • หากคุณไม่ได้ตั้งค่าบริบทใน Intent สำรอง ระบบจะถือว่าเป็น Intent สำรองส่วนกลางที่ Dialogflow ทริกเกอร์เมื่อไม่ตรงกับ Intent อื่น คุณควรมีการกำหนดอย่างใดอย่างหนึ่งต่อไปนี้หากคุณเลือกใช้
  • หากคุณตั้งค่าบริบทอินพุตใน Intent สำรอง Dialogflow จะเรียกใช้ Intent สำรองนี้เมื่อเงื่อนไขต่อไปนี้เป็นจริง

    • บริบทปัจจุบันของผู้ใช้คือชุดขั้นสูงสุดของบริบทที่กำหนดไว้ในความตั้งใจ
    • ไม่พบ Intent อื่นๆ

    วิธีนี้ช่วยให้คุณใช้ Intent สำรองหลายรายการที่มีบริบทการป้อนข้อมูลที่แตกต่างกันได้เพื่อปรับแต่งการแสดงข้อความแจ้งที่ไม่ตรงกันซ้ำไปยังสถานการณ์ที่เฉพาะเจาะจง

  • หากกำหนดบริบทเอาต์พุตสำหรับ Intent สำรอง คุณจะคงผู้ใช้อยู่ในบริบทเดียวกันหลังจากมีการทริกเกอร์และประมวลผล Intent สำรองแล้ว

โปรดดูบริบทของ Dialogflow สำหรับข้อมูลเพิ่มเติม

การแสดงซ้ำโดยไม่ต้องป้อนข้อมูล

ดูรายละเอียดเกี่ยวกับวิธีจัดการเมื่อผู้ใช้ไม่ให้ข้อมูลเพิ่มเติมในอุปกรณ์เสียง เช่น Google Home ที่ต้องมีการโต้ตอบต่อ ในหน้าการทำซ้ำ