如何通过Azure文本拆分技能集保存分块的源页码?
解决Azure AI搜索PDF分块页码保存问题
核心方案
使用SplitSkill按页拆分PDF时,分块的源页码可通过配置技能输出、索引字段映射两步保存到索引元数据中,具体实现如下:
1. 调整SplitSkill配置,输出页码信息
修改你的SplitSkill,新增pageNumbers输出项,拆分后每个分块对应的原生页码会被同步生成:
{ "@odata.type": "#Microsoft.Skills.Text.SplitSkill", "name": "#2", "description": "Split skill to chunk documents", "context": "/document", "defaultLanguageCode": "en", "textSplitMode": "pages", "maximumPageLength": 2000, "pageOverlapLength": 500, "maximumPagesToTake": 0, "inputs": [ { "name": "text", "source": "/document/content" } ], "outputs": [ { "name": "textItems", "targetName": "pages" }, { "name": "pageNumbers", "targetName": "pageNumbers" } ] }
2. 在目标搜索索引中添加页码字段
确保你的vector索引包含一个存储页码的字段,示例定义如下:
{ "name": "source_page_number", "type": "Edm.Int32", "searchable": false, "filterable": true, "sortable": true, "facetable": false }
3. 修改索引投影映射,关联页码到索引字段
在indexProjections的映射规则中,添加页码字段的关联配置,这里提供两种可选方式:
- 方式一:使用SplitSkill输出的原生页码
利用pages与pageNumbers数组的一一对应关系,通过分块索引匹配页码:"indexProjections": { "selectors": [ { "targetIndexName": "vector", "parentKeyFieldName": "parent_id", "sourceContext": "/document/pages/*", "mappings": [ { "name": "chunk", "source": "/document/pages/*" }, { "name": "source_page_number", "source": "/document/pageNumbers[$index]" } ] } ] } - 方式二:使用分块的上下文索引(轻量替代)
若无需依赖原生页码输出,可直接用分块在数组中的位置(从0开始)加1作为页码:"indexProjections": { "selectors": [ { "targetIndexName": "vector", "parentKeyFieldName": "parent_id", "sourceContext": "/document/pages/*", "mappings": [ { "name": "chunk", "source": "/document/pages/*" }, { "name": "source_page_number", "source": "@odata.index + 1" } ] } ] }
4. 调整技能执行顺序(关键)
确保SplitSkill在AzureOpenAIEmbeddingSkill之前执行,因为嵌入技能依赖拆分后的分块数据,调整后的技能数组顺序如下:
"skills": [ { "@odata.type": "#Microsoft.Skills.Text.SplitSkill", // SplitSkill完整配置 }, { "@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill", // EmbeddingSkill完整配置 } ]
完成以上修改后,重新运行索引器,分块的源页码会被自动保存到source_page_number字段中,搜索时可直接过滤、返回该字段获取页码信息。
内容的提问来源于stack exchange,提问作者Trygve Leithe Svalheim
相关产品推荐
相关产品推荐

