
做过即时通讯产品的朋友应该都有体会,消息推送这件事看似简单,其实门道很深。早期的IM软件基本上是你发什么我收什么,顶多搞个已读回执。但用户量一旦上去,问题就来了——群聊里几百条消息,真正跟我有关的可能就那么几条;公众号推文铺天盖地,用户根本看不过来;陌生人社交场景下,如何让两个人建立起有效的对话连接,更是让人头疼。
这时候,智能推荐就成了一个绕不开的话题。但我要说的是,IM场景下的智能推荐跟电商、视频网站的推荐逻辑有很大区别。电商推荐是为了让你买更多东西,视频推荐是为了让你看更久,但IM推荐的核心诉求其实是帮助用户更高效地获取有价值的信息,建立有意义的连接。如果推荐做砸了,用户会觉得你在窥探隐私或者强行塞垃圾内容;如果做得好,用户会觉得”这软件真懂我”。
那到底怎么在IM软件里把这件事做明白?咱们从头捋一捋。
很多人一提到推荐,首先想到的是”推荐内容”,但在即时通讯软件里,需要推荐的东西远不止内容这一样。我大概梳理了一下,IM场景下的智能推荐通常涉及以下几个维度:

这四类推荐的底层逻辑有相通之处,但在具体实现上各有各的讲究。今天这篇文章主要是聊消息内容推荐,因为这是大部分IM产品最核心的需求。
在说技术实现之前,我想先用大白话把智能推荐的本质讲清楚。费曼教学法的核心就是用简单的语言解释复杂的东西,所以我尽量不搞那些听着很玄乎的术语。
想象一下,如果我是一个特别了解你的朋友,你要我帮你从几百条消息里挑出值得看的,我会怎么做?
首先,我得了解你。我知道你做什么工作,平时关心什么话题,跟谁聊得来,之前对什么内容点过赞或者回复过。这些信息构成了一幅你的画像,我拿这幅画像作为筛选标准。
其次,我得了解那些消息。每条消息是谁发的、什么时候发的、是什么内容、话题标签是什么、有多少人有互动,这些信息构成了消息本身的属性。
最后,我需要一个匹配逻辑,也就是用你的画像去和消息的属性做对比,把匹配度高的排在前面。
说白了,智能推荐就是这三个步骤的工程化实现:用户画像构建 → 内容特征提取 → 匹配排序。接下来我们逐一展开。

用户画像在推荐系统里是个老生常谈的话题,但在IM场景下有一些特殊的考量。我见过很多产品一上来就要给用户打各种标签,什么”科技爱好者”、”职场精英”、”二次元少女”之类的。这种粗粒度的标签有没有用?有点用,但不够。
为什么不够?因为一个人在不同场景下的兴趣可能是割裂的。我在工作群里讨论技术方案,和在朋友群里闲聊八卦,这是两个完全不同的状态。如果系统把我对技术话题的兴趣泛化到所有场景,那推荐结果肯定会跑偏。
所以一个更合理的做法是构建场景化的用户画像。什么意思呢?给用户在不同场景下分别建立兴趣模型。比如工作场景下关注什么、社交场景下关注什么、娱乐场景下关注什么。然后当用户在某个场景产生行为时,调用对应场景的模型来做推荐。
用户画像的数据来源主要有几类,我列个表格方便大家对照:
| 数据类型 | 获取方式 | 典型应用 |
| 用户主动填写 | 注册资料、兴趣选择、关注订阅 | 冷启动时的基础画像 |
| 行为数据 | 浏览记录、点击、点赞、回复、停留时长 | 实时兴趣捕捉 |
| 社交关系 | 好友列表、群聊关系、互动频率 | |
| 内容产出 | 用户发的消息、评论、转发 | 深度兴趣挖掘 |
这里要特别提醒一下隐私边界的问题。IM软件天然带有隐私属性,用户对这类产品的信任度要求比电商或者内容平台更高。你收集什么数据、怎么用这些数据、存放在哪里,这些事情都要在隐私政策里写清楚,而且要让用户有选择权。推荐功能做得再好,如果因为隐私问题把用户吓跑了,那就得不偿失了。
早期做内容推荐的时候,很多人觉得只要把文本处理好了就万事大吉。但IM场景下的消息形态早就不是纯文字了,图片、语音、视频、表情包、文件、链接……这些东西越来越多,你根本躲不开。
所以多模态内容理解是IM推荐系统必须面对的课题。文字可以用NLP处理,图片可以用CV模型识别,语音可以转文字再做NLP,链接可以解析元数据。每种模态都有对应的处理方式,最后把各种模态的表示向量融合起来,形成一个完整的内容特征向量。
举个简单的例子,一条群消息是朋友发的一张猫的照片,配的文字是”我家主子又拆家了”。如果只看文字,系统可能觉得这是关于”宠物”的内容。但如果做了图像识别,看到猫的照片,那”宠物”这个标签就打得更准了。再结合这个用户之前对猫粮品牌有过互动,推荐一些宠物相关的内容或者商品,命中率就会高很多。
另外,IM消息还有一个特点是上下文关联性很强。一条消息放在聊天记录里和单独拎出来看,可能完全是两个意思。比如前几条消息在讨论项目进度,突然有人发了个表情包说”累死了”,这个表情包其实是承接了前面的话题,而不是一个独立的娱乐内容。如果系统孤立地理解这条消息,很可能会推荐一些八竿子打不着的东西。
所以,在做内容特征提取的时候,上下文信息一定要考虑进去。这个在技术实现上可以借鉴Transformer架构里的Attention机制,让模型学会关注相关的上下文内容。
有了用户画像和内容特征,接下来就是把它们匹配起来。这个环节通常分成召回和精排两个阶段。
召回阶段的目标是快速从海量内容里筛选出一批可能相关的候选集。因为IM产品里的消息量可能非常大,不可能让每个用户都去遍历所有消息。常用的召回策略有关键词匹配、协同过滤、内容相似度召回等等。这个阶段追求的是速度,可以适当牺牲一些精度。
精排阶段的目标是对召回来的候选内容进行更精细的排序。这时候会引入更多特征,比如用户当前的时间段(工作时间还是休息日)、设备类型(手机还是电脑)、最近的行为序列等等。精排阶段常用的模型有Wide&Deep、DeepFM、DIN这些深度学习模型,结构稍微复杂一些,但效果比简单的规则排序好很多。
这里我想强调一个点:IM推荐的排序逻辑跟信息流产品有个很大的不同。信息流产品希望用户一直刷下去,所以推荐的是”下一个可能感兴趣的内容”。但IM产品里,用户是有明确需求的——他可能正在等某个人的消息,或者在关注某个群里的讨论。如果系统总是推一些”下一个可能感兴趣”的东西,反而会干扰用户的注意力。
所以IM推荐的排序逻辑应该更倾向于“跟我有关”而不是”让我上瘾”。具体来说,那些跟用户当前关注话题相关的、来自用户好友的、互动性强的消息,优先级应该更高。
说到IM场景下的推荐,有一个问题绕不开:实时性。
你想啊,IM软件里的消息是实时产生的。一场直播可能在几秒钟内涌进来几百条弹幕;一个热门话题可能在几分钟内被讨论到几千条;用户刚刚点了一个赞,紧接着肯定想看到相关的后续内容。如果推荐系统做不到实时更新,等用户看到推荐结果的时候,黄花菜都凉了。
但实时推荐对系统架构的挑战是很大的。传统的推荐系统通常是”T+1″模式,每天晚上离线跑一遍任务,第二天更新模型和推荐结果。这种模式用在电商或者视频平台上问题不大,但用在IM上就会很被动。
那怎么做到实时呢?这需要从数据流、模型更新、特征存储三个层面来解决。
首先是实时数据流。消息产生之后要立即进入推荐系统的处理管道,而不是等到晚上统一处理。这需要用到Kafka、Flink这类流处理框架,确保消息从产生到进入推荐系统只有几秒钟的延迟。
其次是增量模型更新。用户的兴趣是动态变化的,一分钟前他还在讨论工作,一分钟后可能就开始聊周末去哪玩了。如果模型不能及时捕捉这种变化,推荐结果就会”慢半拍”。的做法是采用在线学习或者增量训练的方式,让模型能够实时吸收用户的最新行为。
最后是实时特征存储。用户的短期行为特征(比如最近几分钟点击了哪些消息)需要快速读取和更新,这要求特征存储系统有很高的QPS能力。一些团队会选择用Redis或者HBase来存储实时特征,然后用特定的索引结构来加速查询。
说到实时性,这里不得不提一下声网这类即时通讯底层服务商在这方面做的努力。他们在SDK层面就内置了消息通道的实时数据能力,让上层应用可以很方便地获取到消息的实时状态。这样一来,做推荐系统的团队就不需要从零开始搭建实时数据管道,可以把精力集中在算法和业务逻辑上。
一个新用户注册进来,系统对他一无所知,这时候推荐什么呢?这就是经典的冷启动问题。
常见的解法有几种。第一种是让用户主动选择兴趣,比如注册的时候让你勾选”科技”、”财经”、”娱乐”这些标签。这种方式简单直接,但用户体验不太好,很多人会随便选几个应付了事。
第二种是利用注册信息,比如手机号、邀请码、社交账号关联等。如果你用微信登录,系统知道了你的微信号,至少可以拿到一些基础画像。这种方式对用户干扰小,但信息量有限。
第三种是采用热门内容兜底。在对用户一无所知的时候,先推一些普遍受欢迎的内容,比如当天的热门新闻、群里讨论最活跃的话题等等。虽然不够个性化,但至少不会让用户觉得”这软件是空的”。
比较好的做法是把这几种方式组合起来用。用户在注册的时候可以简单选几个大类的兴趣作为初始画像,然后在他开始使用的前几分钟内,快速收集行为数据并调整推荐策略。如果用户在某个内容类型上表现出了明显的正反馈,就及时调整权重;如果用户对某个类型持续无视,就降低相关内容的出现频率。
推荐系统上线之后,怎么评估效果?这是个很重要但经常被忽视的问题。
很多人一看点击率涨了,就觉得推荐做得很好。但IM场景下,点击率高不一定代表用户满意度高。举个极端的例子,如果你总是推一些标题党或者擦边内容,点击率可能很高,但用户其实很烦,时间长了就会流失。
所以评估IM推荐效果的时候,应该关注多个维度的指标:
这些指标要综合起来看,不能只看其中某一个。尤其是负向反馈这个指标,很多团队不太重视,但实际上它是很重要的预警信号。如果某个用户频繁地对推荐内容点”不感兴趣”,说明系统对他的理解偏差很大,这时候要么是他的画像需要更新,要么是推荐策略本身有问题。
聊了这么多,最后说点务实的。智能推荐这个功能,做得好的确能大大提升IM产品的用户体验,但做起来也确实不容易。它不是找个算法团队调几个模型就能搞定的事情,而是需要产品、算法、工程、数据多个团队紧密配合的系统工程。
从数据采集到特征工程,从模型训练到实时计算,从效果评估到迭代优化,每一个环节都有坑。对于中小团队来说,与其从零开始自建推荐系统,不如考虑借助像声网这样的即时通讯服务商提供的能力,把精力集中在产品逻辑和用户体验上。毕竟,IM软件的核心竞争力还是在通讯本身,推荐只是锦上添花的东西。
如果你正在开发IM产品,不妨先想清楚自己到底要推荐什么、解决什么问题,然后再针对性地设计方案。有时候,简单有效的规则比复杂的深度学习模型更好用。先把基础的东西做扎实了,再考虑更高级的优化,这可能才是更务实的路线。
