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