fix(roundtable): 结构化抽取按实际产出抽全(不固定条数/不编造),提升准确度

不动 rwfx 链路结构(任务→目的→行为体→预期行为→驱动因素→叙事;仅预期行为↔驱动因素
1:1,其余皆 1:N)。只修准确度:

- 叙事不再凭空多出来一堆:驱动因素→叙事 仍是 1:N,但叙事条数严格按报告/叙事席位
  实际写出的来(写几条抽几条),删掉「每个驱动因素抽出它名下的若干条叙事」这种诱导
  逐驱动因素编造的措辞——根治「叙事席位只产 3 条、流程图却冒出十几条」
- 去掉所有写死的条数假设(目的「通常3个」、预期行为「3-5条」、叙事「2-4条」、
  候选「10→3」)——各席位交付条数本就不固定,一律以实际产出为准,不漏不多不硬凑

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
董宏凯andClaude Opus 4.8 committed 2026-06-21 00:34:00 +08:00
1 parent a76e28e018
commit 5ae6261e82
1 file changed
+15 -15
@@ -55,9 +55,9 @@ _COMPLETENESS_NOTE = (
"(不要只抽被标「确定 / 第1名 / 选用」的那一条而漏掉报告同列展示的其余条目);\n"
" · 某个上层节点名下若列了多条下层条目(同一上层名下罗列了好几条),"
"**报告里有几条就出几个节点,绝对不许合并 / 概括 / 只取代表性的一条**;\n"
" · ⚠️ **但绝不要无中生有 / 多抽**:报告**已取舍、最终只采用 N 条**的层级(如「从 10 个候选目的里锁定 3 个」"
"「最终选定的方案」),**只抽报告最终采用的那 N 条**——**不要去席位产物、也不要去报告的「候选池 / 被淘汰项」"
"里把没被采用的候选也抽出来凑数**(这是本次要重点纠正的「抽出一堆目的」错);\n"
" · ⚠️ **但绝不要无中生有 / 多抽**:报告**已取舍、最终只采用其中几条**的层级(如报告从若干候选里只锁定了最终几个目的、"
"或只选定了最终方案),**只抽报告最终采用的那几条**——**不要去席位产物、也不要去报告的「候选池 / 被淘汰项」"
"里把没被采用的候选也抽出来凑数**(这是要重点纠正的「抽出一堆目的」错);\n"
" · **不要只照搬报告结尾「方案总纲 / 最终框架 / 共识方案」里被精简的主干链**(那里通常只画被选中的一条主线)——"
"要回到正文把报告该层级列出的**全部条目**抽全。"
)
@@ -80,24 +80,24 @@ _RWFX = ChainSpec(
"或只在第一条预期行为那行写驱动因素、其余行留空)——**这种情况绝不能抽成「一个驱动因素节点连到多条预期行为」**,"
"而要**按预期行为把驱动因素拆开 / 重新归纳**:给每条预期行为各配一个驱动因素节点(其内容综合提炼该条预期行为背后最核心的那个原因),"
"拆分 / 提炼后务必让两层等量、严格一一对应;\n"
"② **「驱动因素」→「叙事」是一对多**——**一个驱动因素对应多个叙事**(每个驱动因素抽出它名下的若干条叙事),"
"每条叙事的 from **只连它所属的那一个驱动因素**(叙事的上一层是驱动因素,不是预期行为、不是行为体);"
"**绝不能把多个驱动因素汇聚连到同一条叙事**(那是多对一,rwfx 链不存在),**一条叙事只能有一个父节点**;"
"若报告里某条叙事看似关联了多个行为体 / 多处驱动,**也只把它归到最直接驱动它的那一个驱动因素名下、只连这一个父节点**,不要给它连多个 from;也不要把全部叙事合并成一个节点;\n"
"② **「驱动因素」→「叙事」是一对多**(一个驱动因素下可以挂多条叙事,一条叙事只属于一个驱动因素)。"
"**⚠️ 叙事条数严格按报告 / 叙事席位实际写出的来——写了几条就抽几条,绝不要为「让每个驱动因素都配一条」而凭空造、复制、拆分出更多叙事**"
"(这是「叙事凭空多出来一堆」的错);每条叙事的 from **只连它所属的那一个驱动因素**(叙事的上一层是驱动因素);"
"**绝不能把多个驱动因素汇聚连到同一条叙事**(多对一,rwfx 链不存在),**一条叙事只能有一个父节点**;也不要把全部叙事合并成一个节点;\n"
"③ 其余相邻层级(任务→目的、目的→行为体、行为体→预期行为)均为**一对多**(上层一条可带下层多条,下层每条连其所属上层条目);\n"
"④ **全链是一棵树:除根「任务」外,每个节点有且仅有一个父节点(一个 from)**——任何节点都不会从多个上层节点汇入(无多对一 / 多对多 / 汇聚)。"
),
completeness_note=(
"以上 6 个层级都要出节点,且每层**严格按报告最终呈现的条目抽全——不漏也不多**:\n"
" · **目的**:抽报告**最终采用 / 锁定的那几个目的**(通常 3 个左右)。报告说「从 N 个候选里锁定 3 个」就"
"**只抽这最终的 3 个、绝不要把那 N 个候选都抽进来**(这是本次「抽出一堆目的」的错);若报告把这几个目的并列成表展示,"
"就把表里列出的都抽全、别只抽第 1 个;\n"
" · **行为体 / 预期行为**:每个行为体名下报告列了几条预期行为(常 3-5 条)就出几个预期行为节点,**不许把一个行为体的多条预期行为合并成一条**;\n"
"以上 6 个层级都要出节点,且**每层条数完全由报告实际呈现决定、严格抽全——不漏也不多**"
"(各席位交付条数本就不固定,绝不要假设任何固定数量、也不要按上一层数量去硬凑下一层):\n"
" · **目的**:抽报告**最终采用 / 锁定的那几个目的**(报告锁定几个就抽几个)。报告若说「从若干候选里只锁定最终几个」就"
"**只抽报告最终采用的、绝不要把被淘汰的候选也抽进来**(这是「抽出一堆目的」的错);报告把目的并列成表展示,就把表里列出的都抽全、别只抽第 1 个;\n"
" · **行为体 / 预期行为**:每个行为体名下报告列了几条预期行为就出几个预期行为节点(有几条出几条),**不许把多条合并成一条、也不要凭空多造**;\n"
" · **驱动因素(1:1 特例,按上面①处理)**:驱动因素层节点数 **= 预期行为层节点数**——每条预期行为各配一个核心驱动因素,"
"**绝不能因为报告把多个原因挤在一处 / 留空,就只抽 1 个驱动因素去连多条预期行为(多对一,本次最严重的错)**,也不要抽得比预期行为多;务必两层等量、位次一一配对;\n"
" · **叙事**:抽报告**最终呈现的那几条核心叙事**(通常 2-4 条,含报告并列展示的备选方案)全部抽成节点,不要只出一两个,"
"也不要去席位候选池里把报告没展示的也抽进来;每条叙事连到它所属/对接的那一个驱动因素——"
"**每条叙事只有一个父驱动因素(单 from)**,绝不要把一条叙事连到多个驱动因素、也不要让多个驱动因素指向同一叙事。"
" · **叙事**:抽报告 / 叙事席位**实际写出的那几条叙事**(写了几条就抽几条),全部抽、但**一条都不要多造**——"
"**绝不要为「每个驱动因素都配一条叙事」而把实际的少数几条叙事扩成一堆**(「叙事凭空多出来一堆」的错);"
"每条叙事**单 from** 连它所属的那一个驱动因素,绝不要连多个驱动因素、也不要让多个驱动因素指向同一叙事。"
),
single_parent=True, # rwfx 是纯树:每个非根节点恰一个父节点(后端确定性兜底收敛)。
)