Commit c4ac1971e12e1d975c076eee2f494eae8d2846de

Authored by zichun
1 parent ee583b89

docs: §20 rearch2 current state (skill-ReAct + event-sourced memory)

Showing 1 changed file with 54 additions and 1 deletions
docs/agent-architecture.md
@@ -335,7 +335,7 @@ ai_op_queue( @@ -335,7 +335,7 @@ ai_op_queue(
335 **业务决策项** 335 **业务决策项**
336 17. 首个灰度只读场景选型;报价是否改双确认;多语言(当前仅中文)。 336 17. 首个灰度只读场景选型;报价是否改双确认;多语言(当前仅中文)。
337 337
338 -## 19. 当前实现状态(2026-07-28,分支 `agent-dev` → `agent-main`) 338 +## 19. 实现状态(2026-07-28 上午,分支 `agent-dev` → `agent-main`)—— §19.1/§19.2 的编排与记忆已被 §20 重构取代;§19.3-19.5 的护栏、协议与安全加固仍是现状
339 339
340 2026-07-27/28 全量重构(22 项待办,5 批),全部完成并验收。 340 2026-07-27/28 全量重构(22 项待办,5 批),全部完成并验收。
341 341
@@ -413,3 +413,56 @@ ai_op_queue( @@ -413,3 +413,56 @@ ai_op_queue(
413 - agent 单步 bench50:严格 38/50 = **76%**(达标 ≥76%),宽松 45/50 = 90%。 413 - agent 单步 bench50:严格 38/50 = **76%**(达标 ≥76%),宽松 45/50 = 90%。
414 - e2e 冒烟(本地 saas 栈 + exec-staging=true):查询+翻页 / 新增报价(表单→FK选择→确定性提交→确认→落库)/ 414 - e2e 冒烟(本地 saas 栈 + exec-staging=true):查询+翻页 / 新增报价(表单→FK选择→确定性提交→确认→落库)/
415 改字段(落库)/ 作废(按单号定位→落库)全部通过;UI 全流程浏览器实测通过。 415 改字段(落库)/ 作废(按单号定位→落库)全部通过;UI 全流程浏览器实测通过。
  416 +
  417 +## 20. 当前实现状态(2026-07-28,分支 `rearch2`,自 `agent-main` 切出)
  418 +
  419 +第二轮重构(rearch2):**废除意图门与确定性流水线,全部自由文本进唯一 skill-ReAct agent;
  420 +记忆改为事件日志唯一事实源 + 四段投影**。安全不变量层(§19.5)一步未退。
  421 +
  422 +### 20.1 编排:单 ReAct + skill(取代 §19.1 的门+路由)
  423 +
  424 +- `IntentService` / `Intent` / `SlotFillService` / `LlmJsonClient` / `OkHttpUtil` /
  425 + `route()` / `handleCreate` / `handleWrite` / `deriveWriteAction` / `ground` / `withState` 全部删除。
  426 + 理由:意图门不掌握字段定义,抽取值必然有损(「大16开」→「16开」类改写);原话是唯一信息载体,
  427 + 只在字段定义存在的地方(工具内部)被解释一次。
  428 +- **固定 7 工具**:`useSkill` + 原 6 工具。流程知识做成 **skill 文本**(`resources/skills/*.md`,
  429 + 文件名 ASCII(部署链 unzip 会搞乱中文文件名),首行=技能名,次行=一句话用途,其余=正文;
  430 + 配 `xly.skills.dir` 指向文件系统目录即热更)。5 个 skill:查询数据 / 新建报价 / 新建单据 /
  431 + 修改记录 / 单据状态操作(写作红线:只写步骤与停止条件、不写错例、值逐字照抄、出提议卡即停)。
  432 +- system prompt 模板化(`prompts/system.txt`:硬性要求 + 域地图 + 技能索引 + 7 工具一行清单 + 4 条硬规则),
  433 + 基准脚本读同一模板与 skill 文件,杜绝复刻漂移。
  434 +- 尺寸拆分正则自 SlotFillService 迁入 `FormCollectTool.expandDimensions`(预填值里的
  435 + 「50*30*5」「长和宽50cm,高5cm」确定性拆成 长/宽/高——模型拆不对是实测结论)。
  436 +- 反编造护栏**无条件常开**(原按意图开关):零工具调用且答案含数字 → 注入纠正话术重试一次
  437 + (internal 事件,前端不显示),复发标注未核实;WRITE_CLAIM 纠正与 `maxSequentialToolsInvocations(8)` 保留。
  438 +- 按钮端点不变且不经模型:`/form/submit`(结构化直达 proposeWrite)、`/op/{id}/confirm|cancel`(CAS)、
  439 + `/op/pending`、`/form/options`、会话 CRUD。
  440 +
  441 +### 20.2 记忆:事件日志唯一事实源(取代 §19.2 的三存储)
  442 +
  443 +- `chat:ledger:{conv}`(Redis LIST,rightPush 原子,30 天 TTL)升格为**唯一事实源**;
  444 + `chat:mem`(整包读改写,有并发覆盖竞态)与 `chat:state`(三处手工同步)废除——
  445 + RedisChatMemoryStore 降级为旧会话只读兼容 + 删除级联,StateService 删除。
  446 +- 事件类型:`user`(internal?)/ `ai` / `tool_call`(**原样序列化载荷**)/ `tool_result`(全文+120字摘要)/
  447 + `form_submit` / `proposal` / `confirm` / `cancel` / `skill_active` / `skill_done`;
  448 + 旧类型 assistant/clarify/form/question/tool 兼容渲染,自然淘汰。
  449 +- `EventLogChatMemory`(实现 LangChain4j ChatMemory):`add()` 逐条 append(用户事件由控制器先落账,
  450 + 记忆层前缀去重;模型消息只由记忆层落账);`messages()` 读四段投影。
  451 +- `EventProjectionService` = **唯一渲染器**,前端历史与 LLM 上下文同源:
  452 + ① 稳定 system prompt;② **进行中流程卡**(激活 skill 全文 + 在办单据状态,钉在 system 尾,
  453 + confirm/cancel/新 skill 激活时摘下——skill 跨轮续办靠它,不怕旧轮工具结果被压缩);
  454 + ③ 往事摘要区(预算外旧轮 → 确定性一行摘要,零模型调用);
  455 + ④ 近期原文区(约 6000 字符按整轮纳入,旧轮工具结果压 120 字,**当前轮原样载荷精确重建**)。
  456 +- 「流式输出中途点确认」竞态从机制上消除(并发写者各自 rightPush,互不覆盖);
  457 + 会话列表懒清理(内容键过期即剔除,3 天宽限)。
  458 +
  459 +### 20.3 基准与验收(`bench/`,已入库)
  460 +
  461 +- `bench50_v2.py`:冻结基线(2026-07-28 验收存档:意图门 100%、agent 单步严格 76%)。
  462 +- `bench_ext.py`:多步轨迹模拟(喂回固定工具结果,含生产反编造护栏复刻)+ 多轮用例
  463 + (消歧 S1-S5 / 多轮接续 M1,M2,M6 / 夹带 M3 / 长会话回指 M4 / 跨轮表单 M5 / 提议纪律 M7);
  464 + `--fifty` 把 bench50 的 50 题按全轨迹判分,新旧架构同口径对照;`--arch new` 与生产同源读
  465 + prompt 模板与 skill 文件。
  466 +- 单测 29 个:投影正确性(当前轮保真/旧轮压缩/预算收拢/摘要区/internal 隐显/流程卡钉摘)、
  467 + 并发 append 不丢事件、尺寸正则、skill 加载、以及 §19.5 的安全不变量回归。
  468 +- 验收数字见 `bench/bench_p3_acceptance.out`。