使用触发词将会话数据永久存储在Azure聊天机器人中

时间:2018-07-31 07:20:14

标签: c# azure botframework azure-storage chatbot

我正在做一些开发,以开发azure聊天机器人,特别是C#中的QnA机器人,现在正在考虑将对话历史记录存储到表或数据库存储中。

但是与网络上的大多数教程和文档不同,我不想从头到尾存储整个对话,我只想存储用户发送给机器人的第一条消息。我希望此消息暂时存储,直到用户键入“否”为止。当用户键入“否”时,我希望永久存储在临时存储器中的内容永久保存。

在聊天机器人中有可能吗?

这里的任何帮助或见识将不胜感激!

1 个答案:

答案 0 :(得分:0)

这将非常容易通过像字典这样的临时存储来完成。有多种方法可以完成此任务。我要研究的一件事是scorables,用于捕获“否”文本。在此示例中,我没有使用scorables,但是它使用了您正在寻找的基本功能。想法是,当收到一条消息时,您检查一下是否已经从该userId中保存了一条消息并进行了保存(如果未保存)。如果用户发送文本“否”,则将文本保存到永久存储并从字典中删除条目。我只是在基本的RootDialog.cs中这样做:

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        var userId = activity.From.Id;
        var message = activity.Text;
        if (!Utils.FirstMessageDictionary.ContainsKey(userId))
        {

            Utils.FirstMessageDictionary.Add(userId, message);
            await context.PostAsync($"Message saved {userId} - {Utils.FirstMessageDictionary[userId]}");
        }

        if (message.ToLower() == "no")
        {

            //save to permanent storage here 

            Utils.FirstMessageDictionary.Remove(userId);
            await context.PostAsync($"Entry Removed for {userId}");

            try
            {
                await context.PostAsync($"{userId} - {Utils.FirstMessageDictionary[userId]}");
            }
            catch (Exception e)
            {
                await context.PostAsync($"No entry found for {userId}");
            }
        }
        context.Wait(MessageReceivedAsync);
    }

我还为字典创建了一个简单的类:

public static class Utils
{
    public static Dictionary<string, string> FirstMessageDictionary = new Dictionary<string, string>();
}