Skip to content

fix(knowledge): 修复合并表格分块的字段重复与上下文丢失 - #1140

Merged
xerrors merged 1 commit into
xerrors:mainfrom
xxbcisco:codex/fix-semantic-merged-tables
Nov 3, 2026
Merged

xerrors merged 1 commit into
xerrors:mainfrom
xxbcisco:codex/fix-semantic-merged-tables

Conversation

@xxbcisco

@xxbcisco xxbcisco commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

变更说明

HTML 表格含合并单元格时,semantic 会重复输出同一个“学历”字段,并把跨字段说明错误赋给学历、资历等字段;长度切分还可能拆散一行中的类别与条件。例如 colspan=3 的“学历:本科”会被输出三次。

本 PR 保留单元格身份,横向合并只输出一次,纵向类别随行继承;同一逻辑表头下的子条件合并,跨字段说明保留为独立正文。semantic 为每个完整数据行生成独立块,并保留同一 HTML 块中的其他表格、贴表正文和来源区间。

  • 任务类型:bug-fix。
  • 目标:修复已有 HTML 合并关系在转换、分块时被破坏的问题。非目标:推断 OCR 已丢失的内容、更换解析引擎或自动重建已有索引。
  • substantial:改变检索及模型可见内容,并接受“完整表格行允许超过长度目标”的取舍;决策与回归一并提交。

工程主张与 Owner

  • 合并字段只输出一次,纵向类别随行继承;跨字段说明不猜测字段归属。Owner:table_utils.py::html_table_to_key_value。
  • 每个表格行块保留完整条件、多表及周围正文。Owner:semantic.py::chunk_markdown。来源投影沿用原 HTML token 的行区间,不生成虚假的单元格行号。
  • 观察边界:转换返回的 KV 文本、公开分块入口及其来源投影的内容与行号;不涉及新的持久化提交点。
  • 决策记录。
  • 上游基线:main@7b752160;从本地修复 d84ff247 单独移植5个文件,无冲突。使用现有转换器和分块入口,不新增配置、依赖或兼容层。

验证情况

合并字段与行上下文完整

  • 失败面:colspan 展开造成重复;rowspan 类别在后续行缺失;子条件脱离逻辑表头。
  • 语义 Owner:html_table_to_key_value。
  • 直接证据:新增19项表格用例中的明确预期文本,覆盖合并表头、多层 thead、表体 th、caption、空表头及跨行类别。
  • 负向案例:在 pinned base 恢复旧实现,新增集合13项因目标缺陷失败、6项通过。
  • 结果:Passed。

跨字段说明不错误赋值

  • 失败面:跨越不同字段的说明被重复赋给多个字段;按文字去重又丢掉独立列的相同值。
  • 语义 Owner:html_table_to_key_value。
  • 直接证据:完整预期 KV 文本,分别验证跨字段说明、相同文字的独立列。
  • 负向案例:旧转换器的错误字段关系使对应回归失败;非法跨度和嵌套表格保留原 HTML。
  • 结果:Passed。

完整行、周围正文及来源保留

  • 失败面:长度目标拆散条件、只消费首张表、吞掉贴表正文、生成无来源数据行。
  • 语义 Owner:chunk_markdown 及现有来源投影。
  • 直接证据:38项相关集合通过,覆盖 token 目标1/5000、多表、贴表正文、来源行号及不支持结构的原文保留。
  • 负向案例:旧入口在相同用例中丢失多表/周围正文,或无法保持完整行块。
  • 结果:Passed。

本次在官方最新基线的独立 checkout 上验证;使用已有 API 依赖镜像、只读挂载源码、--network none,未加载业务数据或替换运行服务。容器中实际执行:

# backend 工作目录
python -m pytest test/unit/knowledge/chunking/test_semantic_tables.py test/unit/knowledge/chunking/test_semantic_chunking.py test/unit/plugins/test_chunk_source_lines.py -q -p no:cacheprovider
python -m pytest test/unit -m "not slow" -q -p no:cacheprovider

# 仓库根目录
python scripts/ci/verify_engineering_contracts.py
python -m unittest scripts.ci.test_verify_engineering_contracts
  • 相关集合:38 Passed,包含新增19项。
  • 全量后端 unit:3663 Passed、11 Skipped(跳过原因见下)。
  • 工程契约检查 Passed,verifier 单元测试56 Passed。
  • Ruff lint、format、import 检查 Passed(447个 Python 文件);变更文档相对链接、pnpm run build、git diff --check Passed。

简化 / 删除验收

不涉及。

独立语义 Review

全新上下文 Reviewer 按 Standards / Spec 审查原需求、职责归属、全部5文件 diff、方案与边界,并独立运行38项相关集合。审查发现的两处测试问题已修正:使用公开分块入口;多句超长行在恢复拆分的负控中准确失败。最终结论:Standards / Spec 均无待修问题。独立审查未重新执行真实原文探针或检索评估。

未验证范围与风险

  • Not run:重新解析/入库、检索召回率及外部 OCR 对照;本 PR 验证分块语义,不宣称召回率提升。
  • 11项部署配置测试因依赖镜像没有 Docker CLI 而跳过;未将这些跳过项计为部署契约通过。
  • 完整行块可能增加块数量,极长行可超过长度目标;上游已缺失或识别错的内容不在本阶段推断补齐。
  • 来源保持原 HTML token 区间;原表位于单行时,不能提供更细的单元格定位。

事故反馈

未达到高影响事故复盘门槛;稳定 reproducer 和负向回归已落在 owning unit 套件。

界面变更

不涉及。

关联事项

无。

补充说明

无配置、依赖或 Schema 迁移;已有文件重新分块后应用新规则,PR 不自动改写旧数据。测试使用合成表格,未提交用户 PDF、解析原文或本地运行数据。

将 d84ff247 的表格转换与 semantic 修复单独移植到官方 main@7b752160。
生产实现保持一致,横向合并只输出一次,纵向类别随行继承,
跨字段说明独立保留;每个完整表格行单独成块并保留来源与贴表正文。

投稿前增强原回归:从公开分块入口验证来源,使用多句条件证明
超长行保护能阻止实际拆分。恢复旧实现13项失败,恢复拆行负控1项失败。

验证:最终相关38项通过;全后端unit3663通过/11跳过(镜像无DockerCLI)。
工程契约及其56项单测、Ruff lint/format/import、文档构建、
相对链接和 diff --check 通过;全新独立Reviewer复核后无待修问题。
未重建业务索引或验证检索效果,不包含MinerU镜像、配置与用户原文。
Copilot AI balanced review requested due to automatic review settings November 3, 2026 01:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

@xxbcisco

xxbcisco commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

申报评审各等级技术职务任职资格.pdf
以上为测试文件

@xerrors
xerrors merged commit 102790c into xerrors:main Nov 3, 2026
20 checks passed
@xxbcisco
xxbcisco deleted the codex/fix-semantic-merged-tables branch November 4, 2026 06:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants