QnA Maker Bot 在 Teams 私人聊天中工作,但在团队中提到时没有答案
QnA Maker Bot working in Teams private chats, but no answers when mentioned in team
我在 qnamaker.ai 配置了一个知识库,发布了它,并使用 Azure 机器人服务创建了一个机器人。
在 Teams 中,我创建了一个新的机器人应用程序并将其与已部署的机器人相关联。该机器人可用于私人聊天、群聊和团队。
- 如果我在私人聊天中“询问”它“部署 cosmosdb”,它会返回正确答案。
- 如果我在团队中使用机器人,通过提及它“@CS Bot deploy cosmosdb”,它不知道答案。
- 如果我在私人聊天中提及该机器人,我会看到相同的行为:无人接听。
但要与机器人对话,必须提到它,那么这里的问题在哪里?
更新:
感谢 Hilton 在下面的回答,我注意到当您下载 bot 源代码(在我的例子中,它是一个 dotnet 核心项目)时,README.MD 文件说明了这个问题 以及如何修复它:
Microsoft Teams channel group chat fix
- Goto
Bot/QnABot.cs
- Add References
using Microsoft.Bot.Connector;
using System.Text.RegularExpressions;
- Modify
OnTurnAsync
function as:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
// Teams group chat
if (turnContext.Activity.ChannelId.Equals(Channels.Msteams))
{
turnContext.Activity.Text = turnContext.Activity.RemoveRecipientMention();
}
await base.OnTurnAsync(turnContext, cancellationToken);
// Save any state changes that might have occurred during the turn.
await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
}
如果您检查第一条消息中返回的文本,它将是“部署 cosmosdb”。但在第二条消息中,它将是 QnAMaker 正在努力解析的“CS Bot deploy cosmosdb”。在将查询文本传递给 QnAMaker 之前,您要做的是从文本中完全删除提及的“@”。
这是一个常见的问题,所以Bot Framework已经有方法来处理这个问题。您没有提到您正在开发的平台,但这里有一个 link for dotnet 到 RemoveRecipientMention 方法。我很确定在 Node 等上有一个等价物
最终效果是将您的 Activity 的文本转换为在两种情况下相同,这将导致 QnAMaker 的响应相同。
我在 qnamaker.ai 配置了一个知识库,发布了它,并使用 Azure 机器人服务创建了一个机器人。
在 Teams 中,我创建了一个新的机器人应用程序并将其与已部署的机器人相关联。该机器人可用于私人聊天、群聊和团队。
- 如果我在私人聊天中“询问”它“部署 cosmosdb”,它会返回正确答案。
- 如果我在团队中使用机器人,通过提及它“@CS Bot deploy cosmosdb”,它不知道答案。
- 如果我在私人聊天中提及该机器人,我会看到相同的行为:无人接听。
但要与机器人对话,必须提到它,那么这里的问题在哪里?
更新:
感谢 Hilton 在下面的回答,我注意到当您下载 bot 源代码(在我的例子中,它是一个 dotnet 核心项目)时,README.MD 文件说明了这个问题 以及如何修复它:
Microsoft Teams channel group chat fix
- Goto
Bot/QnABot.cs
- Add References
using Microsoft.Bot.Connector; using System.Text.RegularExpressions;
- Modify
OnTurnAsync
function as:public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { // Teams group chat if (turnContext.Activity.ChannelId.Equals(Channels.Msteams)) { turnContext.Activity.Text = turnContext.Activity.RemoveRecipientMention(); } await base.OnTurnAsync(turnContext, cancellationToken); // Save any state changes that might have occurred during the turn. await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken); await UserState.SaveChangesAsync(turnContext, false, cancellationToken); }
如果您检查第一条消息中返回的文本,它将是“部署 cosmosdb”。但在第二条消息中,它将是 QnAMaker 正在努力解析的“CS Bot deploy cosmosdb”。在将查询文本传递给 QnAMaker 之前,您要做的是从文本中完全删除提及的“@”。
这是一个常见的问题,所以Bot Framework已经有方法来处理这个问题。您没有提到您正在开发的平台,但这里有一个 link for dotnet 到 RemoveRecipientMention 方法。我很确定在 Node 等上有一个等价物
最终效果是将您的 Activity 的文本转换为在两种情况下相同,这将导致 QnAMaker 的响应相同。