构建基本的 AI 聊天机器人

AI 聊天机器人模板展示了一个机器人应用(类似于 ChatGPT),该应用可响应用户问题并允许用户在 Microsoft Teams 中与 AI 机器人交互。 Teams AI 库 用于生成应用模板,提供创建基于 AI 的 Teams 应用程序的功能。

先决条件

安装 用于使用...
Visual Studio Code JavaScript、TypeScript 或 Python 生成环境。 使用最新版本。
Teams 工具包 Microsoft Visual Studio Code扩展,用于为应用创建项目基架。 使用最新版本。
Node.js 后端 JavaScript 运行时环境。 有关详细信息,请参阅 项目类型的Node.js 版本兼容性表
Microsoft Teams Microsoft Teams,在一个位置通过聊天、会议和通话应用与你合作的每个人进行协作。
Azure OpenAI 首先创建 OpenAI API 密钥,以使用 OpenAI 的生成性预训练转换器 (GPT) 。 如果要在 Azure 中托管应用或访问资源,则必须创建 Azure OpenAI 服务。

创建新的基本 AI 聊天机器人项目

  1. 打开 Visual Studio Code

  2. 选择“Visual Studio Code活动栏中的 Teams 工具包”图标

  3. 选择“ 创建新应用”。

    屏幕截图显示了 Teams 工具包边栏中“创建新项目”链接的位置。

  4. 选择“ 自定义引擎代理”。

    屏幕截图显示用于选择自定义引擎代理作为要创建的新项目的选项。

  5. 选择“ 基本 AI 聊天机器人”。

    屏幕截图显示了使用 AI 库列表选择应用功能的选项。

  6. 选择 “JavaScript”。

    屏幕截图显示了用于选择编程语言的选项。

  7. 选择“ Azure OpenAI”。

    屏幕截图显示了用于选择 LLM 的选项。

  8. 根据所选服务输入 OpenAIAzure OpenAI 凭据。 选择“Enter”。

    屏幕截图显示输入 Azure 打开 API 密钥的位置。

  9. 选择“ 默认文件夹”。

    屏幕截图显示要保存的位置应用文件夹。

    若要更改默认位置,请执行以下步骤:

    1. 选择“ 浏览”。
    2. 选择项目工作区的位置。
    3. 选择 “选择文件夹”。
  10. 输入应用的应用程序 名称,然后选择 Enter 键。

    屏幕截图显示了用于输入适当名称的选项。

    已成功创建 AI 聊天机器人项目工作区。

    屏幕截图显示已创建的 ai 聊天机器人,并提供了自述文件。

  11. “资源管理器”下,转到 env.env.testtool.user> 文件。

  12. 更新以下详细信息:

    • SECRET_AZURE_OPENAI_API_KEY=<your-key>
    • AZURE_OPENAI_ENDPOINT=<your-endpoint>
    • AZURE_OPENAI_DEPLOYMENT_NAME=<your-deployment>

    屏幕截图显示了 env 文件中更新的详细信息。

  13. 若要调试应用,请选择 F5 键或从左窗格中选择 “运行和调试” (Ctrl+Shift+D) ,然后从下拉列表中选择“ 在测试工具 (预览) 调试”。

    屏幕截图显示了从选项列表中选择的调试选项。

测试工具在网页中打开机器人。

屏幕截图显示了使用基本 AI 聊天机器人的机器人响应。

浏览机器人应用源代码

Folder 目录
.vscode 用于调试的Visual Studio Code文件。
appPackage Teams 应用程序清单的模板。
env 环境文件。
infra 用于预配 Azure 资源的模板。
src 应用程序的源代码。
teamsapp.yml 这是main Teams 工具包项目文件。 项目文件定义了两个主要内容:属性和配置阶段定义。
teamsapp.local.yml 这将替代 teamsapp.yml 启用本地执行和调试的作。
teamsapp.testtool.yml 这将替代 teamsapp.yml 在 Teams 应用测试工具中启用本地执行和调试的作。
src/index.js 设置机器人应用服务器。
src/adapter.js 设置机器人适配器。
src/config.js 定义环境变量。
src/prompts/chat/skprompt.txt 定义提示。
src/prompts/chat/config.json 配置提示。
src/app/app.js 处理基本 AI 聊天机器人的业务逻辑。

Teams AI 聊天机器人的工作原理

Teams AI 库提供了一个流来生成具有 AI 功能的智能聊天机器人,如下所示:

屏幕截图显示了 AI 聊天机器人的典型流程。

  • TurnContext:轮次上下文对象提供有关活动的信息,例如发送方和接收方、通道以及处理活动所需的其他数据。

  • TurnState:轮次状态对象(类似于 Cookie)存储当前轮次的数据。 此对象作为轮次上下文,通过整个应用程序逻辑(包括活动处理程序和 AI 系统)传递。

  • 身份验证:如果配置了用户身份验证,Teams AI 会尝试将用户登录。 如果用户已登录,SDK 将检索访问令牌并继续。 否则,SDK 会启动登录流并结束当前轮次。

  • 活动处理程序:Teams AI 库执行一组已注册的活动处理程序,使你能够处理多种类型的活动。 活动处理程序系统是实现机器人或消息扩展应用逻辑的主要方法。 它是一组方法和配置,可用于注册回调(称为路由处理程序),这些回调基于传入活动触发。 传入活动可以是消息、消息反应或 Teams 应用中几乎任何交互的形式。

  • AI 系统:Teams AI 库中的 AI 系统负责审核输入和输出、生成计划并执行计划。 它可以用作独立或由应用对象路由到。 重要概念如下:

    1. 提示管理器:提示在交流和指导大型语言模型 (LLM 的行为) AI 方面起着关键作用。
    2. Planner:规划器接收用户的请求,该请求采用提示或提示模板的形式,并返回一个计划来实现它。 这是通过使用 AI 混合和匹配注册到 AI 系统的原子函数(称为作)来实现的。 这些作将重新组合为一系列完成目标的步骤。
    3. :作是注册到 AI 系统的原子函数。
  • AfterTurn 处理程序:执行活动处理程序或 AI 系统后,Teams AI 库执行处理程序 afterTurn 。 处理程序允许在轮次后执行作。 如果返回为 true,则 SDK 会将轮次状态保存到存储。

  • 响应用户:Teams AI 库保存状态,机器人可以将响应发送给用户。

自定义基本 AI 聊天机器人

可以在基本应用的基础上添加自定义项,以生成复杂方案,如下所示:

  1. 自定义提示:提示在沟通和指导 LLM AI 行为方面起着关键作用。 它们充当输入或查询,用户可以提供这些输入或查询,以从模型获取特定响应。 下面是一个提示,要求 LLM 提供名称建议:

    请求

    Give me 3 name suggestions for my pet golden retriever.
    

    响应

    Some possible name suggestions for a pet golden retriever are:
    - Bailey
    - Sunny
    - Cooper
    

    若要使用 Teams 工具包生成的项目,可以在 文件中创作提示 src/prompts/chat/skprompt.txt 。 在此文件中写入的提示将插入到用于指示 LLM 的提示中。 Teams AI 库定义了可在提示文本中使用的以下语法:

    1. {{ $[scope].property }}:Teams AI 库呈现在轮次状态中限定和定义的属性的值。 它定义了三个此类范围:临时、用户和对话。 如果未指定任何范围,则默认情况下,库使用临时范围。

    2. {{$[scope].property}}按以下方式使用:

      1. src/app/turnState.ts 文件中,定义临时状态、用户状态、聊天状态和应用轮次状态。 turnState.ts如果项目中不存在该文件,请在 下src/app创建它。

        import { DefaultConversationState, DefaultTempState, DefaultUserState, TurnState } from "@microsoft/teams-ai";
        
        export interface TempState extends DefaultTempState {  }
        export interface UserState extends DefaultUserState {  }
        export interface ConversationState extends DefaultConversationState {
            tasks: Record<string, Task>;
        }
        
        export interface Task {
            title: string;
            description: string;
        }
        
        export type ApplicationTurnState = TurnState<ConversationState, UserState, TempState>;
        
      2. 在 文件中 src/app/app.ts ,使用应用轮次状态初始化应用。

        const storage = new MemoryStorage();
        const app = new Application<ApplicationTurnState>({
          storage,
          ai: {
            planner,
          },
        });
        
      3. src/prompts/chat/skprompt.txt 文件中,使用作用域内的状态属性,例如 {{$conversation.tasks}}

  2. 自定义用户输入:Teams AI 库允许通过包括用户输入来增强发送给 LLM 的提示。 包含用户输入时,需要在提示配置文件中src/prompts/chat/config.json通过将 设置为 completion.include_inputtrue 来指定它。 还可以选择通过更改 completion.max_input_tokens在 中src/prompts/chat/config.json配置最大用户输入令牌数。 如果要限制用户输入的长度以避免超过令牌限制,这非常有用。

  3. 自定义对话历史记录:SDK 会自动管理对话历史记录,你可以按如下所示进行自定义:

    • 在 中 src/prompts/chat/config.json,配置 completion.include_history。 如果 true为 ,则将历史记录插入提示,让 LLM 知道对话上下文。

    • 历史记录消息的最大数目。 在初始化 PromptManager时配置 max_history_messages

      
      const prompts = new PromptManager({
      promptsFolder: path.join(__dirname, "../prompts"),
      max_history_messages: 3,
      });
      
    • 历史记录令牌的最大数目。 在初始化 PromptManager时配置 max_conversation_history_tokens

      
      const prompts = new PromptManager({
          promptsFolder: path.join(__dirname, "../prompts"),
          max_conversation_history_tokens: 1000,
      });
      
      
  4. 自定义模型类型:可以将特定模型用于提示。 在 文件中 src/prompts/chat/config.json ,配置 completion.model。 如果未为提示配置任何模型,则使用 中 OpenAIModel 配置的默认模型。

    支持 SDK 的模型如下所示:

    模型 支持
    gpt-3.5-turbo 支持
    gpt-3.5-turbo-16k 支持
    gpt-3.5-turbo-指令 1.1.0 不支持
    gpt-4 支持
    gpt-4-32k 支持
    gpt-4-vision 支持
    gpt-4-turbo 支持
    DALL·E 不支持
    耳语 不支持
    TTS 不支持
  5. 自定义模型参数

    在 文件中 src/prompts/chat/config.json ,按如下方式配置完成的模型参数:

    • Max_tokens:要生成的最大令牌数。
    • 温度:模型温度为介于 0 和 2 之间的数字。
    • Top_p:模型 top_p 作为介于 0 和 2 之间的数字。
    • Presence_penalty:模型 presence_penalty 作为介于 0 和 1 之间的数字。
    • Frequency_penalty:模型 frequency_penalty 作为介于 0 和 1 之间的数字。
    • Stop_sequences:命中时停止生成的停止序列数组。

另请参阅

Teams AI 库