बिल्ड फ़ुलफ़िलमेंट (Dialogflow)

फ़ुलफ़िलमेंट, आपकी सेट की गई कार्रवाई के लिए बातचीत वाला इंटरफ़ेस तय करता है, जिससे उपयोगकर्ता का इनपुट मिलता है. साथ ही, इनपुट को प्रोसेस करने और कार्रवाई को पूरा करने के लिए लॉजिक भी तय होता है.

अपनी बातचीत तय करें

अब जबकि आपने कार्रवाइयों को तय कर लिया है, तो अब आप उन कार्रवाइयों के लिए मिलती-जुलती बातचीत बना सकते हैं. ऐसा करने के लिए, Dialogflow के ऐसे इंटेंट बनाएं जो व्याकरण के बारे में बताते हों या इंटेंट को ट्रिगर करने के लिए उपयोगकर्ताओं को क्या कहना होता है. साथ ही, इंटेंट के ट्रिगर होने पर उसे प्रोसेस करने के लिए, उससे जुड़ी फ़ुलफ़िलमेंट बनाएं.

अपनी पूरी बातचीत के व्याकरण को तय करने के लिए, जितने चाहें उतने इंटेंट बनाए जा सकते हैं.

इंटेंट बनाएं

Dialogflow के बाएं नेविगेशन पैनल में, इंटेंट मेन्यू आइटम के हिसाब से + साइन पर क्लिक करें. इंटेंट एडिटर ऐसी जगह दिखता है जहां नीचे दी गई जानकारी डाली जा सकती है:

  • इंटेंट का नाम आईडीई में दिखाए गए इंटेंट का नाम है.
  • कॉन्टेक्स्ट की मदद से, कुछ खास मामलों में इंटेंट को ट्रिगर किया जा सकता है. ज़्यादा जानकारी के लिए, कॉन्टेक्स्ट पर Dialogflow का दस्तावेज़ पढ़ें.
  • इवेंट से इंटेंट को ट्रिगर किया जाता है. इसके लिए, उपयोगकर्ताओं को कुछ भी बताने की ज़रूरत नहीं होती. इसका एक उदाहरण GOOGLE_ASSISTANT_WELCOME इवेंट है, जो Google Assistant को आपकी सेट की गई कार्रवाई शुरू करने की अनुमति देता है. इस इवेंट का इस्तेमाल, आपकी सेट की गई कार्रवाई की डिफ़ॉल्ट कार्रवाई के लिए किया जाता है. पहले से मौजूद हेल्पर इंटेंट के बारे में ज़्यादा जानकारी के लिए, हमारा दस्तावेज़ देखें.
  • ट्रेनिंग वाले वाक्यांशों से यह तय होता है कि इंटेंट ट्रिगर करने के लिए, उपयोगकर्ताओं को क्या कहना है (व्याकरण). यहां कुछ वाक्यांश (5-10) लिखें कि उपयोगकर्ता इंटेंट ट्रिगर करने के लिए क्या कह सकते हैं. Dialogflow आपके दिए गए उदाहरण वाले वाक्यांशों के स्वाभाविक वैरिएशन को अपने-आप मैनेज करता है.
  • कार्रवाई और पैरामीटर से यह तय होता है कि इस इंटेंट के लिए फ़ुलफ़िलमेंट को चालू करने पर कौनसा डेटा पास किया जाएगा. इसमें उपयोगकर्ता के इनपुट से पार्स किया गया डेटा और वह नाम शामिल होता है जिसका इस्तेमाल करके, फ़ुलफ़िलमेंट में ट्रिगर होने वाले इंटेंट का पता लगाया जा सकता है. आपको बाद में इस नाम का इस्तेमाल करके, अपने इंटेंट को उससे जुड़े लॉजिक के हिसाब से मैप करना होगा. कार्रवाइयां तय करने के बारे में ज़्यादा जानकारी के लिए, Dialogflow दस्तावेज़ में कार्रवाइयां और पैरामीटर देखें.

  • Responses, Dialogflow Response Builder है. इसमें, इस इंटेंट के रिस्पॉन्स को सीधे Dialogflow में तय किया जा सकता है. ऐसा करने के लिए, कॉल को पूरा करने की ज़रूरत नहीं होती. यह सुविधा ऐसे स्टैटिक रिस्पॉन्स के लिए काम की है जिनके लिए कार्रवाई की ज़रूरत नहीं होती. इसका इस्तेमाल, वेलकम मैसेज या अलविदा के बारे में बताने के लिए किया जा सकता है. हालांकि, ज़्यादातर इंटेंट के लिए आपको अपने उपयोगकर्ताओं को जवाब देने के लिए, फ़ुलफ़िलमेंट का इस्तेमाल करना होगा.

  • पूरा किया जाना: यह तय करता है कि इस इंटेंट के ट्रिगर होने पर, आपको पूरा करने के लिए कॉल करना है या नहीं. अपने Dialogflow एजेंट में ज़्यादातर इंटेट के लिए, आप इसे चालू करेंगे. इंटेंट में इस आइटम को देखने के लिए, ग्राहक को आइटम भेजना मेन्यू में एजेंट के लिए, ग्राहक को आइटम भेजने की सुविधा चालू होनी चाहिए.

Dialogflow में जवाब तैयार करना

कुछ इंटेंट के लिए, हो सकता है कि आपको फ़ुलफ़िलमेंट के लिए जवाब देने की ज़रूरत न पड़े. ऐसे मामलों में, जवाब देने के लिए, Dialogflow में रिस्पॉन्स बिल्डर का इस्तेमाल किया जा सकता है.

जवाब सेक्शन में, उपयोगकर्ताओं को टेक्स्ट के तौर पर जवाब दें. डिफ़ॉल्ट टेक्स्ट रिस्पॉन्स, आसान टीटीएस टेक्स्ट रिस्पॉन्स होते हैं, जो कई Dialogflow इंटिग्रेशन में काम कर सकते हैं. Google Assistant के जवाबों की जानकारी जवाब पेज पर दी गई है.

ग्राहक को आइटम भेजने से जुड़े जवाब तैयार करना

आपका फ़ुलफ़िलमेंट कोड, किसी कार्रवाई के लिए वेबहुक फ़ुलफ़िलमेंट लॉजिक में होस्ट किया जाता है. उदाहरण के लिए, Silly Name Maker सैंपल में, यह लॉजिक, Firebase के Cloud फ़ंक्शन के लिए 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() फ़ंक्शन को कॉल करके जवाब दें.

इस कोड में, दो टीटीएस जवाबों को बनाने का तरीका बताया गया है. ये जवाब, बोले जाने वाले इंटेंट (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 पर रीसेट करना चाहिए. (इसे लागू करने का तरीका जानने के लिए, नंबर जीन का नमूना देखें.)

    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 कॉन्टेक्स्ट देखें.

कोई भी इनपुट नहीं फिर से चालू करें

Reprompts पेज पर जाकर, यह समझने का तरीका जानें कि उपयोगकर्ता ने Google Home जैसे किसी वॉइस डिवाइस पर, जब लगातार इंटरैक्शन की ज़रूरत होती है और इनपुट नहीं देता, तो इसे कैसे मैनेज किया जाता है.