Azure AI 搜索中的知识存储“投影”

投影定义知识存储中接受 Azure AI 搜索扩充管道中内容的物理表、对象和文件。 如果要创建知识存储,则定义和整形投影是大部分工作。

本文介绍了投影概念和工作流,以便你在开始编码之前获得一些背景知识。

投影在 Azure AI 搜索技能组中定义,但最终结果是 Azure 存储中的表投影、对象投影和映像文件投影。

Projections expressed in Azure Storage

投影类型和用法

知识存储是一种逻辑构造,其在 Azure 存储中以物理形式表示为表、JSON 对象或二进制映像文件的松散集合。

投影 存储 使用情况
Azure 表存储 用于适合表示为行和列的数据,或者可在每次需要数据的精细表示(例如,作为数据帧)时使用。 表投影使你可以定义架构化形状,使用整形程序技能或内联整形来指定列和行。 你可以根据熟悉的规范化原则将内容组织到多个表中。 同一组中的表会自动关联。
对象 Azure Blob 存储 当需要在一个 JSON 文档中获取数据的完整 JSON 表示和扩充时使用。 与表投影一样,只能将有效的 JSON 对象投影为对象,并且可借助整形实现此目的。
文件 Azure Blob 存储 需要保存规范化的二进制映像文件时使用。

投影定义

投影在技能组的“knowledgeStore”属性下指定。 投影定义在调用索引器期间使用,以使用扩充内容在 Azure 存储中创建并加载对象。 如果不熟悉这些概念,请首先大致了解 AI 扩充

以下示例说明了投影在 knowledgeStore 下的放置和基本构造。 名称、类型和内容源构成投影定义。

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
      {
        "tables": [
          { "tableName": "ks-museums-main", "generatedKeyName": "ID", "source": "/document/tableprojection" },
          { "tableName": "ks-museumEntities", "generatedKeyName": "ID","source": "/document/tableprojection/Entities/*" }
        ],
        "objects": [
          { "storageContainer": "ks-museums", "generatedKeyName": "ID", "source": "/document/objectprojection" }
        ],
        "files": [ ]
      }
    ]

投影组

投影是一组复杂的集合,这意味着每种类型可以指定多个组。 通常只使用一个投影组,但如果存储要求包括支持不同的工具和方案,则可以使用多个投影组。 例如,可以使用一个组来设计和调试技能组,而第二个组收集用于联机应用的输出,第三个组用于数据科学工作负载。

相同的技能组输出用于填充投影下的所有组。 以下示例显示了两个组。

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
        {
            "tables": [],
            "objects": [],
            "files": []
        }, 
        {
            "tables": [],
            "objects": [],
            "files": []
        }
    ]
}

投影组具有以下重要的互斥性和相关性特征。

原则 说明
互斥性 每个组完全独立于其他组,以支持不同的数据整理方案。 例如,如果要测试不同的表结构和组合,则可以将每个集放在不同的投影组中以进行 AB 测试。 每个组都从同一个源(扩充树)获取数据,同时完全独立于任何其他投影组的表对象文件组合。
相关性 在投影组中,表、对象和文件中的内容是相关的。 知识存储使用生成的键作为公共父节点的引用点。 例如,假设有一个文档包含图像和文本。 你可以将文本投影到表或对象,将映像投影到二进制文件,并且表和对象都将具有包含文件 URL 的列/属性。

投影源

source 参数是投影定义的第三个组成部分。 由于投影会存储来自 AI 扩充管道的数据,因此投影的源始终是技能的输出。 因此,输出可能是单个字段(例如,已翻译文本的字段),但通常是对数据形状的引用。

数据形状来自技能组。 在 Azure AI 搜索中提供的所有内置技能中,有一个称为整形程序技能的实用工具技能,用于创建数据形状。 可以包含尽可能多的整形程序技能,以支持知识存储中的预测。

形状经常与表投影一起使用,其中形状不仅指定哪些行将放入表中,还指定将创建哪些列(也可以将形状传递到对象投影)。

形状可能很复杂,本文不会深入讨论形状,但以下示例简要说明了一个基本形状。 整形程序技能的输出指定为表投影的源。 表投影本身中存在“metadata storage_path”、“reviews_text”和“reviews_title”等列,这些列是在形状中指定的。

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "ShaperForTables",
    "description": null,
    "context": "/document",
    "inputs": [
        {
            "name": "metadata_storage_path",
            "source": "/document/metadata_storage_path",
            "sourceContext": null,
            "inputs": []
        },
        {
          "name": "reviews_text",
          "source": "/document/reviews_text"
        }, 
        {
          "name": "reviews_title",
          "source": "/document/reviews_title"
        },
        {
          "name": "reviews_username",
          "source": "/document/reviews_username"
        },
    ],
    "outputs": [
      {
        "name": "output",
        "targetName": "mytableprojection"
      }
    ]
}

投影生命周期

投影具有一个与数据源中源数据绑定的生命周期。 更新源数据并重建其索引时,将使用扩充的结果更新投影,以确保投影最终与数据源中的数据保持一致。 不过,投影在 Azure 存储中也是独立存储的。 删除索引器或搜索服务本身时不会删除投影。

在应用中使用

在运行索引器后,连接到投影,并在其他应用和工作负载中使用数据。

  • 使用 Azure 门户验证 Azure 存储中的对象创建和内容。

  • 使用 Power BI 进行数据研究。 如果数据位于 Azure 表存储中,则此工具非常适用。 在 Power BI 中,可以将数据处理为更易于查询和分析的新表中。

  • 在数据科学管道中使用 blob 容器中的扩充数据。 例如,可以将 blob 中的数据加载到 Pandas 数据帧

  • 最后,如果需要从知识存储导出数据,可以使用 Azure 数据工厂提供的连接器来导出数据,然后将其载入所选的数据库。

入门清单

回想一下,投影专用于知识存储,不用于构建搜索索引。

  1. 在 Azure 存储中,获取访问密钥中的连接字符串,并验证该帐户是否为 StorageV2(常规用途 V2)。

  2. 在 Azure 存储中,熟悉容器和表中的现有内容,以便为投影选择不冲突的名称。 知识存储是表和容器的松散集合。 考虑采用命名约定来跟踪相关对象。

  3. 在 Azure AI 搜索中,在索引器中启用扩充缓存(预览版),然后运行索引器以执行技能组并填充缓存。 这是一项预览功能,请务必对索引器请求使用预览版 REST API(API 版本为 2020-06-30-preview 或更高版本)。 填充缓存后,只要技能本身未修改,就可以在不收费的知识存储中修改投影定义。

  4. 在代码中,所有投影仅在技能组中定义。 没有适用于投影的索引器属性(例如字段映射或输出字段映射)。 在技能组定义中,你将重点放在两个方面:knowledgeStore 属性和技能数组。

    1. 在 knowledgeStore 下,在 projections 节中指定表投影、对象投影、文件投影。 对象类型、对象名和数量(按你定义的投影数量)在此节中确定。

    2. 根据技能数组,确定应在每个投影的 source 中引用的技能输出。 所有投影都具有源。 源可以是上游技能的输出,但通常是整形程序技能的输出。 投影的组成是通过形状确定的。

  5. 如果要向现有技能组添加投影,请更新技能组运行索引器

  6. 在 Azure 存储中检查结果。 在后续运行中,通过删除 Azure 存储中的对象或更改技能组中的项目名来避免命名冲突。

  7. 如果使用表投影,请检查了解表服务数据模型以及表存储可伸缩性和性能目标,以确保数据要求在表存储记录的限制范围内。

后续步骤

查看每种投影类型的语法和示例。