修复: 上下文记忆与工作流注入生产侧空壳接通

WorkingContext 写入链落地(用户轮目标钉扎+压缩后 JSON 卡片回填重锚定,含 6 单测);
工作流 DAG 摘要注入生产侧接通(AI 路径启动写入+终态回写,审批调用点透传会话)。
附知识库与记忆走查诊断(「笨/丢历史」根因:消息压缩视图丢失+知识检索四重收口),
todo 登记修复分档(含随批补登 09-28 交互走查索引条目)。
This commit is contained in:
lxy
2026-09-29 13:28:56 +08:00
parent f57e25a277
commit dfa38f6259
9 changed files with 333 additions and 27 deletions
@@ -1,6 +1,6 @@
# 上下文管理演进 — 执行计划
> 关联: `上下文管理演进-任务技术设计-2026-07-20.md` | 状态: 待执行
> 关联: `上下文管理演进-任务技术设计-2026-07-20.md` | 状态: T1-T3 已落地;T4/T5 生产侧 2026-09-29 补齐落地(消费侧此前已接,本次补 WorkingContext 写入链+工作流摘要产出,见 `05-代码审查/aichat知识库与记忆走查-2026-09-29.md` 第四章)
---
@@ -0,0 +1,80 @@
# aichat 知识库与记忆能力走查 — 用户反馈「笨/丢历史会话」根因诊断
> 日期: 2026-09-29 | 触发: 用户反馈「明显感觉丢历史会话特别严重」「感觉很笨」
> 方法: 双代理只读走查(知识库链路/记忆四层) + 运行时 DB 实证(devflow.db 副本只读查询)
> 结论处置: 会话内上下文生产侧已修复(同日实施,见文末);跨会话召回/知识检索收口登记待办
---
## 一、DB 实证(核心证据)
数据源: `%APPDATA%/top.1216.devflow/devflow.db` 副本(104MB,82 会话/10647 消息)。
| 指标 | 数值 | 含义 |
|------|------|------|
| compressed 消息占比 | 4758/10647 (44.7%) | 压缩是常态而非例外 |
| user 消息被压缩 | 363/892 (41%) | 四成用户请求模型看不到 |
| 最大会话 5fea6024 | 828 条消息,模型可见仅 44 条 (5%) | 26 条用户消息 **0 条可见** |
| user 可见率最差大会话 Top4 | 0b0a46e5: 0/6 · 5c3bc8a0: 0/8 · 5fea6024: 0/26 · f64dee94: 0/39 | 「我说过的话他全忘了」属实 |
| compressed 原文保留 | 363 条全部非空 | **存储没丢,丢的是发送视图** |
| 四段式压缩摘要落库 | 仅 1 条 | 大量压缩走关键词兜底/旧格式,摘要质量无保障 |
**定性**: 丢历史会话 = 机制性视图丢失(DB 单向 `compressed` 标记永不回 LLM 上下文),不是存储损坏。压缩触发阈值 0.6×可用预算,长会话大半历史必然出局;摘要 ≤1024 token 替代全部被压缩内容,且 user 原话不保证进摘要。
## 二、知识库链路: 四重收口(管道铺好,水龙头拧死)
代码事实(走查证据,均为当前 HEAD 实核):
1. **整句 LIKE 检索(最致命)**: 检索 query=末条用户消息**全文**,`idea_repo.rs:640-661` 用 `%整句%` 做 LIKE——知识标题是短语,整句子串匹配命中率≈0。自动注入即使有已发布知识也几乎空转。
2. **candidate↔published 断链**: 自动提炼(`knowledge_inject.rs:441+`)与 MCP `insert_knowledge` 产物全是 `status='candidate'`;检索只认 `'published'`(`idea_repo.rs:651`)。不手动去 /knowledge 页发布,沉淀的知识(现库 962 条!)永不进对话。`reuse_count` 排序形同虚设。
3. **语义检索默认关**: `vector_enabled=false`(`knowledge_config.rs:58`),需手配 embedding provider;默认纯 LIKE,中文同义表达必漏。
4. **LLM 零知识工具**: `tool_registry.rs` 73 个工具无任何 knowledge 注册;9eb2995 的 search/insert_knowledge 挂在 df-mcp(127.0.0.1:18765)只服务**外部** MCP 客户端,ai-chat 自己的 agentic loop 不接。「记住这个」只会落进对话文本,会话结束即散。
次要: 注入剂量 top-3×500 字符;`source_project` 存而不用于检索过滤;提炼只看最后 6 条消息且每会话仅 1 次。
**知识维度总评**: 管道全部 wired(auto_inject 默认开),但四重收口使普通对话实际获得知识的概率趋近于零。
## 三、记忆能力分层盘点
| 层 | 现状 | 判定 |
|----|------|------|
| L1 轮内 | 全量历史进请求,预算≈102k token,namespace 大结果引用化 | ✅ wired |
| L2 跨轮 | 两道丢失闸门: ①单向压缩(保护最近 6 条,其余换 ≤1024 token 摘要,不可逆);②超预算视图裁剪**无摘要补偿**(只保最近 6 条) | ⚠️ 半残 |
| L3 跨会话 | **零召回**: 新会话全空,无全局摘要/项目记忆/跨会话检索,完全隔离 | ❌ 空壳 |
| L4 跨重启 | 恢复消息(compressed 仍是压缩态)+pinned_goals;**不恢复**: working_context/namespace_store(重启清空)/agent_language/session_trust | ⚠️ 半残 |
空壳机制(有代码无调用方/断链):
- **MemoryAdapter**(`df-ai/src/memory_adapter.rs`): 语义记忆 trait,全仓零调用方,注释中的 VectorMemoryAdapter 不存在。
- **Persona 人设**(5 内置人设+prompt 模板): 唯一实例化点在两个默认关闭的实验门内,不进正常对话链路,无持久化。
- **跨会话记忆**: 无任何机制——这是「丢历史会话」主观感受的最大来源(与 DB 实证互为表里: 同会话压缩出局 + 跨会话零召回 + 重启再丢一层)。
- **DB 落库截断**: >8192 字符的 user/assistant 文本落库截为 前3072+后3072+省略标记(`conversation.rs:101-119`)——重启后连原文都只剩骨架。
## 四、本次已修(同日实施批,已过编译门禁)
「上下文管理演进」07-20 设计中 T4/T5 的**生产侧空壳**补齐(消费侧早已落地但无数据源):
- **T5 WorkingContext 写方法**(df-ai/context_helpers.rs): `begin_turn`(新用户轮目标钉扎)+`sync_after_compress`(压缩后从 T3 JSON 卡片回填决策+重锚定)+`reset_all` 实现,6 个新单测全绿。
- **T5 接线**: `chat.rs:651/1978` 用户消息入库点 begin_turn;`context_lifecycle.rs:278` 压缩成功分支 sync_after_compress(TODO 清零)。效果: 压缩不再裸丢目标/决策,下轮 system prompt 重锚定。
- **T4 生产侧**: `workflow.rs::run_workflow_inner` 增加 conv_id 参数,AI 路径启动写 `workflow_id`+`workflow_dag_summary`,终态回写完成/失败摘要;`chat.rs:896/1278` 审批调用点透传。休眠链路闭环。
门禁: `cargo check --workspace` 0 错误;`cargo test -p df-ai` 494 过/4 挂(4 挂均在 anthropic_compat/model_fetch_helpers,**本批零触碰的存量失败**,见待办)。
**边界说明**: 本批只解「会话内压缩后目标/决策丢失」一块。跨会话零召回、知识四重收口、重启失忆均未动,登记待办。
## 五、待办分档(修复方向,未实施)
**P0(直接治「笨」)**:
1. 知识检索去整句 LIKE: 分词/抽关键词后多条件 OR,或默认开语义检索(补 embedding 配置引导)。改动点 `idea_repo.rs:640-661` + `knowledge_inject.rs:364-384`。
2. candidate 断链打通: 自动提炼产物到阈值 confidence/reuse 自动晋升 published(或检索纳入高置信 candidate),人工审核保留为可选。
3. 视图裁剪补摘要: 超预算淘汰单元被丢弃时生成滚动补偿摘要(现在无声丢失)。
**P1**:
4. LLM 知识工具: tool_registry 注册 search_knowledge/insert_knowledge(复用 df-mcp 实现),让 agent 能按需查/存。
5. 跨会话召回最小闭环: 项目级记忆条目(知识表已有 source_project 字段)+会话结束时提炼进知识库(现有 auto_extract 扩为跨会话通道)。
6. 存量测试修复: `anthropic_compat::anthropic_full_stream_accumulates_usage`(assert usage.is_none() 失败)+`model_fetch_helpers::non_chat_sensenova_u1_image_filtered` 等 4 个,疑似 6bafdcd 流式 usage 语义变更后未同步测试。
**P2**:
7. DB 截断放宽/取消(user 原话平均 41 字,3072 截断对 user 无必要,主要风险在工具结果;可分 role 定阈值)。
8. namespace 持久化或重建(DB 原文在,重启可懒重建,免「已超出内存上限」占位)。
9. 兜底压缩路径接 sync_after_compress("")(当前取舍: 不接,防丢决策态;待版本计数漂移观察后复议)。
+44
View File
@@ -10,6 +10,50 @@
> **2026-08-05 编号碰撞登记**: `F-260619-03` 被两个特性复用(消息拆分存储=文档本体 + AI工具路径授权=复用)。子代理审查确认:改 18 处编号无实际价值有风险,**暂不改代码**,后续新增注释编号统一走日期+序号体系、避免复用已有编号。路径授权若后续单独立项再独立编号。
> **2026-08-15 编号碰撞登记**: `REFACTOR-260619-04` 被复用(父③③.2 审批状态机拆分=待办 vs ToolCard 拆分=已完成)。后续引用审批状态机拆分时用「审批状态机拆分」描述,不再沿用该编号。
### 💡 2026-09-29 aichat 可用性与交互成本研究(三动线走查+异常循环截图实证,39 项新发现)
> 背景:用户反馈交互刷屏已修(工具卡默认折叠)后,按「使用体验/使用成本」深入走查三动线;截图实证「写完就删」循环跑到轮次耗尽——G2 熔断签名机制对写删交替结构性漏网(唯一率 0.83≫0.4,单签名最高 2 次<3,全程连警示都不触发);与 9-28 走查 17 项合并排序。
> 详情:[05-代码审查/aichat可用性与交互成本研究-2026-09-29.md](./05-代码审查/aichat可用性与交互成本研究-2026-09-29.md)
- [ ] 第一批 P1:I1 停止能力窄窗(工具执行期按钮消失,失控不可干预)+I2 编辑入口死链(=9-28#1)+G2 破坏性回环熔断(写后 N 步内删同路径计数,误杀率极低)+V2 审批黑洞(非活跃会话审批事件 isCurrent 守卫整体丢弃)+V1/V3 后台信号缺失(等审批伪装 generating+完成零通知)
- [ ] 第二批 P2:V8 草稿 per-conv 防串台/R3 长回复带量提示+R4 代码块复制/I5 错误分类兜底(429 占 55%)/V4 浮窗高风险二次确认/V7 排队时钟冻结/R5+V9 消息内容检索 等 16 项,排序详报告第五章
- [ ] 第三批 P3 攒批:I8-I13+R8-R13+V10-V12+9-28 #9-#17;其中 9-28#17 图片默认上传外部域名涉开源边界,单独决策
- [x] ✅ 同日已修:工具卡默认折叠刷屏+read_file/list_directory 单行摘要补齐+分组折叠幂等补齐(工作区待提交)
### 💡 2026-09-29 aichat 知识库与记忆修复(「笨/丢历史」根因诊断,同日已修会话内侧)
> 背景:用户反馈「明显感觉丢历史会话特别严重」「感觉很笨」。DB 实证:44.7% 消息 compressed,最大会话 828 条仅 5% 可见(26 条用户消息 0 条可见),存储原文都在、丢的是发送视图;知识库四重收口(整句 LIKE 命中≈0/candidate 不参与检索/向量默认关/LLM 零知识工具,962 条知识存量近乎零生效);跨会话零召回。
> 详情:[05-代码审查/aichat知识库与记忆走查-2026-09-29.md](./05-代码审查/aichat知识库与记忆走查-2026-09-29.md)
> ✅ 同日已修:上下文管理演进 T4/T5 生产侧空壳补齐(WorkingContext begin_turn/sync_after_compress 写入链 + 工作流 DAG 摘要注入链),编译门禁过,详见诊断文档第四章。
- [ ] P0 知识检索去整句 LIKE(分词/关键词多条件 OR 或默认开语义检索,idea_repo.rs:640-661 + knowledge_inject.rs:364-384)
- [ ] P0 candidate→published 断链打通(自动提炼产物按置信/复用自动晋升,人工审核改可选)
- [ ] P0 视图裁剪补滚动摘要(超预算淘汰单元无声丢弃,无补偿,context/mod.rs:206-253)
- [ ] P1 LLM 知识工具注册(tool_registry 复用 df-mcp search/insert_knowledge,agent 可按需查/存)
- [ ] P1 跨会话召回最小闭环(项目级记忆+会话结束提炼进知识库,source_project 已有字段未用)
- [ ] P1 存量测试修复 4 个(anthropic_compat usage 断言/model_fetch_helpers 过滤,疑似 6bafdcd 后未同步)
- [ ] P2 DB 落库截断分 role 定阈值(user 原话均 41 字被 3072 截断无必要)/namespace 重启懒重建/兜底压缩路径 sync_after_compress 复议
### 💡 2026-09-28 devflow 集成 u-claw 能力(可行性已定,待实施)
> 链路:devflow → u-relay → u-claw。通路已生产验证(u-ppt 试点 2026-08-29),u-relay 零改动,唯一工作面 devflow 侧接入。
> 详情:[02-架构设计/专项设计/devflow集成u-claw-可行性研究-2026-09-28.md](./02-架构设计/专项设计/devflow集成u-claw-可行性研究-2026-09-28.md)
- [ ] devflow/u-claw 两侧细勘察补全(接入点 trait/WS 渠道能力边界/多轮会话锚定)
- [ ] 接入实施:WS 客户端(移植 u-ppt relay.ts 或并入 df-tunnel)+ aichat u-claw 渠道 + 配置页(默认关,对齐 cfg.WS==nil 模式)
### 💡 2026-09-28 aichat 交互走查清尾(启动「日常主入口」标准,1P1+7P2+9P3)
> ⚠️ 2026-09-29:17 项经核验全部未修,已并入《aichat 可用性与交互成本研究-2026-09-29》合并排序,修复排序以新报告第五章为准(本条目保留作原始详单指针)。
> 背景:devflow 启动定位=日常 AI 交互调度中枢,按日常主入口标准走查。新发现集中在 God 组件拆分丢功能的链路断点+多会话并发收口残留缝隙。
> 详情:[05-代码审查/aichat交互走查-2026-09-28.md](./05-代码审查/aichat交互走查-2026-09-28.md)
- [ ] 第一批(日常直接受伤):#1 编辑末条消息入口丢失回归(2c2b2d7 提取 MessageItem 时按钮未迁移)+#4/#5 排队消息被静默清(AiError/审批失败/看门狗超时三路径,含两处全局清队列残留)+#6 后台会话错误气泡推错视图+#7 429 无分类且重试照显
- [ ] 第二批(多会话体验):#8 审批徽标跨会话误导+点击 no-op+#3 en 重试气泡残留+#2 rejectedHint i18n key 多前缀
- [ ] 第三批随批清理:P3 九项(#9-#17,详见报告)+B-260619-04③销账(实际已落地)
- [x] 第四批(用户实测反馈 2026-09-29):批量读取文件时工具卡逐卡渲染刷屏 ✅已修——分组默认收起机制 6 月已有但为一次性初始化,流式场景首卡到达即触发完毕,组从 1 卡长到 N 卡不再折叠致 N 张单行卡全展开;改响应式补齐(组达 2 卡阈值即收起)+用户手动操作/审批展开记 touched 不被自动收回
### 💡 2026-08-04 父子任务支持(✅ 已完成)
> 目标:完成父任务/子任务的完整支持(数据→后端→前端),UI/UX 重点设计。