Uygulama ipuçları (Dialogflow)

İyi görüşme tasarımı uygulamaları uygulamak için aşağıdaki ipuçlarını inceleyin İşleminize ekleyin.

Olası farklılıklar

Bunu "Kullanıcı diyor ki" bölümünden yapabilirsiniz. giriş yapın. Ayrıca birden fazla aynı işlemle eşlenebilen ve her bir niyetin aşağıdakilerle tetiklendiği "kullanıcının mesajı" anlamına gelir.

Faydalı yeniden istemler vererek başarısız olun

İşleminiz bazen giriş almadığı için ilerleyemez (giriş yok olarak bilinir) veya kullanıcının girişini anlamamıştır (eşleşme yok olarak bilinir). Bu durumda Asistan ilk olarak kullanıcının bunu isteyip istemediğini belirlemeye çalışır. farklı bir İşlemi tetiklemek için kullanın. Asistan, kullanıcının girişiyle eşleşmezse kullanıcı, İşleminiz bağlamında devam eder. Bu senaryo her zaman gerçekleşebilir. Bu nedenle, en iyi uygulama, bunu benzersiz bir şekilde bir yedek içeren sohbetteki girişsiz ve eşleşmez durumlar. Yedekleri kullanarak kullanıcıların işleri yoluna koymalarına yardımcı olabilirsiniz.

Bunu yapmak için conv.data nesnenizde bir fallbackCount değişkeni başlatın. ve 0 olarak ayarlayın. İki yedek isteminden oluşan bir dizi hazırlayın (esnekliği net bir şekilde iletin), sohbeti sonlandıran son bir yedek istem.

Ardından bir yedek intent oluşturun (bunun amacı, aracılığıyla) anlamına gelir. Niyet işleyicide, yedek sayısını conv.data değeri artırın, 3'ten küçükse istemi diziden çekin / 3. Sayı 4 veya daha fazlaysa tıklayın. Yedek olmayan tüm niyetlerde yedek sayısını 0 olarak sıfırlayın. İdeal olarak, yedekleri belirli amaçların bunlara özgü olması için oluşturun.

Node.js

const GENERAL_FALLBACK = [
   'Sorry, what was that?',
   'I didn\'t quite get that. I can help you find good local restaurants, what do you want to know about?',
];

const LIST_FALLBACK = [
   'Sorry, what was that?',
   'I didn\'t catch that. Could you tell me which one you prefer?',
];

const FINAL_FALLBACK = 'I\'m sorry I\'m having trouble here. Let\'s talk again later.';

const handleFallback = (conv, promptFetch, callback) => {
 conv.data.fallbackCount = parseInt(conv.data.fallbackCount, 10);
 conv.data.fallbackCount++;
 if (conv.data.fallbackCount > 2) {
   conv.close(promptFetch.getFinalFallbackPrompt());
 } else {
   callback();
 }
}
// Intent handlers below
const generalFallback = (conv) => {
  handleFallback = (conv, promptFetch, () => {
    conv.ask(GENERAL_FALLBACK[conv.data.fallbackCount],
      getGeneralNoInputPrompts());
 });
}

const listFallback = (conv) => {
  handleFallback = (conv, promptFetch, () => {
   conv.ask(LIST_FALLBACK[conv.data.fallbackCount],
       getGeneralNoInputPrompts());
 });
}

const nonFallback = (conv) => {
  conv.data.fallbackCount = 0;
  conv.ask('A non-fallback message here');
}

Java

private static final List<String> GENERAL_FALLBACK =
    Arrays.asList(
        "Sorry, what was that?",
        "I didn\'t quite get that. I can tell you all about IO, like date or location, or about the sessions. What do you want to know about?");
private static final List<String> LIST_FALLBACK =
    Arrays.asList(
        "Sorry, what was that?",
        "I didn\'t catch that. Could you tell me which one you liked?");
private static final List<String> FINAL_FALLBACK =
    Arrays.asList("I\'m sorry I\'m having trouble here. Maybe we should try this again later.");

@ForIntent("General Fallback")
public ActionResponse generalFallback(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  int fallbackCount = (Integer) request.getConversationData().get("fallbackCount");
  fallbackCount++;
  request.getConversationData().put("fallbackCount", fallbackCount);
  if (fallbackCount > 2) {
    responseBuilder.add(getRandomPromptFromList(FINAL_FALLBACK)).endConversation();
  } else {
    responseBuilder.add(getRandomPromptFromList(GENERAL_FALLBACK));
  }
  return responseBuilder.build();
}

private String getRandomPromptFromList(List<String> prompts) {
  Random rand = new Random();
  int i = rand.nextInt(prompts.size());
  return prompts.get(i);
}

@ForIntent("List Fallback")
public ActionResponse listFallback(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  int fallbackCount = (Integer) request.getConversationData().get("fallbackCount");
  fallbackCount++;
  request.getConversationData().put("fallbackCount", fallbackCount);
  if (fallbackCount > 2) {
    responseBuilder.add(getRandomPromptFromList(FINAL_FALLBACK)).endConversation();
  } else {
    responseBuilder.add(getRandomPromptFromList(LIST_FALLBACK));
  }
  return responseBuilder.build();
}

@ForIntent("Non Fallback")
public ActionResponse nonFallback(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  request.getConversationData().put("fallbackCount", 0);
  responseBuilder.add("Non Fallback message");
  return responseBuilder.build();
}

Her an yardıma hazır olma

"Ne yapabilirim?", "Ne yapabilirim?", "Ne yapabilirim?", "bana neler söyleyebilirsin" veya "yardım". Bu amaçla, bir miktar (dönüşümlü) sunun Bu, temsilcinin neler yapabileceğine dair genel bir bakış sunan ve kullanıcıları bir yapabilirsiniz. İdeal olarak, Dialogflow'da takip yardım niyetini kullanarak farklı harekete geçirici amaçlar için farklı yardım senaryoları oluşturmaktır.

Node.js

const HELP_PROMPTS = [
   'There\'s a lot you might want to know about the local restaurants, and I can tell you all about it, like where it is and what kind of food they have. What do you want to know?',
   'I\'m here to help, so let me know if you need any help figuring out where or what to eat. What do you want to know?',
];

// Intent handler
const help = (conv) => {
 reply(conv, promptFetch.getHelpPrompt(), // fetches random entry from HELP_PROMPTS
     promptFetch.getGeneralNoInputPrompts());
}

Java

private static final List<String> HELP_PROMPTS =
    Arrays.asList(
        "There's a lot you might want to know about IO, and I can tell you all about it, like where it is and what the sessions are. What do you want to know?",
        "IO can be a little overwhelming, so I\'m here to help. Let me know if you need any help figuring out the event, like when it is, or what the sessions are. What do you want to know?");

@ForIntent("Help")
public ActionResponse help(ActionRequest request) {
  return getResponseBuilder(request).add(getRandomPromptFromList(HELP_PROMPTS)).build();
}

Kullanıcıların bilgileri tekrar oynatmasına izin verin

Tüm app.ask(output) yöntemlerinizi çıkışını conv.data.lastPrompt yapın. Şunu dinleyen bir tekrarlanan intent oluşturun: "Ne?" veya "ne oldu?" gibi sorularla, "tekrar söyle" veya "anılır söyler misiniz?” gibi sorular sorarsınız. Tekrarlayan ön eklerden oluşan bir dizi oluşturmak için Kullanıcının bir şeyin tekrarlanmasını istediğini onaylama. Tekrarlı şarkılar intent işleyici için, tekrarlama önekinin birleştirilmiş bir dizesiyle ask() çağrısı yapın ve conv.data.lastPrompt değerine ayarlanır. Proje başladıktan sonra Son istemde kullanılmışsa SSML açılış etiketleri.

Node.js

const REPEAT_PREFIX = [
    'Sorry, I said ',
    'Let me repeat that. ',
];

const reply = (conv, inputPrompt, noInputPrompts) => {
  conv.data.lastPrompt = inputPrompt;
  conv.data.lastNoInputPrompts = noInputPrompts;
  conv.ask(inputPrompt, noInputPrompts);
}
// Intent handlers
const normalIntent = (conv) => {
  reply(conv, 'Hey this is a question', SOME_NO_INPUT_PROMPTS);
}

const repeat = (conv) => {
  let repeatPrefix = promptFetch.getRepeatPrefix(); // randomly chooses from REPEAT_PREFIX
  // Move SSML start tags over
  if (conv.data.lastPrompt.startsWith(promptFetch.getSSMLPrefix())) {
    conv.data.lastPrompt =
        conv.data.lastPrompt.slice(promptFetch.getSSMLPrefix().length);
    repeatPrefix = promptFetch.getSSMLPrefix() + repeatPrefix;
  }
  conv.ask(repeatPrefix + conv.data.lastPrompt,
      conv.data.lastNoInputPrompts);
}

Java

private final List<String> REPEAT_PREFIX = Arrays.asList("Sorry, I said ", "Let me repeat that.");

private final String SsmlPrefix = "<speak>";

@ForIntent("Normal Intent")
public ActionResponse normalIntent(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getConversationData().put("lastPrompt", "Hey this is a question");
  return responseBuilder.build();
}

@ForIntent("repeat")
public ActionResponse repeat(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  String repeatPrefix = getRandomPromptFromList(REPEAT_PREFIX);
  // Move SSML start tags over
  String lastPrompt = (String) responseBuilder.getConversationData().get("lastPrompt");
  if (lastPrompt.startsWith(SsmlPrefix)) {
    String newLastPrompt = lastPrompt.substring(SsmlPrefix.length());
    responseBuilder.getConversationData().put("lastPrompt", newLastPrompt);
    repeatPrefix = SsmlPrefix + repeatPrefix;
  }
  responseBuilder.add(repeatPrefix + lastPrompt);
  return responseBuilder.build();
}

Görüşmeyi kullanıcı tercihleriyle kişiselleştirin

İşleminiz kullanıcılara tercihlerini sorabilir ve daha sonra bu bilgileri hatırlayabilir. kullanabilir. Böylece, kullanıcıyla ileride yapacağınız görüşmeleri kişiselleştirebilirsiniz.

Bu örnek İşlem, kullanıcılara bir posta kodu için hava durumu raporu verir. Aşağıdakiler örnek kod, kullanıcıya İşlemin posta kodu bilgilerini hatırlamasını isteyip istemediğini sorar kullanabileceğiniz bir kod yazmanız gerekir.

Node.js

app.intent('weather_report', (conv) => {
  let zip = conv.arguments.get('zipcode');
  conv.data.zip = zip;
  conv.ask(getWeatherReport(zip));
  conv.ask(new Confirmation(`Should I remember ${zip} for next time?`));
});

app.intent('remember_zip', (conv, params, confirmation) => {
  if (confirmation) {
    conv.user.storage.zip = conv.data.zip;
    conv.close('Great! See you next time.');
  } else conv.close('Ok, no problem.');
});

Java

@ForIntent("weather_report")
public ActionResponse weatherReport(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  String zip = (String) request.getArgument("location").getStructuredValue().get("zipCode");
  responseBuilder.getConversationData().put("zip", zip);
  responseBuilder.add(getWeatherReport(zip));
  responseBuilder.add(
      new Confirmation().setConfirmationText("Should I remember " + zip + " for next time?"));
  return responseBuilder.build();
}

@ForIntent("remember_zip")
public ActionResponse rememberZip(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.getUserConfirmation()) {
    responseBuilder.getUserStorage().put("zip", responseBuilder.getConversationData().get("zip"));
    responseBuilder.add("Great! See you next time.").endConversation();
  } else {
    responseBuilder.add("Ok, no problem.").endConversation();
  }
  return responseBuilder.build();
}

İlk iletişim kutusunda kullanıcıya hangi posta kodunu girdiğini sorduktan sonra, bir sonraki çağrıda bu istemi atlayıp aynı posta kodunu kullanabilir. Yine de bir kaçış rotası (ör. izin verilen bir öneri çipi gibi) sağlamanız gerekir. seçmeye çalışın) ancak postadaki konuşmanın akışını azaltarak çok daha sorunsuz bir deneyim oluşturmanızı sağlar.

Node.js

app.intent('weather_report', (conv) => {
  let zip = conv.arguments.get('zipcode');
  if (zip) {
    conv.close(getWeatherReport(zip));
  } else if (conv.user.storage.zip) {
    conv.ask(new SimpleResponse(getWeatherReport(conv.user.storage.zip)));
    conv.ask(new Suggestions('Try another zipcode'));
  } else {
    conv.ask('What\'s your zip code?');
  }
});

app.intent('provide_zip_df', (conv) => {
  conv.user.storage.zip = conv.arguments.get('zipcode');
  conv.close(getWeatherReport(conv.user.storage.zip));
});

Java

public ActionResponse weatherReport2(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  String zip = (String) request.getArgument("location").getStructuredValue().get("zipCode");
  if (zip != null) {
    responseBuilder.add(getWeatherReport(zip)).endConversation();
  } else if ((zip = (String) responseBuilder.getUserStorage().get("zip")) != null) {
    responseBuilder.add(new SimpleResponse().setTextToSpeech(getWeatherReport(zip)));
    responseBuilder.add(new Suggestion().setTitle("Try another zipcode"));
  } else {
    responseBuilder.add("What's your zip code?");
  }
  return responseBuilder.build();
}

Geri gelen kullanıcılar için özelleştirme

Görüşmeler arasında belirli bir durumu korumak çok daha doğal bir deneyim sunmalısınız. Bu deneyimi tasarlamanın ilk adımı, Geri gelen kullanıcıları farklı şekilde selamlamak. Örneğin, selamlamaya dokunarak Geçmiş konuşmaları temel alarak faydalı bilgiler sunabilir. Bunu yapmak için, kullanıcının gelen AppRequest.User lastSeen mülkünü kullanarak daha önce İşleminizle etkileşime geçti. lastSeen özelliği eklenirse Normalden farklı bir karşılama mesajı kullanabilirsiniz.

Aşağıdaki kod, last.seen

Node.js

// This function is used to handle the welcome intent
// In Dialogflow, the Default Welcome Intent ('input.welcome' action)
// In Actions SDK, the 'actions.intent.MAIN' intent
const welcome = (conv) => {
  if (conv.user.last.seen) {
    conv.ask(`Hey you're back...`);
  } else {
    conv.ask('Welcome to World Cities Trivia!...');
  }
}

Java

// This function is used to handle the welcome intent
// In Dialogflow, the Default Welcome Intent ('input.welcome' action)
// In Actions SDK, the 'actions.intent.MAIN' intent
public ActionResponse welcome(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.getUser().getLastSeen() != null) {
    responseBuilder.add("Hey you're back...");
  } else {
    responseBuilder.add("Welcome to Number Genie!...");
  }
  return responseBuilder.build();
}

Yanıtı asıl kullanıcıya göre uyarlayarak bu karşılamayı daha da güçlendirebilirsiniz. lastSeen değerine ayarlanır. Örneğin, son etkileşimi çok sayıda gerçekleşen kullanıcılar aylar önce olduğundan farklı bir karşılama mesajı Söz konusu işlemi bir gün önce kullananlar.

Görüşme içindeki ses seviyesi kontrolü

Asistan, desteklenen cihazlarda kullanıcıların diyalog: "sesi aç" veya "şunu ayarla" gibi şeyler söyleyerek: ses seviyesini yüzde 50'ye getir". Benzer eğitim ifadelerini işleyen amaçlarınız varsa amaçlarınıza öncelik vereceğinizi düşünebilirsiniz. Asistan'ın bunları yapmasına izin vermenizi öneririz. Kullanıcı istekleri için (İşleminizin belirli bir nedeni yoksa)