跳转至

章节正文与配图需求标签兼容清单

当前 test 仅识别 ASCII 协议标签:<正文>、</正文>、<配图需求>、</配图需求>。最终提取和流式提取共用 app/utils/section_output_parser.py,不修改 Prompt、正文内容或 JSON 字段校验。

支持范围

情况 处理
四个标准标签,含标签内部空白 正常提取;支持标签跨流分片
独立行缺少左括号,如 正文>、/配图需求> 识别为对应标签;行内同名普通文字不匹配
独立行开始标签缺少右括号,如 <正文、<配图需求 以行结束确认边界
结束标签缺少右括号,如 </正文、</配图需求 可紧贴正文或 JSON,须到行结束、区块边界或响应结束再确认
结束标签名称只保留前缀,如 </正、</配、</配图、</配图需,可带 > 与缺少右括号使用相同边界判断;至少保留名称第一个字
整个正文结束标签缺失 后续配图开始标签提供明确边界,或仅在 finish_reason=stop 时恢复到 EOF
正文末尾误用开始标签,即 <正文>…<正文> 恰好两个开始标签且第二个在区块末尾,并有配图边界或 finish_reason=stop 才接受
配图结束标签缺失或不完整,或末尾误用开始标签 提取候选 JSON,仍须完整 JSON 解析和既有字段校验通过
无正文标签 保留纯正文兼容;配图开始之后的内容不作为正文
没有配图标签 配图需求返回 None

没有后续配图边界时,缺失或不完整的正文结束标签必须有 finish_reason=stop 才恢复;length、未知结束原因、过滤及错误均保留失败。完整正文结束标签已经存在时,维持原有提取行为。

开始标签名称只剩一部分、裸 < / </、两侧括号都缺少、自闭合标签、同义名称、错误顺序、多个正文块等,不做猜测补全。半截标签后若继续出现普通文字,如 </正文说明,保留该文字,不当成结束标签。块边界的判断不以单个流分片结束为准。

移除的扩展

移除全角/中文括号、书名号、方括号、HTML 实体、繁体名称、反斜杠和 Unicode 斜杠、单标签 Markdown 包装的兼容规则。它们不再是替代分区标记,例如正文中的 【正文】、【配图需求】 和 &lt;正文&gt; 均保持原样。

保留已有的完整正文/JSON 外层代码围栏剥离;本次不扩展围栏与缺失标签的额外组合。

失败与验证

配图 JSON 内容不完整、字段缺失、重复 query_id 或 querys 数量错误时,继续由 service 记录 warning 并保留正文,不修补业务数据。ASCII 协议标签仍是保留标记,直接引用这些标签作为内容存在歧义。

回归用例位于 tests/test_section_output_parser.py,遍历支持的标签变体、所有切分位置和逐字符输入;同时覆盖半截标签、紧贴正文/JSON 的结束标签、截断拒绝及非协议文字原样保留。正常正文经真实解析器进入 SSE 和保存调用的 mock 用例保留在 tests/test_section_service_full_code_paths.py。

历史生产诊断见 docs/section_output_prod_audit_2026-09-16.md,其中旧版宽泛变体覆盖数和解析器哈希属于当时快照,不代表本次瘦身后的验证结果。

本次瘦身验证(2026-09-16)

  • 定向回归:make test PYTEST_ARGS='tests/test_section_output_parser.py tests/test_section_service_full_code_paths.py tests/test_generation_code_paths.py -q',49 passed、12299 subtests passed;不是全仓测试。
  • 北京时间 13:22:36,在生产只读事务中读取全部留存的 919 条正文标签错误,在一次性进程内存中模拟候选解析器,原文未导出,部署文件和生产数据未修改。
  • 139 条正常结束但缺闭合标签、520 条末尾误用开始标签,659 条全部恢复,且与独立截取的正文逐字一致;整段、17 字符、257 字符、标签逐字拆分四种方式均一致(流式比较忽略首尾空白)。
  • 259 条 length、1 条结束原因未知仍然拒绝;200 条最新成功样本的最终正文与旧标准解析一致,流式模拟一致。
  • 候选解析器 SHA-256:2d4304fe8977b296ca0ec289865b1f84a5d8c814f7e8ff7c174823939e80c0bc。本次验证没有调用真实 LLM 或发布代码;配图半截标签由本地合成用例覆盖。