ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

One ID 用户统一身份打通:从概念到落地的完整技术指南

One ID 用户统一身份打通:从概念到落地的完整技术指南 第一次接触one id这个概念是在做用户画像项目的时候。当时业务方提了一个特别朴素的需求同一个客户在小程序里下了单在App里留了咨询记录又在客服热线里投诉过一次为什么后台看到的是三个完全不一样的人我盯着三张表里的user_id、openid、phone_number突然意识到所谓的用户数据资产如果底层身份对不上再多标签都是空中楼阁。这就是one id的起点把散落在不同系统、不同触点里的同一真实用户重新认出来合并成一个全局唯一的身份标识。这篇内容我会从概念、技术路径、落地流程到常见坑点一次性讲清楚。适合刚接触用户画像、数据中台、CDP建设的产品经理、数据工程师和数据分析师也适合所有被多端用户对不上折磨过的同学。文章里所有流程和方案都来自真实项目实践不是教科书式的理论堆砌。1. one id到底在解决什么问题1.1 数据孤岛与同一用户的割裂先从业务侧说起。今天的用户触点实在太碎了微信小程序、公众号、抖音号、官网、线下门店POS、客服工单系统、短信营销平台每个系统都各自为政都有自己的用户ID。小程序里叫openidApp里叫device_id或user_id线下门店记的是手机号客服系统用的是客户编号。这些ID之间没有任何天然关联同一个真实用户在不同系统里就是几条互相看不见的孤岛数据。孤岛的后果首先是数人头数不清。市场部说我们全域有2000万用户技术部一查数据库发现物理记录有8000万条谁都不敢说自己是错的因为大家统计的口径压根不是一个东西。然后是策略打不准用户在小程序里把商品加入了购物车但因为小程序ID和App ID没有打通App端的推荐系统完全不知道这个人有明确购买意向照样给他推完全不相关的品。更严重的在风控场景同一账号体系下的设备、行为、手机号被拆成多段欺诈特征根本拼不完整异常交易识别率大打折扣。one id要做的就是建立一张全局的身份证对照表。这张表维护着每个真实用户的所有历史ID、常用设备、绑定手机号、关联地址并分配一个全局唯一标识。有了这张表所有下游系统只认one id查询时再展开成各个子系统的本地ID问题就从根本上解决了。1.2 one id的价值边界与适用场景不过先泼一盆冷水one id不是万能的。它本质上是身份解析问题解决的是这些ID是否属于同一个人而不是这个人叫什么名字、年龄多大。身份解析和价值挖掘是两件事很多人一开始就把它们混在一起结果项目做到一半才发现方向错了。从实际落地看one id在下面几类场景里价值最大用户统一视图把CRM、交易、客服、营销等多系统数据合并到一张客户360画像上解决多个ID对应一个真实人的问题。跨端营销触达用户在A渠道留过手机号在B渠道关注了公众号通过one id打通后可以跨渠道识别并统一触达避免重复打扰。反欺诈识别合并设备、IP、手机号、地址等信息后能识别出换了手机号但在同一设备上继续操作的风险账号。数据中台建设作为主数据的一部分为下游数仓、标签体系、推荐系统提供统一的实体主键。反过来如果业务本身只有单一触点、没有跨系统诉求或者用户信息极其敏感、合规成本过高one id的优先级就要往后放一放。技术选型最怕的不是技术难而是在不合适的场景里硬上。2. one id的技术底座从ID映射到实体解析2.1 核心概念原始ID、OneID、ID映射关系在动手之前先把术语统一一下。我们通常说的原始ID也叫局部ID是各业务系统里自成一体的用户标识比如openid、unionid、手机号、邮箱、设备IMEI、IDFA、OAID、cookie里的匿名ID等等。OneID则是跨越所有系统的全局唯一标识一般是一串无业务含义的UUID或雪花ID。中间连接两者的是一套映射关系用大白话说就是哪个原始ID跟哪个原始ID指向同一个人。映射关系有三种基本形态1对1一个手机号对应一个one id一个openid对应一个one id。1对多理论上一个one id会关联多个原始ID但一个原始ID原则上不应该归属多个one id否则就是冲突。多对多出现在原始关系未收敛的中间态最终会被one id的生成逻辑归一化。这里有一个关键点one id体系里存的不只是ID对上ID的关系表还应该记录每次关联的置信度、关联时间、关联来源规则。因为用户关系是动态变化的今天用手机号关联明天可能用设备ID关联这些记录是后续修复和审计的依据缺了它项目维护期会非常痛苦。2.2 实体解析的三种匹配思路实体解析Entity Resolution是one id的核心算法环节。实践中常用的匹配思路有三类按复杂度排序。第一类是精确匹配最简单也最可靠。手机号完全相等、邮箱完全相等这类强标识ID之间可以直接认定是同一人。实操时注意手机号和邮箱这类信息有复用风险一个手机号可能被家人共用一个邮箱可能是公共邮箱所以精确匹配的规则里一般还要叠加时间窗口、使用频次等辅助条件。第二类是模糊匹配常见于地址、姓名这类弱标识字段。姓名相同、地址相似、生日一致这些信息单拎出来都不够硬组合起来可信度就上去了。常用手段是编辑距离、Jaccard相似度、拼音匹配等算法给每个字段的相似度打分再加权汇总出综合置信度。模糊匹配的难点在阈值的设定阈值太低会误合并阈值太高又漏合并后面我会专门讲怎么调。第三类是基于图的关系推断也是目前大型CDP系统的标配。把每个原始ID当作图中的节点把共享手机号、共享设备、共享IP关系当作边利用连通图、标签传播、社区发现等算法把朋友的朋友这种弱关系也利用起来。比如A手机号和B设备ID有过绑定B设备ID又和C手机号有过绑定虽然A和C没有任何直接交集但通过两跳关联可以推断A和C大概率是同一人。这类方法召回率高但误伤也高一般只作为候选集还需要人工规则兜底。2.3 工具选型自研还是引入成熟方案聊完算法思路再聊工程实现。很多团队会纠结one id到底自研还是采购第三方工具我的建议是看你的业务规模和数据敏感度。如果只是几百万用户量级的内部数据打通自研完全可行。一份ID映射表落到Hive或者MySQL再加一套Spark任务定期跑批量匹配配合图计算框架做连通图合并两三个工程师一个月就能做出可用版本。成本低、可控性强缺点是匹配效果、性能调优都要自己趟坑。如果数据规模到了亿级、实时性要求高或者需要很强的可视化逐人排查能力建议引入成熟的CDP或客户数据中台产品。市面上的主流产品基本都内置了ID解析引擎、隐私计算模块和可视化ID图谱能省掉大量底层工作。但代价是数据要过第三方平台合规审查这一关必须提前走。我见过不少项目因为采购流程和合规评估耗了半年最后业务窗口期都过了。一个折中方案是自研开源组件混搭底层存储用图数据库比如Neo4j、JanusGraphID匹配用自研规则引擎图合并算法用开源的连通图计算库这样既保留灵活性又不用从头造轮子。3. 一个最小可落地的one id打通流程3.1 数据接入与ID标准化处理无论方案多先进第一步永远是数据接入和清洗。这一步做不好后面的匹配和合并全是垃圾进垃圾出。我通常建议把ID标准化分成四步字段抽取、格式清洗、字段打分、ID去重。字段抽取指的是从各业务系统的用户表、日志表、订单表里把候选ID字段提取出来像user_id、openid、unionid、phone、email、device_id、device_fingerprint、imei、idfa、oaid、cookie_id等全量纳入。格式清洗是统一格式手机号去空格、加区号邮箱转小写设备ID统一字母大小写日期格式全部转成标准时间戳。字段打分是给每个ID字段赋予可信权重。我的经验是手机号权重最高通常0.9以上邮箱其次微信unionid和openid再次设备ID和指纹ID要看采集环境。特别要提醒的是设备ID这类字段是最容易出问题的因为清缓存、重装系统、多开应用都会导致设备ID变化给它打太高权重会直接拉低整体准确率。ID去重是很多人会忽略的步骤。同一张源表里同一个用户可能出现多次同一个设备ID在不同时间段会被重新生成如果不提前去重和过滤后面做连通图的时候会出现大量自环和冗余边性能会被拖垮。建议在接入层就建立原始ID-源系统-首次出现时间-最近出现时间-出现次数的明细表后续匹配时可以直接用这张表做统计分析。3.2 ID关系构建与置信度打分数据准备好之后开始构建ID与ID之间的关系。这一步要做的是把每条用户行为记录转换成ID关系对并计算关系强度。举个例子订单表里有一条记录关联了user_idU001phone138xxxxdevice_idD001。那么我们就认为U001和138xxxx之间存在一条关联边U001和D001之间也存在一条关联边138xxxx和D001之间也存在一条关联边。每条边都要记录来源表、关联时间、关联次数。有了关系对接下来计算置信度。置信度分两层第一层是单条关系的置信度主要看ID字段本身的强信号强度第二层是综合置信度把两个ID之间所有历史关系的强度汇总。汇总方式我常用的是加权求和再加时间衰减score Σ(w_i × conf_i × decay(t_i))其中w_i是字段权重conf_i是单次匹配置信度decay(t_i)是时间衰减因子最近半年内的关联权重为1半年前到一年内的权重衰减到0.7更早的衰减到0.4甚至更低。这个公式不难但非常有效它能自动让最近频繁共现的关系排在前面很久以前碰巧关联过一次的关系沉到后面。完成打分后设定一个合并阈值。比如综合置信度大于0.8的直接判为强关联0.5到0.8的进入待定池由后续算法进一步判断低于0.5的暂时保留不合并。阈值到底定多少取决于业务对误合并和漏合并的容忍度这是个反复试出来的参数没有标准答案。3.3 图合并与OneID生成关系边和置信度都准备好了下一步就是图合并。这里要做的核心操作是把所有原始ID视作节点所有通过高置信度关系连接的节点归入同一个连通分量每个连通分量分配一个one id。以Spark上的GraphX为例连通分量的计算可以直接调用connectedComponents算子。但实操中要注意一个细节直接对整个全量ID图跑连通分量很容易出现一个大分量吞掉几百万用户的悲剧。因为互联网数据里存在大量弱关联比如同一个公共WiFi下的设备ID会抱团共享同一台老手机的手机号会抱团一旦阈值太低整个图会被连成一片。所以我的做法是分级合并第一轮只用最强的关联关系手机号、邮箱这类做连通分量产出一批高置信度one id第二轮用中等置信度关系设备ID、收货地址尝试把已有的one id合并但合并前要校验两个分量之间是否存在矛盾边第三轮才考虑弱关系。每轮合并都要停顿校验而不是一把梭哈全部跑完。OneID本身的生成规则业内常用的是UUID或雪花算法。我个人的习惯是one id字符串里可以嵌一位校验位或分片位方便后续按one id做数据分片和路由。有些团队为了好看会在one id里加入用户注册时间等业务信息我并不推荐因为这意味着one id有一定概率重复或泄露敏感信息一旦暴露就是个大问题。3.4 标签归并与下游应用OneID生成完后真正影响业务的是标签归并这一步。简单说就是把各源系统里关于同一one id的所有标签、行为、订单全部合并到一张宽表里形成一个用户的完整画像。标签归并里有几种典型情况同一字段不同源取值冲突。举例来说订单系统的用户性别是男客服系统的性别是女合并时听谁的我的处理原则是按数据源权威性排序交易类系统的可信度最高然后是有实名认证的信息再然后是用户主动填写的信息最后才是推断类标签。这个排序要写死到配置里不能靠人工拍脑袋。另一个常见问题是标签时效。用户今天可能还是高消费人群三个月后就沉寂了。所以宽表里的标签最好都是最近一次时间累计次数最新值的结构而不是单纯的当前值。下游做筛选时可以用最近一次下单时间在30天内且累计消费500这种条件既灵活又不容易指鹿为马。下游应用的对接一般是提供两类接口一类是离线批量接口通过one id批量拉取标签另一类是实时查询接口通过任意原始ID反查one id再查画像。实时查询的性能优化是另一个大话题常见的做法是维护一张原始ID到one id的反查索引表数据量大的时候用Redis或HBase加速。4. 实操中的常见问题与排查技巧4.1 设备ID漂移与无效ID做one id一段时间后你会发现最让人头疼的不是算法不够高级而是数据源本身太脏。设备ID字段尤其夸张用户清一下App缓存设备ID就变了系统重装一次ID又是新的同一个用户换着用两部手机两个设备ID本来都是他但关系建立不到一起去。排查这类问题时我建议先统计ID稳定性指标每个设备ID关联了多少个one id每个one id关联了多少个设备ID。如果发现大量设备ID同时指向几十上百个one id说明设备ID的采集或清洗环节有bug比如把网关IP或公共参数错误地当成设备ID存了下来。还有一种情况是无效ID泛滥比如全0的IMEI、字符串unknown、初始值null这些要在接入层直接过滤掉不要进入关系构建流程。另外要注意设备ID类字段适合作为辅助关系而非核心关系。我的经验是设备ID参与构建的关系永远不单独用于合并只用来加强其他关系。只有当A手机号和B手机号共享了至少两台设备时才允许把A和B合并这样可以大幅减少误合并。4.2 冲突与矛盾数据处理冲突指的是数据逻辑上互相矛盾同一个one id下面同时挂了两个完全不同的手机号而且两个手机号各自关联了不同的收货地址和登录行为这到底是同一个人还是两个人在共用账号遇到冲突先不要手动改数据而是建立冲突检测规则。常见的检测手段是矛盾边校验如果A节点和B节点之间有一条强关联边说它们该合并但同时存在另一组强关联边证明A和C、B和D是不同的人那么系统要能识别出这种不一致性并把这条关系降到中等置信度以下。一个真实项目的经验有一次我排查一个one id覆盖了3万多个手机号的异常最后发现源头是某个合作渠道批量注册了虚假账号所有账号共用一个设备指纹。如果当时没有冲突检测机制这3万多个账号就会被错误合并成一个人整个用户数统计直接崩塌。所以我现在做one id项目第一件事就是先把最大连通分量大小做成监控指标一旦某个分量的原始ID数量超过预设阈值自动告警。4.3 准确率与覆盖率如何平衡准确率和覆盖率就像跷跷板。阈值定得高合并保守准确率高但覆盖率低大量用户仍然分散成多个碎片阈值定得低覆盖率上来了但误合并增多用户A的画像里混进了用户B的行为下游模型自然被带偏。我常用的平衡方法是双阈值人工抽检。具体来说用高阈值产出一批绝对可信的合并结果用低阈值产出一批候选结果两者差集就是灰色地带。每周抽取灰色地带的一定样本做人工核实然后根据核实结果调整权重和阈值参数。这种人工反馈闭环听起来不fancy却是保证生产质量最有效的手段。评估指标上我一般关注三个数合并率被合并到多ID用户中的用户占比、误合并率抽样人工核实出错的占比、以及用户投诉率如果业务侧有申诉机制。三个指标要组合着看单独追求某一个都容易翻车。4.4 冷启动与增量更新冷启动阶段最尴尬历史数据只够构建部分ID关系大量用户因为只有一个触点暂时无法关联到one id。这个阶段不要硬合并先把能识别的都识别出来给一个临时的单节点one id后续随着数据积累再逐步合并。这就像拼拼图先拼出几个独立的碎片后面边角对上了再粘连。增量更新是另一个重头戏。全量重跑连通分量在数据量小的时候还能忍数据量一大就是灾难天天跑任务跑不完。我的做法是离线全量计算只做周期性低频调度比如一周一次重点保证实时增量合并的准确性和性能。增量合并的思路是新数据进来时先找到每个原始ID对应的已有one id如果所有ID都各自有归属且属于同一个one id什么都不用做如果属于不同one id就触发合并判断用新关系和历史关系综合打分决定是否把两个one id合并成一个。这里要特别提醒one id合并容易拆分难。一旦两个one id被合并再要拆开所有下游的标签、订单、行为都要跟着回滚工程量巨大。所以增量合并的阈值一定要比离线全量更保守宁可暂缓合并也不要轻易把两个用户绑死。5. 关于one id我踩过的坑和一些个人经验项目做得越多越觉得one id的核心难点不在算法而在工程耐心。最初做第一版的时候我以为把连通分量算完就万事大吉了结果上线第二天就被运营找上门某头部主播的粉丝群里一万多个用户因为共享了同一个福利活动链接被合并成了同一个one id。原因很简单活动链接里带了同一个source_id而我把source_id误当成了设备ID参与建模。那一次让我深刻体会到不是所有ID字段都能进模型字段的血缘和业务含义必须一个一个地过。另一个经验是one id体系的运维比建设更吃时间。你需要持续监控各类ID的命中率、合并率的波动需要关注规则迭代对历史结果的影响还需要为下游提供一个可解释的为什么这两个ID被合在一起了的查询工具。没有这个工具一旦业务方对某个用户画像提出质疑你连排查的入口都没有。最后分享一个做增量的小技巧在每次增量合并前把候选合并对连同它们的关键证据关联字段、时间、置信度落一份快照表。这样即使并错了也能在事后快速定位是哪条规则、哪个字段导致的而不是面对黑箱只能重跑全量。on id项目里后悔药不是靠运气而是靠完善的日志和审计机制。如果你正准备启动自己的one id项目我的建议是从一个小范围、高价值的业务域切入先打通两个数据源跑通全链路验证方法论有效之后再扩展到全域。别一上来就搞大而全否则大概率会陷在无穷无尽的数据清洗和关系核对里。希望这些经验能让你少走一些弯路。
返回列表