Botframework-solutions: Izinkan meneruskan data dari keterampilan kembali ke VA

Dibuat pada 30 Sep 2019  ·  25Komentar  ·  Sumber: microsoft/botframework-solutions

Cerita Pengguna

Sebagai pengembang, saya ingin dapat meneruskan data kembali dari keterampilan ke VA.

Saya ingin dapat meneruskan data kembali dari keterampilan ke VA yang dipanggil ketika keterampilan selesai, untuk (misalnya) melanjutkan percakapan dengan bot lain, dengan informasi yang dihasilkan oleh bot pertama.

Kasus penggunaan saya adalah sebagai berikut:

Saya memiliki VA yang terhubung ke 2 bot, bot pertama digunakan untuk mencari orang dan bot ke-2 digunakan untuk memesan pertemuan dengan orang-orang itu. Salah satu fungsi bot pencarian orang adalah memungkinkan pengguna membuat pertemuan dengan orang yang dicari. Itu akan membutuhkan bot pencari untuk mengembalikan referensi ke orang yang akan membuat pertemuan, kembali ke VA. Itu saat ini tidak mungkin sejauh yang saya tahu , karena semua keterampilan yang kembali ke VA setelah selesai adalah nilai boolean.

Akan lebih bagus jika sesuatu seperti mekanisme manifes/SkillContext/slots tersedia dari skill -> VA alih-alih hanya untuk VA -> skill

Bot Services customer-replied-to customer-reported

Komentar yang paling membantu

Hai,

Kami membutuhkan tutorial tentang ini :-) Saya akan menambahkan ini sebagai bagian dari pekerjaan GA kami (akhir bulan) dan idealnya di situs dokumen dalam beberapa hari ke depan. Sementara itu semoga informasi di bawah ini membantu.

Sebagai bagian dari Skills GA, kami menyederhanakan berbagi data dan memindahkan metode transfer dari SemanticAction (yang sulit digunakan karena skema lama) dan menuju properti Value pada suatu aktivitas.

Saya akan mendapatkan contoh kode juga dan memperbarui masalah ini.

Untuk meneruskan data ke Skill

Untuk memanggil Keterampilan, Aktivitas tipe Event dikirim ke Keterampilan sehingga memicu pemanggilan gaya Tindakan daripada ucapan biasa.

Berikut adalah contoh memasukkan data ke Aktivitas yang akan Anda kirim

public class BookingDetails
{
        public string Destination { get; set; }
        public string Origin { get; set; }
        public string TravelDate { get; set; }
}

activity.Value = new BookingDetails { Destination = "New York" };

Mengambil data dalam Skill

Di sini dan di bawah ini adalah contoh Skill yang diberikan informasi dari orang tua (mis. Virtual Assistant atau Power Virtual Agents). Dalam situasi ini "data" diteruskan pada properti Value dari Aktivitas yang masuk. Dalam situasi ini "data" diteruskan ke Keterampilan (melalui Aktivitas Acara) dan kemudian dideserialisasi dan dimasukkan ke dalam status - artinya ketika dialog dijalankan, ia memiliki semua data yang dibutuhkan.

case Events.CreateEvent:
{
    state.IsAction = true;
    EventInfo actionData = null;
    if (ev.Value is JObject info)
    {
        actionData = info.ToObject<EventInfo>();
        // Process data here
    }

    return await stepContext.BeginDialogAsync(_createEventDialog.Id, options);

Melewati data kembali

Di dalam Dialog (di dalam keahlian Anda) ketika Anda selesai memproses dan ingin mengembalikan informasi kembali, Anda dapat melakukannya melalui kelebihan beban pada EndDialogAsync. Data ini kemudian disusun kembali ke pemanggil sebagai bagian dari pesan EndOfConversation yang dikirimkan oleh infrastruktur Skill.

    return await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList });

Mendapatkan data di sisi penelepon

Di sisi penelepon, untuk mendukung skenario ini dengan lebih baik, kami harus memutar MainDialog menjadi Waterfall daripada ComponentDialog. Dialog Komponen tidak menyediakan cara untuk "mendapatkan" hasil Dialog.

Seperti yang Anda lihat di sini, Anda dapat meraih dan mendapatkan hasil dari keterampilan dan proses yang sesuai.

if (stepContext.Result != null)
{
  var message = $"Skill \"{activeSkill.Id}\" invocation complete.";
  message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}";
}

Semua 25 komentar

Hai,

Kami telah mengerjakan dukungan "permohonan tindakan" untuk Keterampilan dan sebagai bagian dari formalisasi ini bagaimana data dapat dikembalikan kembali ke Bot pemanggil. Aktivitas memiliki properti SemanticAction yang diposisikan untuk mengaktifkan skenario ini.

Kami memiliki konsep untuk membuktikan ini dalam PR saat ini. Berikut adalah contoh pengaturan properti SemanticAction ini yang kemudian dapat Anda tarik di sisi klien.

Beri tahu saya jika ini membantu, dengan senang hati membantu lebih lanjut dan membuat Anda bergerak dengan skenario ini yang merupakan sesuatu yang akan kami tambahkan lebih banyak dokumentasi/dukungan untuk rilis berikutnya yang selaras dengan konferensi Ignite..

Hei Darren

Terima kasih atas respon yang cepat. Ya, respons SemanticAction akan menjadi solusi yang bagus untuk kasus penggunaan saya. Namun, menarik tindakan semantik dari sisi klien (VA) akan memerlukan beberapa perubahan pada basis kode di sana sejauh yang saya tahu, bukan? Karena saat ini, bahkan jika Anda memanggil sc.EndDialogAsync(semanticAction) di sisi skill, hasil panggilan ini akan diterjemahkan oleh skillTransport di sisi VA menjadi nilai boolean true , yang menunjukkan bahwa skill sudah selesai dan tidak ada lagi.

Poin wajar - dalam skenario Anda, apakah Anda memiliki keinginan untuk "memanggil" keterampilan secara langsung seperti panggilan metode jarak jauh atau alih-alih menyampaikan ucapan, biarkan keterampilan melakukan hal itu tetapi juga dapat mengembalikan data kembali bersama dengan aktivitas apa pun yang (saat ini) diteruskan ke pengguna tanpa Anda dapat mencegatnya.

Pendekatan pemanggilan tindakan yang memiliki pola, hampir siap digunakan dan yang lainnya terasa seperti sesuatu yang kami jelajahi seperti yang Anda sarankan jika itu skenario yang Anda lihat.

Ada pendapat @marawanshalaby ?

Hei Darren

Maaf telat balasnya, akhir-akhir ini terkubur pekerjaan :). Jadi, untuk kasus saya, saya akan mengatakan bahwa opsi kedua akan lebih menarik karena lebih longgar digabungkan, skenario yang ideal bagi saya adalah sebagai berikut:

  • Pengguna mengirim ucapan, petugas VA mengirimnya ke Skill A.
  • Keterampilan A menangani tindakan pengguna, hingga maksud "Buat Rapat" diidentifikasi oleh Keterampilan A
  • Setelah maksud "Buat rapat" diidentifikasi oleh Keterampilan A, itu mengakhiri percakapan dan mengirimkan status lokalnya (Nama orang dan id), mungkin melalui tindakan semantik, kembali ke VA, bersama dengan ucapan.
  • VA menyelesaikan ucapan ke Skill B, lalu meneruskan aksi semantik yang awalnya dari Skill A ke Skill B menggunakan slotnya

Dengan cara ini Keterampilan A tidak tahu apa-apa tentang Keterampilan B dan satu-satunya hubungan di antara mereka terjadi melalui ucapan yang ditangani oleh petugas operator, alih-alih melakukan hardcoding panggilan metode jarak jauh di VA/Keterampilan A, jadi itu juga mudah diperluas ke keterampilan lain. Apakah menurut Anda ini masuk akal?

Ya, benar-benar dan SemanticAction seperti yang kita miliki hari ini akan memungkinkan ini. Faktanya, sampel ini menunjukkan permintaan tiga keterampilan untuk menggabungkan data menjadi satu kartu ringkasan harian. Itu tidak menunjukkan data yang lewat kembali untuk kemudian meneruskan data kembali ke keterampilan lain, tetapi kami telah menunjukkan bahwa dalam beberapa skenario terutama pengalaman untuk mengambil tugas Anda, memilah jenisnya dan kemudian menawarkan untuk mengarahkan Anda melalui toko ke menyelesaikan (misalnya kelontong, apotek).

SemanticAction menyediakan mekanisme untuk melakukan pertukaran ini, kami akan menambahkan beberapa dokumentasi lebih lanjut dalam beberapa minggu ke depan untuk menguraikan pola ini dengan sedikit lebih detail

Hei Darren

Itu tampak hebat, dua pertanyaan dari pihak saya:

  • apakah Anda memiliki perkiraan tanggal kapan fitur SemanticAction akan dirilis?
  • apakah dukungan TypeScript akan ditambahkan bersamaan dengan dukungan C#?

Hei Darren,

kami hanya akan melalui sampel untuk menerapkan keterampilan untuk menggabungkan data tetapi tidak melihat data yang diteruskan dari keterampilan ke VA, saya tahu Anda telah menyebutkannya dalam komentar Anda. tetapi maukah Anda memberi tahu kami jika ada mekanisme untuk meneruskan data dari keterampilan ke vA. terimakasih

@darrenj dapatkah Anda memberikan pembaruan untuk pertanyaan di atas?

Hai

Berikut adalah contoh pengaturan semanticaction dalam skill yang mengembalikan informasi ke Bot pemanggil.

kami telah mencoba ini di keterampilan tetapi bagaimana kami mendapatkan data lagi di asisten virtual. tidak bisa mendapatkan sampel apa pun. hargai jika Anda dapat membagikan alat kode vA

@darrenj bisa tolong beri tahu kami kode VA juga

@darrenj , saya sekarang mencoba menerapkan ini, saya melihat bahwa itu telah diperbaiki di sisi VA dalam versi C# https://github.com/microsoft/botframework-solutions/blob/4619333ec086ca7c42a697022c9e01dfcafab824/lib/csharp/microsoft. bot.builder.skills/Microsoft.Bot.Builder.Skills/SkillDialog.cs#L326 sehingga setiap entitas tindakan semantik yang ditetapkan oleh keterampilan dikembalikan, tetapi itu tidak terjadi di TypeScript https://github.com/microsoft/botframework- solusi/blob/4619333ec086ca7c42a697022c9e01dfcafab824/lib/typescript/botbuilder-skills/src/skillDialog.ts#L244 . Apakah Anda memiliki perkiraan kapan akan ditambahkan dalam TypeScript juga?

Ini adalah penghalang bagi kami karena dalam aliran saat ini yang kami terapkan, kami perlu memastikan bahwa dialog berakhir dengan sukses di sisi keterampilan (bukan pembatalan misalnya) untuk memicu dialog umpan balik di sisi VA. Adakah saran bagaimana menerapkan skenario ini sambil menunggu dukungan TS?

Halo, @darrenj

Bisakah Anda berbagi cara menangani data lagi di VA? Anda membagikan sampel di CalendarSummaryDialog, tetapi itu hanya sisi keterampilan. Bagaimana mengatasinya di VA setelah keterampilan mengirim EndDialogAsync?

Terima kasih untuk itu

Masalah telah ditutup sehingga kami tidak mendapatkan pemberitahuan, membuka kembali. Maaf atas keterlambatannya, bisakah saya mengklarifikasi skenario di sini?

  • VA dan SKill ada di Javascript/TypeScript daripada C#?
  • Anda ingin mengembalikan "data" kembali ke VA induk dari Keterampilan anak sebagai bagian dari pola "Akhiri Dialog"?

Terima kasih untuk itu.

Pertanyaan saya masih bagaimana mengirim konteks keterampilan kembali ke VA (keduanya dalam C #). Saya ingin melakukan sesuatu yang mirip dengan apa yang dikatakan @marawanshalaby sebelumnya. "VA menyelesaikan ucapan ke Skill B, lalu meneruskan aksi semantik yang awalnya dari Skill A ke Skill B menggunakan slotnya"

Bagaimana pendekatan terbaik untuk melakukan itu? Melihat apa yang dibahas di sini, saya masih tidak tahu bagaimana menangani tindakan semantik di sisi VA.

Hai,

Kami membutuhkan tutorial tentang ini :-) Saya akan menambahkan ini sebagai bagian dari pekerjaan GA kami (akhir bulan) dan idealnya di situs dokumen dalam beberapa hari ke depan. Sementara itu semoga informasi di bawah ini membantu.

Sebagai bagian dari Skills GA, kami menyederhanakan berbagi data dan memindahkan metode transfer dari SemanticAction (yang sulit digunakan karena skema lama) dan menuju properti Value pada suatu aktivitas.

Saya akan mendapatkan contoh kode juga dan memperbarui masalah ini.

Untuk meneruskan data ke Skill

Untuk memanggil Keterampilan, Aktivitas tipe Event dikirim ke Keterampilan sehingga memicu pemanggilan gaya Tindakan daripada ucapan biasa.

Berikut adalah contoh memasukkan data ke Aktivitas yang akan Anda kirim

public class BookingDetails
{
        public string Destination { get; set; }
        public string Origin { get; set; }
        public string TravelDate { get; set; }
}

activity.Value = new BookingDetails { Destination = "New York" };

Mengambil data dalam Skill

Di sini dan di bawah ini adalah contoh Skill yang diberikan informasi dari orang tua (mis. Virtual Assistant atau Power Virtual Agents). Dalam situasi ini "data" diteruskan pada properti Value dari Aktivitas yang masuk. Dalam situasi ini "data" diteruskan ke Keterampilan (melalui Aktivitas Acara) dan kemudian dideserialisasi dan dimasukkan ke dalam status - artinya ketika dialog dijalankan, ia memiliki semua data yang dibutuhkan.

case Events.CreateEvent:
{
    state.IsAction = true;
    EventInfo actionData = null;
    if (ev.Value is JObject info)
    {
        actionData = info.ToObject<EventInfo>();
        // Process data here
    }

    return await stepContext.BeginDialogAsync(_createEventDialog.Id, options);

Melewati data kembali

Di dalam Dialog (di dalam keahlian Anda) ketika Anda selesai memproses dan ingin mengembalikan informasi kembali, Anda dapat melakukannya melalui kelebihan beban pada EndDialogAsync. Data ini kemudian disusun kembali ke pemanggil sebagai bagian dari pesan EndOfConversation yang dikirimkan oleh infrastruktur Skill.

    return await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList });

Mendapatkan data di sisi penelepon

Di sisi penelepon, untuk mendukung skenario ini dengan lebih baik, kami harus memutar MainDialog menjadi Waterfall daripada ComponentDialog. Dialog Komponen tidak menyediakan cara untuk "mendapatkan" hasil Dialog.

Seperti yang Anda lihat di sini, Anda dapat meraih dan mendapatkan hasil dari keterampilan dan proses yang sesuai.

if (stepContext.Result != null)
{
  var message = $"Skill \"{activeSkill.Id}\" invocation complete.";
  message += $" Result: {JsonConvert.SerializeObject(stepContext.Result)}";
}

Saya telah memvalidasi sebuah pendekatan - membuat ini ditinjau oleh tim saya sebelum saya berkomitmen pada dokumen tetapi membuatnya bekerja dengan cukup mudah menggunakan Keterampilan Cuaca sebagai contoh.

Ini mengasumsikan Anda memiliki Keterampilan terdaftar yang disebut WeatherSkill - akan bekerja dengan keterampilan lain tetapi perlu memastikan itu dikonfigurasi.

  var skillSteps = new WaterfallStep[]
            {
                PreSkillStepAsync,
                PostSkillStepAsync,
            };

  AddDialog(new WaterfallDialog("WeatherActionInvoke", skillSteps));

Mulai Doa Aksi

 return await innerDc.BeginDialogAsync("WeatherActionInvoke");

Panggilan Aksi Keterampilan

stepContext.Result di PostSkillStepAsync akan memiliki nilai pengembalian dari Skill

        private async Task<DialogTurnResult> PreSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var evt = stepContext.Context.Activity.AsEventActivity();
            if (evt != null)
            {
                LocationInfo location = new LocationInfo();
                location.Location = "51.4644018,-2.1177246,14";

                var activity = (Activity)Activity.CreateEventActivity();
                activity.Name = "WeatherForcast";
                activity.Value = location;

                // Create the BeginSkillDialogOptions
                var skillDialogArgs = new BeginSkillDialogOptions { Activity = activity };

                // Start the skillDialog instance with the arguments. 
                return await stepContext.BeginDialogAsync("WeatherSkill", skillDialogArgs, cancellationToken);
            }

            return await stepContext.NextAsync();
        }

        private async Task<DialogTurnResult> PostSkillStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            return await stepContext.NextAsync();
        }

Mengenai pertanyaan @higoorc , saya kira implementasi yang diusulkan mencakup persyaratan dan dapat dilakukan.

Namun, ada skenario serah terima keterampilan yang mungkin akan mendapat manfaat dari kontrol tambahan yang ada. Value adalah wadah yang sangat umum yang dapat dimanfaatkan oleh pelaksana VA untuk mengimplementasikan skenario apa pun yang mereka inginkan tetapi tidak memaksakan perilaku tertentu. Dalam skenario di mana pelaksana menghubungkan implementasi VA mereka ke keterampilan pihak pertama (dikembangkan di rumah) dan pihak ketiga (keterampilan komunitas), seringkali tidak mungkin untuk menjamin bahwa Value akan menjadi mekanisme umum untuk penyerahan keterampilan.

Yang saya maksud dengan skill handoff adalah ketika sebuah skill dirancang sedemikian rupa sehingga dialognya berakhir sedemikian rupa sehingga wajar untuk melanjutkan percakapan dengan skill lain. Ambil contoh skenario tentang pemesanan perjalanan dan, setelah pemesanan, menawarkan untuk menyerahkan keterampilan yang juga memesan mobil sewaan atau tur lokal untuk tujuan tertentu. Saya bahkan akan membayangkan skill handoff tidak akan menjadi satu-satunya hal yang mungkin ingin dilaporkan oleh sebuah skill sebagai hasilnya. Asisten (Google/Alexa/...) bisa jadi yang lain.

Salah satu cara yang mungkin untuk menangani ini adalah keterampilan menyerahkan pekerjaan untuk mempublikasikan maksud target dan entitas/slotnya yang dikenal sebagai bagian dari acara EndOfConversation ( SemanticAction , meskipun namanya aneh, adalah cara untuk mengekspresikan ini, selama tindakan semantik diketahui sebelumnya). Mengingat sifat keterampilan yang terputus, ini berarti keterampilan yang menyerahkan maksud harus diperbarui jika keterampilan target mengubah logika pemrosesan maksud/entitas/slot mereka tetapi arsitekturnya lebih bersih. Bagaimana menurutmu? Akankah ada cara yang lebih baik?

@darrenj - bisakah Anda memberikan contoh untuk ini yang harus memiliki VA dan Keterampilan

@darrenj - bisakah Anda memberi tahu kami kapan dokumen akan diperbarui.
menghargai bantuan Anda.

@darrenj, bisakah Anda memberikan pembaruan pada dokumen/sampel pembaruan?

Menghubungkan PR ke masalah dengan garis besar langkah-langkah yang diperlukan untuk bertukar data dengan Keterampilan.

@darrenj Melewati data dari keterampilan ke Bot Induk tanpa menggunakan Dialog dapatkah ini terjadi?

Saya menggunakan cuplikan di bawah ini untuk memanggil keterampilan dari bot root
var response = menunggu _skillClient.PostActivityAsync(_botId, targetSkill, _skillsConfig.SkillHostEndpoint, turnContext.Activity, CancellationToken);

Saya menggunakan cuplikan di bawah ini untuk mengakhiri percakapan di bot keterampilan

var endOfConversation = Aktivitas.CreateEndOfConversationActivity();endOfConversation.Code = EndOfConversationCodes.CompletedBerhasil;

Apakah halaman ini membantu?
0 / 5 - 0 peringkat