整形程序认知技能
Shaper 技能用于重塑或修改由技能组创建的内存中扩充树的结构。 如果技能输出无法直接映射到搜索字段,可以添加 Shaper 技能来创建搜索索引或知识存储所需的数据形状。
此技能的主要用例包括:
你要填充知识存储。 知识存储的表和对象的物理结构通过投影定义。 Shaper 技能通过创建可推送到投影的数据形状来增加粒度。
技能会生成多个输出,但你希望组合成一个字段(不必是复杂类型),如场景 2 中所述。 例如,将标题和作者合并到单个字段中。
技能会使用子元素生成多个输出,并且你想要将它们组合在一起。 此用例在场景 3 中进行了说明。
Shaper 技能的输出名称始终为“输出”。 管道可在内部映射不同的名称,例如下图所示的“analyzedText”,但“整形程序”技能本身会在响应中返回“output”。 如果正在调试大量文档并发现存在命名差异,或者要生成自定义技能并自行构建响应,这一点非常重要。
注意
此技能不会绑定到 Azure AI 服务。 它不可计费,并且没有 Azure AI 服务密钥要求。
@odata.type
Microsoft.Skills.Util.ShaperSkill
方案 1:复杂类型
请思考这样一种情况:想要创建名为 analyzedText 的结构,该结构具有两个成员:分别为 text 和 sentiment 。 在索引中,可搜索的多部分字段称为“复杂类型”,它通常是当源数据具有映射到它的相应复杂结构时创建的。
但是,创建复杂类型的另一种方法是通过“整形程序”技能。 通过在技能集中包含此技能,在技能集处理期间执行的内存中操作可以输出采用嵌套结构的数据形状,而此形状随后可映射到索引中的复杂类型。
以下示例技能定义提供成员名称作为输入。
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"context": "/document/content/phrases/*",
"inputs": [
{
"name": "text",
"source": "/document/content/phrases/*"
},
{
"name": "sentiment",
"source": "/document/content/phrases/*/sentiment"
}
],
"outputs": [
{
"name": "output",
"targetName": "analyzedText"
}
]
}
示例索引
技能集由索引器调用,索引器需要索引。 索引中的复杂字段表示形式可能如以下示例所示。
"name":"my-index",
"fields":[
{ "name":"myId", "type":"Edm.String", "key":true, "filterable":true },
{ "name":"analyzedText", "type":"Edm.ComplexType",
"fields":[
{
"name":"text",
"type":"Edm.String",
"facetable":false,
"filterable":false,
"searchable":true,
"sortable":false },
{
"name":"sentiment",
"type":"Edm.Double",
"facetable":true,
"filterable":true,
"searchable":true,
"sortable":true }
}
技能输入
为此“整形程序”技能提供可用输入的传入 JSON 文档可能如下所示:
{
"values": [
{
"recordId": "1",
"data": {
"text": "this movie is awesome",
"sentiment": 0.9
}
}
]
}
技能输出
整形程序技能使用 text 和 sentiment 组合元素生成一个名为 analyzedText 的新元素。 此输出符合索引架构。 它将在 Azure AI 搜索索引中导入和编制索引。
{
"values": [
{
"recordId": "1",
"data":
{
"analyzedText":
{
"text": "this movie is awesome" ,
"sentiment": 0.9
}
}
}
]
}
方案 2:输入整合
在另一个示例中,假设处于管道处理的不同阶段,已提取书名以及该书不同页面上的章节标题。 现在可创建由这些不同输出组成的单个结构。
此方案的“整形程序”技能定义可能如以下示例所示:
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"context": "/document",
"inputs": [
{
"name": "title",
"source": "/document/content/title"
},
{
"name": "chapterTitles",
"source": "/document/content/pages/*/chapterTitles/*/title"
}
],
"outputs": [
{
"name": "output",
"targetName": "titlesAndChapters"
}
]
}
技能输出
在本例中,“整形程序”平整所有章节标题,以创建单个数组。
{
"values": [
{
"recordId": "1",
"data": {
"titlesAndChapters": {
"title": "How to be happy",
"chapterTitles": [
"Start young",
"Laugh often",
"Eat, sleep and exercise"
]
}
}
}
]
}
方案 3:从嵌套的上下文进行输入整合
假设你有某本书籍的章节标题和章节号,并已针对内容中的关键短语运行实体识别,现在需要将不同技能的结果聚合成包含章节名称、实体和关键短语的单个形状。
本示例向“chapterTitles”输入添加可选 sourceContext
属性。 source
和 sourceContext
属性是互斥的。 如果输入位于技能上下文中,则可使用 source
。 如果输入所在的上下文与技能上下文不同,则使用 sourceContext
。 sourceContext
需要你定义一个嵌套输入,其中每个输入都有一个 source
,以标识用于填充命名节点的特定元素。
此方案的“整形程序”技能定义可能如以下示例所示:
{
"@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
"context": "/document",
"inputs": [
{
"name": "title",
"source": "/document/content/title"
},
{
"name": "chapterTitles",
"sourceContext": "/document/content/pages/*/chapterTitles/*",
"inputs": [
{
"name": "title",
"source": "/document/content/pages/*/chapterTitles/*/title"
},
{
"name": "number",
"source": "/document/content/pages/*/chapterTitles/*/number"
}
]
}
],
"outputs": [
{
"name": "output",
"targetName": "titlesAndChapters"
}
]
}
技能输出
在本例中,“整形程序”会创建一个复杂类型。 此结构存在于内存中。 若要将其保存到知识存储,应在技能组中创建一个用于定义存储特征的投影。
{
"values": [
{
"recordId": "1",
"data": {
"titlesAndChapters": {
"title": "How to be happy",
"chapterTitles": [
{ "title": "Start young", "number": 1},
{ "title": "Laugh often", "number": 2},
{ "title": "Eat, sleep and exercise", "number: 3}
]
}
}
}
]
}