星云API www.xingyapi.com 的底层重构笔记。最近有个做高客单价医美 SaaS 的兄弟踩坑:他们的群机器人在回复客户时,完全无视了客户身上的“已消费十万”和“高意向”标签,对所有人的提问统一推送了极其廉价的“9.9元体验卡”话术,惹得好几个顶级 VIP 觉得被冒犯,直接退群。
很多开发者把机器人做成了没有感情的复读机,根本原因是没打通“群聊消息”与“客户画像(标签)”的数据壁垒。如果在收到消息时去现查客户标签,绝对会把企微接口的频控打挂。今天不废话,直接手撕这套基于内存缝合的“标签化精准群聊管线”。
一、客户画像前置:靠事件回调把标签拍进 Redis
机器人的 Webhook 只负责收消息,它对发消息的人一无所知。要想知道客户的具体信息和标签,你必须查阅 开发文档,利用自建应用的change_external_contact(客户变更)和change_external_chat(群变更)回调,提前把客户画像固化到内存里。
工业级防线:维护 O(1) 的客户标签异构库。当后台监听到客户加微或被打标签的事件时,Worker 线程异步拉取客户详情,只把最核心的“身份+标签”存入 Redis。
Java
// 监听到客户标签变更事件时,异步刷新画像缓存 public void syncCustomerTags(String externalUserId) { // 拉取客户全量信息 WeComCustomer detail = wecomClient.getExternalContact(externalUserId); // 提取核心业务标签(如:VIP、高意向、已成交) List<String> tagNames = detail.getTags().stream() .map(Tag::getTagName).collect(Collectors.toList()); // 极简存储:将标签数组拍入 Redis Hash redisTemplate.opsForHash().put("WeCom:CustomerProfile", externalUserId, String.join(",", tagNames)); }二、消息探针与标签缝合:在 MQ 消费端完成“千人千面”
当机器人的 Webhook 收到群聊事件(如客户@机器人提问)时,网关直接把原始报文扔进 MQ。 在消费端,我们用UserId去 Redis 瞬间抽出客户的标签画像,把“冰冷的聊天文本”包装成“带标签的业务载荷”喂给大模型。
Java
@RabbitListener(queues = "queue_robot_chat") public void processMessageWithTags(RobotMsgDTO msg) { String senderId = msg.getFrom().getUserId(); // 1. O(1) 极速提取客户标签(不触发任何网络 IO) Object tagStr = redisTemplate.opsForHash().get("WeCom:CustomerProfile", senderId); String tags = tagStr != null ? String.valueOf(tagStr) : "普通客户"; // 2. 意图拦截与分层路由 String userQuestion = msg.getText().getContent(); if (tags.contains("已流失") || tags.contains("黑名单")) { log.info("触发黑名单拦截,机器人静默不回复"); return; } // 3. 终极缝合:将客户标签直接注入大模型的 System Prompt String systemPrompt = String.format( "你是金牌顾问。正在向你提问的客户带有以下系统标签:[%s]。" + "请根据客户的标签等级,调整你的语气和推荐策略(如 VIP 强调尊贵服务,普通客户强调性价比)。", tags ); // 4. 调用大模型获取精准话术 String smartAnswer = llmService.chat(systemPrompt, userQuestion); // 5. 零权限极速下发(利用机器人专属 WebhookUrl) HttpUtils.postJson(msg.getWebhookUrl(), buildMarkdown(senderId, smartAnswer)); }用应用事件流充当“雷达”去捕获标签,用 Redis 抹平数据孤岛,在 MQ 消费层完成“聊天流”与“标签库”的微秒级缝合。只要把这套异步架构做薄,你的机器人就能立刻从“人工智障”进化成能看懂客户段位的顶级销售。