将多个类别添加到 FAQ 机器人
在本教程中,你将了解如何执行以下操作:
- 创建项目,将问答对标记到包含元数据的不同类别中
- 为每个域创建一个单独的项目
- 为每个域创建一个单独的语言资源
构建 FAQ 机器人时,可能会遇到需要跨多个域处理查询的用例。 假设 Microsoft 的营销团队想要构建一个客户支持机器人,该机器人可以回答用户针对多个 Surface 产品的常见查询。 为了简单起见,我们将使用 Surface 触控笔和 Surface Earbuds 这两个 FAQ URL 创建项目。
使用特定于域的元数据创建项目
内容作者可使用文档提取问答对,或将自定义问答对添加到项目。 为了将这些问答分组到特定的域或类别中,可以添加元数据。
对于 Surface 产品上的机器人,可以按照以下步骤创建一个机器人来回答关于这两种产品类型的查询:
添加以下 FAQ URL 作为源,选择“添加源”>“URL”>“添加所有”(只要你已添加了以下每个 URL 即可):
在此项目中,我们有两个产品问答对,我们希望区分它们,这样可以在给定产品的问答中搜索答案。 为此,可以更新问答对的元数据字段。
如以下示例所示,我们添加了一个元数据,其中 product 作为键,surface_pen 或 surface_earbuds 作为值(如果适用) 。 可以扩展此示例,以提取多个产品的数据,并为每个产品添加不同的值。
现在,为了限制系统搜索特定产品的响应,需要在自定义问题解答 REST API 中将该产品作为筛选器传递。
可以从“部署项目”窗格中检索 REST API 预测 URL:
在 API 调用的 JSON 正文中,我们已将 surface_pen 作为元数据“product”的值传递 。 因此,系统将只查找具有相同元数据的 QnA 对中的响应。
{ "question": "What is the price?", "top": 3 }, "answerSpanRequest": { "enable": true, "confidenceScoreThreshold": 0.3, "topAnswersWithSpan": 1 }, "filters": { "metadataFilter": { "metadata": [ { "key": "product", "value": "surface_pen" } ] } }
可按照以下方式根据用户输入获取元数据值:
通过机器人客户端将域明确用作用户的输入。 如以下实例所示,发起对话时,可以将产品类别作为用户输入。
基于机器人上下文隐式识别域。 例如,如果上一个问题与特定的 Surface 产品有关,则客户端可以将其保存为上下文。 如果用户未在下一个查询中指定产品,则可以将机器人上下文作为元数据传递给生成答案 API。
从用户查询中提取实体,以识别用于元数据筛选的域。 可以使用其他 Azure AI 服务,例如命名实体识别 (NER) 和对话语言理解进行实体提取。
项目可以有多大?
可以将最多 50000 个问答对添加到一个项目。 如果数据超过 50,000 个问答对,则应考虑拆分项目。
为每个域创建一个单独的项目
还可以为每个域创建一个单独的项目,并分别维护这些项目。 所有 API 都要求用户传递项目名称,以便对项目进行任何更新或提取用户问题的答案。
服务接收到用户问题时,你需要传递所示的 REST API 终结点中的 projectName
,以便从相关项目提取响应。 可以在“部署项目”页的“获取预测 URL”下查找 URL:
https://chinaeast2.api.cognitive.azure.cn/language/:query-knowledgebases?projectName=Test-Project-English&api-version=2021-10-01&deploymentName=production
为每个域创建一个单独的语言资源
假设 Microsoft 的营销团队想要构建一个客户支持机器人,该机器人可以回答用户针对 Surface 和 Xbox 产品的常见查询。 他们计划安排不同的团队访问 Surface 和 Xbox 上的项目。 在这种情况下,建议创建两个自定义问题解答资源:一个用于 Surface,另一个用于 Xbox。 但可以为访问相同资源的用户定义不同的角色。