Skip to content

A Chinese name does not stop the queue, and a stated figure is written down - #523

Merged
WaylandYang merged 12 commits into
devfrom
fix/adjudication-stalls-silently
Sep 9, 2026
Merged

WaylandYang merged 12 commits into
devfrom
fix/adjudication-stalls-silently

Conversation

@WaylandYang

Copy link
Copy Markdown
Contributor

拿七篇真实公开文档(NVIDIA 的四份 SEC 文件、中英文维基条目、一篇 arXiv PDF)灌进一个新库做抽取体检,人读原文列了 52 条「该抽到什么」,起点只中 33 条。这个 PR 是把查出来的问题修掉,并把量它的台子留下来。

49/52(94.2%),同一份代码连跑两轮都是这个数,而两轮漏的不是同一批(交集为空)——剩下的是抽样噪声,不是缺口。

一个静默的 panic

七个 adjudicate_entities 任务卡在 running 两小时二十分钟,进程零 CPU、零网络、零数据库活动、零日志。不是死锁:governance.rsname_shape 找整词出现时 from = i + 1字节前进,中文名字一撞上,下一轮 long[from..] 就切在字符中间。

panicked at crates/utopia-store/src/governance.rs:329:33:
start byte index 7 is not a char boundary; it is inside '繪'

panic 掀掉整个 spawn 出来的 future:mark_failed 不跑(任务永远 running、无错误、无重试),running 计数也不减——每 panic 一次永久少一个并发名额,攒够 cap 之后整个队列不再认领任何任务。改成按字符前进,并在 worker 里套一层 spawn 把 panic 变成 JoinError 收回来标 failed。CJK 回归测试去掉修复就 FAILED。

修好之后浮出第二个:七个裁决任务同时跑同一个库、各自读到同一批待裁项,模型调用翻七倍,两个任务对同一对下判断时撞 agent_decisions_open_idx。补上入队去重(隔壁 resolve_types 早就这么做)与同库串行。

量化事实为什么会丢

  • 表格在解析这一步就没了:htmd 要求显式表头,而 SEC 的 XBRL 报表一个 <th> 都没有(那份财报 11 张表、投票结果 8-K 21 张表,计数都是 0),整张退回逐格摊平。整表无表头时把第一行提成表头;空列砍掉(否则分块数从 51 涨到 137);提上来的表头整行为空时让位给真正的抬头。
  • 提示词没有字面值那一条:第 8 条只放行「自己命名的关系」,于是金额、容量、期限、职务没有落脚点,模型索性不说。补 8a;并让「已知关系+只给了值」不再被当成缺宾语丢掉(object_missing 实测 69 次)。
  • 字面值通道的主语解析比关系通道严:只查本次回复声明过的实体,用句柄带进来的、或只写了名字的一律落空——一轮丢掉 113 条,丢的是营收净利每股收益、十位董事的赞成票反对票。改成与关系通道同一套解析。这个 bug 只有在放开字面值之后才暴露得出来。
  • 关系检索没有区分度:一块讲「Jensen Huang, founder and CEO of NVIDIA」的正文里,employee 排第 10(模型就只写了它),founder 排 267、job_title 排 618、has_occupation 排 811,前 30 的窗口一个都进不去——四位高管的职务因此全部没落进图,且不留任何丢弃信号。类那边有祖先地板兜着,关系没有;补一道 domain 地板(池子从 1625 收到 86)。地板要放在签名扩类之后,放前面时提示词从 11.7k 涨到 21.4k。
  • 角色与名单:已列出的关系当文本给的是字符串时也能用 value,且「X, founder and CEO of Y」写两条事实(职务 0/4 → 4/4);名单是名单,一个名字一条事实,不许收成摘要(关系边 8/12 → 12/12,总分 44 → 49)。

台子

scripts/bench/recall.mjs + truth/nvda-public-docs.json(52 条)+ fetch-sec-filings.mjs。与 run.mjs(实体归到哪个类)、temporal.mjs(两根轴)分工不同,它问的是「文档里的信息丢没丢」——extraction_drops / ontology_misses 只看得见「抽出来了没落地」,看不见「根本没抽」,而后者是大头。语料不入库存(各公司提交给 SEC 的文件,公开可取但版权不属于我们),跑一次 fetch 就有。

52 个条目、九成命中率,一个标准差 ≈ 2.7 条:单轮差一两条不是证据,README 里写了。

轮次 改了什么 分数
基线 33/52
r1 字面值通道放行 29/52 ← 回归
r2 +表格 +关系地板 +主语兜底 44/52
r3 +角色规则 +空列裁剪 43/52
r4 +空表头让位 44/52
r5 +名单是名单 49/52
r6 代码一字不改,重跑 49/52

不受运气影响的那几个:object_missing 69 → 0,subject_not_declared 113 → 0,SEC 表格保住行列 0/32 → 32/32,四位高管职务 0/4 → 4/4。

测试

utopia-extract 27 · utopia-ingest 49 · utopia-store lib 34 · utopia-store 连库 58 个测试二进制,全绿。

没在这个 PR 里的

体检还查到三条没动:新库装完本体包立刻上传时本体向量还没建好,抽取退回全量本体(每块 109k tokens)、把端点打到限流、整块被跳过;自动扩本体在已有词旁边长重复(includes/contains 建成新关系而 has_part 零使用);一篇文档内部串行,71 块的文档就是 85 分钟。

🤖 Generated with Claude Code

WaylandYang and others added 12 commits September 8, 2026 21:35
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: WaylandYang <wayland0916@gmail.com>
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.

1 participant