为要投影到知识存储中的数据整形
在 Azure AI 搜索中,“整理数据”描述了知识存储工作流中的一个步骤,该步骤可用于创建要投影到 Azure 存储中表、对象及文件的内容的数据表示形式。
在执行技能时,输出将被写入节点层次结构中的扩充树,此时你可能想完整地查看并使用该扩充树,而更有可能的情况是,你需要更精细的粒度,为不同方案创建节点子集,如在特定表中放置与已翻译文本或已提取实体相关的节点。
就其本身而言,扩充树不包含对其内容在知识存储中的表示形式予以通知的逻辑。 数据形状将通过提供每个表、对象及文件投影中的内容的架构,来填补这一空白。 可以将数据形状视为扩充数据的自定义定义或视图。 你可根据需要创建多个形状,然后将形状分配给知识存储定义中的投影。
用于创建形状的方法
可以通过以下两种方式创建扩充内容的形状,以使其可以投影到知识存储中:
使用整形程序技能在扩充树中创建专门用于投影的节点。 大多数技能都会创建新内容。 而整形程序技能却相反,它通常会使用现有节点,将多个节点合并为单个复杂对象。 当你希望多个节点的输出以物理形式表现为表中的列时,这就非常有用。
使用投影定义本身中的内联形状。
使用整形程序技能将形状外部化,以使其可以被多个投影甚至其他技能使用。 它还可以确保扩充树的所有突变都包含在该项技能中,且输出也是可重用的对象。 相反,内联整形可让你创建所需的形状,但它是一个匿名对象,仅适用于定义它时所针对的投影。
这些方法可以结合使用,也可以单独使用。 本文将介绍这两种方法:用于表投影的整形程序技能,以及带关键短语表投影的内联整形。
使用整形程序技能
整形程序技能通常位于技能组的末尾,可创建要传给投影的数据视图。 本示例将创建一个名为“tableprojection”的形状,其中包含以下节点:“reviews_text”、“reviews_title”、“AzureSearch_DocumentKey”以及分页审阅中的情绪评分和关键短语。
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"name": "#5",
"description": null,
"context": "/document",
"inputs": [
{
"name": "reviews_text",
"source": "/document/reviews_text",
"sourceContext": null,
"inputs": []
},
{
"name": "reviews_title",
"source": "/document/reviews_title",
"sourceContext": null,
"inputs": []
},
{
"name": "AzureSearch_DocumentKey",
"source": "/document/AzureSearch_DocumentKey",
"sourceContext": null,
"inputs": []
},
{
"name": "pages",
"source": null,
"sourceContext": "/document/reviews_text/pages/*",
"inputs": [
{
"name": "Sentiment",
"source": "/document/reviews_text/pages/*/Sentiment",
"sourceContext": null,
"inputs": []
},
{
"name": "LanguageCode",
"source": "/document/Language",
"sourceContext": null,
"inputs": []
},
{
"name": "Page",
"source": "/document/reviews_text/pages/*",
"sourceContext": null,
"inputs": []
},
{
"name": "keyphrase",
"sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
"inputs": [
{
"source": "/document/reviews_text/pages/*/Keyphrases/*",
"name": "Keyphrases"
}
]
}
]
}
],
"outputs": [
{
"name": "output",
"targetName": "tableprojection"
}
]
}
SourceContext 属性
整形程序技能中的输入可以拥有一项 sourceContext
元素。 此属性还可用于投影中的内联形状。
sourceContext
用于在扩充管道中构造多层嵌套对象。 如果输入所在的上下文与技能上下文不同,则使用 sourceContext。 sourceContext 要求使用寻址为源的特定元素定义嵌套的输入。
在上面的示例中,情绪分析与关键短语的提取均在拆分为数页的文本上进行,以便进行更高效的分析。 假设你想要将分数和短语投影到表中,那么现在就需要将上下文设置为提供分数及短语的嵌套输入。
将形状投影到多个表中
通过上述 outputs
部分中定义的节点 tableprojection
,可以将 tableprojection
节点的各个部分切分为单个的相关表:
"projections": [
{
"tables": [
{
"tableName": "hotelReviewsDocument",
"generatedKeyName": "Documentid",
"source": "/document/tableprojection"
},
{
"tableName": "hotelReviewsPages",
"generatedKeyName": "Pagesid",
"source": "/document/tableprojection/pages/*"
},
{
"tableName": "hotelReviewsKeyPhrases",
"generatedKeyName": "KeyPhrasesid",
"source": "/document/tableprojection/pages/*/keyphrase/*"
}
]
}
]
表投影的内联形状
内联整形是在投影定义本身内创建新形状的功能。 内联整形具备以下特征:
- 创建的形状只能由包含该形状的投影使用。
- 创建的形状可与整形程序技能生成的形状相同。
内联形状是使用 sourceContext
和 inputs
创建的。
属性 | 说明 |
---|---|
sourceContext | 设置投影的根。 |
inputs | 每项输入都是表中的一列。 Name 为列名称。 Source 为提供数值的扩充节点。 |
若要投影与上一个示例相同的数据,可使用如下所示的内联投影选项:
"projections": [
{
"tables": [
{
"tableName": "hotelReviewsInlineDocument",
"generatedKeyName": "Documentid",
"sourceContext": "/document",
"inputs": [
{
"name": "reviews_text",
"source": "/document/reviews_text"
},
{
"name": "reviews_title",
"source": "/document/reviews_title"
},
{
"name": "AzureSearch_DocumentKey",
"source": "/document/AzureSearch_DocumentKey"
}
]
},
{
"tableName": "hotelReviewsInlinePages",
"generatedKeyName": "Pagesid",
"sourceContext": "/document/reviews_text/pages/*",
"inputs": [
{
"name": "Sentiment",
"source": "/document/reviews_text/pages/*/Sentiment"
},
{
"name": "LanguageCode",
"source": "/document/Language"
},
{
"name": "Page",
"source": "/document/reviews_text/pages/*"
}
]
},
{
"tableName": "hotelReviewsInlineKeyPhrases",
"generatedKeyName": "KeyPhraseId",
"sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
"inputs": [
{
"name": "Keyphrases",
"source": "/document/reviews_text/pages/*/Keyphrases/*"
}
]
}
]
}
]
使用这两种方法后,可以观察如何使用“sourceContext”来投影“Keyphrases”的值。 包含字符串集合的“Keyphrases”节点本身是页文本的子级。 但是,由于投影需要 JSON 对象并且页是基元(字符串),因此使用了“sourceContext”将关键短语包装成具有命名属性的对象。 使用此技术可以单独投影平整基元。
对象投影的内联形状
可以使用整形器技能或使用对象投影的内联整形来生成新形状。 表示例演示的是创建形状和切片的方法,而本示例演示的是内联整形的用法。
内联整形是指在投影输入的定义中创建新形状的功能。 内联整形创建一个匿名对象,该对象与整形器技能生成的对象相同(在本例中为 projectionShape
)。 定义一个你不打算重复使用的形状时,内联整形非常有用。
投影属性是一个数组。 此示例将一个新的投影实例添加到数组,其中的 knowledgeStore 定义包含内联投影。 使用内联投影时,可以省略整形器技能。
"knowledgeStore" : {
"storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
"projections": [
{
"tables": [ ],
"objects": [
{
"storageContainer": "sampleobject",
"source": null,
"generatedKeyName": "myobject",
"sourceContext": "/document",
"inputs": [
{
"name": "metadata_storage_name",
"source": "/document/metadata_storage_name"
},
{
"name": "metadata_storage_path",
"source": "/document/metadata_storage_path"
},
{
"name": "content",
"source": "/document/content"
},
{
"name": "keyPhrases",
"source": "/document/merged_content/keyphrases/*"
},
{
"name": "entities",
"source": "/document/merged_content/entities/*/name"
},
{
"name": "ocrText",
"source": "/document/normalized_images/*/text"
},
{
"name": "ocrLayoutText",
"source": "/document/normalized_images/*/layoutText"
}
]
}
],
"files": []
}
]
}
后续步骤
本文介绍了投影形状的概念和原则。 接下来,请参阅如何在表、对象和文件投影模式下应用这些内容。