From 5ae6261e8209564832c5e7dd9e4ad4b4ee19e9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=87=AF?= Date: Sun, 21 Jun 2026 00:34:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(roundtable):=20=E7=BB=93=E6=9E=84=E5=8C=96?= =?UTF-8?q?=E6=8A=BD=E5=8F=96=E6=8C=89=E5=AE=9E=E9=99=85=E4=BA=A7=E5=87=BA?= =?UTF-8?q?=E6=8A=BD=E5=85=A8(=E4=B8=8D=E5=9B=BA=E5=AE=9A=E6=9D=A1?= =?UTF-8?q?=E6=95=B0/=E4=B8=8D=E7=BC=96=E9=80=A0)=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E5=87=86=E7=A1=AE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不动 rwfx 链路结构(任务→目的→行为体→预期行为→驱动因素→叙事;仅预期行为↔驱动因素 1:1,其余皆 1:N)。只修准确度: - 叙事不再凭空多出来一堆:驱动因素→叙事 仍是 1:N,但叙事条数严格按报告/叙事席位 实际写出的来(写几条抽几条),删掉「每个驱动因素抽出它名下的若干条叙事」这种诱导 逐驱动因素编造的措辞——根治「叙事席位只产 3 条、流程图却冒出十几条」 - 去掉所有写死的条数假设(目的「通常3个」、预期行为「3-5条」、叙事「2-4条」、 候选「10→3」)——各席位交付条数本就不固定,一律以实际产出为准,不漏不多不硬凑 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../extraction_spec.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/agents/roundtable_orchestrator/extraction_spec.py b/offline-backend-20260512/backend/packages/harness/deerflow/agents/roundtable_orchestrator/extraction_spec.py index 83da6bc1..dcd738c7 100644 --- a/offline-backend-20260512/backend/packages/harness/deerflow/agents/roundtable_orchestrator/extraction_spec.py +++ b/offline-backend-20260512/backend/packages/harness/deerflow/agents/roundtable_orchestrator/extraction_spec.py @@ -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 是纯树:每个非根节点恰一个父节点(后端确定性兜底收敛)。 )