Skip to content

v1.4.2 — 第一次真实云端端到端 · 连引核验修复

Choose a tag to compare

@hellobs hellobs released this 04 Oct 09:58
· 73 commits to main since this release

v1.4.2 — 第一次真实云端端到端 · 连引核验修复

一句话:这是项目第一次在真实云端模型上跑通完整热路径(此前所有验证都是本地模型或零消耗
替身)。真跑逮到两个只有实战才暴露的缺陷,都已修复。


为什么有这一版

v1.4.1 之后堆了 21 个提交,其中两处是安全修复。本版的核心不是"加功能",而是把那个唯一
用零消耗手段补不上的洞补上
:协议桥转译、json_schema 约束、并发模型、超时层次——这些
在 mock 与本地模型下都成立,但只有真接云端网关才能确认。

真跑经用户明确授权,共消耗 6 次上游调用(1 次单路探 + 5 次五路),单次约 ¥0.001 量级。

实测结果

单路探(1 次调用,只开「逻辑审计员」)

用 ADVISORS_YAML 临时名册只开一路、其余 enabled: false,1 次调用同时验三件事:

观察点 结果
协议桥转译(/bridge/v1 → Anthropic 协议 → 网关) 通
response_format=json_schema 被遵守 是
顶层 res 字段(_parse_output 强取) 正常
单次延迟 1.4–1.7s

max_tokens 未被吃掉——输出 97–534 字符。这条验证了一个已知陷阱:给 mavis 传合法的
max_tokens 反而会导致 0 次调用(未知 kwargs 静默空转),所以 mavis_bridge.py 干脆不传,
由桥侧 DEFAULT_MAX_TOKENS 兜底。

五路并行(5 次调用,LLM_CONCURRENCY=5)

观察点 结果
五路状态 全 ok
墙钟耗时 2.88s(最慢一路 2.85s)
真并发 确认——5 个请求在 37ms 窗口内发出
prompt_pack 传了 domain 时落 legal(法学包),产出明显更强

结论:现场用云端时,五路并行的延迟余量充足,不需要为速度牺牲路数。


修掉的两个缺陷

① 连引稀释内容核验(后端,误判)

真实模型产出了一句连引:

作品需具有独创性并能以一定形式表现,**《著作权法实施条例》**未要求创作须脱离工具独立完成

_claimed_after() 原来只在第一个句末符处截断,不知道下一部法从这里开始 ⇒ 下一条引用
标记被算进本条的分母。最长公共子串占声称长度的比例从 0.452 掉到 0.326,刚好跨过
MATCH_LOW=0.45 判错
——一条真引用被判存疑。

修法是剔除下一条引用标记本身(连同它前面的连接词"及/和/以及"),不是截断:
截断会让第一条什么都不剩,等于把真引用漏掉核验。

实测:同一条引用 match 回到 0.452,content_ok 恢复 True。整体 content_suspect
从 1 降到 0。新增 2 条回归,测试数据就是那句真实模型产出。

MATCH_LOW 一个字没动 —— 按既定口径,算法不改,只修实现 bug。

② 零引用与自由输入的界面口径(前端,说不清)

真跑同时暴露了一个真实的路子被堵死的情况:

  • 手打辩题时前端不带 domain,后端按「绝不猜」落 general 包。这本身是正确行为,
    但界面上既不说明、也不给出路,用户只看到法学语料一条都没引用。
  • 通用辩题本就无引用,界面却显示成"本轮没有《…》第…条式引用",读起来像出错。

改动(后端逻辑一字未动):

  • 新增 frontend/src/citeBar.ts:total === 0 时显示「引用 本轮无(通用辩题不引法条)」,
    且 warn: false——零引用也出现在状态条上,不再静默消失。
  • packNote():无 domain 时明说「提示词包 X · 自由输入,未选领域」,并提示从下拉选预设
    即可切过去;有 domain 时只报包名,不说教。
  • CitationPanel 的零引用文案与状态条统一口径。

新增 10 条前端用例覆盖这两处。


回归数据(发版前最后一轮)

项 结果
后端 pytest 316 passed(v1.4.1 是 314,+2 连引回归)
前端 npm test 59 passed(v1.4.1 是 49,+10 界面口径)
tsc --noEmit 0 错误
vite build 通过
桥探针 scripts/bridge_probe.py 10/10
npm audit --omit=dev 0 漏洞

两次交互之间的等待都设得大于单轮最坏耗时,并断言了「进行中」中间态;变异检验做了 4 次
(SettingsPanel 2 条、citations 1 条、citeBar 2 条),全部精准命中单点——全绿通常意味着
在测快照而不在测测行为
。


本版没有做的(以及为什么)

  • 没动 MATCH_LOW:内容核验的已知盲区(合理意译会判存疑,偏保守;半挪用/只截 1/4 原文
    都放行,拦不住拼凑截取)是算法层面的取舍,按既定口径不改,只修实现 bug。
  • 没给会话表加 domain 字段:会让复盘无法回溯当轮用了哪个提示词包,是一个已知取舍,
    不是漏项。要加得配套设计复盘视图,不适合塞进一个补丁版。
  • 没清 dev 依赖的 4 条 audit 告警:都在 vitest/vite 链上,清零得整条升到 6/7,
    会牵动 plugin-react 与 vitest,属独立任务。
  • 没重抓 npc.gov.cn 语料:仍是死穴(SPA 空壳 + TLS 握手失败)。加新法走 gov.cn
    子域镜像手工取。

升级提示

无破坏性变更,直接 git pull 即可。若你之前手打过辩题,现在起建议从预设辩题下拉里选,
否则提示词包会落在通用包上——这不是 bug,但法学场景下你会拿不到法学措辞。

复现入口

cd backend && API_PORT=8020 LLM_CONCURRENCY=5 ADVISOR_BUDGET_S=120 LLM_TIMEOUT_S=110 \
  "../.venv/Scripts/python.exe" -m app.main
# POST /api/analyze(body 里带 domain)→ POST /api/session/{id}/verify-citations

三条坑记在 HANDOVER.md §13续八:端点是 verify-citations 不是 citations/verify;
package-lock.json 里 4 处版本号只改前 2 处;手打辩题要传 domain。