简介:在个性化推荐与智能客服场景中,用户画像的精准度直接决定业务效果。传统规则与机器学习模型在处理非结构化文本时,难以理解语义、识别隐含情绪,导致画像标签粗糙且滞后。大语言模型(LLM)凭借强大的语义理解与上下文推理能力,为智能用户画像带来了新思路。本文从多源数据融合出发,讲解如何将结构化特征与非结构化文本高效喂给LLM,并拆解情感识别、消费习惯挖掘、价值观推断等核心模块的实现细节;同时针对动态标签生成、幻觉控制、成本优化与效果评估给出可落地的工程方案。这套方法论不仅适用于电商与内容平台,也可为智能客服、用户行为分析等场景提供直接参考,让数据真正转化为可信任、可行动的用户洞察。
1. 这个系统不是拍脑袋想出来的:传统用户画像卡在哪儿了
先交代一下背景。我之前在电商和内容平台都做过用户画像相关的工作,从最早的规则标签到后来的机器学习打分模型,前前后后折腾了七八年。最近这一年多,我把大语言模型引入到画像系统里,做出了一个基于LLM的智能用户画像分析系统,覆盖客户画像、用户行为分析、情感识别、消费习惯挖掘、价值观推断和动态标签生成这几个模块。这篇文章就把整个系统从设计到落地的完整过程拆开讲一遍,包括我踩过的坑和最后稳定运行的方案。
先说为什么要用大语言模型来做这件事。过去我们做用户画像,主流做法是两条路:一条是纯粹的规则体系,比如用户点了某个商品类目三次以上就给他打一个"喜欢3C数码"的标签;另一条是浅层的机器学习模型,比如用逻辑回归或者GBDT预测用户的购买意愿分数。这两条路在数据量小、场景固定的情况下够用,但一旦数据来源变多、涉及文本语义理解,问题就来了。
传统的标签体系有一个硬伤:它只能处理结构化字段。用户的年龄、性别、消费金额、访问次数这些是结构化的,直接进规则引擎或者模型特征矩阵都没问题。但用户留下的真正有价值的信息,其实藏在非结构化数据里——客服聊天记录、商品评价、论坛发言、社交媒体的评论,这些文本数据才是理解用户真实意图的关键。过去我们处理这些文本的方式特别笨:先分好词,再统计高频词,然后用TF-IDF或者Word2Vec转化成向量。这样做的结果就是你只能知道用户"说了什么词",但无法理解用户"想表达什么"。
举个例子。一个用户在售后工单里写:"东西还行,就是发货速度真的让我有点无语。"传统的关键词提取会抓出"发货速度"和"无语"这两个词,然后打上"物流敏感"的标签。但这个用户真的是对物流不满意吗?如果结合上下文看他之前买过三次东西都选的普通快递,这次也是因为急着用才抱怨,那这个标签就不够准确。更深一层的问题是,这种文本分析根本没办法识别反讽、对比、隐含态度这些复杂情绪,更不用说去推断用户的价值观和生活方式了。
这就是我决定引入大语言模型的原因。LLM最核心的能力是语义理解和上下文推理,它能把一段零散的文本还原成有逻辑的意图和情感,还能跨文本地总结用户的一致性偏好。用一个大模型作为画像分析的中枢,配合传统的结构化处理管线,整个系统的画像维度、准确度和动态响应能力都有了质的提升。
这篇文章不打算只讲原理和架构图,我会把每个模块的实现细节、Prompt设计思路、数据融合方案以及我在实践中调整过的参数都写出来。如果你正在做用户画像、用户行为分析、智能客服、个性化推荐,或者手里有一堆用户文本却不知道如何挖掘价值,这篇文章应该能给你一套可以直接上手的思路。
2. 多源数据融合:结构化与非结构化数据怎么喂给LLM
做画像系统,第一步遇到的永远是数据问题。标题里写了"多源数据融合"和"结构化与非结构化数据",这两个词看着简单,实际操作起来非常容易出现两套数据各跑各的、最后没法合并的窘境。我在第一个版本就犯了这个错误,所以这里单独拿出来详细讲。
2.1 结构化数据的ETL管道设计
先说结构化数据。这部分主要包括:用户注册信息(性别、年龄、地域)、行为日志(浏览、点击、下单、加购)、交易数据(消费金额、频次、品类分布)、客服工单(类型、处理状态、处理时长)等。这些数据的格式相对规整,字段名、类型、取值逻辑都是确定的,处理起来最稳妥的方式就是走传统的ETL管道。
我的方案是用Airflow做任务调度,数据从业务库同步到数据仓库的ODS层,然后经过清洗、标准化、宽表拼接,最终落到一个叫 user_feature_wide 的宽表里。宽表按 user_id 做主键,每行对应用户的全量结构化特征。具体来说,我在宽表里维护了以下几个维度:
- 基础属性:年龄、性别、城市等级、注册时长、会员等级
- 消费特征:近30天消费金额、近90天消费频次、客单价分位、品类偏好Top3、价格敏感度分位
- 行为特征:近7天活跃天数、平均停留时长、核心页面访问次数、搜索频次、加购转化率
- 服务特征:近90天投诉次数、平均响应时长、售后工单类型占比
这批特征的产出频率是每天早上跑一次全量、每两小时跑一次增量。宽表的产出结果会写入两个下游:一个是给传统算法模型用的特征存储,另一个是给LLM用的上下文输入。注意这里我就已经埋了一个伏笔——结构化数据不是直接丢给LLM的,而是要先做一层"语义化"加工,后面会具体讲。
2.2 非结构化数据的清洗、切分与嵌入
非结构化数据是这套系统相比传统画像多出来的关键增量。来源包括:商品评价、客服对话记录、用户问卷调查、论坛/社区发言、舆情评论等。这些数据有几个特点:格式混乱(有长段落、有碎片、有表情符号)、口语化严重、存在大量指代和不完整表达。
我的处理流程分四步:
第一步是清洗。去掉HTML标签、无意义符号、乱码、广告夹杂的内容。这里有一个比较细节的点:不要过度清洗。很多人做文本清洗时会把标点、数字全部去掉,这对于分词任务可能是合理的,但对于LLM来说,标点和数字往往承载着情感强化的作用。比如"这东西太慢了!!!!"和"这东西太慢了",情感强度完全不同。所以我只做基础去噪,保留标点和数字的原始状态。
第二步是IDF筛选和分段。先统计一下所有文本的总量,如果一个用户在所有数据源里的文本加起来超过一定长度(比如超过2000字),就按语义段落切分成多个chunk。切分的时候要保证每个chunk是一个相对完整的语义单元,不能把一句话拦腰切断。我用的是滑动窗口 + 句号分隔符的双重策略,窗口大小为800字、重叠128字。
第三步是向量化嵌入。我最初用的是text-embedding-ada-002,后来切换到更便宜且效果接近的bge-large-zh。对于中文场景,bge系列的稳定性比OpenAI的嵌入模型更让人放心。嵌入后的向量统一存到向量数据库里,同时存储原始文本和对应的元数据(用户ID、来源渠道、时间戳)。
第四步是建立用户级别的文本聚合视图。这一步很关键。向量数据库存的是chunk级的索引,用于后续的检索,但画像系统还需要一个"用户维度"的聚合理解。我会把同一个用户的所有文本按时间排序,拼接成一份用户文本档案,这份档案会在后续的画像生成中被LLM整体读取。
2.3 融合层:为什么不能直接把原始数据全塞给LLM
这是我在架构设计上做得最纠结也最值得说的一点。刚开始我试过一种简单粗暴的方案:把用户宽表的所有字段加上所有文本记录拼成一个巨大的JSON,然后一次性丢给LLM,让它"自由发挥"生成画像。结果惨不忍睹——Token消耗巨大、响应延迟高、生成结果不稳定,而且经常出现幻觉,比如明明用户没有买过母婴商品,LLM却因为某个上下文片段推断出"该用户可能已为人父母"。
后来我总结出正确的融合方式:不是把数据都塞给LLM,而是先由前置模块加工成"LLM友好的输入"。结构化数据经过统计分析后变成一个高度浓缩的画像摘要,非结构化数据则通过检索或者总结得到一个观点摘要。LLM拿到的是这两份摘要,加上一小部分关键的原始引用,而不是海量的原始记录。
具体而言,我设计了一个 query_rewriter 模块,它负责根据当前画像任务(比如这次要分析情感还是推断价值观),从宽表和文本聚合视图中有选择地提取最相关的信息,拼装成上下文。这个方案的核心思想是:数据量越大,越要靠"信息筛选"而不是"全文搬运"来保证结果质量。
2.4 数据更新的节奏:实时与批量的取舍
多源数据有一个容易被忽视的问题:数据的时效性不一致。交易数据是秒级产生的,客服文本是事件驱动的,情感态度则可能随着时间变化。如果所有数据都按同一频率更新,要么浪费计算资源,要么导致画像滞后。
我的方案是分级更新策略。行为类指标(活跃、浏览)走准实时通道,Kafka接入后5分钟刷新一次;交易类指标走小时级;文本画像标签走天级;价值观、生活方式这类稳定性高的标签走周级。这样既控制了成本,又能保证高时效性特征不拖后腿。
这里有一个经验:不要为了追求"实时画像"而把所有标签都实时化。价值观、消费风格、兴趣偏好这类标签本来就是一个相对稳定的量,你实时刷新100次,结论也不会变,只是白白消耗算力。真正需要实时的是"当前意图",比如用户正在看什么、准备买什么,这个另建一套实时通道来管就好。
3. 画像能力拆解:情感识别、消费习惯挖掘、价值观推断的实现细节
这一节是整套系统的核心部分。标题里列了客户画像、用户行为分析、情感识别、消费习惯挖掘、价值观推断、动态标签生成这几个子能力,我逐个讲实现方式和Prompt工程细节。
3.1 情感识别:比正负二分类多走一步
很多团队做情感分析,止步于"正面/负面"二分类,顶多再加一个"中性"。但做用户画像时,这种粗粒度的情感远远不够。用户说"质量还行"和用户说"质量惊艳",都归类为正面,但两者映射到用户心智和复购行为上完全不同。
我在系统里用的是六分类的细粒度情感体系:认可、期待、不满、失望、愤怒、平静。前两种是正向情感,中间两种是负向情感但强度有差异,愤怒是强负向需要拉响服务预警,平静则是中性但往往意味着低卷入度。
Prompt的设计上,我要求模型输出JSON格式的结果,包含情感类别、情感强度(1~10)、触发原因、涉及的实体对象。这里贴一下我实际在用的Prompt模板(已经做了脱敏和简化):
你是一个专业的用户情感分析助手。请分析以下用户文本的情感倾向。 要求: 1. 从以下类别中选择最匹配的一个:认可、期待、不满、失望、愤怒、平静 2. 给出情感强度评分(1-10分,分数越高代表情感越强烈) 3. 用一句话说明触发该情感的具体原因 4. 提取文本中涉及的实体对象(如商品、服务、物流、客服等) 输出格式(严格JSON): {"sentiment": "类别", "intensity": 分数, "reason": "原因", "entities": ["实体1", "实体2"]} 用户文本: {text}这个Prompt看起来简单,但有几个细节值得注意。第一,输出格式限定为JSON,这能大幅降低后续解析成本;第二,要求模型给出触发原因,这个原因本身就能作为画像中的"证据"字段,方便后续核查;第三,实体对象的提取为后续的品类偏好分析做了铺垫。
实测效果:在人工标注的2000条测试集上,六分类的准确率在82%左右,强度评分的平均绝对误差约为0.7。相比我之前用BERT微调做三分类的方案,准确率提升了大约5个百分点,而且泛化能力更好,遇到新品类、新表述方式时不会轻易翻车。
3.2 消费习惯挖掘:从订单数据到行为模式的解释性总结
消费习惯挖掘是这类系统里跟业务指标结合最紧的部分。传统做法是统计用户在各品类的消费占比、价格区间分布、购买时段分布,然后贴上一堆"高价值用户""价格敏感型"的标签。但这样做出来的标签解释力很弱,运营同学看到"高价值用户"四个字依然不知道该怎么跟用户沟通。
我的思路是用LLM来做"解释性总结"。先让统计模块产出结构化的消费指标——品类偏好Top3、价格带分布、购买时间分布、大促参与度、优惠券使用率、退货率等,然后把这些指标以JSON的形式提供给LLM,让它生成一段连贯的用户消费习惯描述。
以我实际得到的输出为例,对于一位用户,系统生成的结果是这样的:
"该用户近90天的消费集中在美妆和个护品类,客单价处于中高水平(200-400元区间),对套装类商品偏好明显。用户有明显的价格敏感行为,购买决策前通常会对比3-5个同品类商品,优惠券使用率高达78%。值得注意的是,用户晚22点至24点时段的购买占比超过40%,属于典型的夜间决策型消费者。"
这段话的效率非常高。它不仅是几个标签的堆砌,还给出了消费场景的画像和潜在的行动建议——晚间时段推送、重视性价比验证环节,这些都是做营销干预时可以直接使用的信息。
实现上有几个提速技巧。一是用结构化指标直出文本,不要让LLM自己看流水数据,否则又贵又慢;二是把常见的消费模式总结做成少量样本示例放进Prompt里,引导输出风格保持一致;三是对近30天无消费记录的用户,在Prompt里强制要求标注"近期活跃度下降",避免模型产出与事实冲突的结论。
3.3 价值观推断:最有争议也最有价值的模块
价值观推断是这套系统里最具"智能感"的部分,也是最容易做砸的部分。为什么这么说?因为价值观不像消费行为那样有明确的统计信号,它需要从用户的言论、选择、偏好中做归纳和推理,出错风险很高。
我的实现思路是:不做"判断",只做"归纳"。具体来说,系统不直接输出"该用户属于某某类型人群"这样的判断性标签,而是输出"该用户在以下维度上表现出稳定的倾向",每一个倾向都附带证据文本。
Prompt的引导词大概是这样:
请基于用户的文本记录,归纳该用户在以下几个方面表现出的稳定倾向: 1. 对品质与服务的要求层级 2. 对新事物的接受程度 3. 对品牌的态度(品牌忠诚 vs 功能导向) 4. 生活方式取向(效率优先 vs 体验优先) 要求: - 只归纳有文本证据支撑的倾向,不要推测用户的身份、职业、收入等敏感属性 - 每个倾向标注证据(引用原文片段) - 如果没有足够证据,请明确输出"证据不足"这个设计有两点考虑。第一,用"倾向"替代"标签",在表达上更严谨,也更容易被业务方接受;第二,强制要求"证据引用"和"证据不足"的存在,就是为了抑制LLM的过度推测倾向。实测初期,不做这个约束时,模型经常"脑补"出用户的职业和家庭情况,比如从买了一次母婴用品就推断用户是"宝妈",这显然是危险且不准确的。
价值观推断这个模块上线后,我最常收到的反馈是:它生成的用户描述比传统标签更容易让一线的运营同事产生认同感。因为传统标签只是"高活跃"“高消费”这类冷冰冰的词,而LLM生成的内容更像一个真正理解用户的人写的用户小传。
3.4 用户行为分析:把行为序列翻译成用户语言
用户行为分析我用了另一个思路——把行为序列转成自然语言事件流,然后让LLM做模式识别。传统的用户行为分析用序列挖掘算法(比如PrefixSpan、FP-Growth)找频繁模式,但找到的模式往往是"浏览A→浏览B→购买C"这种可读性很差的结构。
我的方案分两步。第一步,用一个行为翻译器把原始行为日志转成事件描述,比如:
- 原生日志:{"event": "detail_view", "sku": "12345", "category": "手机", "duration": 45}
- 翻译后文本:"用户在22:13分查看了一款手机商品详情页,停留45秒"
第二步,把用户一段窗口时间内的所有事件文本交给LLM,让它识别行为模式。系统会输出类似这样的分析:用户有明确的目标导向型购买行为,决策链路集中在对比阶段,通常会在3天内完成从浏览到购买的转化,但容易受到评价中负面信息的影响而在最后一步放弃。
这种分析的价值在于,它不只能回答"用户做了什么",还能回答"用户的行为路径说明了什么"。这一点是传统序列挖掘很难做到的。实际应用的时候,这套行为分析的结果会被用来做流失预警和干预触发,比如识别出"连续多次放弃结算"的用户,自动触发客服关怀任务。
4. 动态标签生成:从静态标签到有生命周期、有证据链的标签
用户画像的最终呈现形态是标签。市面上大多数标签系统都是静态的:打上去就是打上去了,几个月不动。这种静态标签的问题在于,用户的兴趣和意图会漂移,很多标签等到真正使用时已经过时了。我在这个系统里设计了动态标签生成机制,核心是给每个标签加上生命周期和证据链。
4.1 标签体系的层级结构与生成逻辑
我把标签分成三个层级:基础标签、业务标签、推理标签。
基础标签直接来自结构化数据,比如"女性""北京""30-35岁""注册时长大于2年",这类标签不需要LLM参与,用规则就能处理,我保留它们在传统管线里生产。
业务标签是运营视角的概念标签,比如"高潜力转化用户""价格敏感型""夜间活跃""内容创作者偏好",这些标签由LLM综合结构化特征和文本特征生成,带有一定的业务解释性。
推理标签是LLM综合判断后的深层标签,比如"品质生活导向""家庭决策型消费者""品牌忠诚度高",这类标签不直接依赖某个指标,而是通过对多源信息的归纳推理得出。
标签生成不是一步到位的。我的系统采用两阶段生成:第一阶段,LLM基于用户所有的上下文信息生成候选标签列表和证据文本;第二阶段,一个校验模块对候选标签做合法性检查,过滤掉敏感标签、证据不足的标签和与基础事实冲突的标签,然后才写入标签库。
4.2 标签的置信度、生命周期与自动化更新
每个标签在入库时都带着四个字段:置信度分数、证据引用、首次生成时间、最后更新时间。置信度由LLM生成时的自评分和规则校验结果共同决定,低于阈值的标签只留在候选区,不进入正式的用户画像接口。
生命周期管理是动态标签的核心。我的策略是:行为驱动的标签更新优先,时间驱动的标签衰减为辅。具体来说,当用户产生新行为时,触发相关标签的更新;如果某标签长期没有被触发,置信度会按时间衰减。衰减系数我调成了平滑线性衰减,90天内无激活的标签置信度减半,180天无激活的标签自动降级为候选标签,等待重新验证。
这套机制解决了一个很现实的问题:画像系统的标签不再越积越多、越来越脏。我见过很多团队做画像,做了两三年标签库膨胀到几万个,大量标签互相矛盾,实际可用率不到一半。有了生命周期管理之后,标签库维持在相对精简的状态,每个标签都有存活依据,使用方也更容易信任系统输出。
4.3 标签解释性设计:给业务方一个"宁可展示证据"的界面
标签系统的最后一个拦路虎是业务方的信任问题。运营同学和客服同学天然不信任一个"黑盒标签",他们会问:为什么系统说这个用户是价格敏感型?依据是什么?
我因此在标签管理的输出接口里加入了一个"证据展示"字段。每个标签输出时都附带上证据链——具体的数据指标或者文本片段引用。业务侧查看的时候,可以直接看到"依据用户原文:'再便宜点我就下单了,比了好几家了'"这样的支撑信息。这个改动看起来很小,但对系统落地帮助巨大。信任感上来了,系统使用率自然就上去了,画像数据也才能真正驱动业务的精细化运营。
5. 上线之后的坑:幻觉控制、成本控制、评估方法论
这一节是实战经验的集中展示。再漂亮的架构,跑到生产环境都会遇到一堆文档里不会写的问题。我挑几个典型的来讲。
5.1 幻觉问题:LLM会一本正经地编造用户特征
幻觉是LLM应用到画像场景最危险的问题。我遇到过一个典型案例:一位用户只买过一次宠物用品,LLM在生成标签时写了"该用户养了一只柯基犬"。这个结论是怎么来的?因为用户的某条评价里出现了"我家狗子"这个口语化表达,而训练语料里"柯基"和"狗子"的关联度太高,模型就自行脑补了品种信息。
这类幻觉如果不加控制,后果很严重。一是画像失真,二是如果业务方拿着错误标签去做营销,比如给用户推送狗粮,用户根本不需要,反而造成体验损伤。
我总结了三道防线的控制方案。第一道防线是Prompt层,明确要求模型"只能基于提供的文本做推断,不得补充背景知识";第二道防线是证据校验,标签的生成必须附带证据引用,如果证据无法从原文中定位,标签直接丢弃;第三道防线是结果审核,对生成画像做抽样人工复核,统计幻觉率作为监控指标,一旦超过阈值就触发告警。
这三道防线并不能完全消灭幻觉,但能把影响降到可接受的范围。我现在系统里的幻觉率控制在3%以内,且大多集中在低风险标签上,影响有限。
5.2 成本控制:Token消耗的优化策略
LLM做画像的Token消耗是传统算法不需要考虑的额外成本。一开始我把所有用户的全部文本都塞给模型分析,一个月下来账单数字相当惊人。后来做了三个优化,成本下降到原来的四分之一。
第一,把固定不变的内容移到System Prompt里。用户画像的"任务说明"和"输出格式"是每次调用都一样的,这部分放入System Prompt可以稳定复用,不用重复计费到每次的上下文里。
第二,做文本预筛选。不是所有文本都值得给LLM分析。我先用低成本的关键词匹配和情感得分初筛一遍,只把信息密度高、情感强度高的文本喂给LLM。纯寒暄类的客服对话、毫无信息量的评论,直接跳过。
第三,引入缓存层。用LLM生成的画像结果按用户+时间窗口做缓存,同一个用户在短时间内重复请求画像时,直接命中缓存,不重新调用模型。画像本身就是低频变动的数据,缓存命中率只要做得好,收益非常可观。
5.3 画像质量的评估方法论
最后一个坑是如何评估画像做得好不好。传统标签的评估可以用准确率、覆盖率这些指标,但LLM生成的描述性画像没有唯一的标准答案,很难做自动化评估。
我的做法是构建了两套评估体系。第一套是从业务效果侧的A/B测试:把画像结果用于实际的运营策略——比如用画像做个性化Push的文案优化、商品推荐的排序调整——然后对比实验组的点击率、转化率、客单价等业务指标。这是最客观的评估,毕竟画像系统的最终价值还是要落到业务指标的提升上。
第二套是定期的模型输出人工盲评。把LLM生成的画像和传统算法生成的画像混合在一起,让业务侧的同学盲评,从"准确性""丰富度""行动指导性"三个维度打分。这套评估虽然耗时,但能发现很多自动化指标发现不了的问题,比如生成内容模板化、过于泛泛而谈、缺乏个性化的现象。
目前系统稳定运行了大半年,画像的月活调用量在千万级别,业务侧的核心转化指标相比使用传统画像系统时提升了约12%。这个提升当然不只是画像系统的功劳,但它至少说明一点:让LLM参与用户画像分析,方向是对的,关键是把工程细节做扎实。
最后再分享一个我个人操作中的小技巧。很多人用LLM做用户分析,习惯一次性把所有任务丢给模型,让它既做情感分类又做消费总结又做价值观推断,结果每个任务都做得不够好。我的建议是拆分成独立的调用链路,每个模块专注一件事,模块之间用数据管道串联。虽然调用次数多了、整体延迟变长了,但每个环节的质量都更容易保证和迭代——工程上宁要多个小步的确定性,也不要一个大步的碰运气。
本文还有配套的精品资源,点击获取