বাস্তবায়ন টিপস (ডায়ালগফ্লো)

আপনার অ্যাকশনে ভাল কথোপকথন ডিজাইন অনুশীলন বাস্তবায়নের জন্য নিম্নলিখিত টিপস পর্যালোচনা করুন।

বৈচিত্র আশা

ডায়ালগফ্লোতে "ব্যবহারকারী বলেছেন" ইনপুটে এটি পরিচালনা করুন। এছাড়াও, একই অ্যাকশনে ম্যাপ করতে পারে এমন একাধিক অভিপ্রায় ব্যবহার করুন, যেখানে প্রতিটি অভিপ্রায়কে "ব্যবহারকারী বলেছেন" বাক্যাংশের বিভিন্ন সেট দিয়ে ট্রিগার করা যেতে পারে।

সহায়ক reprompts প্রদান করুন এবং gracefully ব্যর্থ

কখনও কখনও আপনার অ্যাকশন এগিয়ে যেতে পারে না কারণ এটি একটি ইনপুট পায়নি (একটি নো-ইনপুট হিসাবে পরিচিত) বা ব্যবহারকারীর ইনপুট বুঝতে পারে না (একটি নো-ম্যাচ হিসাবে পরিচিত)৷ এটি ঘটলে, সহকারী প্রথমে ব্যবহারকারী একটি ভিন্ন ক্রিয়া ট্রিগার করতে চায় কিনা তা নির্ধারণ করার চেষ্টা করে। অ্যাসিস্ট্যান্ট যদি অন্য অ্যাকশনের সাথে ব্যবহারকারীর ইনপুটের সাথে মেলে না, তাহলে ব্যবহারকারী আপনার অ্যাকশনের প্রেক্ষাপটে চালিয়ে যান। এই দৃশ্যটি যে কোনো সময় ঘটতে পারে, তাই সর্বোত্তম অভ্যাস হল নো-ইনপুট এবং নো-ম্যাচ পরিস্থিতিগুলিকে একটি ফলব্যাকের সাথে কথোপকথনের প্রতিটি মোড়কে অনন্যভাবে পরিচালনা করা। ফলব্যাক ব্যবহার করে, আপনি ব্যবহারকারীদের ট্র্যাকে ফিরে যেতে সাহায্য করতে পারেন।

এটি করার জন্য, আপনার conv.data অবজেক্টে একটি fallbackCount ভেরিয়েবল শুরু করুন এবং এটি 0 এ সেট করুন। দুটি ফলব্যাক প্রম্পটের একটি অ্যারে প্রস্তুত করুন (স্বচ্ছতার সাথে বৃদ্ধি), এবং একটি চূড়ান্ত ফলব্যাক প্রম্পট যা কথোপকথনটি শেষ করে।

তারপরে, একটি ফলব্যাক অভিপ্রায় তৈরি করুন (এজেন্টের প্রতিটি কর্মযোগ্য অভিপ্রায়ের জন্য আদর্শভাবে একটি)। অভিপ্রায় হ্যান্ডলারে, conv.data অবজেক্ট থেকে ফলব্যাক গণনা টানুন, এটি বৃদ্ধি করুন এবং যদি এটি 3 এর কম হয়, 3 এর অ্যারে থেকে প্রম্পটটি টানুন। গণনা 4 বা তার বেশি হলে, ব্যবহার করে কথোপকথনটি বন্ধ করুন চূড়ান্ত প্রম্পট। ফলব্যাক নয় এমন সমস্ত অভিপ্রায়ে, ফলব্যাক গণনা 0-তে রিসেট করুন। আদর্শভাবে, নির্দিষ্ট অভিপ্রায়গুলিকে নির্দিষ্ট করার জন্য ফলব্যাকগুলিকে টেমপ্লেটাইজ করুন।

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');
}

জাভা

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();
}

যে কোন সময় সাহায্য করার জন্য প্রস্তুত থাকুন

"আমি কি করতে পারি?", "আপনি আমাকে কি বলতে পারেন" বা "সহায়তা" এর মতো সাহায্যের বাক্যাংশ শুনতে পারে এমন একটি উদ্দেশ্য তৈরি করুন। এই অভিপ্রায়ে, কিছু (ঘূর্ণায়মান) প্রতিক্রিয়া অফার করুন যা এজেন্ট কী করতে পারে তার একটি ওভারভিউ অফার করে এবং ব্যবহারকারীদের একটি সম্ভাব্য পদক্ষেপের নির্দেশ দেয়। আদর্শভাবে, বিভিন্ন কর্মযোগ্য অভিপ্রায়ের জন্য বিভিন্ন সহায়তা পরিস্থিতি তৈরি করতে ডায়ালগফ্লোতে ফলো-আপ সহায়তার উদ্দেশ্যগুলিও ব্যবহার করুন।

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());
}

জাভা

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();
}

ব্যবহারকারীদের তথ্য পুনরায় খেলতে দিন

আপনার সমস্ত app.ask(output) পদ্ধতি একটি প্রক্সি ফাংশন দিয়ে মোড়ানো যা conv.data.lastPrompt এ আউটপুট যোগ করে। একটি পুনরাবৃত্ত অভিপ্রায় তৈরি করুন যা ব্যবহারকারীর কাছ থেকে পুনরাবৃত্তি করার অনুরোধগুলি যেমন "কি?", "আবার বলুন", বা "আপনি কি এটি পুনরাবৃত্তি করতে পারেন?"। পুনরাবৃত্তি উপসর্গগুলির একটি বিন্যাস তৈরি করুন যা স্বীকার করতে ব্যবহার করা যেতে পারে যে ব্যবহারকারী কিছু পুনরাবৃত্তি করতে বলেছেন। পুনরাবৃত্তি অভিপ্রায় হ্যান্ডলারে, পুনরাবৃত্তি উপসর্গের একটি সংযুক্ত স্ট্রিং এবং conv.data.lastPrompt এর মান সহ ask() কল করুন। মনে রাখবেন যে শেষ প্রম্পটে ব্যবহার করা হলে আপনাকে যেকোনো SSML ওপেনিং ট্যাগ পরিবর্তন করতে হবে।

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);
}

জাভা

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();
}

ব্যবহারকারীর পছন্দের সাথে কথোপকথনটি ব্যক্তিগতকৃত করুন

আপনার অ্যাকশন ব্যবহারকারীদের তাদের পছন্দের জন্য জিজ্ঞাসা করতে পারে এবং পরবর্তীতে ব্যবহারের জন্য তাদের মনে রাখতে পারে, আপনাকে সেই ব্যবহারকারীর সাথে ভবিষ্যতের কথোপকথন ব্যক্তিগতকৃত করতে দেয়।

এই উদাহরণ অ্যাকশন ব্যবহারকারীদের একটি জিপ কোডের জন্য আবহাওয়া প্রতিবেদন দেয়। নিম্নলিখিত উদাহরণ কোড ব্যবহারকারীকে জিজ্ঞাসা করে যে তারা পরবর্তী কথোপকথনের জন্য তাদের জিপ কোড মনে রাখুক

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.');
});

জাভা

@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();
}

ব্যবহারকারীকে জিজ্ঞাসা করার পরে তারা তাদের প্রথম ডায়ালগের সময় কোন জিপ কোডে রয়েছে, আপনি তাদের পরবর্তী আহ্বানের সময় সেই প্রম্পটটি এড়িয়ে যেতে পারেন এবং একই জিপ কোড ব্যবহার করতে পারেন। আপনার এখনও একটি পালানোর পথ প্রদান করা উচিত (যেমন একটি পরামর্শ চিপ তাদের একটি ভিন্ন জিপ কোড বাছাই করার অনুমতি দেয়) তবে সাধারণ ক্ষেত্রে কথোপকথনের মোড় কমিয়ে আপনি অনেক বেশি নির্বিঘ্ন অভিজ্ঞতা তৈরি করেন।

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));
});

জাভা

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();
}

ফেরত ব্যবহারকারীদের জন্য কাস্টমাইজ করুন

কথোপকথনের মধ্যে কিছু অবস্থা বজায় রাখা রিটার্ন ব্যবহারকারীদের জন্য অনেক বেশি স্বাভাবিক অভিজ্ঞতা নিশ্চিত করে। এই অভিজ্ঞতা তৈরির প্রথম ধাপ হল প্রত্যাবর্তনকারী ব্যবহারকারীদের ভিন্নভাবে শুভেচ্ছা জানানো। উদাহরণস্বরূপ, আপনি অতীতের কথোপকথনের উপর ভিত্তি করে অভিবাদন বা পৃষ্ঠের দরকারী তথ্য টেপার করতে পারেন। এটি করার জন্য, ব্যবহারকারী আপনার অ্যাকশনের সাথে আগে ইন্টারঅ্যাক্ট করেছে কিনা তা নির্ধারণ করতে ইনকামিং AppRequest.User lastSeen প্রপার্টি ব্যবহার করুন। যদি lastSeen প্রপার্টি রিকোয়েস্ট পেলোডে অন্তর্ভুক্ত করা হয়, তাহলে আপনি স্বাভাবিকের চেয়ে ভিন্ন অভিবাদন ব্যবহার করতে পারেন।

নিচের কোডটি last.seen এর মান আনতে Node.js ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।

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!...');
  }
}

জাভা

// 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();
}

আপনি lastSeen এর প্রকৃত মানের সাথে সাড়া জাগিয়ে এই অভিবাদনটিকে আরও উন্নত করতে পারেন। উদাহরণস্বরূপ, যে ব্যবহারকারীদের শেষ মিথস্ক্রিয়া বর্তমান ইন্টারঅ্যাকশনের অনেক মাস আগে হয়েছিল তারা আগের দিন যারা অ্যাকশন ব্যবহার করেছিল তাদের চেয়ে আলাদা অভিবাদন পেতে পারে।

ইন-কথোপকথন ভলিউম নিয়ন্ত্রণ

সমর্থিত ডিভাইসগুলিতে, সহায়ক ব্যবহারকারীদের "ভলিউম বাড়ান" বা "ভলিউম 50 শতাংশে সেট করুন" এর মতো কথা বলে আপনার কথোপকথনমূলক অ্যাকশনের মধ্যে ডিভাইসের ভলিউম নিয়ন্ত্রণ করতে দেয়। আপনার যদি অভিপ্রায় থাকে যা অনুরূপ প্রশিক্ষণ বাক্যাংশগুলি পরিচালনা করে, আপনার অভিপ্রায়গুলি অগ্রাধিকার পাবে। আপনার অ্যাকশনের নির্দিষ্ট কারণ না থাকলে আমরা সহায়ককে এই ব্যবহারকারীর অনুরোধগুলি পরিচালনা করতে দেওয়ার পরামর্শ দিই।