Commit f3086c3c67a978208ac9971f60c4e65defaeb948
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,7 +253,7 @@ ai_op_queue( | ||
| 253 | - 现网安全发现(后端逐用户表单权限被注释关 / 读 API 可被 `bUpdate` 触发写 / 旧 NL2SQL 越权)——`docs/security-findings.md` 已成文,**是否整改由业务定**。授权层真正“收紧到非管理员”只有在**生产以真实用户 token 运行**时才能观测(本地 dev-login=admin 全通)。 | 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 | > 这是**唯一的现状节**。改代码后请更新这一节,不要再往 §15/§16 里加。 | 258 | > 这是**唯一的现状节**。改代码后请更新这一节,不要再往 §15/§16 里加。 |
| 259 | 259 | ||
| @@ -308,7 +308,7 @@ ai_op_queue( | @@ -308,7 +308,7 @@ ai_op_queue( | ||
| 308 | | §10 manual 预填深链 `/form/{formId}?staging={sId}` | ERP 侧端点已写,xlyAi 侧**不产生这类链接** | manual 流程未打通 | | 308 | | §10 manual 预填深链 `/form/{formId}?staging={sId}` | ERP 侧端点已写,xlyAi 侧**不产生这类链接** | manual 流程未打通 | |
| 309 | | §3 agent 完全自路由 | 前置确定性意图门 | 见 §17.2(有意为之) | | 309 | | §3 agent 完全自路由 | 前置确定性意图门 | 见 §17.2(有意为之) | |
| 310 | 310 | ||
| 311 | -## 18. 未完成清单(2026-07-23) | 311 | +## 18. 未完成清单(2026-07-23)—— 历史快照,勿当现状读 |
| 312 | 312 | ||
| 313 | **阻塞上线** | 313 | **阻塞上线** |
| 314 | 1. **`kg-edge-flow` 未合并 `master`** —— §14 已定"写入 master",但全部 6200 行新代码只在该分支;`master` 仍是改造前状态。 | 314 | 1. **`kg-edge-flow` 未合并 `master`** —— §14 已定"写入 master",但全部 6200 行新代码只在该分支;`master` 仍是改造前状态。 |
| @@ -334,3 +334,53 @@ ai_op_queue( | @@ -334,3 +334,53 @@ ai_op_queue( | ||
| 334 | 334 | ||
| 335 | **业务决策项** | 335 | **业务决策项** |
| 336 | 17. 首个灰度只读场景选型;报价是否改双确认;多语言(当前仅中文)。 | 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 全流程浏览器实测通过。 |