我正在使用botframework的pythonsdk进行bot设计。我在对话设计中使用瀑布式对话框
我的bot以一个对话框开始,询问用户:"I can show documents for topic A, B, C. Of what topic you would like to see documents?"
为了验证用户是否提交了正确的主题,我使用自定义验证器,并使用luis验证用户是否输入了正确的主题
在对话框的瀑布步骤中,我使用用户输入的主题向他显示相应的主题。但在这里,我还必须再次点击luis服务,从用户消息中提取主题,然后从主题列表中使用实体过滤器
我的问题是:是否可以将值从promptValidatorContext传递到当前步骤上下文或瀑布对话框集中的下一个对话框
正如您在下面的示例代码中所看到的,我正在使用相同的用户消息两次点击luis应用程序,如果可以在promptValidatorContext和dialogContext之间共享值,这将帮助我避免两次点击luis服务,并且可以通过一次点击完成相同的工作
示例代码:
class MainDialog(ComponentDialog):
def __init__(self, dialog_id, luis_app):
self.dialog_id = dialog_id
self.luis_app = luis_app
self.add_dialog(TextPrompt('topic', self.TopicValidator))
self.add_dialog(WaterFallDialog('wf_dialog', [self.Welcome, self.Topic, self.FinalStep])
async def Welcome(self, step_context):
return await step_context.prompt(
'topic',
options = PromptOptions(
prompt = MessageFactory.text('Welcome to the bot, I can show you documents of topic Math, English, Science'),
retry_prompt = MessageFactory.text("I am sorry I didn't understand please try again with different wording")
)
)
async def TopicValidator(self, prompt_context: PromptValidatorContext):
for_luis = prompt_context.recognized.value
#hit the luis app to get the topic name
topic_name = self.luis_app(for_luis)
if topic_name in ['Math', 'Science', 'English']:
return True
else:
return False
async def Topic(self, step_context):
topic_name = self.luis_app(step_context.context.activity.text) #using the same user message as used in Validator function
#filter documents based on topics with custom function filter_doc
docs = filter_doc(topic_name)
return await step_context.prompt('docs', options = PromptOptions(prompt = docs))
async def FinalStep(self, step_context):
#code for final step
我真的想重申,我认为您应该使用选择提示。选择提示比你想象的要灵活得多。选择识别是非常先进的,它能够识别一个短语中间的选择,甚至可以提供同义词,就像在路易斯列表实体。对话框库中有一个entire folder专用于选择识别。你认为你通过使用LUIS给用户带来了更好的体验,但实际上你给了他们更糟糕的体验,因为他们不能选择像1或2这样的序号。根据你告诉我的,我确信选择提示对你来说是最好的选择
话虽如此,这是你要的信息
通常的做法是每回合只调用一次给定的LUIS端点。如果你的LUIS模型对于你的机器人来说是全局的,那么在这个对话框之外调用它会更有意义,所以我假设这个LUIS模型是这个对话框特有的
最明显的解决方案是将LUIS结果存储在turn状态。您可以这样存储它:
您可以像这样检索值:
另一个想法是使
luis_app
成为memoized function(一个缓存自己结果的函数)。由于其缓存的最佳位置是转弯状态,因此这与第一个想法没有太大区别。主要的区别是,您将更改luis_app
代码,并保持对话框代码不变另一个想法是将您的LUIS结果放入提示结果中。您可以在验证器中随意修改已识别的值
在瀑布的下一步中使用
step_context.result
访问该值。我应该提到,您还可以修改传入活动的text属性,但这可能被认为是不好的做法最后,您可以创建自己的prompt类,该类自动使用LUIS实体作为其可识别的值。也许你可以称之为
EntityPrompt
或其他什么相关问题 更多 >
编程相关推荐