重要
Teams AI 库 v1 已弃用。 建议升级代理以使用更新的 Teams AI 库。 Teams AI 库现已正式发布,适用于 JavaScript 和 C#,支持开发人员预览版中的 Python。 它提供简化的 SDK、对模型上下文协议的支持 (MCP) 、代理到代理通信 (A2A) ,以及简化工具,使开发人员能够构建适用于 Teams 的智能代理。
机器人消息中的 AI 标签、引文、反馈按钮和敏感度标签可提高用户参与度并提高透明度和信任度。
- AI 标签 使用户能够识别消息是使用 AI 生成的。
- 引文 使用户能够通过文本内引文和引用来引用机器人消息的源。
- “反馈”按钮 使用户能够向机器人消息提供正面或负面反馈。
- 敏感度标签 使用户能够了解机器人消息的机密性。
以下屏幕截图显示了如何使用 AI 标签、引文、反馈按钮和敏感度标签来增强机器人消息:
注意
- 个人聊天、群组聊天和频道中的机器人可以使用 AI 标签、引文、反馈按钮和敏感度标签。
- 政府 社区云 (GCC) 、GCC High 和国防部 (DoD) 环境中提供了 AI 标签、引文、反馈按钮和敏感度标签。
AI 标签
机器人消息上的 AI 标签指示它由 AI 生成。 虽然使用大型语言模型 (LLM) 的 AI 支持机器人通常很可靠,但标签有助于防止有关信息源的混淆。
添加 AI 标签
如果使用 Teams AI 库来生成机器人,则会自动为作中PredictedSayCommand模块中的所有 ai AI 支持机器人消息启用 AI 标签。 有关详细信息,请参阅 AIEntity 接口。
如果使用 Microsoft Bot Framework SDK 来生成机器人,请在实体对象的数组message下entities包含 additionalType 。 以下代码片段演示如何在机器人消息中启用 AI 标签:
await context.sendActivity({
  type: ActivityTypes.Message,
  text: `Hey! I'm a friendly AI bot. This message is generated by AI.`,
  entities: [
    {
     type: "https://schema.org/Message",
     "@type": "Message",
     "@context": "https://schema.org",
     additionalType: ["AIGeneratedContent"], // Enables AI label
    }
  ]
});
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
| additionalType | Array | 是 | 在机器人消息中启用 AI 标签。 允许的值: AIGeneratedContent | 
添加 AI 标签后,机器人的消息会在机器人名称旁边显示 AI 生成的 标签。 将鼠标悬停在 AI 标签上时,会显示免责声明,指出 AI 生成的内容可能不正确。 无法为 AI 支持的机器人自定义 AI 标签和免责声明。
错误处理
| 错误代码 | 说明 | 
|---|---|
| 400 | 在数组下 entities找到多个根消息实体。 | 
| 400 | 从 entities数组分析消息实体时出错。 | 
引文
在机器人消息中引用来源可帮助用户提出后续问题或进行独立研究。 引用文件、消息、电子邮件和工作项等数据源,以提供有价值的见解。 引文对于使用 Retrieval-Augmented Generation (RAG) 等技术的机器人至关重要。
机器人消息中的引文可以包括以下内容:
- 文本内引文 以 [#] 格式表示添加到机器人消息的引文编号,每个引文都对应于引用。 引文可以插入文本中的任何位置。
- 引文参考的详细信息 包括标题、图标、关键字、摘要、超链接、敏感度信息,以及用于打开包含其他内容的模式窗口的按钮。 每个文本内引文的引用显示为弹出窗口。
- 引文的敏感度标签 指示引用的引文内容的机密性,不会自动添加。 若要为引文添加敏感度标签,请参阅 添加敏感度标签。
- 包含其他内容的模式窗口 呈现自适应卡片,没有任何交互式项。
注意
- 消息中最多显示 20 个引文。
- 公共开发人员预览版中提供了具有自适应卡片的引文。
- 自适应卡片不会在引文弹出窗口中呈现。 但是,自适应卡片可以呈现在机器人的消息中,也可以在从弹出窗口访问的引文模式窗口中呈现。
添加引文
如果使用 Teams AI 库 构建机器人,则引 PredictedSayCommand 文将通过作自动添加到 AI 支持的机器人消息中。 还可以修改作以 PredictedSayCommand 向机器人消息添加引文。 有关详细信息,请参阅 ClientCitation 接口。
如果使用 Bot Framework SDK 来生成机器人,请在 数组下entities包含 citation 。 下面是一个示例代码片段:
await context.sendActivity({
  type: ActivityTypes.Message,
  text: `Hey I'm a friendly AI bot. This message is generated through AI [1]`, // cite with [1],
  entities: [
  {
    type: "https://schema.org/Message",
    "@type": "Message",
    "@context": "https://schema.org",
    citation: [
    {
      "@type": "Claim",
      position: 1, // Required. Must match the [1] in the text above
      appearance: {
        "@type": "DigitalDocument",
        name: "AI bot", // Title
        url: "https://example.com/claim-1", // Hyperlink on the title
        abstract: "Excerpt description", // Appears in the citation pop-up window
        text: "{\"type\":\"AdaptiveCard\",\"$schema\":\"http://adaptivecards.io/schemas/adaptive-card.json\",\"version\":\"1.6\",\"body\":[{\"type\":\"TextBlock\",\"text\":\"Adaptive Card text\"}]}", // Appears as a stringified Adaptive Card
        keywords: ["keyword 1", "keyword 2", "keyword 3"], // Appears in the citation pop-up window
        encodingFormat: "application/vnd.microsoft.card.adaptive",
        image: {
          "@type": "ImageObject",
          name: "Microsoft Word"
        },
       },
      },
    ],
  },
],
})
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
| citation | Object | ✔️ | 引文的详细信息。 | 
| citation.@type | String | ✔️ | 引文的对象。 允许的值: Claim | 
| citation.position | 整数 | ✔️ | 显示引文编号。 此值对于每个引文都必须是唯一的。 | 
| citation.appearance | Object | ✔️ | 有关引文外观的信息。 | 
| citation.appearance.@type | String | ✔️ | 引文外观的对象。 允许的值: DigitalDocument | 
| citation.appearance.name | String | ✔️ | 引用内容的标题。 最大字符数:80 | 
| citation.appearance.url | String | 引用内容的 URL。 | |
| citation.appearance.abstract | String | 引用内容的摘要。 最大字符数:160 | |
| citation.appearance.text | String | 一个字符串化的自适应卡片,其中包含有关引文的其他信息。 它在可从弹出窗口访问的模式窗口中呈现。 | |
| citation.appearance.keywords | Array | 引用内容中的关键字。 不能添加超过三个关键字。 每个关键字 (keyword) 只能包含 28 个字符。 | |
| citation.appearance.encodingFormat | String | 字段的 citation.appearance.text编码格式。允许的值: application/vnd.microsoft.card.adaptive | |
| citation.appearance.image | Object | 有关引文图标的信息。 | |
| citation.appearance.image.@type | String | ✔️ | 引文图标的对象。 必须是 ImageObject。 | 
| citation.appearance.image.name | String | ✔️ | 预定义图标的名称。 它会在引文引用的详细信息中呈现引文图标。 允许的值:、、 Microsoft Excel、、Microsoft OneNoteMicrosoft SharePointMicrosoft VisioMicrosoft LoopMicrosoft PowerPointAdobe PhotoshopAdobe IllustratorSource CodeSketchMicrosoft Whiteboard、Adobe InDesignVideoGIFImageAdobe Flash、Sound、、TextZIPMicrosoft WordPDF | 
启用引文后,机器人消息将包括文本内引文和引用。 当用户将鼠标悬停在引文上时,文本内引文会显示引用详细信息。
错误处理
| 错误代码 | 说明 | 
|---|---|
| 400 | 在数组下 entities找到多个根消息实体。 | 
| 400 | 从 entities数组分析消息实体时出错。 | 
| 400 | 引文超过 20 的机器人消息。 | 
| 400 | 对象 appearance为空。 | 
| 400 | 分析 ID 为 X 的引文实体时出错。 | 
反馈按钮
机器人消息中的反馈按钮对于跟踪用户参与、识别错误和深入了解机器人性能至关重要。 借助这些见解,可以有针对性的增强机器人的对话功能。 启用反馈按钮以允许用户喜欢或不喜欢邮件并提供详细的反馈。
当用户选择反馈按钮时,将基于用户的选择显示反馈表单。 可以使用默认反馈表单,也可以自定义它以满足应用的需求。
注意
可自定义的反馈表单在 公共开发人员预览版中提供。
反馈按钮位于机器人消息的页脚,包括 👍 用户选择的 () 和 👎 (竖起大拇指) 按钮。
添加反馈按钮
对于使用 Teams AI 库生成的机器人,当模块中ai设置为 true 时enable_feedback_loop,Teams 为所有机器人消息启用反馈按钮。
export const app = new Application<ApplicationTurnState>({
    ai: {
        planner: planner,
        enable_feedback_loop: true
    },
有关详细信息,请参阅 const app 变量。
启用反馈按钮后,来自机器人的所有SAY命令都会在 对象中channelData自动设置为 true。feedbackLoopEnabled
若要在使用 Bot Framework SDK 生成的机器人中启用反馈按钮,请在机器人消息的 对象下channelData定义一个 feedbackLoop 对象。
await context.sendActivity({
  type: ActivityTypes.Message,
  text: `Hey! I'm a friendly AI bot!`,
  channelData: {
    feedbackLoop: { // Enable feedback buttons
        type: "custom"
  },
});
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
| feedbackLoop | Object | ✔️ | 在机器人的消息中启用反馈按钮。 | 
| feedbackLoop.type | String | ✔️ | 定义用户选择反馈按钮时显示的反馈表单的类型。 允许的值: custom、default | 
如果设置为 feedbackLoop.typedefault,则当用户选择反馈按钮时,将显示默认反馈表单。 如果要显示自定义反馈表单,请将 设置为 feedbackLoop.typecustom。 以下调用请求将发送到机器人,以检索要向用户显示的自定义表单:
{
    "type": "invoke",
    "name": "message/fetchTask",
    "value": {
        "actionName": "feedback",
        "actionValue": {
            "reaction": "like" // like or dislike
        }
    }
}
必须使用对话 (TeamsJS v1.x) 中称为任务模块的对话框来响应此调用,就像响应调用一 task/fetch 样。 有关在机器人中调用对话的详细信息,请参阅 将对话与机器人配合使用。
处理反馈
机器人通过机器人调用流从反馈表单接收用户输入。 对于使用 Teams AI 库生成的机器人,将自动处理机器人调用请求。 若要处理反馈,请使用 app.feedbackLoop 方法注册在用户提供反馈时调用的反馈循环处理程序。
app.feedbackLoop(async (_context: TurnContext, _state: TurnState, feedbackLoopData: FeedbackLoopData) => {
  // custom logic here...
});
有关详细信息,请参阅 异步回调函数。
对于使用 Bot Framework SDK 生成的机器人,必须具有 onInvokeActivity 处理程序来处理反馈。 确保返回状态代码 200 ,其中包含空的 JSON 对象作为响应。
以下代码片段演示如何处理在机器人调用中收到的反馈,并使用状态代码 200返回响应:
public async onInvokeActivity(context: TurnContext): Promise<InvokeResponse> {
    try {
      switch (context.activity.name) {
        case "message/submitAction":
           console.log('Your feedback is ' + JSON.stringify(context.activity.value))
           // Your feedback is {"actionName":"feedback","actionValue":{"reaction":"like","feedback":"{\"feedbackText\":\"This is my feedback.\"}"}}
           return CreateInvokeResponse(200, {});
        default:
          return {
            status: 200,
            body: `Unknown invoke activity handled as default- ${context.activity.name}`,
          };
      }
    } catch (err) {
      console.log(`Error in onInvokeActivity: ${err}`);
      return {
        status: 500,
        body: `Invoke activity received- ${context.activity.name}`,
      };
    }
  }
 export const CreateInvokeResponse = (
  status: number,
  body?: unknown
 ): InvokeResponse => {
    return { status, body };
 };
通过保存机器人发送和接收的消息的消息 ID 和内容来存储反馈。 当机器人收到包含反馈的调用请求时,请将消息 ID 与相应的反馈相匹配。
注意
Teams 不会存储或处理反馈。 它不提供 API 或存储机制。
如果用户卸载机器人,但仍有权访问机器人聊天,Teams 会从机器人消息中删除反馈按钮,以防止用户向机器人提供反馈。
错误处理
| 错误代码 | 说明 | 
|---|---|
| 400 | message/submitActioninvoke 响应不为空。 | 
敏感度标签
机器人响应可能包含机密信息,或者只能由组织中的某些人员访问。 添加敏感度标签以帮助用户识别邮件的机密性,使他们能够在共享邮件时保持谨慎。
注意
仅当机器人的消息包含敏感信息时,才向这些消息添加敏感度标签。
添加敏感度标签
对于使用 Teams AI 库生成的机器人,可以通过作添加 PredictedSayCommand 敏感度标签。 有关详细信息,请参阅 SensitivityUsageInfo 接口。
对于使用 Bot Framework SDK 生成的机器人,请通过修改要包含在 usageInfo 对象中的 entities 消息来向机器人消息添加敏感度标签。
以下代码片段演示如何向机器人消息和引文引用添加敏感度标签:
await context.sendActivity({
  type: ActivityTypes.Message,
  text: `Hey, I'm a friendly AI bot. This message is generated through AI [1]`,
  entities: [
    {
      type: "https://schema.org/Message",
      "@type": "Message",
      "@context": "https://schema.org",
      usageInfo: {
        "@type": "CreativeWork",
        name: "Sensitivity title",
        description: "Sensitivity description",
      },
    },
  ],
});
| 属性 | 类型 | 必需 | 说明 | 
|---|---|---|---|
| usageInfo.@type | String | ✔️ | 在机器人消息中启用敏感度标签。 | 
| citation.usageInfo.@id | String | ✔️ | 在引文引用中启用敏感度标签。 向引文引用添加敏感度标签时,需要用到它。 | 
| usageInfo.name | String | ✔️ | 指定敏感度标签的标题。 | 
| usageInfo.description | String | 指定当用户将鼠标悬停在敏感度标签上时显示的弹出窗口消息。 | 
添加敏感度标签后,机器人消息将显示屏蔽图标。 用户可以将鼠标悬停在图标上以查看有关邮件敏感度的免责声明。
错误处理
| 错误代码 | 说明 | 
|---|---|
| 400 | 在数组下 entities找到多个根消息实体。 | 
| 400 | 从 entities数组分析消息实体时出错。 | 
| 400 | 引文级别 usageInfo.@id值与至少一个实例中的消息级别usageInfo.@id不匹配。 | 
| 400 | 有多个引文级 usageInfo属性具有相同@id,但其name和description属性不同。 | 
修改 PredictedSayCommand
对于使用 Teams AI 库生成的机器人, PredictedSayCommand 提供有关如何将 AI 标签、引文、反馈按钮和敏感度标签添加到机器人活动的控制。 下面是要修改 PredictedSayCommand的代码片段:
app.ai.action<PredictedSayCommand>(AI.SayCommandActionName, async (context, state, data, action) => {
  // custom logic here...
  await context.sendActivity(data.content);
  return "";
});
有关 的详细信息 PredictedSayCommand,请参阅 PredictedSayCommand 接口。
代码示例
| 示例名称 | Description | Node.js | .NET | 
|---|---|---|---|
| Teams 对话自动程序 | 此示例应用在消息中显示 AI 标签、引文、反馈按钮和敏感度标签。 | View | 不适用 | 
| 数据上的 Azure OpenAI | 此对话机器人使用 Teams AI 库,并在生成的消息中包含 AI 标签、反馈按钮、敏感度标签和引文。 | 不适用 | View | 
 
              
               
              
               
              
               
              
               
              
            
 
              
               
              
               
              
               
              
               
              
            
 
              
               
              
            
 
              
               
              
            
