Derleme istek karşılama (Dialogflow)

Karşılama, İşleminizin kullanıcı girişi elde etmesi için kullanılan sohbet arayüzünü ve girişi işleyip nihayetinde İşlemi gerçekleştirmek için kullanılan mantığı tanımlar.

Konuşmanızı tanımlayın

İşlemleri tanımladığınıza göre artık bu İşlemlere karşılık gelen ileti dizisini oluşturabilirsiniz. Bunu, dil bilgisini veya kullanıcıların niyeti tetiklemek için söylemesi gerekenleri ve tetiklendiğinde niyeti işlemek için karşılık gelen istek karşılamayı tanımlayan Dialogflow niyetleri oluşturarak yaparsınız.

Konuşmanızın tamamının dil bilgisini tanımlamak için istediğiniz kadar amaç oluşturabilirsiniz.

Amaç oluşturma

Dialogflow'un sol gezinme menüsündeki Niyetler menü öğesinin yanında bulunan + işaretini tıklayın. Aşağıdaki bilgileri girebileceğiniz Intent Düzenleyici görüntülenir:

  • Amaç adı, IDE'de gösterilen amacın adıdır.
  • Bağlamlar, amacın tetiklenmesini belirli durumlara göre kapsamanıza olanak tanır. Daha fazla bilgi için Bağlamlar ile ilgili Dialogflow belgelerini okuyun.
  • Etkinlikler, kullanıcıların herhangi bir şey söylemesine gerek kalmadan amaçları tetikler. Örnek etkinliklerden biri, Google Asistan'ın İşleminizi çağırmasına olanak tanıyan GOOGLE_ASSISTANT_WELCOME etkinliğidir. Bu etkinlik, İşleminizin varsayılan İşlemi için kullanılır. Yerleşik yardımcı amaçları hakkında daha fazla bilgi için dokümanlarımıza bakın.
  • Eğitim ifadeleri, kullanıcıların niyeti tetiklemek için ne söylemesi gerektiğini (dil bilgisi) tanımlar. Buraya kullanıcıların amacı tetiklemek için söyleyebileceği kelimelerden birkaçını (5-10) yazın. Dialogflow, sağladığınız örnek ifadelerin doğal varyasyonlarını otomatik olarak işler.
  • İşlem ve parametreler, bu amaç için istek karşılama etkinse hangi verilerin istek karşılamaya iletileceğini tanımlar. Buna, kullanıcı girişinden ayrıştırılan veriler ve hangi niyetin tetiklendiğini algılamak için istek karşılamanızda kullanabileceğiniz ad da dahildir. Bu adı daha sonra niyetinizi karşılık gelen istek karşılama mantığıyla eşlemek için kullanacaksınız. İşlemler tanımlama hakkında daha fazla bilgi için Dialogflow belgelerindeki İşlemler ve parametreler bölümüne bakın.

  • Yanıtlar, Dialogflow Yanıt Oluşturucu'dur. Burada, istek karşılama çağrısı yapmadan doğrudan Dialogflow'da bu amaca yönelik yanıtı tanımlayabilirsiniz. Bu özellik, istek karşılama gerektirmeyen statik yanıtlar için yararlıdır. Basit karşılama veya vedalaşma mesajları göndermek için bu özelliği kullanabilirsiniz. Ancak, çoğu durumda kullanıcılarınıza yanıt vermek için büyük olasılıkla istek karşılamayı kullanırsınız.

  • Karşılama, bu niyet tetiklendiğinde istek karşılama durumunuzu çağırmak isteyip istemediğinizi belirtir. Büyük olasılıkla Dialogflow aracınızdaki çoğu amaç için bunu etkinleştirirsiniz. Niyette bu öğeyi görmek için Karşılama menüsünde temsilci için sipariş karşılamayı etkinleştirmiş olmanız gerekir.

Dialogflow'da yanıt derleme

Bazı amaçlar için, istek karşılamanızın yanıt döndürmesini sağlamanız gerekmeyebilir. Bu tür durumlarda yanıt oluşturmak için Dialogflow'daki yanıt oluşturucuyu kullanabilirsiniz.

Yanıtlar alanında, kullanıcılara döndürmek istediğiniz yazılı yanıtı girin. Varsayılan metin yanıtları, birden çok Dialogflow entegrasyonunda çalışabilen basit TTS metin yanıtlarıdır. Google Asistan'ın yanıtları Yanıtlar sayfasında açıklanmaktadır.

Sipariş karşılama yanıtları oluşturma

Sipariş karşılama kodunuz bir Action'ın webhook karşılama mantığında barındırılır. Örneğin Saçma Ad Oluşturucu örneğinde, Firebase Cloud Function işlevi için bu mantık index.js içinde yer almaktadır.

İstek karşılama kullanan bir niyet tetiklendiğinde Dialogflow'dan niyet hakkında bilgi içeren bir istek alırsınız. Ardından, amacı işleyip bir yanıt döndürerek isteğe yanıt verirsiniz. Bu istek ve yanıt, Dialogflow webhook'u tarafından tanımlanır.

İstekleri işlemek ve yanıtları döndürmek için Node.js istemci kitaplığını kullanmanızı önemle tavsiye ederiz. İstemci kitaplığını kullanmayla ilgili genel süreç şöyledir:

  1. Dialogflow nesnesini başlatın. Bu nesne, isteklerin dinlenmesini ve ayrıştırılmasını otomatik olarak gerçekleştirir. Böylece bunları karşılamanızda işleyebilirsiniz.
  2. İstekleri işlemek için işlevler oluşturun. Bu işlevler, kullanıcı girişini ve niyetin diğer bileşenlerini işler ve Dialogflow'a döndürülecek yanıtı oluşturur.

Dialogflow nesnesini başlatın

Aşağıdaki kod, Dialogflow örneğini somutlaştırır ve Google Cloud Functions için bazı ortak Node.js kurulumu yapar:

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

İstekleri işlemek için işlevler oluşturma

Kullanıcılar bir amacı tetikleyen bir ifade söylediğinde Dialogflowflow'dan istek karşılamanızdaki bir işlevle ele aldığınız bir istek alırsınız. Bu işlevde genellikle aşağıdakileri yaparsınız:

  1. Kullanıcı girişini işlemek için gereken tüm mantığı yürütün.
  2. Tetiklenen niyetlere yanıt vermek için yanıtlarınızı oluşturun. Kullanıcılarınızın uygun yanıtlar oluşturmak için kullandığı yüzeyi göz önünde bulundurun. Farklı yüzeylere yönelik yanıtları nasıl hazırlayacağınız hakkında daha fazla bilgi için yüzey özellikleri bölümüne bakın.
  3. Yanıtınızla birlikte ask() işlevini çağırın.

Aşağıdaki kod, bir çağrı amacını (input.welcome) ve kullanıcıyı İşleminize karşılayan ve kullanıcının Dialogflow niyeti için söylediği numarayı şu adla hatırlatan bir iletişim niyetini (input.number) işleyen iki TTS yanıtının nasıl oluşturulacağını gösterir:

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

Yukarıdaki koda eşlik eden özel amaç Giriş Numarası, kullanıcının ifadelerinden bir sayı çıkarmak için @sys.number varlığını kullanır. Amaç, daha sonra kullanıcının numarasını içeren num parametresini, istek karşılamadaki işleve gönderir.

Her amaç için ayrı işleyiciler yerine alternatif olarak bir yedek işlev ekleyebilirsiniz. Yedek işlevinde, işlevi hangi amacın tetiklediğini kontrol edin ve buna göre uygun işlemi yapın.

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

Eşleşmeyen yeniden istem

Dialogflow, amaçlarınızın Eğitim ifadeleri bölümünde tanımlanan giriş dilbilgilerinden herhangi biriyle eşleşemediğinde bir yedek intent tetikler. Yedek amaçlar genellikle kullanıcıdan İşleminiz için gerekli girişi sağlamasını ister. Yeniden istem ifadelerini, yedek amacın Yanıt alanında belirterek sağlayabilir veya yanıt sağlamak için webhook kullanabilirsiniz.

Bir kullanıcının yanıtı, İşleminizin eğitim ifadeleriyle eşleşmediğinde Google Asistan, girişi işlemeye çalışır. Bu davranış, kullanıcıların bir görüşmenin ortasında İşlemleri değiştirmesini kolaylaştırır. Örneğin, bir kullanıcı "Bu hafta hangi filmler oynuyor?" diye sorar ve ardından görüşmenin ortasında bağlamı değiştirir: "Yarın hava nasıl olacak?" Bu örnekte, "Yarın hava nasıl olacak?" ilk istem tarafından tetiklenen ileti dizisi için geçerli bir yanıt olmadığı için Asistan otomatik olarak eşleşmeyi işlemeye ve kullanıcıyı uygun bir görüşmeye taşımaya çalışır.

Asistan, kullanıcının girişiyle eşleşen uygun bir İşlem bulamazsa kullanıcı, İşleminizin bağlamına geri döner.

Asistan, geçerli bir eşleşme yok senaryoya yanıt vermek için İşleminizi kesintiye uğratabileceğinden kullanıcı sorgularını yerine getirmek için yedek intent'leri kullanmayın. Kullanıcınızdan geçerli girişleri tekrar istemek için yalnızca yedek intent'leri kullanmalısınız.

Yedek intent oluşturmak için:

  1. Dialogflow'un gezinme menüsünde Intents'i (Niyetler) tıklayın.
  2. Niyet Oluştur'un yanındaki ⋮ simgesini tıklayıp Yedek Amaç Oluştur'u seçin. (Alternatif olarak, düzenlemek için Varsayılan Yedek Niyeti'ni tıklayın.)
  3. Kullanıcılara yanıt vermek için yeniden istem ifadeleri belirtin. Bu ifadeler konuşma olmalı ve kullanıcının mevcut bağlamı için mümkün olduğunca yararlı olmalıdır.

    Bunu yerine getirmeden yapmak için: Niyetin Yanıt alanındaki ifadeleri belirtin. Dialogflow, daha spesifik bir niyet tetiklenene kadar kullanıcılara geri dönüş yapmak için bu listeden rastgele ifadeler seçer.

    Sipariş karşılama ile bunu yapmak için:

    1. Niyetin Karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir'i açın.
    2. İstek karşılama mantığınızda, yedek amacını İstekleri işlemek için işlevler oluşturma bölümünde açıklandığı gibi, diğer tüm niyetlerle aynı şekilde işleyin.

    Örneğin, aşağıdaki işlev, bir yedek amacın kaç kez tetiklendiğini izleyen bir sayacı depolamak için Node.js istemci kitaplığındaki conv.data nesnesini (durumu korumak için kullanabileceğiniz rastgele bir veri yükü) kullanır. Birden çok kez tetiklenirse işlem kapanır. Kodda gösterilmese de, yedek olmayan bir niyet tetiklendiğinde diğer amaçların bu sayacı 0'a sıfırlamasını sağlamanız gerekir. (Bunun nasıl uygulanacağıyla ilgili ayrıntılar için Number Genie örneğine bakın.)

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

Bağlamları kullanma

Dialogflow'un yalnızca belirli durumlarda yedek niyetleri tetiklemesini istiyorsanız bağlamları kullanın. Bu, farklı eşleşmeme senaryoları için farklı yedek amaçlarınızın olmasını istiyorsanız yararlı olur.

  • Yedek niyette bağlam ayarlamazsanız bu niyet, başka bir niyet eşleşmediğinde Dialogflow'un tetiklediği genel yedek niyet olarak kabul edilir. Kullanmayı seçerseniz bunlardan yalnızca birini tanımlamanız gerekir.
  • Bir yedek niyette giriş bağlamları ayarlarsanız Dialogflow bu yedek niyeti aşağıdakiler doğru olduğunda tetikler:

    • Kullanıcının mevcut bağlamları, amaçta tanımlanan bağlamların üst kümesidir.
    • Başka amaç eşleşmesi yok.

    Bu sayede, eşleşme yok yeniden istemini belirli senaryolara göre özelleştirmek için farklı giriş bağlamlarına sahip birden fazla yedek intent kullanabilirsiniz.

  • Yedek intent için çıkış bağlamı ayarlarsanız yedek amaç tetiklenip işlendikten sonra kullanıcıyı aynı bağlamda tutarsınız.

Daha fazla bilgi için Dialogflow Contexts bölümüne bakın.

Giriş yok yeniden istemi

Kullanıcı, Google Home gibi sürekli etkileşim gerektiren bir ses cihazında daha fazla giriş sağlamadığında bunu nasıl yapacağınızla ilgili ayrıntılar için Kopyalar sayfasına bakın.