You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:25:12