Corpus · 料甲方标注台喂进来的
免登页 /annotate/<token> 让甲方逐条标「好 / 要改 + 改后文案」,结果搬进话术库打 tag。当前 100 条已标注案例、206 条话术示例在库。
客户在企业微信里发来一句话,云端 Windows 截屏把它读出来,服务器想好怎么答,再回到那台机器上一个字一个字打出去。全程无人值守。
// 没有官方接口、没有网页 DOM —— 这条链路唯一的输入是一张截图,唯一的输出是模拟键鼠
// 数据截至 2026-07-30,均为线上直查
三层各管一件事,互不越界:云电脑只负责「看屏幕、打字」,服务器只负责「想」,中间那一跳只负责「绕过国内连不上 Vercel 这件事」。
阿里无影 Windows,挂着登录好的企业微信。截屏 → 视觉模型认字 → 鼠标点 → 逐字打字 → 再截屏确认。一台机器一个窗口,所有会话串行。
国内云电脑直连 Vercel 不通,所以走 akke-worker-prod.fly.dev 纯转发,不持密钥、不做任何判断。实测往返 0.56–0.82s,是整条链路里最稳的一环。
独立仓 wecom-chat 的 /api/wecom/chat/reply:取料、认身份、组话术、生成、清洗、落库、记成本。账本和判断全在这一层,云电脑不碰。
wecom_msgid 幂等指纹,防「服务端没落库→下轮重发」
// 两段式的意义:「拿到回复」和「真的发出去」是两件事。中间隔着身份门和 GUI,任何一步没成,这条消息就不进账本,下一轮从头再来。
这不是偷懒的选择。想拿到企微好友单聊的内容,能想到的四条「正经路」逐条实测都是死的——已判死,别再重探。
眼睛是视觉模型、手是盲打:只要前台不是企微窗口(有人开了记事本、弹窗、召回把窗口切到群聊),打出去的字就会错位、错人、错窗口。看起来像「脚本乱了」,实际是焦点乱了。
所以工程上做的每一件事,本质都是同一句话:把能用确定性代码判定的东西,从视觉模型手里拿回来。
一台机器 = 一个企微销售号 = 一个人设,不共用、不串台。四台都是 6 核 12G 企业版,2026-07-30 直查阿里云均为 Running。
三台在跑的机器脚本 md5 完全一致(74BA7E7C / 178,011 字节 / v2026-07-29.recall-draft-clipboard-verified)——2026-07-25 起 loop 每 20 轮比对远端 md5,发现新版就自己干净退出、让 launcher 拉新版重启,改代码不用再手粘脚本。
但 .env 还在四个人手里各改各的:读屏模型、轮询节奏、日限、裁剪比例,九项参数没有一项一致。坐标裁剪比三台差 3 倍是正常的(客户端版本不同、必须逐台实测),模型和节奏不一致没有任何理由——这是「同代码三种效率」的直接原因,也让任何优化都无法归因。下一步要把 .env 收敛成服务端下发。
2026-07-30 上线。甲方要的效果是「遇到类似问题优先用审定过的话术」,所以做成生成之前先检索命中,而不是塞进 few-shot 里赌模型照抄。
还要同时满足:单段、无客户专属数字、最近没发过。更快也更省。
把审定原话抹平换行嵌进 prompt,模型只许改称呼和衔接。
正常生成。开关 APPROVED_REPLY_MODE,出事先降档再关。
4,950 对真实问句的相似度分布:中位 0.499(无关)、p99 0.727。真·同题能到 0.968。两条必须挡在直发之外的边界是画线的依据 —— 「把户型图发我吧」↔「发个两室一厅的户型图」= 0.862;「预算 3 万 110 平」↔「我在武汉…3 万能不能做」= 0.855(城市决定要不要报远程服务费,直发会丢掉这条上下文)。两条已写成回归用例。
免登页 /annotate/<token> 让甲方逐条标「好 / 要改 + 改后文案」,结果搬进话术库打 tag。当前 100 条已标注案例、206 条话术示例在库。
确定性画像抽取 + 滚动摘要,治「过 8 轮就只剩 5 轮记忆」。当前 76 个会话有客户画像、21 个有滚动摘要;最长一条聊到 54 条消息。
07-15 试过推理型 kimi:初评质量更优、编店更少,但红蓝风洞暴露延迟高 + 话术漂移 → 07-21 回滚。
qwen/qwen3-235b-a22b-2507主号没有隔离,被封一次代价是真实客户资产。所以阈值写死在代码里、只允许 env 收紧,一条消息要顺次过完这些门才准发出。
活跃对话 8–18s 快轮询、空闲照旧慢跑,别让客户等在那儿。拟人延迟按字数算——越长等越久,逐字敲的速度本身就是「像不像人」的一部分。
一层管「像话术但不该说的话」(推微信号、免费量尺、编造前文、复读记账标记);07-30 起补第二层管「根本不是话」——聊天模板词、日文假名、代码残渣、HTML 实体,命中就改发安全兜底句。
同一个后端,企微严禁「免费量尺」(抖音相反)、一律用「您」、绝不推微信号、按真实门店就近分派。渠道隔离靠 tag 和人设,混一次就是给客户发错承诺。
2026-07-30 逐行还原三台生产机的日志(30,648 行)+ Supabase 369 次真实往返。结论有点反直觉:97.8% 的轮次没有产出一条消息。
空转的四张账单 —— 都在日志里明码标价,逐条可数:
同一份代码,三台的「有效轮占比」:
① 硬校验前台是企微窗口(并关掉生产机上的编辑器)→ 夏伟约 900 轮/日空转直接归零,分钟级就能做。② 系统会话红点本地永久黑名单 → 小顾读屏调用 −48%。③ 回声判据下沉到云电脑本地(本地缓冲实测命中 0 次,等于没生效)→ 省 330 趟跨境往返。④ 身份门失败的话术缓存下轮重投,别直接扔(夏伟生成 218 条、只发出 15 条)。⑤ .env 服务端下发,收敛成一份事实源。
换更便宜的读屏模型只省 29%,砍空转能省 90% 以上 —— 优化方向是次数,不是模型。
口径:channel='wecom_chat' 生产库直查,2026-07-30。不是估算、不是样例。
/annotate(首批 100 条)wecom-chat + 6 条 cron.env 服务端下发,收敛配置
数据来源 ① Supabase 生产库直查 channel='wecom_chat'(会话 / 消息 / stage / 画像,2026-07-30)
② 阿里云 ecd describe-desktops 直查四台云电脑状态(2026-07-30)
③ 三台生产机 _loop.log 逐行还原 30,648 行 + 369 次紧邻配对往返(2026-07-30 效率解剖)
已知偏差 投递半程不含「客户发出 → 被读到」那半程(库里没有这个时间戳);成本为「读屏次数 × 实测 token × 官方单价」估算;日志窗口是尾部 1.2MB 不是完整自然日。