构建基本的 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 聊天机器人项目
打开 Visual Studio Code。
选择“Visual Studio Code活动栏中的 Teams 工具包
”图标
选择“ 创建新应用”。
选择“ 自定义引擎代理”。
选择“ 基本 AI 聊天机器人”。
选择 “JavaScript”。
选择“ Azure OpenAI”。
根据所选服务输入 OpenAI 或 Azure OpenAI 凭据。 选择“Enter”。
选择“ 默认文件夹”。
若要更改默认位置,请执行以下步骤:
- 选择“ 浏览”。
- 选择项目工作区的位置。
- 选择 “选择文件夹”。
输入应用的应用程序 名称,然后选择 Enter 键。
已成功创建 AI 聊天机器人项目工作区。
在“资源管理器”下,转到 env.env.testtool.user> 文件。
更新以下详细信息:
SECRET_AZURE_OPENAI_API_KEY=<your-key>
AZURE_OPENAI_ENDPOINT=<your-endpoint>
AZURE_OPENAI_DEPLOYMENT_NAME=<your-deployment>
若要调试应用,请选择 F5 键或从左窗格中选择 “运行和调试” (Ctrl+Shift+D) ,然后从下拉列表中选择“ 在测试工具 (预览) 调试”。
测试工具在网页中打开机器人。
浏览机器人应用源代码
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 功能的智能聊天机器人,如下所示:
TurnContext:轮次上下文对象提供有关活动的信息,例如发送方和接收方、通道以及处理活动所需的其他数据。
TurnState:轮次状态对象(类似于 Cookie)存储当前轮次的数据。 此对象作为轮次上下文,通过整个应用程序逻辑(包括活动处理程序和 AI 系统)传递。
身份验证:如果配置了用户身份验证,Teams AI 会尝试将用户登录。 如果用户已登录,SDK 将检索访问令牌并继续。 否则,SDK 会启动登录流并结束当前轮次。
活动处理程序:Teams AI 库执行一组已注册的活动处理程序,使你能够处理多种类型的活动。 活动处理程序系统是实现机器人或消息扩展应用逻辑的主要方法。 它是一组方法和配置,可用于注册回调(称为路由处理程序),这些回调基于传入活动触发。 传入活动可以是消息、消息反应或 Teams 应用中几乎任何交互的形式。
AI 系统:Teams AI 库中的 AI 系统负责审核输入和输出、生成计划并执行计划。 它可以用作独立或由应用对象路由到。 重要概念如下:
AfterTurn 处理程序:执行活动处理程序或 AI 系统后,Teams AI 库执行处理程序
afterTurn
。 处理程序允许在轮次后执行作。 如果返回为true
,则 SDK 会将轮次状态保存到存储。响应用户:Teams AI 库保存状态,机器人可以将响应发送给用户。
自定义基本 AI 聊天机器人
可以在基本应用的基础上添加自定义项,以生成复杂方案,如下所示:
自定义提示:提示在沟通和指导 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 库定义了可在提示文本中使用的以下语法:{{ $[scope].property }}
:Teams AI 库呈现在轮次状态中限定和定义的属性的值。 它定义了三个此类范围:临时、用户和对话。 如果未指定任何范围,则默认情况下,库使用临时范围。{{$[scope].property}}
按以下方式使用:在
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>;
在 文件中
src/app/app.ts
,使用应用轮次状态初始化应用。const storage = new MemoryStorage(); const app = new Application<ApplicationTurnState>({ storage, ai: { planner, }, });
在
src/prompts/chat/skprompt.txt
文件中,使用作用域内的状态属性,例如{{$conversation.tasks}}
。
自定义用户输入:Teams AI 库允许通过包括用户输入来增强发送给 LLM 的提示。 包含用户输入时,需要在提示配置文件中
src/prompts/chat/config.json
通过将 设置为completion.include_input
true
来指定它。 还可以选择通过更改completion.max_input_tokens
在 中src/prompts/chat/config.json
配置最大用户输入令牌数。 如果要限制用户输入的长度以避免超过令牌限制,这非常有用。自定义对话历史记录: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, });
自定义模型类型:可以将特定模型用于提示。 在 文件中
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 不支持 自定义模型参数:
在 文件中
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:命中时停止生成的停止序列数组。