Commit f3086c3c67a978208ac9971f60c4e65defaeb948

Authored by zichun
1 parent d3fa137a

docs: §19 current state (agent-dev rework, acceptance results)

Showing 1 changed file with 52 additions and 2 deletions
docs/agent-architecture.md
... ... @@ -253,7 +253,7 @@ ai_op_queue(
253 253 - 现网安全发现(后端逐用户表单权限被注释关 / 读 API 可被 `bUpdate` 触发写 / 旧 NL2SQL 越权)——`docs/security-findings.md` 已成文,**是否整改由业务定**。授权层真正“收紧到非管理员”只有在**生产以真实用户 token 运行**时才能观测(本地 dev-login=admin 全通)。
254 254 - 报价改双确认、首个灰度只读场景选型 —— 业务确认项。
255 255  
256   -## 17. 当前实现状态(2026-07-23,分支 `kg-edge-flow`,HEAD `8b927e3`)
  256 +## 17. 实现状态(2026-07-23,分支 `kg-edge-flow`,HEAD `8b927e3`)—— 历史快照,勿当现状读
257 257  
258 258 > 这是**唯一的现状节**。改代码后请更新这一节,不要再往 §15/§16 里加。
259 259  
... ... @@ -308,7 +308,7 @@ ai_op_queue(
308 308 | §10 manual 预填深链 `/form/{formId}?staging={sId}` | ERP 侧端点已写,xlyAi 侧**不产生这类链接** | manual 流程未打通 |
309 309 | §3 agent 完全自路由 | 前置确定性意图门 | 见 §17.2(有意为之) |
310 310  
311   -## 18. 未完成清单(2026-07-23)
  311 +## 18. 未完成清单(2026-07-23)—— 历史快照,勿当现状读
312 312  
313 313 **阻塞上线**
314 314 1. **`kg-edge-flow` 未合并 `master`** —— §14 已定"写入 master",但全部 6200 行新代码只在该分支;`master` 仍是改造前状态。
... ... @@ -334,3 +334,53 @@ ai_op_queue(
334 334  
335 335 **业务决策项**
336 336 17. 首个灰度只读场景选型;报价是否改双确认;多语言(当前仅中文)。
  337 +
  338 +## 19. 当前实现状态(2026-07-28,分支 `agent-dev` → `agent-main`)
  339 +
  340 +2026-07-27/28 全量重构(22 项待办,5 批),全部完成并验收。
  341 +
  342 +### 19.1 工具与编排(§3/§5 的最终形态)
  343 +
  344 +- **固定 6 工具**,不再按意图分范围(`ToolScope` 已删):`findForms` / `readFormData(formId, moduleId, keyword?, page?)` /
  345 + `lookupRecord` / `collectForm` / `proposeWrite(action=…)` / `askUser`。n=50 基准显示按意图收窄无准确率收益(严格 76% vs 76%),
  346 + 反而破坏 KV-cache 前缀稳定性。已删除:`queryData`(NL2SQL 栈 + jsqlparser 依赖)、`kgSearch`、`loadSkill`(SkillTool/SkillService;`ai_skill` 表保留)。
  347 +- **单一 system prompt**(`SystemPromptService.prompt()`):域地图 + 业务常识(问价=新建报价核价、删除=作废)+ 6 工具清单 + 4 条准则。
  348 +- **意图门 4 类**(查询/新增/操作已有单据/其他):提示只写**类定义**(含有界行业常识),零逐案纠错规则;
  349 + 具体写动作(update/invalid/examine/cancelInvalid/cancelExamine/delete)由路由层从原话推出(`deriveWriteAction`)。
  350 +- 记录定位:`FormResolverService.searchField` 按关键词形态选检索字段(形如单号→`sBillNo`,否则名称列);
  351 + `locateRecord()` 为 update/invalid/examine/delete 四路共用。
  352 +
  353 +### 19.2 上下文(§8 的实现)
  354 +
  355 +- **会话账本** `chat:ledger:{conv}`(Redis LIST,30 天):user/assistant/clarify/form/question/tool/proposal/confirm/cancel
  356 + 全类型事件按序落账——确定性路径也入账;前端历史从账本重放(`ConversationService.history`)。
  357 +- **状态槽** `chat:state:{conv}`(代码写入,非模型总结):上轮意图/最近实体/在办单据(阶段)。摘要前缀喂意图门与写槽位抽取
  358 + (跨轮指代「它/那张单」可解),尾注入 agent 用户消息。
  359 +- **投影记忆** `ProjectedChatMemory`(替代 MessageWindowChatMemory):存储保完整(硬上限整轮裁剪),
  360 + 读取按字符预算(≈token)从新到旧整轮取,旧工具结果压一行;当前轮原样保留。
  361 +- 确定性路径通过 `RedisChatMemoryStore.appendTurn` 补记忆(表单弹出/澄清/提议/确认结果),修补记忆空洞。
  362 +
  363 +### 19.3 可靠性护栏
  364 +
  365 +- Ollama(0.32.3,已升级重测)对 `tool_choice=required` **不硬执行**(4/5)→ 代码护栏:
  366 + 查询轮零工具调用且答案含数字 → 强制重试一次,仍复发则标注「未经核实」;非查询轮声称已生成/已完成但未真正
  367 + proposeWrite → 附纠正提示。
  368 +- `erp.exec-staging.enabled=true` 生产路径已本地端到端验证(改字段/新增报价/作废均真实落库、以用户 token 身份执行、
  369 + ai_op_queue 状态由 ERP 侧回写)。修复两个真实缺陷:xlyAi 侧未解 ERP 统一响应包装(status 在 `dataset.rows[0]`);
  370 + ERP 侧执行器缺 `invalid` 分支(已补,走 `updatebInvalid`/Sp_Invalidation)。
  371 +
  372 +### 19.4 交互协议与前端
  373 +
  374 +- **确定性表单提交**:`POST /api/agent/form/submit` 结构化字段直达 `proposeWrite(action=create)`,不经 LLM 再编码
  375 + (旧的 NL 标记路径已删)。
  376 +- `GET /api/agent/form/options`:多列(名称+按使用度选 3 个展示列)+ 名称搜索 + 分页,FK 二级选择器数据源。
  377 +- `askUser` 返回 `allowFree=true`:前端选项片之外永远保留自由输入(Claude Code 风格)。
  378 +- `chat.html` 整页重写:原生 JS(去 jQuery)、全视口、可折叠会话侧栏、单滚动区、markdown 表格、提议卡片、
  379 + collectForm 网格布局 + 类型化控件 + FK 选择器模态。
  380 +
  381 +### 19.5 验收(2026-07-28)
  382 +
  383 +- 意图门 bench50:**50/50 = 100%**(终跑 49/50,唯一错例为 Ollama 502 网络抖动,单测复核正确)。
  384 +- agent 单步 bench50:严格 38/50 = **76%**(达标 ≥76%),宽松 45/50 = 90%。
  385 +- e2e 冒烟(本地 saas 栈 + exec-staging=true):查询+翻页 / 新增报价(表单→FK选择→确定性提交→确认→落库)/
  386 + 改字段(落库)/ 作废(按单号定位→落库)全部通过;UI 全流程浏览器实测通过。
... ...