通过使用Copilot Studio,可以创建与不同语言的客户通信的代理。 你可以配置多语言客服,根据用户的浏览器设置自动检测所需语言,并用相同语言回应,为客户提供更个性化且更具吸引力的体验。
创建代理时,请指定其主要语言。
将辅助语言添加到代理后,你负责为创建的主题中的消息提供翻译。 对于使用生成式调度的代理,生成的消息会自动翻译。
当客户启动与已发布代理的会话时,代理会选择其语言之一,以匹配客户客户端或浏览器中指定的语言。 如果代理无法检测语言,或者如果检测到不支持的语言,则代理默认为其主要语言。
可以设计代理以更改在聊天期间使用的语言(请参阅 “使代理切换到另一种语言”)。 还可以设置使用 生成编排 来动态切换语言的代理,以便跟随当前对话轮次中使用的语言(请参阅 设置代理以进行动态语言切换)。
有关支持语言的列表,请参阅语言支持。
备注
经典聊天机器人仅支持一种语言。 有关将经典聊天机器人转换为代理的详细信息,请参阅 升级到 Copilot Studio 统一创作。
为智能体添加语言
转到代理的 “设置” 页,然后选择“ 语言”。
选择“添加语言”。
在 “添加语言 ”面板中,选择要添加到代理的语言,然后选择“ 添加”。
查看语言列表,并关闭 “设置” 页。
管理多语言代理的本地化
在Copilot Studio中,你以代理的主要语言执行所有主题和内容编辑。 本部分介绍如何从代理下载字符串并将其翻译为代理的辅助语言。 上传翻译后的字符串后,可以在 测试面板中切换语言 ,并验证辅助语言中的对话是否也按预期流动。
准备本地化内容
首次下载辅助语言的本地化文件时,所有字符串都采用代理的主要语言。 下载本地化文件后,请将其与您首选的本地化过程一起使用。
转到代理的 “设置” 页,然后选择“ 语言”。
在“ 语言 ”页上的辅助语言列表中,选择要更新的语言的 “上传 ”。
在 “更新本地化 ”面板中,选择 JSON 或 ResX 格式以下载该语言的当前本地化文件。
备注
下载的文件包含智能体的最新本地化内容。 若要下载以前版本的本地化文件, 请打开代理的解决方案。
打开下载的文件,用适当的翻译文本替换主要语言字符串。
返回到 “更新本地化 ”面板,选择“ 浏览”,然后上传翻译的文件。
关闭 “更新本地化 ”面板和 “设置” 页。
更新本地化内容
如果更改主要语言字符串,则还必须更新辅助语言中的内容。 此过程包括新内容和修改的内容。 增量更改不会自动翻译。 必须下载辅助语言 JSON 或 ResX 文件,并使用首选本地化过程更新未转换的字符串。
以下方案是翻译内容工作流的典型情况。 您之前已将主要语言(en-US)翻译为次要语言(fr-FR),并且添加和修改了主要语言的内容。 当你下载第二语言的本地化文件时,任何新字符串都会在主语言(en-US)中,之前翻译的字符串会保留在第二语言中(fr-FR)。 然而,那些自你上次上传本地化文件以来原文被修改的已翻译字符串,仍然会显示为上次翻译成第二语言时的样子。 由于字符串ID不变,主语言发生变化后,二级语言字符串和主语言字符串可能会不同步。 确保将新本地化文件与你上次上传的版本进行比较——以识别主要语言字符串的变化——是本地化过程的一部分。
使来自Adaptive Cards的动态内容可用于本地化
本地化文件不包含来自Adaptive Cards的混合类型字符串。 如果需要本地化自适应卡片,其中字符串可以同时包含静态文本和变量(动态内容),请使用以下解决方法。 此过程演示如何使用 Set 文本变量 节点将完整字符串与静态文本和变量存储在中间变量中。 随后在自适应卡片中仅引用该中间变量。 下载代理的本地化文件时,中间变量的值(包含静态文本和变量引用)可以作为 setVariable 操作的一部分被本地化。
若要使自适应卡片的动态内容可本地化:
在自适应卡片之前添加 “设置变量值 ”节点。 此步骤创建一个 YAML 表示形式,可以使用代码编辑器将节点转换为 “设置”文本变量 节点来更新该表示形式。 无法直接从创作画布创建 “设置文本变量 ”节点。
在 “设置变量值 ”节点中,创建新的变量,但尚未设置该值。
在代码编辑器中,找到表示Set 变量值的节点,并将
kind: SetVariable替换为kind: SetTextVariable。 此更改会将设置变量值节点转换为设置文本变量节点。关闭代码编辑器:
选择 “设置文本变量 ”节点的底部字段,并输入包含要在自适应卡片上显示的静态文本和变量的完整字符串。 插入变量的方式和在 消息中插入变量一样。
使用对此新变量的引用来更新自适应卡片。
保存您的主题。 现在可以下载本地化文件,并验证它是否包含Adaptive Cards的动态内容。
在 本地化自适应卡片内容中了解详细信息。
测试多语言代理
打开测试面板。
选择测试面板顶部的三个点(...),然后选择你想要的语言。 测试面板将重新加载自身,这次使用所选语言。 创作画布保留在主要语言中,在切换回主要语言之前,无法保存对主题所做的更改。
若要测试代理,请使用所选语言输入消息。
还可以将浏览器语言设置为代理的语言之一,并转到 预生成的演示网站。 演示网站以指定语言打开,代理以该语言聊天。
使代理切换到另一种语言
创作时,可以将代理配置为在对话中间切换到另一种语言。 逻辑可以存在于代理的任意话题中。 但是,最佳做法是在问题节点之后立即切换语言,这样可以确保在下一个问题节点之前,所有后续消息都使用同一种语言。
若要更改代理的当前语言,请将 User.Language系统变量 设置为代理的辅助语言之一。 此选择会立即更改您的智能体所说的语言。
为动态语言切换设置代理
备注
此功能仅适用于启用了生成式编排的 代理 。
可以将代理配置为检测客户使用的语言并使用相同的语言进行响应。 使用此配置,代理可以在单个对话过程中多次切换语言。 以下方案演示如何设置代理以在荷兰语和英语之间切换。 你可以将其扩展为代理支持的语言的任意组合。
警告
此动态语言切换方法与基于浏览器的语言检测不兼容。 动态检测用户语言的主题设置 User.Language 变量后,基于浏览器的语言检测将不再对该用户生效,即使该主题稍后关闭或删除。 如果要试验或验证这两种方法,请使用单独的测试代理。 测试动态语言切换后,必须先 清除持久化的用户语言状态 ,然后才能尝试测试基于浏览器的语言检测。
此场景使用具有已收到消息主题触发器的主题。 本主题触发器允许代理检查它收到的每条消息。 本主题使用自定义提示来检测语言和设置代理语言系统变量的条件。
创建主题。
将主题的默认触发器类型替换为接收到的一条消息。
向主题添加提示:
选择触发器节点下方的
“添加节点”图标。选择 添加工具>新提示。
在提示编辑器中,输入提示的代表名称,例如“检测语言”。
在“ 说明 ”窗格中,输入“确定此消息写入的语言:”。
在“ 说明 ”窗格底部,选择“ 添加内容 ”,然后选择“ 文本”。 此时将显示一个窗口,邀请你输入名称和示例消息。
对于 名称,请输入“消息”。对于 示例数据,请输入“来自用户的消息”,然后选择“ 关闭”。
在 “模型响应 ”窗格中,将 输出 格式切换到 JSON。
选择测试。 提示显示 JSON 文本,其中单个属性将语言标识为英语。
选择“保存”。 画布上出现一个提示节点。
配置 提示 节点:
根据检测到的语言对逻辑进行分支:
在“提示”节点下方添加条件。
基于自定义变量的条件,该变量
DetectedLanguage.structuredOutput.language保存检测到的语言的名称。为需要检测的每种语言添加条件分支。
在每个分支下,添加 一个 Set 变量值 节点以相应地设置
User.Language系统变量。 下图显示了一个有条件在荷兰语和英语之间切换的主题。
还原基于浏览器的语言检测
当为 动态语言切换 配置的代理设置 User.Language 系统变量时,所选语言将作为对代理用户的优先设置而保留。 用户的首选语言按以下优先级顺序确定:
- 用户明确设置的语言偏好,并将作为此用户的覆盖设置保留(最高优先级)。
- 用户发送的消息,其语言与代理支持的语言之一相匹配(
Activity.Locale)。 - 智能体的主语言(备用语言)。
若要在测试动态语言切换后清除持久化语言:
- 将
/debug clearstate发送给代理。 此命令清除用户状态中的语言覆盖。
对多语言代理进行故障排除
本节提供帮助你理解意外多语言代理行为的建议。
针对未配置的语言的多语言智能体行为
如果用户为其浏览器配置了未为代理配置的语言,代理会回退到其主要语言。
创建代理时,请指定代理的主要语言。 创建后无法更改主要语言,但如果有多个区域可用,则可以 更改 代理的主要语言的区域。
缺少翻译的多语言智能体行为
如果你用代理的主语言添加消息但没有上传新消息的 翻译 ,代理会显示未翻译的更改内容。 在对智能体进行更改后,应及时更新翻译,始终确保翻译为最新版本。
本地化文件不包括来自Adaptive Cards的混合类型字符串。 如果需要对Adaptive Cards进行本地化,而其中的文本字符串需要同时包含静态文本和变量(动态内容),那么必须使用解决方法。 了解如何在自适应卡片中使用之前将混合类型字符串存储在文本变量中。
发布多语言智能体时出错
尝试发布多语言代理时,可能会看到“机器人验证失败”错误消息,其中包含原始响应错误代码 SynonymsNotUnique。 此错误表示本地化文件包含重复的同义词或与值匹配的 DisplayName 同义词。 通常在节点包含 Entity.Definition.'closedListItem' ,并且出现以下任一情况时,会遇到此错误:
- 其中一个
Synonyms元素并不独特。 - 其中一个
Synonyms元素与该DisplayName元素具有相同的值。
同一实体的所有 Synonyms 元素必须是唯一的,并且与元素的名称 DisplayName 不同。
若要更正此错误,请查看辅助语言的 JSON 或 ResX 文件,并识别可能存在此条件的任何实例。