Skip to content

fix(agent): 修复兴趣图谱进化链路断裂(#422) - #425

Merged
Zewang0217 merged 2 commits into
developfrom
fix/interest-evolution-422
Oct 14, 2026
Merged

Zewang0217 merged 2 commits into
developfrom
fix/interest-evolution-422

Conversation

@Zewang0217

Copy link
Copy Markdown
Owner

问题

Closes #422。生产实测 admin 租户 interest-history.jsonl 最后快照停在 2026-09-08 12:20(#236 发布后 1 小时),此后图谱零 persist、兴趣零进化,游荡 focusTopics 整个 10 月都在用 9 月的旧兴趣。

根因(三条独立断点 + 一个观测黑洞)

  1. 反思输出截断:maxOutputTokens: 3000 对推理模型不够(reasoning tokens 计入同一上限,实测 v4-flash 单次 reasoning ~1.7k + 正文 ~1.5k)。生产 10-14 四次反思的 outputTokens 全部恰好 = 3000,JSON 全部截断、parse 全部失败,被当「零洞察」静默吞掉。
  2. 反思 prompt 未规定字段名:探针复现显示模型稳定产出洞察,但字段名是 name/interest/reason,Zod schema 要 topic/reasoning → 即使不截断也会全量丢弃。
  3. 游荡回灌断粮:[bug] 兴趣图谱被污染:搜索 query 与 URL 域名成为兴趣节点(#147 同类) #176 话题准入(≤4 英文词 / ≤40 字符 / 拒域名形态)把游荡侧候选(搜索 query 5–13 词 + URL 主机名)100% 滤掉,plausible.length === 0 静默 return,一个多月无人知晓。
  4. worker 日志黑洞:run-one-wander 不初始化文件 logger,consola 的 stdout/stderr 是 nullStream——「反思 LLM 输出不是合法 JSON」「兴趣回灌失败」等报错从未落盘,故障不可见。

修复

  • engine.ts:输出上限 3000 → 8000(REFLECTION_MAX_OUTPUT_TOKENS 常量 + 注释);system prompt 写死精确 JSON 结构(字段名一字不差 + 约束);user prompt 注入图谱当前 top-10 兴趣清单(existingInterestUpdates 只能从清单选——否则 updateInterestGraph 静默跳过清单外话题)。
  • wander-agent.ts:extractRecentTopics 收集 record_knowledge 的 title(模型自己概括的干净话题,稳定通过 [bug] 兴趣图谱被污染:搜索 query 与 URL 域名成为兴趣节点(#147 同类) #176 准入)——提取函数提为模块级导出纯函数;候选全滤时 logger.warn 留痕,不再静默。
  • run-one-wander.ts:租户上下文就绪后 initFileLogger(),consola 日志落租户 logs/ 目录。

验证

  • pnpm --filter agent test:634 通过(新增反思调用契约测试 + extractRecentTopics 直测 4 例)
  • pnpm --filter agent lint / typecheck 通过
  • 生产观察(合并部署后):反思产出非零洞察、interest-history.jsonl 出现新快照、游荡 query 不再是 "September 2026" 陈旧话题

生产实测:interest-history 最后快照停在 09-08(#236 发布后 1 小时),此后
图谱零 persist。三条独立断点:

1. 反思输出截断:maxOutputTokens 3000 对推理模型(reasoning 计入上限,
   实测单次 reasoning ~1.7k)必截断 JSON,parse 失败被当「零洞察」静默
   吞掉(10-14 四次反思 outputTokens 全部恰好 =3000)。→ 上限提至 8000。
2. 反思 prompt 未规定字段名:模型输出 name/interest/reason,Zod schema
   要 topic/reasoning,全量丢弃。→ prompt 写死精确 JSON 结构与示例,并把
   图谱当前 top-10 兴趣注入 user prompt(existingInterestUpdates 只能从
   清单选,否则 updateInterestGraph 静默跳过)。
3. 游荡回灌断粮:#176 话题准入(≤4 英文词/拒域名)把搜索长 query 与
   URL 主机名 100% 滤掉,plausible 恒空且静默 return。→ 提取 record_knowledge
   的 title(模型概括的干净话题)作为喂料;候选全滤时 warn 留痕。
4. worker 日志黑洞:run-one-wander 不初始化文件 logger,consola 输出全部
   进 nullStream(「不是合法 JSON」等报错从未落盘)。→ 租户上下文就绪后
   initFileLogger()。

验证:agent 包 634 测试 / lint / typecheck 全绿;新增反思调用契约测试与
extractRecentTopics 直测。
@Zewang0217

Copy link
Copy Markdown
Owner Author

Review(subagent)结论 APPROVE,5 条 P2 建议中采纳 3 条轻量改进:① callLLM 读图谱前补 isInitialized/load 防御(与 updateInterestGraph 同款);② 断粮 warn 区分「零候选」(纯 speak/rest 游荡,不告警)与「有候选全被拒」(warn);③ 注释措辞收敛(中文标题稳定通过,英文长标题仍会被拒)。其余 P2(loadConfig 前置错误仍进黑洞、loaded-graph prompt 测试)接受现状。CI 重新触发中。

@Zewang0217
Zewang0217 merged commit 8adde98 into develop Oct 14, 2026
1 check passed
@Zewang0217
Zewang0217 deleted the fix/interest-evolution-422 branch October 14, 2026 11:41
Zewang0217 added a commit that referenced this pull request Oct 14, 2026
本次发布 develop 领先 main 的两个提交:#425 修复兴趣图谱进化链路(反思输出上限 8000 / prompt 字段契约 / record_knowledge 喂料 / worker 文件日志);#426 表情包改为游荡中心情概率门触发并移除日记收尾死代码链。验证:agent 635 + CP 550 测试、两包 lint/typecheck、CI/CD 管线全绿;三路 subagent review 全部 APPROVE(结论见 PR 评论)。发布观察项:兴趣快照恢复、游荡话题更新、图鉴随心情概率增长。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant