NAVI · 产品月报
从"单机记忆、一重启就失忆",到崩溃也不丢活儿;还学会了帮顾客重置密码、认清"这活儿是冲谁去的"。
2026.06.10 – 06.23 · 按 T 切主题 · ← → 翻页 · F 全屏
一句话总结
pod 被杀/部署重启,请求不丢、不重复、不卡死
Slack 一句话,自动走完 Shopify 整套重置流程
不再把"提需求的你"和"操作对象"搞混
Config Center 升级,调内部服务有了正经认证
主题一 / 占了这两周一多半的工作
把 Navi 从"把活儿记在脑子里就开干",改造成"每一步都先记进账本,再动手"。
以前为什么会出事
在 Kubernetes 里,容器(pod)被回收、被部署、被杀是家常便饭。原来 Navi 的"进度"只活在那台机器的内存里——机器一没,三种坏事就会发生:
没人接着干,你在 Slack 里干等回复
Slack 自动重发消息,它又从头跑一次
留下一条卡死的记录,再也不会结束
🍳 打个比方:像厨师把订单全记在脑子里就开炒。店里一停电,订单全忘光——客人干等,或者客人再催一次时又炒了一遍。
现在怎么做 · 每一步都落账
同一条 Slack 消息只放行一次;Slack 的自动重发被当场拦下。
请求先进持久队列;被领取时原子地挪进"处理中"格子。pod 被杀,处理中的工单还在,下个 pod 开机自动捡回来重跑。
同一对话同一时刻只有一个 worker 能写;锁被抢走后,旧 worker 在建 PR / 发消息这类外部动作前会被栅栏拦下,绝不重复产生副作用。
只存一个"游标",恢复时按事件日志重新拼出对话历史,从断点继续——而不是存一整坨消息。
回复先存档、发送成功才销账。就算在"已生成、还没发出"那一瞬挂掉,开机后补发——回复绝不丢。
前后对比
配套改造 · 已在生产开启
收件 / 干活拆成两个进程: web 只负责"收消息 + 入队"(轻、快、不 clone 代码库);worker 专门干重活——跑 agent、拉仓库、调模型。两边靠 Redis 协同,互不拖累。
主题二 / 一个全新的本事
顾客忘了 Mercaso 商城的密码,以前要人工去后台折腾。现在 Slack 里 @Navi 一句话就行。
它会做什么
Shopify 直接把重置链接发到顾客自己的邮箱,线程里回执成功。
生成 8 位新密码私信给你;线程里只报"已完成",从不回显密码。
路线 B 全程自动: 触发重置 → 轮询收件箱拿重置链接(封顶 3 分钟,超时会说清卡在哪一步)→ 只认本次这封新邮件、用完即清理 → 生成密码、调内部 API 重置 → 还原邮箱。
上线后的一个坑 · 顺手修了
重置总是"超时",像是流程太慢。
邮件其实到了、也读到了。但 Shopify 的邮件追踪链接,对"看起来像机器人"的访问直接回 403。我们的轮询器自报家门叫 NaviResetBot——被拦了。
修法:访问链接时伪装成正常浏览器(完整的 Chrome User-Agent + 请求头),403 消失,链接正常跳转。
🔑 顺带:认证简化成"一把钥匙"——优先用静态 ADMIN_TOKEN,没有就用 client-credentials 自动换 Admin token,再派生 Storefront token。一个密钥,两个 API 全覆盖。
主题三 / 多智能体的"认人"问题
当主管 agent 把活儿派给子 agent,系统原来会把"提需求的你"和"操作对象"搞混——给顾客重置,结果差点重置到你自己头上。
解法 · 给委派加一个"对象"字段
需要"对象"的 agent 会声明 requires_subject;少了就被打回重派。来源只能三选一:
从你的原话里取目标(把你说的原文照搬给子 agent,别再认错人)
取自上一步的结构化结果,必须带 ref 指向那一步
你从消歧选项里选的那个,必须带 ref = 确认的实体 id,子 agent 不再重查
🧷 为什么强制 ref: Navi 问"你指 A 还是 B",你回"1",它把选择锚定成实体 id 带下去。就算长对话被摘要、选项列表从上下文里消失了,因为有 ref,也不会沦为"用户选了某个、但不知道是哪个"的死循环。
交接保证 · 答案绝不被悄悄丢掉
有的模型(实测 DeepSeek)会把"工具调用"错当成纯文本吐出来(DSML 标记)。现在能把这段文本解析、还原成真正的交接,而不是当垃圾丢掉。
交接里答案是空的?先强制重答一次;再不行就兜底成最佳散文。绝不出现"明明查到了,用户却收到一句没数据"的情况。
这三件事(认对象、扛压缩、保交接)合起来,堵住了过去"派活儿派错人 / 长对话后答非所问 / 答案凭空消失"这一类最让人困惑的故障。
主题四 / 控制台与基础设施
Navi 调订单/客户等内部微服务时的服务到服务认证。凭据在控制台管理、加密存储、UI 永不显示明文;缺失/禁用会返回明确错误,不再静默失败。
Slack 用户选择器、方向键导航、域分组的侧边栏,外加 Cmd+K 菜单搜索——找设置更快。
轮询器跑在 worker 里、运行中续租数据库锁;"Run now"跨容器秒级唤醒,跑完还能查状态。
requires_subject 等字段在 UI 里可见(dev 可改、prod 只读);菜单显示名做到单一来源、不再前后打架。
如果你只有 10 分钟
崩溃也不丢活儿 — 占了这两周一多半的工作,决定了 Navi 在生产里稳不稳。
帮顾客重置密码 — 唯一对外可见的全新能力,含一个值得讲的 403 排查故事。
认清操作对象 — 修掉了多智能体里最让人困惑的一类错。
控制台 + 内部鉴权 — 日常运维更顺手,调内部服务更安全。
一句话收尾
账本让它崩溃也不失忆,闸门挡住重复,发件箱保证回复不丢,认人的牌子让它分得清"为谁办事"。
NAVI · 2026.06.10 – 06.23 · 90 commits