บันทึกข้อมูลในการสนทนา (Dialogflow)

สำรวจใน Dialogflow

คลิกต่อไปเพื่อนำเข้าตัวอย่างบันทึกข้อมูลใน Dialogflow จากนั้นทำตามขั้นตอนด้านล่างเพื่อทำให้ใช้งานได้และทดสอบตัวอย่าง

  1. ป้อนชื่อตัวแทนและสร้าง Agent ใหม่ใน Dialogflow สำหรับตัวอย่าง
  2. หลังจากนำเข้า Agent เสร็จแล้ว ให้คลิกไปที่ Agent
  3. จากเมนูการนำทางหลัก ให้ไปที่การดำเนินการคำสั่งซื้อ
  4. เปิดใช้ตัวแก้ไขในบรรทัด แล้วคลิกทำให้ใช้งานได้ ซึ่งตัวแก้ไขจะมีโค้ดตัวอย่าง
  5. จากเมนูการนําทางหลัก ให้ไปที่ Integrations แล้วคลิก Google Assistant
  6. ในหน้าต่างโมดัลที่ปรากฏ ให้เปิดใช้แสดงตัวอย่างการเปลี่ยนแปลงอัตโนมัติ และคลิกทดสอบเพื่อเปิดเครื่องจำลองการดำเนินการ
  7. ในเครื่องจำลอง ให้ป้อน Talk to my test app เพื่อทดสอบตัวอย่าง

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

ข้อกำหนดจะแตกต่างกันไปเล็กน้อยขึ้นอยู่กับว่าคุณต้องบันทึกข้อมูลภายในการสนทนาหนึ่งหรือระหว่างการสนทนา คุณใช้ช่อง conversationToken ของออบเจ็กต์ AppResponse เพื่อบันทึกข้อมูลในการสนทนาได้

หากต้องการบันทึกข้อมูลในการสนทนาต่างๆ ให้ทําตามขั้นตอนต่อไปนี้แทน

  1. ตรวจสอบว่าผู้ใช้ได้รับการยืนยันหรือเป็นผู้มาเยือน
  2. จัดเก็บหรือเข้าถึงข้อมูลผู้ใช้โดยใช้ช่อง userStorage ของออบเจ็กต์ AppResponse

การบันทึกข้อมูลระหว่างการเปลี่ยนสถานะของการสนทนา

ช่อง conversationToken เป็นสตริงที่มีโทเค็นทึบแสงและหมุนเวียนไปยัง "การดำเนินการ" ทุกครั้งที่มีการสนทนา เช่น หากกำหนดค่าเป็น "count=1" ใน AppResponse สำหรับการเปิดการสนทนาครั้งแรก AppRequest ที่การดำเนินการของคุณได้รับสำหรับตาที่ 2 ของการสนทนานั้นจะมี "count=1" อยู่ใน conversationToken

โทเค็นจะกำหนดค่าเริ่มต้นเป็นสตริงว่างเปล่าในตอนต้นของการสนทนาเสมอ หากใช้ไลบรารีของไคลเอ็นต์ Actions on Google Node.js คุณจะสามารถ โต้ตอบกับโทเค็นการสนทนาเป็นออบเจ็กต์ JSON โดยใช้ conv.data โดยที่ conv คืออินสแตนซ์ของ Conversation

ตัวอย่างต่อไปนี้แสดงวิธีบันทึกตัวนับในช่อง conversationToken ของ AppResponse

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุคที่ใช้ outputContexts แทน conversationToken

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุค

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

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

การบันทึกข้อมูลในการสนทนาต่างๆ

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

การกำหนดและการจัดการสถานะการยืนยันผู้ใช้

สถานะการยืนยันของผู้ใช้อาจมีค่าเป็น GUEST หรือ VERIFIED เมื่อเริ่มต้นการสนทนา Actions on Google จะตั้งสถานะการยืนยันของผู้ใช้ตามสัญญาณบอกสถานะต่างๆ เมื่อการสนทนาเริ่มต้นขึ้น ตัวอย่างเช่น ผู้ใช้ที่เข้าสู่ระบบ Google Assistant ในอุปกรณ์เคลื่อนที่มีสถานะการยืนยันเป็น VERIFIED

เหตุผลที่อาจทำให้ผู้ใช้มีสถานะการยืนยันเป็น GUEST มีดังนี้

  • ผู้ใช้ปิดผลการค้นหาเฉพาะบุคคลไว้
  • ผู้ใช้ปิดใช้กิจกรรมบนเว็บและแอป โปรดทราบว่าผู้ใช้บางคน อาจปิดใช้การตั้งค่านี้ในระดับโดเมน
  • หากอุปกรณ์เปิดใช้ Voice Match และจับคู่ไม่สำเร็จหรือผู้ใช้เรียกใช้ Assistant โดยไม่ใช้เสียง (เช่น กด Google Home ค้างไว้)
  • ผู้ใช้ไม่ได้ลงชื่อเข้าใช้

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

หากใช้ไลบรารีของไคลเอ็นต์ Actions on Google สำหรับ Node.js คุณจะอินเทอร์เฟซกับพื้นที่เก็บข้อมูลของผู้ใช้เป็นออบเจ็กต์ JSON ได้โดยใช้ conv.user.storage โดยที่ conv คืออินสแตนซ์ของ Conversation ตัวอย่างต่อไปนี้แสดงวิธีบันทึกตัวนับในช่อง userStorage ของ AppResponse

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Java

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุค

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

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

หมายเหตุทางกฎหมาย: การขอความยินยอมก่อนเข้าถึง userStorage บางประเทศมีกฎระเบียบที่กำหนดให้นักพัฒนาแอปต้องขอความยินยอมจากผู้ใช้ก่อนจึงจะเข้าถึงหรือบันทึกข้อมูลบางอย่าง (เช่น ข้อมูลส่วนบุคคล) ใน userStorage ได้ หากคุณดำเนินธุรกิจในประเทศใดประเทศหนึ่งเหล่านี้ และต้องการเข้าถึงหรือบันทึกข้อมูลดังกล่าวใน userStorage คุณต้องใช้เครื่องมือช่วยยืนยันเพื่อขอความยินยอมจากผู้ใช้และขอความยินยอมก่อน จึงจะเริ่มจัดเก็บข้อมูลดังกล่าวใน userStorage ได้

การหมดอายุของพื้นที่เก็บข้อมูลของผู้ใช้

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

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

  • ตั้งค่า Voice Match แล้วแต่ไม่มีการจับคู่ที่ตรงกัน
  • ผู้ใช้ปิดใช้ข้อมูลส่วนตัว

ล้างเนื้อหาของช่อง userStorage

คุณล้างเนื้อหาในช่อง userStorage ของการดำเนินการได้โดยตั้งค่าช่อง resetUserStorage ของ AppResponse เป็นจริง หากคุณตั้งค่า userStorage เป็นสตริงว่างเปล่า ค่าของ userStorage จะไม่เปลี่ยนแปลงในบทสนทนาถัดไป วิธีนี้ช่วยให้คุณหลีกเลี่ยงการส่ง userStorage กลับไปทั้งฉบับได้ในกรณีที่เนื้อหาไม่เปลี่ยนแปลง

หากใช้ไลบรารี Actions On Google Client สำหรับ Node.js คุณจะตั้งค่า conv.user.storage เป็น {} ได้ (ออบเจ็กต์ว่างเปล่า)

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Java

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุค

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

โปรดทราบว่า JSON ด้านล่างอธิบายการตอบสนองของเว็บฮุค

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

ในฐานะผู้ใช้ คุณจะดูเนื้อหาของช่อง userStorage ในการดำเนินการที่คุณเรียกใช้ได้ คุณยังสามารถนำข้อมูลผู้ใช้ที่จัดเก็บไว้ออกจากการดำเนินการนั้นๆ ได้โดยทำให้บริการเลิกจดจำคุณ

  1. เปิดแอป Assistant ในโทรศัพท์
  2. แตะไอคอนลิ้นชัก

  3. ในแท็บสำรวจ ให้ค้นหาการดำเนินการที่ต้องการดูหรือล้างพื้นที่เก็บข้อมูลของผู้ใช้ แล้วแตะการดำเนินการเพื่อเปิดหน้ารายละเอียด
  4. เลื่อนลงไปที่ด้านล่างของหน้า
    • หากต้องการดูเนื้อหาของช่อง userStorage ให้แตะ [ดูข้อมูลที่จัดเก็บไว้]
    • หากต้องการนำข้อมูลผู้ใช้ที่จัดเก็บไว้ออก ให้แตะหยุด $action ไม่ให้จดจำฉัน