长序列怎么压缩与摘要?
生成式推荐中序列截断、记忆增强与分层建模方法
原题:当用户的交互历史序列过长(如数千次点击或浏览记录)时,在构建生成式推荐或序列建模系统中应如何有效压缩、摘要或选择关键信息?请讨论可行的序列截断、记忆增强或分层建模方法。
Agent · 小红书真题
30 秒回答
- 用Key-Value结构存储历史item的embedding
- 当前query与memory做注意力读取,类似RAG检索
- 代表:DIN中的Activation Unit、Transformer-XL的Segment-level Recurrence
- 压缩:用MLP或Autoencoder将多步历史聚合成固定维向量(如User2Vec)
回答与解析
核心思路
长序列推荐的关键矛盾:无限增长的历史 vs 有限的计算预算和有效上下文长度。解决路径分三层:截断筛选 → 记忆压缩 → 分层抽象。
一、序列截断:快速筛选高价值信号
| 策略 | 做法 | 适用场景 |
|---|---|---|
| 时间衰减截断 | 保留最近N天,或按指数衰减加权 | 兴趣漂移快的场景(如资讯) |
| 行为重要性采样 | 按点击/停留时长/转化权重筛选Top-K | 行为质量差异大的场景 |
| 双路召回 | 短序列走精排,长序列走粗排召回 | 工程分层架构 |
小红书场景:笔记浏览序列中,收藏/点赞/完播 应比 快速划过 获得更高保留优先级。
二、记忆增强:外部化存储与压缩
1. 外部记忆网络(Memory Network)
- 用Key-Value结构存储历史item的embedding
- 当前query与memory做注意力读取,类似RAG检索
- 代表:DIN中的Activation Unit、Transformer-XL的Segment-level Recurrence
2. 记忆压缩/摘要
- 压缩:用MLP或Autoencoder将多步历史聚合成固定维向量(如User2Vec)
- 摘要:用小型模型或规则生成"兴趣标签"(如[美妆爱好者, 近期关注孕期护肤])
3. 稀疏注意力/线性注意力
- Longformer、BigBird的局部+全局注意力,降低O(n²)到O(n)
三、分层建模:多粒度兴趣分离
Session-level(短期): 最近10-50次行为 → 即时意图
↓ 聚合
Interest-level(中期): 周/月级主题分布 → 阶段性偏好
↓ 聚合
Persona-level(长期): 用户画像向量 → 稳定特质
- 实现:低层Transformer编码session,高层网络或图网络聚合
- 代表工作:阿里SIM(Search-based Interest Model)——先搜索相关历史再精细建模
四、工程权衡
| 方案 | 计算成本 | 信息损失 | 实现复杂度 |
|---|---|---|---|
| 硬截断 | 低 | 高 | 低 |
| 注意力压缩 | 中 | 中 | 中 |
| 外部记忆 | 中 | 低 | 高 |
| 分层摘要 | 高 | 低 | 高 |
小红书实践建议:结合 时间加权截断 + 关键行为记忆网络 + Session聚合,在GPU显存和效果间找平衡点。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 本质是时间与成本之间的博弈
- 截断:时间衰减+行为加权,快速舍弃噪声
- 记忆压缩:外部存储和注意力降复杂度
- 分层建模:session到persona的抽象
- 工程取舍:组合策略,关注风险
这道题其实问的是,当用户历史长到几千条,我们怎么在有限的计算预算和模型上下文窗口里,把最有价值的信息提炼出来。核心矛盾就是历史无限增长,但资源有限。我一般会从三个层面来思考:截断、记忆压缩和分层抽象,但真正落地的时候,往往是组合拳。
先说截断,这是最直接的做法。但怎么截?如果只是简单取最近N条,那用户昨天刚搜过的东西可能就被淹没了。所以我会结合时间衰减,比如只保留最近30天,或者按指数衰减给每条行为一个时间权重。另外,行为本身的质量差异很大,在小红书这样的场景里,收藏和完播的权重肯定要比快速划过高得多。所以我会做一个重要性采样,按点击、停留时长、转化这些信号筛出Top-K。这里有个前提:如果用户行为稀疏,截断会损失大量信息,所以截断更适合行为密集的场景。
光靠截断不够,因为长序列里可能藏着用户的长期兴趣。所以第二层是记忆压缩。一种做法是外部记忆网络,用Key-Value结构存历史item的embedding,当前query通过注意力去读取,有点像RAG的检索思路。另一种是压缩,把多步历史聚合成一个固定维向量,比如用Autoencoder或者简单的MLP。但压缩必然有信息损失,所以我会更倾向于用稀疏注意力,比如Longformer的局部加全局注意力,把复杂度从O(n²)降到O(n)。这里有个坑:稀疏注意力的实现复杂度高,而且如果局部窗口设得太小,长距离依赖就抓不住,上线前一定要用离线指标验证召回率。
再一个思路是分层建模。用户的行为天然有不同粒度:短期session反映即时意图,中期按周或月聚合出阶段性偏好,长期就是用户画像。我会用低层的Transformer编码session,然后高层用图网络或者简单的MLP聚合。阿里SIM就是典型,先搜索出和当前query相关的历史,再精细建模,这样既控制了计算量,又保留了关键信号。
最后落到工程上,不同的方案在计算、信息损失和复杂度之间权衡。硬截断计算量最低但损失最大,注意力压缩中等,外部记忆和分层摘要效果好但实现复杂。我的倾向是:用时间加权截断先把序列压到几百条,然后用一个轻量的记忆网络做压缩,最后按session聚合。但上线我会特别关注两个风险:一是截断后的冷启动问题,新用户历史短怎么办;二是记忆网络的存储和更新延迟,不能因为写记忆把推理堵了。
其实还有一个延伸方向,就是如何让模型自己学会决定保留哪些历史,而不是靠人工规则截断。比如用Reinforcement Learning让模型根据当前query动态选择历史片段,这在工业界已经有探索了。
所以整体上,我不会只依赖一种方法,而是根据业务场景组合使用。核心是理解用户行为的时间特性和质量分布,然后做有针对性的取舍。
关键一句:用强化学习让模型动态选择历史片段,而不是靠人工规则截断
面试官还可能这样问
- 问法 1 · 场景切入
假设你负责电商推荐系统,用户一年下来有上千条浏览记录。模型处理不了这么长的序列,你会怎么从中挑出最有用的部分,同时不丢掉用户的长期兴趣?
- 问法 2 · 层层追问
用户行为序列太长时,你们一般怎么处理?……如果直接截断,怎么保证不丢失关键信息?……除了截断,有没有办法把历史信息压缩成更紧凑的表示?
- 问法 3 · 直球架构
设计一个生成式推荐系统,要处理用户数千条历史行为。请给出序列压缩或摘要的方案,包括截断策略、记忆网络或分层建模,并说明各自的优缺点和适用场景。