feat(agent): form pipeline + collection prompt workflow@20261021

- merge main: workflow/20261021 (collection prompt adds step-5 mandatory
  time readback-confirm before routing; non-motor/0003 branch rework;
  accident_cause unified schema), updated eval suites (photo_skip/
  button_guidance rewritten, no_false trimmed to asr, new
  non_motor_vehicle + time_confirmation with form/reply assertions),
  runner gains form/formMatches/replyMatches expectations
- prompts/collection.md regenerated from 20261021; extraction prompt
  archived (contentExtract description, 6-key whitelist)
- collect: extraction call per turn (extraction.md + current time/form
  injected), merge follows 更新表单 semantics (meaningful values only,
  number/string equality, diff -> turn_patch); accident_fields now uses
  external form keys
- backend: form_update flows to ChatResult and SSE formUpdate event
  (stream emits prefix, FormUpdate, body)
- fields: FORM_FIELDS whitelist with strict type validation
- verified: 155 unit tests; golden evals on real model - photo_skip 4/4,
  no_false 2/2, photo_button_guidance 12/12, non_motor_vehicle 14/14,
  collection_skip 10/12, time_confirmation 1/2; remaining 3 failures are
  model sequence/literal-template adherence, recorded in plan appendix
This commit is contained in:
Eric Wang
2026-10-21 17:10:33 +08:00
parent 4ead44ef3f
commit 74db6be385
9 changed files with 291 additions and 109 deletions
+11 -8
View File
@@ -367,7 +367,7 @@ docs/langgraph/
| 2. 接入 API | ✅ 完成 | `AGENT_BACKEND=langgraph` 启动验证;`test_langgraph_backend.py` |
| 3. 领域状态与事件 | ✅ 完成 | 事件解析 14 例、白名单校验 24 例;`LEGAL_TRANSITIONS` 17 条均带 `source_ref` |
| 4. 采集 + LLM | ✅ 完成 | 真实模型 `collection_skip_known_info` 12/12;单测含逐字比对 |
| 5. 拍照与核实 | ◐ 代码完成,评测有差异 | 单测全过;真实模型评测差异见下 |
| 5. 拍照与核实 | ✅ 完成 | 真实模型 4/4 + 12/12 + 2/2(20261021 基准) |
| 6—10 | 未开始 | — |
全量单元测试 143 通过;七份提示词与 20261020 工作流逐字比对由参数化测试锁定。
@@ -384,17 +384,20 @@ docs/langgraph/
| 黄金案例 | 结果 | 说明 |
|---|---|---|
| `collection_skip_known_info` | 12/12 | 采集主流程与“跳过已知项”完全对齐 |
| `photo_skip_plate_confirm` | 0/4 | 全部卡在同一步 |
| `no_false` | 2/8 | 2 个 ASR 案例通过 |
| `collection_skip_known_info` | 10/12 | 2 例:时间确认后漏问数量直接分流(模型顺序执行差异) |
| `photo_skip_plate_confirm` | 4/4 | 20261021 步骤5(时间复述确认)修复了原“对”分歧 |
| `no_false`(asr,main 已移除旧 6 例) | 2/2 | — |
| `photo_button_guidance` | 12/12 | — |
| `non_motor_vehicle`(新增) | 14/14 | 依赖 formUpdate 管线(提取节点 + 更新表单差量语义) |
| `time_confirmation`(新增) | 1/2 | 1 例:模型话术“我记录的事故时间是”不匹配字面模板 |
**统一失败模式**:开放问题(“您现在还在事故现场吗?”)未获明确回答时,用户输入短促词(“对”),评测期望保持 1002 澄清,模型直接分流 2000/2010。移植侧已排除提示词、历史、变量、温度(0 与缺省均试过)差异;模型名与 FastGPT 应用一致(deepseek-v4.1-flash)。
### 开放问题(对账前按提交规则留档,不叠代码守卫)
### 开放问题(20261021 合并后更新)
1. **FastGPT 应用层配置差异**:应用级系统提示词、思考模式开关不随工作流 JSON 导出,可能是分流行为差异来源。行动:请负责人在 FastGPT 应用设置中核对并导出;或在本机起 FastGPT(`ANALYSIS_SERVICE_URL` 指向 127.0.0.1:3030)直接跑评测对照。
2. **评测案例与工作流导出的分歧**:`no_false` 单车案例期望 2003→2004,而 20261020 导出提示词写 2003→2005(`photo_skip_plate_confirm` 注释亦写“不经过 2004”)。已按“2004=车牌确认、双走向合法”实现,权威口径待确认。
3. **“对”的判定语义**:评测期望模型区分“对=开放问题的模糊回答(澄清)”与“信息已齐无待定问题(分流)”。当前模型不区分。若应用层配置排除后仍不通过,按规则 4 记录差异及采用依据,或由评测负责人重新录制该步骤预期。
1. **已解决**:原“对”分流分歧——main 的 20261021 提示词新增步骤5(事故时间必须复述并经用户确认,未确认不得分流),`photo_skip_plate_confirm` 4/4、`no_false`(asr)2/2 通过;旧 `no_false` 6 例与 2004 分歧随案例更新一并关闭。2004 按“车牌确认、双走向合法”实现并保留在白名单。
2. **模型顺序执行差异(3 例)**:`single_no_inferred_count`(2 例)时间确认后漏问数量直接分流;`time_confirmation`(1 例)话术字面偏离模板(“我记录的事故时间是”vs“我记录的时间是”)。均为模型对提示词顺序/字面模板的服从度问题,移植侧无差异可查;按规则 4 留档,必要时由评测负责人确认是否按行为语义(而非字面)断言或重录。
3. **待落实**:FastGPT 应用层配置(应用级系统提示词/思考开关)仍建议对账一次,作为作业 10 等价性证据的一部分。
### 代码地图(截至作业 5)