2016-07-06 64 views
1

我正在开发一个bot,它将响应用户对我私人用例的查询。同样,我想启用机器人来回答一些常见的问题,如天气或方向等。所以我建立了一个自己的应用程序Luis,也试图使用预建的cortana意图。下面的示例如何将多个Luis模型集成到机器人框架

[LuisModel("c413b2ef-382c-45bd-8ff0-f76dad0e2a821", "697asfc173ce6f40aca4c99e7d38assad6cad")] 
public class myClass: LuisDialog<T> 
{ 
} 

这将只接受Cortana Intents或我自己的Intents取决于订阅ID和密钥。

如何在我的班级中使用两个Luis模型?请帮助

回答

2

大约20天前,他们更新了LuisDialog支持多个LuisModel和ILuisService实例(检查这个commit)。这个变化已经在NuGet 1.2.4中发布了。

+0

仍然困惑如何添加多个对话框。正如你可以看到我的代码,我用Luis模型注释了我的课程。尝试给出另一个模型,但它没有检测到。 – Satheesh

+0

@Satheesh可能你使用的是旧版本的框架?如果我用多个模型装饰课程,它适用于我。非常感谢ejadib这个信息! – K48

+0

@ K48是的,它也适用于我。如果我们直接放置多个模型,那么在第二个模型中选择无意图的机会会更多。我们必须做一些调整才能使其工作。但我尝试了一些不同。我将我的意图放在不同的班级中,并使用多个LUIS模型。它没有发现。但现在我很高兴地说,我实现了这一点。 – Satheesh

0

我的机器人将回答不同的使用情况。所以我必须为每个用例使用多个类。使用这个代码是,我们可以在多个类中编写我们的任务(用Intents指定)。

我通过重写的LuisDialog如下的处理程序方法找到的解决方案。我的Baseform继承了LuisDialog类。其中有意向的所有其他类将继承我的BaseForm

protected override IDictionary<string, IntentActivityHandler> GetHandlersByIntent() 
     { 
      var classCollection = AppDomain.CurrentDomain.GetAssemblies() 
         .SelectMany(assembly => assembly.GetTypes()) 
         .Where(type => type.IsSubclassOf(typeof(BaseForm))); 
      List<KeyValuePair<string, IntentActivityHandler>> handler = new List<KeyValuePair<string, IntentActivityHandler>>(); 
      foreach (var item in classCollection) 
      { 
       handler.AddRange(MyLuisDialog.EnumerateHandlers(Activator.CreateInstance(item)).ToList()); 
      }    
      return handler.ToDictionary(kv => kv.Key, kv => kv.Value); 
     } 
代码

EnumerateHandlers方法,它仅仅是一个从路易斯对话框SDK相同的副本。