如何让多个Bot在Teams同一聊天窗口向聚合Bot用户提供回复
实现多Bot在同一Teams聊天窗口聚合回复的方案
这个需求其实是Bot生态里很典型的「聚合路由Bot」场景,我之前帮不少团队落地过类似方案,下面给你拆解具体的实现思路和步骤:
核心思路
搭建一个聚合Bot作为唯一入口,它负责接收用户在Teams聊天窗口的所有消息,通过路由逻辑把消息转发给对应领域的专业Bot,再把专业Bot的回复同步回原聊天窗口。用户全程只需要和这个聚合Bot交互,不用关心背后具体是哪个Bot在处理。
具体实现步骤
1. 配置聚合Bot的Teams集成
首先要确保聚合Bot已经在Azure Bot Service完成注册,并启用了Teams频道。这一步是基础,确保它能正常接收和发送Teams消息:
- 在Azure Portal创建Bot资源,绑定Azure AD应用
- 在Bot的「频道」页面添加Teams频道,完成配置验证
2. 实现消息路由逻辑
这里有两种常用的路由方案,你可以根据团队的技术栈和维护成本选择:
方案一:聚合Bot自带统一意图识别
适合愿意维护一个全局NLP模型的团队,步骤如下:
- 训练一个统一的LUIS(或其他NLP工具)模型,涵盖所有领域Bot的核心意图(比如「服务故障咨询」「目录查询」等)
- 在聚合Bot的消息处理逻辑中,先调用这个全局模型识别用户意图,再把消息转发给对应的领域Bot
示例代码(C#,基于Bot Framework):
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 调用全局LUIS识别用户意图 var luisResult = await _globalLuisRecognizer.RecognizeAsync(turnContext, cancellationToken); var topIntent = luisResult.TopIntent().Intent; // 根据意图路由到对应领域Bot switch(topIntent) { case GlobalIntents.ServiceIssue: await ForwardMessageToBot(turnContext, _serviceBotClient, cancellationToken); break; case GlobalIntents.DirectoryQuery: await ForwardMessageToBot(turnContext, _directoryBotClient, cancellationToken); break; default: await turnContext.SendActivityAsync(MessageFactory.Text("抱歉,我暂时无法理解你的问题,请尝试换一种方式描述。"), cancellationToken); break; } } // 封装消息转发方法,保留用户上下文 private async Task ForwardMessageToBot(ITurnContext<IMessageActivity> turnContext, IBotClient targetBotClient, CancellationToken cancellationToken) { // 构造转发消息,包含原始用户消息、会话ID、用户信息等上下文 var forwardedMessage = new BotMessage { Content = turnContext.Activity.Text, ConversationId = turnContext.Activity.Conversation.Id, UserId = turnContext.Activity.From.Id }; // 调用领域Bot的接口或通过Direct Line发送消息 var botReply = await targetBotClient.SendMessageAsync(forwardedMessage); // 把领域Bot的回复发回原Teams聊天窗口 await turnContext.SendActivityAsync(MessageFactory.Text($"[{targetBotClient.BotName}]:{botReply.Content}"), cancellationToken); }
方案二:广播消息到所有领域Bot,由Bot自主判断
适合不想维护全局NLP模型的团队,聚合Bot把用户消息同时发给所有领域Bot,每个Bot用自己的LUIS判断是否能处理:
- 聚合Bot维护一个领域Bot的地址列表
- 收到用户消息后,并行发送给所有领域Bot,设置响应超时时间
- 只取第一个返回有效回复的Bot内容,或者筛选置信度最高的回复返回给用户
3. 改造领域Bot适配转发逻辑
领域Bot需要做少量调整,支持接收来自聚合Bot的转发消息:
- 暴露一个API接口(或通过Bot Framework Direct Line)接收聚合Bot的消息
- 处理消息时,保留会话上下文,确保多轮对话能正常进行
- 把处理后的回复返回给聚合Bot,格式要符合Teams的消息规范(支持文本、自适应卡片等)
4. 优化用户体验的细节
- 添加Bot标识:在回复前加上
[服务Bot]「目录Bot」等前缀,让用户清晰知道是哪个领域的回复 - 上下文保持:转发消息时带上完整的会话上下文(比如历史消息、用户之前的提问),确保领域Bot能理解多轮对话
- 错误兜底:如果所有领域Bot都无法处理,或者某个Bot超时/报错,聚合Bot要返回友好的提示,比如「当前服务Bot暂时无法响应,请稍后再试」
关键注意事项
- 安全通信:聚合Bot和领域Bot之间的通信要做身份验证,比如用Azure AD OAuth或API密钥,避免消息被篡改或非法访问
- 性能控制:如果用广播方案,要设置合理的超时时间(比如2秒),避免用户等待太久;同时限制并发请求数量,防止服务过载
- 权限隔离:确保领域Bot只能处理自己权限范围内的消息,避免越权访问
内容的提问来源于stack exchange,提问作者Matt D
相关产品推荐
相关产品推荐

