revert(substance_gate): 回退输出端正则门禁(2026-09-16用户纠偏'到处加检查标准方法不对')——打地鼠式正则(【待填】→【待人工确认】→【定稿环节以…】永远漏)违反语义判断铁律(LLM裁决非词匹配)+堆门禁不治根因。根因=写者输入端缺'真标书长什么样'约束,修复转技能层(禁元内容/禁自造占位/逐标的实质响应)+reviewer/scorer的LLM实质性判断第一判据。docx表格转换修复保留(独立真bug)

This commit is contained in:
ymq 2026-09-16 16:58:06 +08:00
parent d59f5c43a7
commit 9e9886a6f1

View File

@ -1,150 +0,0 @@
"""pipeline_service.substance_gate — 标书「实质性响应」硬门禁2026-09-16 用户报障根治)。
用户原话级问题目前产出的投标书像是编写指南而不是标书本身标书质量太低
检核还得了满分这本身就是问题
实测根因甘肃交通项目 bid_v1写者交付的正文是**编写指南体**
- 1.1 投标函开头编制依据与响应说明按封面原样抄录见第六节人工填写清单
17 待填-投标总价待填-投标人名称自查表人工填写清单
- 2.2.2 实施方案开头按第三章格式编制完整覆盖评分标准四个子项①②③④
这些是教人怎么写标书的元内容meta-content不是投标文件正文本身
review_chapter / finalize_bid_score 只查篇幅+伪图+得分率**没有任何这是不是
标书正文的门禁**评分器LLM写作层是否提到评分子维度打分指南体表面
把每个子维度都提到 满分放行 评分报告自己列了无效标却给 100/100
判定是**确定性的**质量闸门不靠 LLM 自觉对齐 diagram_gate 的分层原则
- 元内容标题## 编制说明/编制依据/填写口径/自查表/人工填写清单/…)→ 强信号
- 元内容句格式编制完整覆盖子项见第X节清单提示性括注 中信号
- 非规范待填占位待填-xxx/待填区别于合法的材料待补xxx 强信号
综合打分超阈值 判为指南体/未实质填写机制层拒绝
豁免边界避免误伤真实标书
- 材料待补xxx是合法占位符规范实体材料缺失不计入待填违规
- 签字栏下划线___日期 是真实标书正常留白不计入
- 阈值适中主体合格仅开头一段啰嗦的章节 2.2.2不触发整章拒绝
通篇待填+编制说明的空壳 1.1必触发
消费方
- pipeline-bidding bid_write_capability.write_chapter写入时拦指南体
- pipeline-bidding bid_review_capability.review_chapter评审兜底
- pipeline-bidding bid_score_capability.finalize_bid_score整书放行前硬门禁
"""
import re
# 合法占位符实体材料缺失2026-09-16 占位符规范)——不计入待填违规
_LEGIT_PLACEHOLDER_RE = re.compile(r"【材料待补[:]")
# 元内容标题:## 编制说明 / 编制依据 / 填写口径 / 自查表 / 人工填写清单 / …
_META_HEADING_RE = re.compile(
r"^#{1,6}\s*[^#\n]*?"
r"(编制说明|编制依据|编制要求|编制口径|编制环节|编写说明|编写依据|编写要求|"
r"填写口径|填写说明|填报口径|填报说明|填报要求|"
r"自查表|自检表|核对表|人工填写清单|待人工签章清单|待签章清单|"
r"应答口径|认定口径|落稿|回填规则|页码回填|响应说明|编制与.{0,6}说明)",
re.M)
# 元内容句:正文里「讲怎么写」而非「写内容」的句子
_META_SENTENCE_PATTERNS = (
r"按[^。\n]{0,30}格式编制",
r"按[^。\n]{0,30}(规定|要求)填报",
r"本(?:章|节|部分|表)[^。\n]{0,15}按[^。\n]{0,25}编制",
r"完整覆盖[^。\n]{0,20}(?:子项|维度|评分|要求)",
r"逐(?:项|条|字)(?:照录|抄录|填报)[^。\n]{0,15}(?:原文|格式|栏目)",
r"见[^。\n]{0,12}《[^》\n]{0,20}(?:清单|说明|表)》",
r"(?:提示性|操作性)[^。\n]{0,8}括注",
r"不占用[^。\n]{0,10}栏目",
r"一律置于[^。\n]{0,12}第[^。\n]{0,4}节",
r"(?:未|不得|禁止)(?:删改|增设|改变)[^。\n]{0,10}栏目",
r"原样(?:抄录|填报|照录)",
r"本(?:清单|表|节)[^。\n]{0,10}(?:集中|统一)(?:标注|管理|列明)",
)
_META_SENTENCE_RE = re.compile("|".join("(?:%s)" % p for p in _META_SENTENCE_PATTERNS))
# 非规范待填占位:【待填-xxx】/[待填]/(待填)/ 待填写。区别于合法的【材料待补:】
_FILL_PLACEHOLDER_RE = re.compile(
r"[【\[(]\s*待填[^\]】))\n]{0,40}[\]】))]" # 【待填-投标总价】
r"|待填[写补]?\s*[-—:]" # 待填-xxx / 待填写:
r"|[【\[(]\s*待(?:补(?![:])|定|确认)[^\]】))\n]{0,30}[\]】))]" # 【待定】【待确认】(非材料待补)
)
# 阈值:综合分 >= 此值判为指南体/未实质填写
# 元内容标题 +2 / 元内容句 +1 / 待填占位 +1
GUIDE_SCORE_THRESHOLD = 4
def analyze_substance(text):
"""分析正文实质性。返回结构化结果(不抛异常)。
分层判定2026-09-16 走查校正阈值4曾误伤2.2.1/2.2.2等有实质内容仅带前言的章
- 待填占位待填-xxx= 无歧义表单没填铁证 强信号权重高
- 元内容标题/ = 讲怎么写 弱信号真实标书也常带编制依据前言
单独不足以判指南体需与待填或高密度叠加
is_guide硬门禁拒绝只在高精度组合下成立避免误伤有实质内容的章节
{
'is_guide': bool, # 硬门禁:判为指南体/未实质填写(机制拒绝)
'score': int, # 综合违规分(软信号,喂评分器)
'meta_density': float, # 元内容密度(每千字违规命中数)
'meta_headings': [str],
'meta_sentences': [str],
'fill_placeholders': [str],
}
"""
text = text or ""
headings = [m.group(0).strip()[:60] for m in _META_HEADING_RE.finditer(text)]
sentences = [m.group(0).strip()[:50] for m in _META_SENTENCE_RE.finditer(text)]
# 待填占位:排除合法【材料待补:】——先挖掉合法占位再统计
scrubbed = _LEGIT_PLACEHOLDER_RE.sub("", text)
fills = [m.group(0).strip()[:40] for m in _FILL_PLACEHOLDER_RE.finditer(scrubbed)]
n_h, n_s, n_f = len(headings), len(sentences), len(fills)
score = n_h * 2 + n_s + n_f
kchars = max(1.0, len(text) / 1000.0)
meta_density = round((n_h + n_s) / kchars, 2)
# 硬门禁(高精度,宁缺毋滥——误伤真实内容会逼无谓重写):
# ① 待填占位 >= 2表单大面积没填1.1=17、2.1.4=31 铁证);或
# ② 综合分 >= 15元内容压倒性通篇讲怎么写
# ③ 元内容标题 >= 3 且 待填 >= 1既是指南框架又没填实。
is_guide = (n_f >= 2) or (score >= 15) or (n_h >= 3 and n_f >= 1)
return {
"is_guide": is_guide,
"score": score,
"meta_density": meta_density,
"meta_headings": headings,
"meta_sentences": sentences,
"fill_placeholders": fills,
}
def find_substance_problems(text):
"""返回问题描述列表(空 = 通过)。供门禁调用方判定 + 拼提示。"""
a = analyze_substance(text)
if not a["is_guide"]:
return []
problems = []
if a["meta_headings"]:
problems.append("元内容标题 %d 处:%s"
% (len(a["meta_headings"]), "".join(a["meta_headings"][:5])))
if a["meta_sentences"]:
problems.append("编写说明句 %d 处:%s"
% (len(a["meta_sentences"]), "".join(a["meta_sentences"][:5])))
if a["fill_placeholders"]:
problems.append("非规范待填占位 %d 处:%s"
% (len(a["fill_placeholders"]), "".join(a["fill_placeholders"][:8])))
return problems
def gate_message(problems, scene="标书章节"):
"""门禁拒绝提示(带改法,对齐 diagram_gate.gate_message 风格)。"""
return ("FAIL: %s 是「编写指南/作业指导书」不是投标文件正文本身2026-09-16 硬门禁)。\n"
"检出问题:%s\n"
"改法:① 删除所有「编制说明/编制依据/填写口径/自查表/人工填写清单/应答口径」"
"等讲『怎么写』的元内容段落——正文只写『写什么』;"
"② 投标函/承诺函/报价表等按招标格式**直接填真实内容**(投标人名称、报价、"
"日期等能从项目/知识库取到的就填实,取不到的实体材料用规范占位符"
"【材料待补:具体材料名】,禁止用【待填-xxx】这类自造占位"
"③ 技术方案/实施方案写实质措施(架构/流程/指标/责任人/工期),"
"不写「本章覆盖评分子项①②③」这类编写说明。"
% (scene, "".join(problems)))