如何从使用Split Skillset的Azure AI Search索引获取正确页码?
解决Azure AI Search拆分块页码与原文档不符的问题
问题根源
你遇到的chunk_id页码和原文档实际页码不符的情况,是因为Split Skillset的text_split_mode="pages"并不是按原文档物理页码计数,而是按拆分后的逻辑文本块计数。如果原文档某一页的内容长度超过maximum_page_length=2048,该页会被拆分成多个逻辑块,导致逻辑块的页码计数(比如26)远大于实际物理页码(比如21)。
解决方案
要获取并存储原文档的真实物理页码,需要结合Document Extraction Skill提取原生页码元数据,再将其关联到拆分后的每个块中,具体步骤如下:
1. 添加Document Extraction Skill提取物理页码
在现有技能集中添加该技能,用于从PDF等结构化文档中提取原生物理页码信息。配置示例:
{ "@odata.type": "#Microsoft.Skills.Util.DocumentExtractionSkill", "name": "extract-physical-pages", "description": "Extract physical page numbers from source document", "context": "/document", "inputs": [ { "name": "file_data", "source": "/document/file_data" } ], "outputs": [ { "name": "page_numbers", "targetName": "physical_page_numbers" } ], "configuration": { "extractPageNumbers": true, "mode": "default" } }
该技能会在/document/physical_page_numbers中生成原文档每一页的页码列表,以及对应文本的位置映射。
2. 关联物理页码与拆分后的块
Split Skill拆分后,每个块会包含offset(在原文档中的字符偏移量),可以通过以下方式匹配对应的物理页码:
- 借助
Conditional Skill结合偏移量范围,从physical_page_numbers的位置映射中匹配页码; - 使用自定义Web技能,根据块的
offset和length,精准定位对应的物理页码,这种方式灵活性更高。
3. 更新索引与技能输出映射
- 在现有索引中添加
physical_page_number字段(类型选Edm.Int32,若需存储跨页范围则选Edm.String); - 在技能集的输出字段映射中,将匹配到的物理页码关联到索引的
physical_page_number字段,或者直接追加到chunk字段末尾(例如格式化为"{chunk} [页码: {physical_page_number}]")。
4. 处理跨页逻辑块
如果某个逻辑块跨越了原文档的多个物理页,可在自定义技能中返回页码范围(比如21-22),或取起始页码作为该块的关联页码,根据业务需求调整。
替代方案:自定义前置拆分逻辑
如果内置技能无法满足需求,可直接在数据导入阶段(比如用Azure Function)先按原文档物理页码拆分文本,再将拆分后的块上传到Azure AI Search,同时手动添加物理页码字段,完全规避Split Skill的逻辑计数问题。
内容的提问来源于stack exchange,提问作者Hakuna0001
相关产品推荐
相关产品推荐

