gpt4 book ai didi

bots - 导航如何与 LUIS 子对话框一起使用?

转载 作者:行者123 更新时间:2023-12-02 01:07:01 25 4
gpt4 key购买 nike

我有一个问题...不幸的是,网络上的所有示例都太浅显,并没有真正涵盖这一点:

我有一个扩展 LuisDialog 的 RootDialog。这个 RootDialog 负责确定用户想要做什么。这可能是多件事,但其中之一是启动新订单。为此,RootDialog 会将调用转发给 NewOrderDialog,NewOrderDialog 的职责是找出一些基本细节(用户想要订购什么,他喜欢使用哪个地址),最后它会确认订购并返回到 RootDialog。

RootDialog 的代码非常简单:

[Serializable]
public class RootDialog : LuisDialog<object>
{
public RootDialog() : base(new LuisService(new LuisModelAttribute(ConfigurationManager.AppSettings["LuisAppId"], ConfigurationManager.AppSettings["LuisAPIKey"], domain: "westus.api.cognitive.microsoft.com")))
{
}

[LuisIntent("Order.Place")]
public async Task PlaceOrderIntent(IDialogContext context, LuisResult result)
{
await context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, context.Activity, CancellationToken.None);

context.Wait(MessageReceived);
}

private async Task OnPlaceOrderIntentCompleted(IDialogContext context, IAwaitable<object> result)
{
await context.PostAsync("Your order has been placed. Thank you for shopping with us.");

context.Wait(MessageReceived);
}
}

我还为 NewOrderDialog 想到了一些代码:

[Serializable]
public class NewOrderDialog : LuisDialog<object>
{
private string _product;
private string _address;

public NewOrderDialog() : base(new LuisService(new LuisModelAttribute(ConfigurationManager.AppSettings["LuisAppId"], ConfigurationManager.AppSettings["LuisAPIKey"], domain: "westus.api.cognitive.microsoft.com")))
{
}

[LuisIntent("Order.RequestedItem")]
public async Task RequestItemIntent(IDialogContext context, LuisResult result)
{
EntityRecommendation item;
if (result.TryFindEntity("Item", out item))
{
_product = item.Entity;
await context.PostAsync($"Okay, I understood you want to order: {_product}.");
}
else
{
await context.PostAsync("I couldn't understand what you would like to buy. Can you try it again?");
}

context.Wait(MessageReceived);
}

[LuisIntent("Order.AddedAddress")]
public async Task AddAddressIntent(IDialogContext context, LuisResult result)
{
EntityRecommendation item;
if (result.TryFindEntity("Address", out item))
{
_address = item.Entity;
await context.PostAsync($"Okay, I understood you want to ship the item to: {_address}.");
}
else
{
await context.PostAsync("I couldn't understand where you would like to ship the item. Can you try it again?");
}

context.Wait(MessageReceived);
}
}

列出的代码不起作用。进入 Order.Place 意图后,它立即执行“成功”回调,然后抛出此异常:

Exception: IDialog method execution finished with multiple resume handlers specified through IDialogStack. [File of type 'text/plain']

所以我有几个问题:

  1. 如何解决我遇到的错误?
  2. 我如何在进入 NewOrderDialog 时检查我们是否已经知道产品和地址,如果没有提示他们输入正确的信息?
  3. 为什么即使我没有调用 context.Done() 之类的东西,NewOrderDialog 也会关闭?我只希望在收集到所有信息并确认订单后关闭它。

最佳答案

所以第一个问题是您在“Order.Place”中执行了一个context.Forward 和一个context.Wait,这根据定义是错误的。您需要选择:转发到新对话或在当前对话中等待。根据您的帖子,您想要转发,因此只需删除 Wait 调用即可。

除此之外,您有 1 个 LUIS 对话框,并且您正在尝试转发到一个新的 LUIS 对话框...我怀疑这是否可行;我可以想象这是两个不同的 LUIS 模型,否则就会出错。

根据您的评论,我现在明白了您要对第二个对话框执行的操作。问题(这与您的第二个问题有关)是以这种方式使用 LUIS 可能会造成混淆。例如:

  • 用户:我要下单
  • bot => 转发到新对话框。由于它是转发,activity.Text 可能会再次转到 LUIS(到第二个对话框的模型)并且不会检测到任何内容。第二个对话框将处于 Wait 状态,等待用户输入。

现在,用户如何知道他需要输入地址或产品?你在哪里提示用户?看到问题了吗?

我怀疑你的第三个问题是你在 #1 中遇到的错误的副作用,我已经提供了解决方案。

如果您再澄清一点,我可能会更有帮助。您在第二个对话框中尝试使用 LUIS 执行的操作看起来不太正常,但也许有解释可能有意义。

通常的情况是:我从 LUIS(“Order.Place”)获得意图,然后我启动一个 FormFlow 或一组提示来获取下订单的信息(地址、产品等),或者如果您想继续使用 LUIS,您可能需要检查 Luis Action Binding .您可以在 https://blog.botframework.com/2017/04/03/luis-action-binding-bot/ 上阅读更多内容.

关于bots - 导航如何与 LUIS 子对话框一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47077488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com