ফুলফিলমেন্ট তৈরি করা (Dialogflow)

ব্যবহারকারীর ইনপুট পাওয়ার জন্য আপনার অ্যাকশনের কথোপকথন ইন্টারফেস এবং ইনপুট প্রসেস করার লজিক ও অবশেষে অ্যাকশন পূরণ করার পদ্ধতিকে ফুলফিলমেন্ট বলা হয়।

আপনার কথোপকথন নির্ধারণ করুন

এখন আপনি অ্যাকশন নির্দিষ্ট করেছেন, আপনি সেই অ্যাকশনের জন্য সংশ্লিষ্ট কথোপকথন তৈরি করতে পারবেন। আপনি এটি করেন Dialogflow ইনটেন্ট তৈরি করার মাধ্যমে যা ব্যাকরণ বা ইনটেন্ট ট্রিগার করার জন্য ব্যবহারকারীদের কী বলতে হবে এবং ইনটেন্ট ট্রিগার হলে তা প্রসেস করার জন্য সংশ্লিষ্ট ফুলফিলমেন্ট সংজ্ঞায়িত করে।

আপনার সম্পূর্ণ কথোপকথনের ব্যাকরণ সংজ্ঞায়িত করতে আপনি যতগুলি চান ততগুলি ইনটেন্ট তৈরি করতে পারেন।

ইনটেন্ট তৈরি করুন

Dialogflow-এর বাঁদিকের নেভিগেশনে Intents মেনু আইটেমের পাশে + চিহ্নে ক্লিক করুন। ইনটেন্ট এডিটর দেখা যাবে যেখানে আপনি নিম্নলিখিত তথ্য লিখতে পারবেন:

  • ইন্টেন্টের নাম হল ইন্টেন্টের সেই নাম যা IDE-তে দেখানো হয়।
  • Contexts আপনাকে নির্দিষ্ট ক্ষেত্রে ইনটেন্ট ট্রিগার করার সুযোগ দেয়। আরও তথ্যের জন্য প্রসঙ্গ-এর উপর Dialogflow ডকুমেন্টেশন পড়ুন।
  • ইভেন্ট ব্যবহারকারীর কিছু বলার প্রয়োজন ছাড়াই ইনটেন্ট ট্রিগার করে। একটি উদাহরণ ইভেন্ট হল GOOGLE_ASSISTANT_WELCOME ইভেন্ট, যা Google Assistant-কে আপনার অ্যাকশন চালু করার অনুমতি দেয়। এই ইভেন্টটি আপনার অ্যাকশনের ডিফল্ট অ্যাকশন-এর জন্য ব্যবহার করা হয়। বিল্ট-ইন হেল্পার ইনটেন্ট সম্পর্কে আরও তথ্যের জন্য আমাদের ডকুমেন্টেশন দেখুন।
  • ট্রেনিং ফ্রেজ ব্যবহারকারীদের কী বলতে হবে (ব্যাকরণ) তা নির্ধারণ করে যাতে ইনটেন্ট ট্রিগার করা যায়। ইনটেন্ট ট্রিগার করার জন্য ব্যবহারকারী কী বলতে পারেন তার কয়েকটি বাক্যাংশ (৫-১০) এখানে টাইপ করুন। আপনার দেওয়া উদাহরণ বাক্যাংশের স্বাভাবিক বৈচিত্র্য Dialogflow অটোমেটিক ম্যানেজ করে।
  • অ্যাকশন ও প্যারামিটার নির্ধারণ করে যে এই ইনটেন্টের জন্য ফুলফিলমেন্ট চালু করা থাকলে, ফুলফিলমেন্টে কোন ডেটা পাস করতে হবে। এর মধ্যে ব্যবহারকারীর ইনপুট থেকে পার্স করা ডেটা এবং নাম অন্তর্ভুক্ত থাকে যা আপনি নিজের ফুলফিলমেন্টে ব্যবহার করতে পারেন যাতে কোন ইনটেন্ট ট্রিগার করা হয়েছে তা শনাক্ত করা যায়। আপনি পরে এই নাম ব্যবহার করে আপনার ইনটেন্টকে তার অনুরূপ ফুলফিলমেন্ট লজিকের সাথে ম্যাপ করবেন। অ্যাকশন নির্ধারণ করার ব্যাপারে আরও তথ্য পেতে Dialogflow ডকুমেন্টেশনে অ্যাকশন ও প্যারামিটার দেখুন।

  • Responses হল Dialogflow Response Builder, যেখানে আপনি ফুলফিলমেন্ট কল না করেই সরাসরি Dialogflow-এর মধ্যে এই ইনটেন্টের জন্য উত্তর সংজ্ঞায়িত করতে পারেন। এই ফিচারটি স্ট্যাটিক উত্তরের জন্য উপযোগী যার জন্য ফুলফিলমেন্টের প্রয়োজন হয় না। আপনি এটি ব্যবহার করে সহজ স্বাগত বা বিদায় মেসেজ দিতে পারেন। তবে, বেশিরভাগ ইনটেন্টের ক্ষেত্রে ব্যবহারকারীদের উত্তর দেওয়ার জন্য আপনি সম্ভবত ফুলফিলমেন্ট ব্যবহার করবেন।

  • এই ইনটেন্ট ট্রিগার করা হলে, আপনি ফুলফিলমেন্ট কল করতে চান কিনা তা ফুলফিলমেন্ট নির্দিষ্ট করে। আপনার Dialogflow এজেন্টের বেশিরভাগ ইনটেন্টের জন্য আপনি সম্ভবত এটি চালু করবেন। ইনটেন্টে এই আইটেম দেখতে, আপনাকে অবশ্যই ফুলফিলমেন্ট মেনুতে এজেন্টের জন্য ফুলফিলমেন্ট চালু করতে হবে।

Dialogflow-এ উত্তর তৈরি করা

কিছু ইনটেন্টের ক্ষেত্রে, আপনার ফুলফিলমেন্ট থেকে কোনও উত্তর নাও আসতে পারে। এইসব ক্ষেত্রে, আপনি Dialogflow-এ রেসপন্স বিল্ডার ব্যবহার করে উত্তর তৈরি করতে পারেন।

উত্তর বিভাগে, আপনি ব্যবহারকারীকে যে টেক্সট উত্তর দিতে চান তা লিখুন। ডিফল্ট টেক্সট উত্তর হল সাধারণ TTS টেক্সট উত্তর যা একাধিক Dialogflow ইন্টিগ্রেশন জুড়ে কাজ করতে পারে। Google Assistant-এর উত্তর উত্তর পৃষ্ঠায় বর্ণনা করা হয়েছে।

ফুলফিলমেন্ট রেসপন্স তৈরি করা

আপনার ফুলফিলমেন্ট কোড কোনও অ্যাকশনের জন্য ওয়েবহুক ফুলফিলমেন্ট লজিকে হোস্ট করা হয়। যেমন, Silly Name Maker স্যাম্পেলে, Firebase-এর জন্য ক্লাউড ফাংশনের index.js-এ এই লজিক পাওয়া যায়।

যখন কোনও ইনটেন্ট ট্রিগার করা হয় যা ফুলফিলমেন্ট ব্যবহার করে, আপনি Dialogflow থেকে একটি অনুরোধ পান যাতে ইনটেন্ট সম্পর্কে তথ্য থাকে। তারপর আপনি ইনটেন্ট প্রসেস করে এবং উত্তর ফিরিয়ে দিয়ে অনুরোধের উত্তর দেন। এই অনুরোধ ও উত্তর Dialogflow ওয়েব হুক দ্বারা সংজ্ঞায়িত।

আমরা আপনাকে অনুরোধ প্রসেস করতে এবং উত্তর ফেরত দিতে Node.js ক্লায়েন্ট লাইব্রেরি ব্যবহার করার জন্য সুপারিশ করি। ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সাধারণ প্রসেস এখানে দেওয়া হল:

  1. Dialogflow অবজেক্ট শুরু করুন। এই অবজেক্ট অটোমেটিক অনুরোধ শোনে এবং পার্স করে যাতে আপনি নিজের ফুলফিলমেন্টে সেগুলি প্রসেস করতে পারেন।
  2. অনুরোধ ম্যানেজ করার জন্য ফাংশন তৈরি করুন। এইসব ফাংশন ব্যবহারকারীর ইনপুট এবং ইনটেন্টের অন্যান্য কম্পোনেন্ট প্রসেস করে এবং Dialogflow-তে ফেরত পাঠানোর জন্য উত্তর তৈরি করে।

Dialogflow অবজেক্ট শুরু করুন

নিম্নলিখিত কোড Dialogflow ইনস্ট্যান্সিয়েট করে এবং Google Cloud Functions-এর জন্য কিছু বয়লারপ্লেট Node.js সেট-আপ করে:

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
    // ...
  }

অনুরোধ ম্যানেজ করার জন্য ফাংশন তৈরি করুন

ব্যবহারকারী কোনও ইনটেন্ট ট্রিগার করে এমন কোনও শব্দগুচ্ছ বললে, আপনি Dialogflow থেকে একটি অনুরোধ পান যা আপনি আপনার ফুলফিলমেন্টে একটি ফাংশনের মাধ্যমে ম্যানেজ করেন। এই ফাংশনে, আপনি সাধারণত নিম্নলিখিত কাজগুলি করবেন:

  1. ব্যবহারকারীর ইনপুট প্রসেস করার জন্য প্রয়োজনীয় লজিক প্রয়োগ করুন।
  2. ট্রিগার করা ইনটেন্টের উত্তর দিতে আপনার উত্তর তৈরি করুন। ব্যবহারকারীরা যে সারফেস ব্যবহার করছেন সেটি বিবেচনা করে উপযুক্ত উত্তর তৈরি করুন। বিভিন্ন সারফেসের জন্য কীভাবে উত্তর দিতে হয় সেই সম্পর্কে আরও তথ্যের জন্য সারফেসের ক্ষমতা দেখুন।
  3. আপনার উত্তর সহ ask() ফাংশন কল করুন।

নিম্নলিখিত কোড থেকে আপনি জানতে পারবেন যে কীভাবে দুটি TTS উত্তর তৈরি করতে হয় যা ইনভোকেশন ইনটেন্ট (input.welcome) এবং ডায়ালগ ইনটেন্ট (input.number) ম্যানেজ করে। এই ইনটেন্টগুলি আপনার অ্যাকশনে ব্যবহারকারীকে স্বাগত জানায় এবং 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();
}

কাস্টম ইনটেন্ট ইনপুট নম্বর, যা উপরের কোডের সাথে থাকে, সেটি ব্যবহারকারীর উচ্চারণ থেকে একটি নম্বর বের করতে @sys.number এন্টিটি ব্যবহার করে। তারপর, ইন্টেন্টটি num প্যারামিটার পাঠায়, যাতে ব্যবহারকারীর থেকে পাওয়া নম্বর থাকে, ফুলফিলমেন্টের ফাংশনে।

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

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 যখন আপনার ইনটেন্টের ট্রেনিং ফ্রেজে সংজ্ঞায়িত ইনপুট ব্যাকরণের কোনওটির সাথে মিলতে পারে না, তখন এটি একটি ফলব্যাক ইনটেন্ট ট্রিগার করে। ফলব্যাক ইনটেন্ট সাধারণত ব্যবহারকারীকে আপনার অ্যাকশনের জন্য প্রয়োজনীয় ইনপুট প্রদান করার জন্য আবার প্রম্পট করে। আপনি ফলব্যাক ইনটেন্টের উত্তর বিভাগে নির্দিষ্ট করে রিপ্রম্পট বাক্যাংশ প্রদান করতে পারেন অথবা উত্তর প্রদান করার জন্য ওয়েবহুক ব্যবহার করতে পারেন।

ব্যবহারকারীর উত্তর আপনার অ্যাকশনের ট্রেনিং ফ্রেজের সাথে না মিললে, Google Assistant ইনপুট ম্যানেজ করার চেষ্টা করে। এই আচরণ ব্যবহারকারীদের কথোপকথনের মাঝখানে অ্যাকশন পরিবর্তন করতে সাহায্য করে। যেমন, ব্যবহারকারী জিজ্ঞাসা করলেন, "এই সপ্তাহে কোন কোন সিনেমা চলছে?" এবং তারপর কথোপকথনের মাঝেই প্রসঙ্গ পরিবর্তন করে বললেন: "আগামীকাল আবহাওয়া কেমন থাকবে?" এই উদাহরণে, "আগামীকাল আবহাওয়া কেমন থাকবে?" প্রাথমিক প্রম্পটের মাধ্যমে শুরু হওয়া কথোপকথনের সঠিক উত্তর নয়, তাই Assistant অটোমেটিক ম্যাচটি ম্যানেজ করার চেষ্টা করে এবং ব্যবহারকারীকে উপযুক্ত কথোপকথনে নিয়ে যায়।

Assistant যদি ব্যবহারকারীর ইনপুটের সাথে মেলে এমন কোনও উপযুক্ত অ্যাকশন খুঁজে না পায়, তাহলে ব্যবহারকারীকে আপনার অ্যাকশনের প্রসঙ্গে ফিরিয়ে আনা হয়।

কারণ, কোনও সঠিক নো-ম্যাচ পরিস্থিতিতে উত্তর দেওয়ার জন্য Assistant আপনার অ্যাকশনে বাধা দিতে পারে, তাই ব্যবহারকারীর কোয়েরি পূরণ করার জন্য ফলব্যাক ইনটেন্ট ব্যবহার করবেন না। ব্যবহারকারীকে সঠিক ইনপুট দেওয়ার জন্য আবার প্রম্পট করতে আপনাকে শুধু ফলব্যাক ইনটেন্ট ব্যবহার করতে হবে।

ফলব্যাক ইনটেন্ট তৈরি করতে:

  1. Dialogflow-এর নেভিগেশন মেনুতে ইনটেন্ট বিকল্পে ক্লিক করুন।
  2. ইনটেন্ট তৈরি করুন বিকল্পের পাশে ⋮ আইকনে ক্লিক করে ফলব্যাক ইনটেন্ট তৈরি করুন বিকল্প বেছে নিন। (অথবা, ডিফল্ট ফলব্যাক ইনটেন্ট এডিট করতে ক্লিক করুন।)
  3. ব্যবহারকারীকে আবার প্রম্পট করার জন্য বাক্যাংশ উল্লেখ করুন। এইসব বাক্যাংশ কথোপকথনমূলক এবং ব্যবহারকারীর বর্তমান প্রসঙ্গের জন্য যতটা সম্ভব উপযোগী হতে হবে।

    ফুলফিলমেন্ট ছাড়া এটি করতে: ইনটেন্টের উত্তর অংশে বাক্যাংশ উল্লেখ করুন। আরও নির্দিষ্ট ইনটেন্ট ট্রিগার না হওয়া পর্যন্ত Dialogflow এই তালিকা থেকে র‍্যান্ডমলি শব্দগুচ্ছ বেছে নিয়ে ব্যবহারকারীদের সাথে কথা বলে।

    ফুলফিলমেন্টের মাধ্যমে এটি করতে:

    1. ইনটেন্টের ফুলফিলমেন্ট বিভাগে এই ইনটেন্টের জন্য ওয়েব হুক কল চালু করুন টগল করুন।
    2. আপনার ফুলফিলমেন্ট লজিকে, অনুরোধ ম্যানেজ করার জন্য ফাংশন তৈরি করুন বিভাগে যেমন বর্ণনা করা হয়েছে, ঠিক সেইভাবে অন্য যেকোনও ইনটেন্টের মতো ফলব্যাক ইনটেন্ট ম্যানেজ করুন।

    যেমন, নিম্নলিখিত ফাংশনটি Node.js ক্লায়েন্ট লাইব্রেরি থেকে conv.data অবজেক্ট (একটি যথেচ্ছ ডেটা পেলোড যা আপনি স্টেট বজায় রাখতে ব্যবহার করতে পারেন) ব্যবহার করে একটি কাউন্টার স্টোর করে যা ট্র্যাক করে যে কতবার একটি ফলব্যাক ইনটেন্ট ট্রিগার করা হয়েছে। এটি একাধিকবার ট্রিগার করা হলে, অ্যাকশন বন্ধ হয়ে যায়। যদিও এটি কোডে দেখানো হয়নি, তবুও নন-ফলব্যাক ইনটেন্ট ট্রিগার হলে, অন্যান্য ইনটেন্ট যাতে এই কাউন্টারকে 0-তে রিসেট করে দেয়, তা আপনাকে নিশ্চিত করতে হবে। (এটি কীভাবে প্রয়োগ করবেন সেই সম্পর্কে বিস্তারিত জানতে Number Genie স্যাম্পেল দেখুন।)

    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 শুধুমাত্র নির্দিষ্ট পরিস্থিতিতে ফলব্যাক ইনটেন্ট ট্রিগার করুক, তাহলে কনটেক্সট ব্যবহার করুন। বিভিন্ন নো-ম্যাচ পরিস্থিতির জন্য আপনি আলাদা আলাদা ফলব্যাক ইনটেন্ট রাখতে চাইলে এটি সহায়ক হবে।

  • আপনি যদি কোনও ফলব্যাক ইনটেন্টে প্রসঙ্গ সেট না করেন, তাহলে এটিকে একটি গ্লোবাল ফলব্যাক ইনটেন্ট হিসেবে বিবেচনা করা হয় যা অন্য কোনও ইনটেন্ট মিলে না গেলে Dialogflow ট্রিগার করে। আপনি যদি একটি ব্যবহার করতে চান, তাহলে আপনাকে এর মধ্যে একটিই বেছে নিতে হবে।
  • আপনি যদি ফলব্যাক ইনটেন্টে ইনপুট প্রসঙ্গ সেট করেন, তাহলে নিম্নলিখিত শর্তগুলি পূরণ হলে Dialogflow এই ফলব্যাক ইনটেন্ট ট্রিগার করে:

    • ব্যবহারকারীর বর্তমান প্রসঙ্গ হল ইনটেন্টে সংজ্ঞায়িত প্রসঙ্গের সুপারসেট।
    • অন্য কোনও ইনটেন্ট ম্যাচ করে না।

    এটি আপনাকে নির্দিষ্ট পরিস্থিতিতে নো-ম্যাচ রিপ্রম্পটিং কাস্টমাইজ করতে বিভিন্ন ইনপুট প্রসঙ্গ সহ একাধিক ফলব্যাক ইনটেন্ট ব্যবহার করতে দেয়।

  • আপনি যদি ফলব্যাক ইনটেন্টে আউটপুট প্রসঙ্গ সেট করেন, তাহলে ফলব্যাক ইনটেন্ট ট্রিগার এবং প্রসেস করার পরে আপনি ব্যবহারকারীকে একই প্রসঙ্গে রাখেন।

আরও তথ্যের জন্য Dialogflow কনটেক্সট দেখুন।

ইনপুট না থাকলে আবার প্রম্পট করা

Google Home-এর মতো ভয়েস ডিভাইসে ব্যবহারকারী আরও ইনপুট না দিলে কীভাবে ম্যানেজ করতে হবে সেই সম্পর্কে বিস্তারিত জানতে আবার প্রম্পট করা পৃষ্ঠা দেখুন, যেখানে ক্রমাগত ইন্টার‍্যাকশন প্রয়োজন।