Botframework-solutions: السماح بتمرير البيانات من المهارة إلى VA

تم إنشاؤها على ٣٠ سبتمبر ٢٠١٩  ·  25تعليقات  ·  مصدر: microsoft/botframework-solutions

قصة المستخدم

بصفتي مطورًا ، أود أن أكون قادرًا على تمرير البيانات مرة أخرى من المهارة إلى VA.

أود أن أكون قادرًا على تمرير البيانات مرة أخرى من المهارة إلى المساعد الافتراضي عندما تكتمل المهارة ، من أجل (على سبيل المثال) لمواصلة المحادثة مع روبوت آخر ، مع المعلومات التي تم إنشاؤها بواسطة الروبوت الأول.

حالة الاستخدام الخاصة بي هي كما يلي:

لدي VA متصل بـ 2 روبوت ، يتم استخدام الروبوت الأول للبحث عن الأشخاص ويتم استخدام الروبوت الثاني لحجز الاجتماعات مع هؤلاء الأشخاص. تتمثل إحدى وظائف روبوت البحث عن الأشخاص في تمكين المستخدم من إنشاء اجتماع مع شخص تم البحث عنه. قد يتطلب ذلك من روبوت البحث عن الأشخاص إرجاع إشارة إلى الشخص الذي سيتم إنشاء الاجتماع معه ، إلى VA. هذا غير ممكن حاليًا

سيكون من الرائع أن يتوفر شيء مثل آلية البيان / SkillContext / الفتحات من المهارة -> VA بدلاً من المهارة فقط -> المهارة

Bot Services customer-replied-to customer-reported

التعليق الأكثر فائدة

أهلا،

نحتاج إلى برنامج تعليمي حول هذا :-) سأضيف هذا كجزء من عمل GA (نهاية الشهر) وبشكل مثالي على موقع doc في الأيام القليلة المقبلة. في غضون ذلك ، نأمل أن تساعد المعلومات أدناه.

كجزء من Skills GA ، قمنا بتبسيط مشاركة البيانات ونقلنا طريقة النقل من SemanticAction (والتي كانت صعبة الاستخدام بسبب مخطط قديم) ونحو خاصية Value الأسهل للنشاط.

سأحصل على عينة رمز أيضًا وأحدث هذه المشكلة.

لتمرير البيانات إلى مهارة

لاستدعاء مهارة ، يتم إرسال نشاط من النوع Event إلى المهارة مما يؤدي إلى استدعاء نمط الإجراء بدلاً من الكلام المعتاد.

فيما يلي مثال على وضع البيانات في نشاط سترسله

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

استرجاع البيانات داخل المهارة

هنا وأدناه مثال على مهارة يتم تمرير المعلومات من أحد الوالدين (مثل المساعد الافتراضي أو الوكلاء الظاهريون). في هذه الحالة ، يتم تمرير "البيانات" على خاصية Value لنشاط وارد. في هذه الحالة ، يتم تمرير "البيانات" إلى مهارة (عبر نشاط حدث) ثم يتم إلغاء تسلسلها ووضعها في الحالة - بمعنى أنه عند تنفيذ مربع الحوار ، فإنه يحتوي على جميع البيانات التي يحتاجها.

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

تمرير البيانات مرة أخرى

ضمن مربع الحوار (داخل مهارتك) عندما تنتهي من المعالجة وترغب في إرجاع المعلومات مرة أخرى ، يمكنك القيام بذلك من خلال التحميل الزائد على EndDialogAsync. ثم يتم تنظيم هذه البيانات مرة أخرى إلى المتصل كجزء من رسالة EndOfConversation التي ترسلها بنية المهارة الأساسية.

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

الحصول على البيانات من جانب المتصل

من جانب المتصل ، لدعم هذا السيناريو بشكل أفضل ، كان علينا أن نحول الحوار الرئيسي المحوري ليكون شلالًا بدلاً من حوار مكون. لم توفر "حوارات المكونات" طريقة "للحصول" على نتيجة الحوار.

كما ترى هنا يمكنك الوصول والحصول على نتيجة المهارة والعملية وفقًا لذلك.

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

ال 25 كومينتر

أهلا،

لقد عملنا على دعم "استدعاء الإجراء" للمهارات وكجزء من إضفاء الطابع الرسمي على كيفية إعادة البيانات إلى الروبوت المتصل. النشاط له خاصية SemanticAction التي تم وضعها لتمكين هذا السيناريو.

لدينا مفهوم لإثبات ذلك في العلاقات العامة في الوقت الحالي. فيما يلي مثال على تعيين خاصية SemanticAction هذه والتي يمكنك سحبها بعد ذلك من جانب العميل.

اسمحوا لي أن أعرف ما إذا كان هذا يساعدك ، ويسعدني تقديم المزيد من المساعدة وجعلك تتحرك مع هذا السيناريو وهو شيء سنضيف المزيد من الوثائق / الدعم له في الإصدار التالي المتوافق مع مؤتمر Ignite ..

يا دارين

شكرا للاستجابة السريعة. نعم ، ستكون استجابة SemanticAction حلاً رائعًا لحالة الاستخدام الخاصة بي. ومع ذلك ، فإن سحب الإجراء الدلالي من جانب العميل (VA) سيتطلب بعض التغييرات على قاعدة الكود هناك أيضًا بقدر ما أستطيع أن أقول ، أليس كذلك؟ لأنه في الوقت الحالي ، حتى إذا اتصلت بـ sc.EndDialogAsync(semanticAction) على جانب المهارة ، فإن نتيجة هذه المكالمة تتم ترجمتها بواسطة نقل المهارة على جانب VA إلى قيمة منطقية true ، مما يشير إلى أن المهارة تمت و لا شيء آخر.

نقطة عادلة - في السيناريو الخاص بك ، هل لديك رغبة في "استدعاء" المهارة نوعًا ما بشكل مباشر مثل استدعاء الطريقة البعيدة أو بدلاً من ذلك تمرير الكلام ، دع المهارة تفعل الشيء ولكن أيضًا تكون قادرًا على إرجاع البيانات مرة أخرى مع أي نشاط يتم إعادة توجيهها (حاليًا) إلى المستخدم دون أن تتمكن من اعتراضها.

نهج استدعاء الإجراء الذي لدينا نمط له ، جاهز تقريبًا للاستخدام والآخر يبدو وكأنه شيء نستكشفه كما تقترح إذا كان هذا هو السيناريو الذي تنظر إليه.

أي أفكار marawanshalaby ؟

يا دارين

آسف على الرد المتأخر ، تم دفنه بالعمل مؤخرًا :). لذلك ، بالنسبة لحالتي ، أود أن أقول إن الخيار الثاني سيكون أكثر جاذبية لأنه مقترن بشكل غير وثيق ، سيكون السيناريو المثالي بالنسبة لي كما يلي:

  • يرسل المستخدم خطابًا ، ويرسله مرسل VA إلى Skill A.
  • تتعامل المهارة أ مع إجراءات المستخدم ، حتى يتم تحديد نية "إنشاء اجتماع" بواسطة المهارة أ
  • بمجرد تحديد نية "إنشاء اجتماع" بواسطة Skill A ، فإنها تنهي المحادثة وترسل حالتها المحلية (اسم الشخص ومعرفه) ، ربما من خلال إجراء دلالي ، إلى VA ، جنبًا إلى جنب مع الكلام.
  • يحل VA النطق إلى Skill B ، ثم يمرر الإجراء الدلالي في الأصل من Skill A إلى Skill B باستخدام فتحاته

بهذه الطريقة ، لا تعرف المهارة A شيئًا عن المهارة B ويتم الاتصال الوحيد بينهما من خلال الكلام الذي يتعامل معه المرسل ، بدلاً من تشفير استدعاء الطريقة البعيدة في VA / Skill A ، لذلك فهي أيضًا قابلة للتوسيع بسهولة لمهارات أخرى. هل تعتقد أن هذا منطقي؟

نعم ، تمامًا و SemanticAction كما لدينا اليوم سيمكن هذا. في الواقع ، تُظهر هذه العينة استدعاء ثلاث مهارات لتجميع البيانات معًا في بطاقة ملخص يومية واحدة. لا يُظهر البيانات التي تم تمريرها مرة أخرى إلى مهارة أخرى ثم نقلها مرة أخرى إلى مهارة أخرى ، لكننا أظهرنا أنه في بعض السيناريوهات ، أبرزها تجربة لاسترداد مهامك ، وفرز الأنواع ، ثم عرض توجيهك عبر متجر إلى حل (مثل بقالة ، صيدلية).

يوفر SemanticAction آلية إجراء هذا التبادل ، وسنضيف بعض الوثائق الأخرى في الأسابيع القليلة المقبلة لتوضيح هذا النمط بتفاصيل أكثر قليلاً

يا دارين

يبدو هذا رائعًا ، سؤالان من جانبي:

  • هل لديك تاريخ تقريبي لإطلاق ميزة SemanticAction؟
  • هل سيتم إضافة دعم الكتابة المطبوعة في نفس الوقت مع دعم C #؟

مرحبًا دارين ،

نحن نمر فقط في العينة لاستدعاء المهارات لتجميع البيانات ولكننا لم نشاهد البيانات تنتقل من المهارة إلى المساعد الافتراضي ، أعلم أنك ذكرتها في تعليقك. ولكن هل تمانع في إخبارنا إذا كانت هناك أية آلية لتمرير البيانات من المهارة إلى vA. شكرا لك

darrenj ، هل يمكنك تقديم تحديث للسؤال أعلاه

أهلا

فيما يلي مثال على تعيين الدلالات ضمن مهارة تعيد المعلومات إلى الروبوت المتصل.

لقد جربنا هذا في المهارة ولكن كيف نحصل على البيانات مرة أخرى في المساعد الافتراضي. لم أستطع الحصول على أي عينة. نقدر ما إذا كان يمكنك مشاركة أداة رمز vA

darrenj هل يمكنك إعلامنا برمز VA أيضًا

darrenj ، أحاول الآن تنفيذ هذا ، أرى أنه تم إصلاحه على جانب VA في إصدار C # https://github.com/microsoft/botframework-solutions/blob/4619333ec086ca7c42a697022c9e01dfcafab824/lib/csharp/microsoft. bot.builder.skills / Microsoft.Bot.Builder.Skills / SkillDialog.cs # L326 لذلك يتم https://github.com/microsoft/botframework- Solutions / blob / 4619333ec086ca7c42a697022c9e01dfcafab824 / lib / typecript / botbuilder-Skills / src / SkillsDialog.ts # L244 . هل لديك تقدير لوقت إضافته في الكتابة المطبوعة أيضًا؟

هذا مانع بالنسبة لنا لأنه في التدفق الحالي الذي نقوم بتنفيذه ، نحتاج إلى التأكد من انتهاء الحوار بنجاح من جانب المهارة (وليس الإلغاء على سبيل المثال) من أجل تشغيل مربع حوار التعليقات على جانب VA. هل لديك أي اقتراحات حول كيفية تنفيذ هذا السيناريو أثناء انتظارنا لدعم TS؟

darrenj أي تحديث حول متى سيتم إصلاح ذلك في typecript https://github.com/microsoft/botframework-solutions/blob/master/sdk/typescript/libraries/botbuilder-skills/src/skillDialog.ts#L382 ؟ هل هذا متعلق بهذه المشكلة: https://github.com/microsoft/botframework-solutions/issues/2489 ؟

مرحبًا ، darrenj

هل يمكنك مشاركة كيفية التعامل مع البيانات مرة أخرى في VA؟ لقد قمت بمشاركة العينة في CalendarSummaryDialog ، لكنها فقط جانب المهارة. كيف يتم التعامل مع ذلك في VA بعد إرسال المهارة في EndDialogAsync؟

شكرا على ذلك

تم إغلاق المشكلة ، وبالتالي لم نتمكن من تلقي الإشعارات وإعادة الفتح. آسف على التأخير ، هل يمكنني فقط توضيح السيناريو هنا؟

  • VA و SKill في Javascript / Typescript بدلاً من C #؟
  • هل ترغب في إعادة "البيانات" إلى VA الأصل من مهارة الطفل كجزء من نمط "End Dialog"؟

شكرا على ذلك.

لا يزال سؤالي هو كيفية إرسال سياق المهارة مرة أخرى إلى VA (كلاهما في C #). أردت أن أفعل شيئًا مشابهًا لما تحدث عنه marawanshalaby من قبل. "يحل VA النطق إلى Skill B ، ثم يمرر الإجراء الدلالي في الأصل من Skill A إلى Skill B باستخدام فتحاته"

ما هي أفضل طريقة للقيام بذلك؟ بالنظر إلى ما تمت مناقشته هنا ، ما زلت لا أعرف كيفية التعامل مع الإجراء الدلالي في جانب VA.

أهلا،

نحتاج إلى برنامج تعليمي حول هذا :-) سأضيف هذا كجزء من عمل GA (نهاية الشهر) وبشكل مثالي على موقع doc في الأيام القليلة المقبلة. في غضون ذلك ، نأمل أن تساعد المعلومات أدناه.

كجزء من Skills GA ، قمنا بتبسيط مشاركة البيانات ونقلنا طريقة النقل من SemanticAction (والتي كانت صعبة الاستخدام بسبب مخطط قديم) ونحو خاصية Value الأسهل للنشاط.

سأحصل على عينة رمز أيضًا وأحدث هذه المشكلة.

لتمرير البيانات إلى مهارة

لاستدعاء مهارة ، يتم إرسال نشاط من النوع Event إلى المهارة مما يؤدي إلى استدعاء نمط الإجراء بدلاً من الكلام المعتاد.

فيما يلي مثال على وضع البيانات في نشاط سترسله

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

استرجاع البيانات داخل المهارة

هنا وأدناه مثال على مهارة يتم تمرير المعلومات من أحد الوالدين (مثل المساعد الافتراضي أو الوكلاء الظاهريون). في هذه الحالة ، يتم تمرير "البيانات" على خاصية Value لنشاط وارد. في هذه الحالة ، يتم تمرير "البيانات" إلى مهارة (عبر نشاط حدث) ثم يتم إلغاء تسلسلها ووضعها في الحالة - بمعنى أنه عند تنفيذ مربع الحوار ، فإنه يحتوي على جميع البيانات التي يحتاجها.

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

تمرير البيانات مرة أخرى

ضمن مربع الحوار (داخل مهارتك) عندما تنتهي من المعالجة وترغب في إرجاع المعلومات مرة أخرى ، يمكنك القيام بذلك من خلال التحميل الزائد على EndDialogAsync. ثم يتم تنظيم هذه البيانات مرة أخرى إلى المتصل كجزء من رسالة EndOfConversation التي ترسلها بنية المهارة الأساسية.

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

الحصول على البيانات من جانب المتصل

من جانب المتصل ، لدعم هذا السيناريو بشكل أفضل ، كان علينا أن نحول الحوار الرئيسي المحوري ليكون شلالًا بدلاً من حوار مكون. لم توفر "حوارات المكونات" طريقة "للحصول" على نتيجة الحوار.

كما ترى هنا يمكنك الوصول والحصول على نتيجة المهارة والعملية وفقًا لذلك.

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

لقد تحققت من صحة نهج - تمت مراجعة هذا من قبل فريقي قبل أن ألتزم بالمستندات ولكنني نجحت في ذلك بسهولة باستخدام Weather Skill كمثال.

هذا يفترض أن لديك مهارة مسجلة تسمى WeatherSkill - ستعمل مع أي مهارة أخرى ولكن عليك التأكد من تكوينها.

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

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

ابدأ استدعاء الإجراء

 return await innerDc.BeginDialogAsync("WeatherActionInvoke");

استدعاء عمل المهارة

ستحصل stepContext.Result في PostSkillStepAsync على القيمة المرجعة من المهارة

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

فيما يتعلق بسؤالhigoorc ، أفترض أن التنفيذ المقترح يغطي المتطلبات ويمكن تنفيذه.

ومع ذلك ، هناك سيناريوهات تسليم المهارات التي من المحتمل أن تستفيد من الضوابط الإضافية المعمول بها. Value عبارة عن حاوية عامة جدًا يمكن لمنفذي VA الاستفادة منها لتنفيذ أي سيناريو يرونه مناسبًا ولكن لا يفرض أي سلوك معين. في سيناريو يقوم فيه المنفذون بربط تطبيقات VA الخاصة بهم بكل من مهارات الطرف الأول (المطورة داخليًا) ومهارات الطرف الثالث (مهارات المجتمع) ، غالبًا ما لا يمكن ضمان أن Value سيكون آلية عامة لتسليم المهارات.

أعني من خلال تسليم المهارة عندما يتم تصميم المهارة بطريقة تنتهي فيها حواراتها بطريقة تجعل من الطبيعي مواصلة المحادثة بمهارة أخرى. خذ على سبيل المثال سيناريو حول حجز رحلة ، وبعد الحجز ، اعرض التسليم لمهارة تقوم أيضًا بحجز تأجير السيارات أو الجولات المحلية لتلك الوجهة المعينة. حتى أنني أتخيل أن تسليم المهارة لن يكون الشيء الوحيد الممكن الذي قد ترغب المهارة في الإبلاغ عنه كنتيجة. قد يكون تسليم المساعد (Google / Alexa / ...) أمرًا آخر.

تتمثل إحدى الطرق الممكنة للتعامل مع هذا الأمر في تسليم المهارة للعمل لنشر الهدف المستهدف والكيانات / الفتحات المعروفة كجزء من حدث EndOfConversation ( SemanticAction ، على الرغم من تسميته بشكل غريب ، سيكون طريقة للتعبير عن هذا ، طالما أن الإجراءات الدلالية معروفة مسبقًا). نظرًا للطبيعة غير المتصلة للمهارات ، فهذا يعني أنه يجب تحديث مهارة تسليم النية إذا غيرت المهارة المستهدفة نواياها / كيانها / منطق معالجة الفتحة لكنها بنية أنظف. ماذا تعتقد؟ هل هناك طريقة أفضل؟

darrenj - هل يمكنك من فضلك تقديم عينة لهذا يجب أن تحتوي على VA و Skill

darrenj - هل يمكنك إخبارنا بموعد تحديث المستندات.
نقدر مساعدتكم.

darrenj ، هل يمكنك تقديم تحديث للمستندات / نموذج التحديث

ربط العلاقات العامة بالمشكلة بمخطط تفصيلي للخطوات المطلوبة لتبادل البيانات مع المهارات.

darrenj هل يمكن أن يكون هذا ممكنًا

أنا أستخدم المقتطف أدناه لاستدعاء المهارة من روبوت الجذر
var response = wait _skillClient.PostActivityAsync (_botId، targetSkill، _skillsConfig.SkillHostEndpoint، turnContext.Activity، cancellationToken) ؛

أنا أستخدم المقتطف أدناه لإنهاء المحادثة في روبوت المهارة

var endOfConversation = Activity.CreateEndOfConversationActivity () ،endOfConversation.Code = EndOfConversationCodes.CompletedSuccessfully ،

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات