01 现在 vs 之后
现在
企微云电脑
Windows 个微端
手机 APK × 7
企微九人表 SALES_PERSONAS
三端都借这九个 key 说话
xiawei:客户名 五台手机 + 云电脑混一池
之后
手机 本人填表
Windows / 云电脑 管理员分配
个微人设表
wx_xiaoxia_01 ↔ 手机A
wx_xiawei_01 ↔ 销售机B
一个 key 只绑一台机
wx_xiaoxia_01:客户名 一机一池,工作台按前缀看
左边是今天:三个执行端都从企微的九个人设里挑 key,七台手机里五台选了夏伟,会话全写成 xiawei:客户名,和云电脑企微的混在一起。右边是要做成的样子:个微有自己的一张人设表,一台机器对应一个 wx_ key,会话按 key 分池。
今天的会话池 会话数 里面是谁的
xiawei:295 150 段 Windows / macOS 个微端,145 段是云电脑企微和五台手机混在一起,分不出
gerenweixin:111 Windows / macOS 个微端共用一个接待号,分不出是哪台机
xiaoxia:48 46 段是云电脑企微和两台手机混在一起
02 核心机制:一张表、两个入口、一条通道
① 谁来填
② 服务端
③ 机器与工作台
手机 · 本人
填姓名、客户称呼、性别、九档风格
persona_register
管理员 · 门店工作台
给 Windows / 云电脑建人设并绑机器
persona_assign
或生成配对码,装机时输码绑定
写入
人设表 weixin_personas
key wx_xiaoxia_01
host salesphone-…
姓名 · 客户称呼 · 性别 · 固定风格
唯一约束:key · host · 姓名
= 一台机只有一个人设
机器
手机 APK / Windows 边车
落盘,断网重启都保持
心跳 每 5 分钟
回包 desired.persona
代回:generate 带 key + host
会话身份键
wx_xiaoxia_01:客户名
核对 key 与 host
按前缀收窄
门店工作台
成员接待号填同一个 key
只看到自己这台机的客户
表里没有这台机的人设
→ 回包不带 persona → 机器一条不回
手机和电脑端只在①「谁来填表」上不同,②③完全一样。机器不自己决定是谁:它每 5 分钟发一次心跳,服务端在回包里告诉它「你是 wx_xiaoxia_01,叫小夏」。没分配就没有这个键,机器就不回。工作台成员的接待号填同一个 key,就只看到这台机的客户。
03 人设是什么:三样原料进同一副骨架
姓名 · 2–4 字
客户称呼 · 2–6 字
性别 · 男/女/不强调
风格 · 九档选一
装配
固定骨架 buildYdyxPersona
「你叫 X,有大有小的销售(X 生)」
品牌事实:568 全国统一价、板材品牌
表达闸:简短、自然、不重复喊客户
风格段 ← 九档预设原文,不接收自由文本
骨架不给改,所以不开自由文本
AI 用这个身份
替他回客户
本人或管理员只提供身份信息、性别和固定风格。它们被装进一副固定骨架,骨架里写死了品牌事实和表达规则,所以谁填都改不了「568 全国统一价」这类事实。风格只从九档预设中选择。
九档风格 一句话 九档风格 一句话 九档风格 一句话
利落干练 先甩结论再补理由 热情周到 句尾软化,不催不推 温和细致 把复杂的事掰开讲
算账清楚 一问价就拆开算 勤快跟进 当场去核实,给时间点 实在行家 给中肯判断,帮避坑
稳健护盘 先交代工期安装售后 细节确认 复述一遍再往下走 先看现场 先问清房子再给建议
04 手机端 UI:本人实际看到的五个页面
01 · 创建身份
9:41 5G 87%
‹ 设置我的 AI 身份
第 1 / 4 步
先告诉 AI 你是谁
这些信息只用来决定回复时怎么称呼自己、用什么语气。
下一步:选说话风格
02 · 选择风格
9:42 5G 87%
‹ 选择说话风格
第 2 / 4 步
你平时更像哪一种?
只能从固定风格里选,品牌价格和服务规则不会被改动。
更多 5 种风格 ⌄
勤快跟进、实在行家、稳健护盘……
下一步:试听
03 · 试听确认
9:43 5G 86%
‹ 听听像不像你
第 3 / 4 步
这是客户问价时的效果
模拟对话 · 不会真的发送
你们家全屋定制大概多少钱?
这么说吧,柜体主推 568 元/㎡投影,全国统一价。您把房子面积和城市告诉我,我直接给您估个范围。
身份:小夏 · 风格:利落干练
不像我,返回调整
像我,就用这个身份
04 · 迁移老客户
9:44 5G 86%
‹ 认领我的老客户
第 4 / 4 步
哪些聊天是这台手机的?
只勾你确认是个人微信聊过的人。没勾的会话原地保留,不会丢。
已选 2 人,迁移后 AI 会接着原来的聊天记忆回复。
确认迁移 2 位客户
暂不迁移
05 · 创建完成 / 日常入口
9:45 5G 86%
‹ 我的 AI 身份 ⋯
✓
小夏的人设已生效
这台手机只会使用下面这个身份回复。
工作台接待号
wx_xiaxia_01
把这串发给管理员,绑定后你只能看到自己手机上的客户。
姓名与称呼 夏夏 · 小夏
说话风格 利落干练
设备绑定 本机 ✓
当前状态 正在值守 ✓
修改姓名或风格
这五页才是手机端真正的产品形态。前四页只在首次安装或更换本人时出现;创建完成后,App 首页只保留“我的 AI 身份”卡片。修改姓名或风格要重新试听,但 key 不变,工作台和历史会话不会断。
手机上
1 填表
姓名 · 客户称呼 · 性别 · 固定风格
替换现在的四选一弹窗
2 试听
看一句「客户问价」的回复
像不像自己,不像就改
3 登记
拿到 key,大字显示
给工作台管理员抄接待号
4 迁旧会话
勾自己的老客户(见 06)
勾完开始正常回
服务端
persona_preview
真模型按人设回一句,不落库
persona_register
建行、绑 host、返回 key
persona_migrate_*
列候选、按勾选改绑
放在引导第 6 步。没建完人设引导不往下走,App 报「人设未设置(现在谁都不回)」,和「白名单为空」是同一种状态,会进心跳让服务端看见。试听那一步是为了避免今天「在 xiawei 和 xiaoxia 之间选错」这种事,听一句比看拼音可靠。
05 电脑端:管理员分,机器只管收敛
管理员
服务端
机器(Windows / 云电脑)
入口 A · 工作台分配
机器页:建人设 + 绑这台机
persona_assign
人设行 host = 这台机
入口 B · 配对码
建人设 → 生成 6 位码,24h 一次性
码交给装机的人
首次启动输码
机器还没上线也能绑
persona_claim
绑 host,码作废
下一拍心跳回包
desired.persona
每 5 分钟心跳
报 host
落盘 → 代回
没收到就不回
两个入口写的是同一张表,之后的路一样。入口 A 给已经在发心跳、状态页上看得到的机器用。入口 B 给首装:机器还没上线、装机的人也不是销售本人,他只要在客户端输一次配对码,机器就绑上了。.env 里的 AKKE_WEIXIN_PERSONA 和 AKKE_WEIXIN_DATA_OPERATOR 退役,换人只改表里那一行,机器下一拍生效。
06 旧会话迁移:只迁手机端的,手机报名单、人来勾
今天的 xiawei: 池 · 295 段
150 段带显式身份 consult:
Windows / macOS 的,一律排除
145 段裸名 xiawei:客户名
云电脑企微 + 五台手机混着
库里没有字段能分开
手机报名单
白名单、黑名单里的名字
按规范名匹配
候选清单
客户名 · 最后一条 · 消息数
销售逐条勾
勾了的:精确改绑
wx_xiaoxia_01:客户名
customer_profile 留 migrated_from
可回退
没勾的:留在 xiawei: 不动
库里认不出一段裸名会话来自手机还是云电脑,唯一知道答案的是手机:白名单里写着测试过的人,拿手机的销售也认得自己的客户。所以由手机报名字、服务端找候选、人来勾。同一个客户可能既加了夏伟企微又加了这台手机个微,键一模一样,只有人能分辨。按今天七台手机的白名单一共六个人,要勾的是个位数。电脑端旧会话不迁:111 段共用一个接待号,也没有人在机器前勾选的环节。
07 服务端怎么拦:三个问题,答错就不回
代回请求进来
带 host 吗?
新包都带
否 = 老包
灰度期照旧放行
全部切完后关闸 400
是
persona 是 wx_ 开头?
个微端不许用企微 key
否
400 拒绝
手机日志「人设无效」
是
host 与登记一致?
查人设表
否
不回 + Lark 告警
persona_host_mismatch
放行
三问都过才装配人设、生成回复。第二问就是「隔离」本身:带 host 的新包只能用 wx_ 人设,企微的九个 key 在个微端从此无效。第三问就是「一机一人设」的执法:key 被别的机器拿去用,服务端不回并告警。
人设表和配对码表的 DDL
create table public.weixin_personas (
id uuid primary key default gen_random_uuid(),
org_id uuid not null,
key text not null, -- wx_xiaoxia_01,服务端生成
origin text not null check (origin in ('self','assigned')), -- 手机自建 / 后台分配
host text, -- 绑定的机器;未绑时为空
display_name text not null,
gender text not null check (gender in ('男','女')),
style_preset text not null,
catchphrases text[] not null default '{}',
status text not null default 'active' check (status in ('active','retired')),
created_by text not null,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
create unique index on weixin_personas (org_id, key);
create unique index on weixin_personas (org_id, host) where status = 'active' and host is not null;
create unique index on weixin_personas (org_id, display_name) where status = 'active';
create table public.weixin_persona_pairing_codes (
code text primary key, -- 6 位数字
org_id uuid not null,
persona_id uuid not null references weixin_personas(id),
expires_at timestamptz not null, -- 生成后 24 小时
used_at timestamptz,
used_by text
);
DDL 走 supabase/wecom-ddl/ 存档加 dashboard 执行,并补 wecom_ddl_applied 台账。
接口契约一览(八个 action)
action 谁调 做什么
persona_preview手机 / 工作台 按表单字段临时装配人设,真模型回一句固定问价,不落库
persona_register手机 建 origin=self 的行并绑 host,返回 key;同名或本机已有生效人设则拒绝并说明绑在哪台
persona_assign工作台 / 状态页 建或改 origin=assigned 的行,绑到指定 host;管理员 token
persona_pairing_code工作台 为一个未绑定的人设生成配对码
persona_claimWindows 边车 拿配对码把本机 host 绑到预建的人设,配对码作废
persona_migrate_preview / _commit手机 列旧 persona 下裸名候选(排除显式身份的),按勾选精确改绑
heartbeat(已有)手机 / 边车 回包 desired.persona;telemetry 加 personaKey、personaName
generate / opener / confirm(已有)手机 / 边车 新增 host 字段;服务端核对 (persona, host) 与登记一致
服务端认人设的函数从「查静态九人表」扩成「先查静态表,wx_ 前缀再查库」,命中后交给同一个骨架装配,回复生成、模型选择、个微输出闸一行不改。
08 上线顺序:先服务端,再两端,最后关闸
1 服务端
建表、八个 action
老包照旧放行
2 手机 0.9.31
强制建人设 + 迁旧会话
删掉四选一弹窗
3 Windows v1.9.21
读 desired.persona
支持配对码,带 host
4 工作台分配页
六台 Windows / 云电脑
逐台分配
5 关闸
所有个微机器都是 wx_ 后
带 host 的非 wx_ 一律 400
1 到 4 期间新旧包并存,老包不受影响;第 5 步之后隔离正式生效
验收只认行为,不认配置:①把一台新版手机的人设改回 xiawei 发一条,服务端应 400;②两台机器注册或分配同名「小夏」,第二台应被拒并提示绑在哪台;③给一台 Windows 机器改绑人设,下一拍心跳后状态行显示新名字、新会话前缀换成新 key;④用过期或用过的配对码,客户端应被拒且不绑定;⑤心跳表所有个微机器无重复人设;⑥销售的工作台账号填了接待号后,只看到自己机器的会话。