会话推荐( Session-based Recommendation, SBR)是一个"短历史"问题:你只看到用户在一次会话里很短的一段点击序列(通常 3 – 20 次点击),就要预测下一个最可能点击的物品。难点不在于概念,而在于工程现实:会话短、长尾多、冷启动多,很多时候纯靠交互图( ID + 转移边)根本学不稳——新物品几乎没有边、长尾物品边非常稀疏、用户探索噪声大。
但真实系统里又往往有大量被浪费的文本侧信息(标题、描述、属性、评论)。如果能把这些语义用起来,理论上可以缓解冷启动与长尾问题:新物品即使没有交互,也有标题和描述;长尾物品虽然交互少,但语义信息仍然在。问题是,传统 GNN-SBR 很难把这些文本语义有效注入到会话图建模里——图模型擅长学习结构, LLM 擅长理解语义,两边的表示空间天然不兼容,直接拼起来往往训不稳。
LLMGR 的核心做法是把大语言模型当作"语义引擎",让它把文本变成可与图节点对齐的表示;再用混合编码层把语义与图结构融合进同一个表示空间;最后用两阶段提示调优策略,先对齐"节点—文本"(让模型学会"这段描述对应哪个物品"),再对齐"会话—行为模式"(让模型学会"根据会话图预测下一跳")。这篇笔记按实现链路讲清楚它为什么这么设计、两阶段训练各解决什么瓶颈、融合层具体怎么把语义与转移模式揉在一起,以及它在稀疏与冷启动设置下为什么能更稳地拉开差距。同时我也会保留论文里关键的实验细节和数字(例如在 Amazon Music/Beauty/Pantry 数据集上,相比最强基线, HR@20 提升约 8.68%、 NDCG@20 提升 10.71%、 MRR@20 提升 11.75%),方便你评估这个方法是否真的值得尝试。
论文信息
背景:为什么会话推荐在稀疏/冷启动里"学不稳"
会话推荐系统( SBR)主要依赖于用户的交互序列来进行推荐。近年来,基于图神经网络( GNN)的方法因为能够捕捉物品之间的隐式关系和复杂转移模式,逐渐成为了 SOTA( State of the Art)方法。然而,传统的基于图的推荐方法主要依赖于用户交互数据(点击、购买、评分),而忽略了用户与物品相关的文本信息(标题、描述、属性、评论),这限制了模型捕捉用户交互中隐含的语境和上下文的能力。
在真实场景里,会话推荐的输入通常是一段很短的序列:
目标是预测
- 序列短: 3 – 20 次点击很常见,探索噪声很大,很难从这么短的序列里抽取稳定的"意图信号"。
- 长尾多:大量物品几乎没有边(或边非常不可靠),纯靠转移图很难学到有意义的表示。
- ID 没有语义:同一个"邻居关系"可能是同类、互补、替代,光靠转移边很难分清。
现实里"文本"往往是救命的:新物品即使没有交互,也有标题/描述/属性;长尾物品交互少,但语义信息仍然在。但传统图式 SBR 方法很难把文本用起来,因为它们主要设计给 ID 和边用的,文本侧信息要么被完全忽略,要么只是简单拼接一个预训练的 BERT 表示,效果往往不理想。
常见图式 SBR: 1 分钟回顾(为理解 LLMGR 铺垫)
在深入 LLMGR 之前,我们快速回顾一下传统基于图的会话推荐方法是怎么做的,以及它们的局限性在哪里。这有助于理解 LLMGR 为什么要这么设计。
基于图的推荐系统( Graph-based Recommendation Systems, GRS)使用图神经网络( GNN)等图结构学习算法来建模用户与物品之间的关系。在推荐系统中,用户的交互数据往往以某种形式的网络或图来表示。例如,用户与商品的点击、购买或评分可以被看作是图中的节点与边,节点代表用户和物品,边则表示交互行为。
典型图式会话推荐流程大致是:
- 把一个会话的点击序列变成会话图:节点是会话内出现的物品,边是
(有向边,可能带权重)。 - 用 GNN 在会话图上做消息传递( message passing),得到节点表示。
- 聚合成会话表示( pooling/attention),再做下一跳排序( dot product 或 MLP)。
它的短板也直观:主要学习的是 ID + 边。一旦边稀疏、节点冷启动,表示就会漂。
SR-GNN( Session-based Recurrent Graph Neural Network)
SR-GNN 是一种经典的基于图神经网络( GNN)的会话推荐方法,它主要用于捕捉用户在会话( session)中的行为序列,并预测用户可能点击的下一个物品。该模型的主要思想是将用户在会话中的物品点击行为转化为图结构,通过 GNN 学习物品之间的转移模式。
核心思路
会话图构建:首先,将用户在一个会话中的点击序列转换为一个有向图,节点表示用户点击的物品,边表示物品之间的点击顺序。这样就可以将用户的行为序列转化为图结构。 GNN 在这个图上进行信息传播( message passing),通过聚合邻居节点的信息,学习每个物品的表示。这部分的输出是每个物品节点的嵌入向量,表示物品在当前会话中的状态和与其他物品的关系。
虽然 SR-GNN 对每个会话单独构建图,但在处理多个用户时,模型可以通过学习所有会话中的物品转移模式,生成共享的物品嵌入( item embedding)。这些物品嵌入不仅反映了单个会话的局部结构,还会通过模型的参数共享机制,捕捉跨用户、跨会话的物品间全局关系。换句话说,虽然图是针对单个会话构建的,但通过模型训练,所有会话的图都将贡献给模型的全局学习——这是图式方法的一个关键优势,也是它在有足够交互数据时能 work 的原因。
会话表示的生成:在经过 GNN 的信息传播后, SR-GNN 获取了每个物品的嵌入表示(物品的节点向量)。为了总结整个会话的状态,模型需要生成一个会话级别的表示。通常会话表示可以通过汇总当前会话中所有物品节点的嵌入向量来得到。常见的汇总方法包括平均池化( average pooling)、最大池化( max pooling),或基于最后一个物品节点的嵌入(因为最后一次点击往往对下一跳最相关)。
引入 GRU 建模时间依赖:为了弥补 GNN 在长距离依赖上的不足( GNN 主要靠多跳邻居聚合,远距离依赖需要堆很多层), SR-GNN 引入了 GRU( Gated Recurrent Unit)。 GRU 能够通过递归的方式沿时间顺序依次更新隐藏状态,并在每一步保留时间序列中的上下文信息。这样, GRU 能够显式地捕捉整个会话中的全局时间顺序,而不仅仅是局部的转移模式。
通过结合 GNN(图结构的局部依赖)和 GRU(全局时间依赖), SR-GNN 能更全面地建模用户的行为序列,提升预测准确性。在这个步骤中,模型将会话中的物品嵌入(通过 GNN 计算得到的节点表示)作为 GRU 的输入,逐个输入给 GRU 。具体步骤如下:
- 对于每个会话中的物品嵌入,按照点击顺序依次传入 GRU 。
- GRU 内部的门控机制(即更新门 update gate 和重置门 reset gate)会自动决定是否保留或更新隐藏状态,从而捕捉序列中的时间依赖性。
- 最终, GRU 的隐藏状态将包含整个物品序列的动态信息,即用户在会话中的行为模式。
预测下一物品:通过 GNN,我们得到了物品之间的图结构关系的表示;通过 GRU,我们捕捉了用户点击行为的时间顺序信息。最终, SR-GNN 将这两个部分的输出结合起来,用于预测用户在当前会话中最有可能点击的下一个物品。
在实际操作中,模型会使用最后一个物品节点的 GNN 表示,结合 GRU 最终的隐藏状态,作为对会话的综合表示。这一会话表示会通过一个全连接层(或 MLP)映射到物品空间中,从而计算出用户最可能点击的下一个物品的概率分布。
优点
- SR-GNN 能够捕捉用户行为中的局部物品关系以及物品的转移模式(通过 GNN)。
- 使用 GNN 后,能够有效捕捉会话中复杂的物品交互关系(比纯序列模型更能建模"回访""跳转"这种非线性模式)。
- 结合 GRU,增强了对序列信息的处理能力。它能够根据输入序列的顺序信息,动态地更新隐藏状态,从而捕捉用户在整个会话中的兴趣变化。例如,用户可能在会话初期对某一类物品感兴趣,但在后期对另一类物品更感兴趣, GRU 能够在这个过程中动态调整对这些物品的关注。与传统的 RNN 不同, GRU 通过门控机制减少了梯度消失的问题,使得它能够更好地捕捉较长序列中的时间依赖性。
局限性
- SR-GNN 主要依赖局部图结构和转移模式,在较长序列或复杂的会话中可能表现不佳,因为长距离的依赖关系需要经过多层 GNN 的传播才能捕捉(而多层 GNN 容易过平滑 over-smoothing)。
- 更关键的是:它几乎完全依赖 ID 和边,对文本侧信息利用不足。在冷启动/长尾场景下,这个短板尤其明显。
GCSAN( Global Contextual Self-attention Network)
GCSAN 是另一种基于图神经网络的会话推荐方法,它在 SR-GNN 的基础上进行了改进,引入了自注意力机制来捕捉全局上下文信息。该模型的目标是同时学习会话中的局部和全局物品关系。
核心思路
- 局部上下文捕捉:类似于 SR-GNN, GCSAN 首先使用 GNN 提取会话中的局部上下文信息,通过邻居节点的聚合来更新每个物品的表示。局部上下文的捕捉使得模型能够有效学习到物品之间的短程依赖(例如"连续点击的两个物品往往相关")。
- 自注意力机制引入:为了克服 GNN 难以捕捉长距离依赖关系的问题, GCSAN 引入了自注意力机制( self-attention)。通过自注意力机制,模型能够在会话中对所有物品进行加权计算,识别出与当前物品最相关的物品,而不仅仅依赖于邻居节点。这让模型可以"跳过"中间节点,直接关注到会话中任意位置的物品。
- 全局上下文学习:自注意力机制允许模型对会话中的每个物品赋予不同的重要性权重,因此能够有效建模用户的全局兴趣和短期偏好。这样模型不仅可以学习到短期的局部关系(例如"刚点了 A,很可能点 B"),还能捕捉到会话中的全局信息(例如"会话开头点了 X,中间点了很多其他东西,但结尾往往会回到与 X 相关的物品")。
优点
- 结合 GNN 和自注意力机制,既能捕捉局部上下文(通过 GNN 的邻居聚合),又能学习全局依赖信息(通过 self-attention 的全局加权)。
- 对于较长的会话, GCSAN 在捕捉长距离依赖关系上表现更好(
self-attention 的复杂度是
,但对于会话长度通常不大的 SBR 任务,这是可以接受的)。 - 使用自注意力机制可以让模型在处理复杂的行为序列时更加灵活,不需要堆很多层 GNN 。
局限性
- 由于自注意力机制的引入,计算复杂度较高(
的注意力计算),尤其是在处理大规模数据集或非常长的会话时,训练速度和效率可能受到影响。 - 同样的问题:它仍然主要依赖 ID 表示,对文本语义的利用非常有限。
HCGR( Hyperbolic Contrastive Graph Representation)
HCGR 是一种在非欧几里得几何空间(如双曲空间 hyperbolic space)中进行图表示学习的推荐系统。传统的推荐模型通常在欧几里得空间( Euclidean space)中进行数据建模,但这种方法在高维空间中容易产生信息扭曲( distortion)——比如层次化的类别结构(例如"电子产品 > 手机 > iPhone")在欧式空间里很难紧凑地表示,需要的维度会很高。而 HCGR 尝试通过在双曲空间中进行学习,以更有效地处理用户和物品的复杂关系。
核心思路
- 双曲空间表示: HCGR 使用双曲空间进行用户和物品的表示学习。与欧几里得空间相比,双曲空间能够更好地表示层次化和非线性的数据结构(因为双曲空间有"负曲率",可以用更低的维度表示树状/层次结构),从而能够更紧凑地捕捉用户和物品之间的关系。双曲空间特别适合用于建模复杂的层次关系,例如用户和物品之间的多层次交互(例如"用户 → 类别偏好 → 具体物品")。
- 协作图构建: HCGR 通过构建用户-物品的协作图来学习用户偏好。每个用户和物品节点在双曲空间中进行嵌入( embedding),并通过图神经网络传播和聚合信息,学习节点之间的关系。
- 减少信息扭曲:在欧几里得空间中,节点表示的距离可能无法准确反映它们的真实关系(例如在高维空间里,很多点的距离会"趋于相等",失去区分度)。而在双曲空间中,节点之间的距离可以更加紧凑地表示用户和物品之间的相似性或差异性,从而提高推荐精度。
优点
- 使用双曲空间表示能够减少在高维数据中的信息扭曲问题,尤其适用于复杂的、层次化的数据结构(例如类别树、知识图谱)。
- 能够在非欧几里得几何空间中有效建模用户的偏好和物品之间的复杂关系。
- HCGR 模型在稀疏数据和高维数据中具有很好的表现,因为双曲空间可以更好地处理这些场景(用更低的维度达到更好的表示能力)。
局限性
- 双曲空间的引入虽然可以减少信息扭曲,但也增加了模型的复杂性和理解难度。在实际应用中,如何高效训练和优化此类模型仍是一个挑战(例如双曲空间里的梯度下降需要特殊的优化器,如 Riemannian Adam)。
- 模型的解释性较低,因为用户和物品的表示在双曲空间中并不容易直观理解(欧式空间里的"距离"我们有直觉,但双曲空间里的"距离"对大多数人来说比较抽象)。
- 同样的核心问题:它也主要依赖交互数据,对文本信息的利用有限。
基于图的推荐算法的现有问题(为什么需要 LLMGR)
尽管基于图的推荐算法在处理复杂的用户-物品交互关系上表现出色,但也面临一些挑战和局限性,尤其是在稀疏/冷启动场景下:
长距离依赖问题
GNN 在传播信息时,通常只能够捕捉到邻近节点的信息(局部上下文)。对于长距离的依赖关系(例如在长会话中前后物品之间的关联,或者"用户点了 A,中间点了 B/C/D,最后又点了与 A 相关的 E"这种跨越多跳的模式), GNN 的效果有限。尤其在较长的会话推荐任务中,用户可能在前后两个时间点之间有重要的偏好转移,而传统的 GNN 模型需要堆很多层才能捕捉到这些全局性的行为模式(而堆太多层又容易 over-smoothing,节点表示都变得很相似,失去区分度)。
稀疏性问题( LLMGR 重点解决的痛点)
传统的基于图的推荐系统主要依赖用户的交互数据(点击、购买、评分),而交互数据往往具有高度稀疏性。在许多实际场景中,用户与物品的交互频率较低,尤其是冷启动场景下( cold-start),新用户或新物品的数据更为稀疏。由于图神经网络( GNN)主要依赖邻居节点的聚合来学习节点表示,数据稀疏会导致模型难以有效地捕捉到用户偏好和物品特性。
具体来说:
- 新物品(冷启动):几乎没有交互边, GNN 学到的表示基本就是随机初始化的 embedding,非常不可靠。
- 长尾物品:交互次数少,边权重不稳定, GNN 学到的表示也很容易被噪声带偏。
- 短会话:只有 3 – 5 次点击,构建出来的会话图非常稀疏, GNN 能聚合的邻居信息非常有限。
对上下文理解有限(文本信息被浪费)
尽管基于图的推荐方法能够很好地捕捉用户与物品之间的结构化交互关系("谁点了什么、什么跟着什么"),但它们对与用户或物品相关的文本信息(例如物品描述、评论、属性标签)理解有限。这些模型主要依赖于交互数据,而忽略了与用户行为或物品相关的丰富文本信息。
在真实系统里,这些文本信息其实非常有价值:
- 两个物品可能从来没有在同一个会话里出现过(图上没有边),但它们的标题/描述非常相似(语义上高度相关)。
- 一个新物品虽然没有交互数据,但它的描述里包含了明确的类别/品牌/功能信息,这些都是可用的信号。
传统图式方法很难利用这些文本,最多就是拼接一个预训练的 BERT embedding,但这种简单拼接往往效果不佳,因为:
- 文本表示和图表示在不同的空间里,拼接后模型不知道怎么"对齐"它们。
- 预训练的文本编码器(如 BERT)是在通用语料上训练的,对推荐场景的语义理解不一定准(例如"iPhone"和"充电器"在通用语义上不相关,但在推荐场景里高度互补)。
这就是 LLMGR 要解决的核心问题。
大语言模型( LLMs)在自然语言理解和生成方面展现了强大的能力,因此研究人员提出了将 LLM 与 GNN 结合的可能性。然而,将基于图的会话推荐任务直接转化为自然语言任务,存在着结构化数据与自然语言不匹配的问题。论文的核心挑战是如何将基于图的 SBR 任务表示为自然语言任务,并且如何将 LLM 与图数据的图结构相结合,让两边的表示能够"互相理解"。
LLMGR 框架的提出:把 LLM 当"语义引擎",而不是"推荐器"
为了应对上述挑战,本文提出了一种结合大语言模型( LLM)和图神经网络( GNN)的会话推荐框架—— LLMGR( Large Language Model with Graphical Recommendation)。
一个容易踩的坑是"让 LLM 直接推荐物品"。这通常不 work,因为:
- 候选集合很大(几千到几万个物品), LLM 的 token budget 有限。
- 排序需要校准的分数和负采样, LLM 的生成式输出很难直接给出可用的排序分数。
- 在线推理成本太高(每个请求都跑一次 LLM,延迟和成本都爆炸)。
LLMGR 的策略更务实:把 LLM 当作"语义模块",负责提取文本语义;把排序留给擅长做排序的模型( GNN + 推荐 head)。
该框架通过设计多任务提示( prompts),将文本信息和图结构数据结合起来,并采用混合编码层来增强推荐效果。具体而言, LLMGR 的主要贡献包括:
多任务提示设计:用 prompt 当"监督接口"
LLMGR 通过设计一系列的提示模板,使得大语言模型能够理解会话图的结构,并捕捉用户行为中的潜在偏好。这里的 prompt 不是上线时给用户看的 UI,而是训练时的监督信号接口——通过设计不同的任务,逼模型学到正确的跨模态对齐。
这些提示分为两个主要任务:
主要任务:行为模式建模(预测下一跳)
建模用户的行为模式,通过提示引导 LLM 理解用户在会话中的偏好,并预测下一个用户可能点击的物品。该任务主要通过基于节点和会话图的提示来实现。例如(示意):
1 | 提示:给你一个会话图(以及会话内节点列表/结构化描述) |
论文里给出的一个具体例子(示意图):

这个任务的目标不是让 LLM 直接输出"下一个物品是 X",而是让它产生一个表示,这个表示在经过融合和排序 head 后,能够给出更好的下一跳排序。
辅助任务:节点—文本对齐(语义落地)
对图中的节点与其相关的文本信息进行对齐,通过提示帮助 LLM 理解物品节点与其文本描述之间的关系。例如(示意):
1 | 提示:下面有若干节点(物品) ID:{v1, v2, v3, ...} |
这个任务的目的是:让模型学会"这段文本对应哪个节点/物品",从而把文本语义锚定到 ID 表示上。在冷启动/长尾场景下,这个对齐尤其重要,因为即使物品没有足够的交互数据,它的文本描述仍然可以提供稳定的语义 anchor 。
混合编码层:让 ID 表示进入 LLM 的同一表示空间
为了使 LLM 能够有效处理图结构数据, LLMGR 设计了混合编码层( hybrid encoding layer)。该层将会话中的节点 ID 和图 ID 编码为与文本信息相同维度的向量,从而使得 LLM 能够同时处理文本和图结构信息。
LLM 能自然处理文本 token(通过 tokenizer + word embedding),但图模型输出的是 ID embedding(维度通常比 LLM 的隐层维度小很多)。混合编码层的关键,是把 ID embedding 通过线性映射对齐到与文本 embedding 相同的维度,再做融合。
在混合编码层中:
节点 ID 的嵌入转换:由于节点 ID 的嵌入维度(例如 64 或 128)与文本嵌入维度(例如 LLaMA2-7B 的隐层维度是 4096)不同,需要对节点嵌入进行线性变换,把它投影到 LLM 能处理的维度:
其中,${} d{} d_{} $(例如 4096)。 文本嵌入:文本信息(例如物品标题、描述)通过 LLM 的分词器( tokenizer)和词嵌入层( word embedding)转化为嵌入表示。假设文本
的嵌入为 ,则该嵌入与节点 ID 嵌入一起输入 LLM 。 最终输入向量:混合编码层将文本嵌入和节点嵌入进行连接( concatenation),生成 LLM 的输入序列:
这样, LLM 的输入就同时包含了文本信息(语义)和节点信息(结构),可以在一个统一的空间里处理它们。
论文里的整体框架图(来自原文):

这张图展示了 LLMGR 框架的架构,分为两个部分:左侧为辅助调优阶段(节点-文本对齐),右侧为主要调优阶段(行为模式建模)。通过这两个阶段,模型能够结合图结构数据和自然语言信息,进行更精准的推荐。
两阶段提示调优策略:为什么要拆两步训练
为了提高模型的性能, LLMGR 采用了两阶段的提示调优策略。这不是随意设计的,而是为了避免一个典型的优化陷阱:
如果一上来就训练主任务(行为模式建模),模型很容易出现"语义还没对齐就被行为噪声带跑偏"的问题。因为会话数据本身就有很多探索噪声(用户随机点击、误点等),如果模型还不知道"文本对应哪个节点",它就只能依赖 ID 和边,结果就和传统 GNN 没区别了。
但如果只做对齐(辅助任务),又学不到会话里真正决定下一跳的结构模式(例如"连续点击的物品往往相关""会话结尾往往会回到开头的主题")。
所以 LLMGR 拆成两段:
阶段 1:辅助提示调优阶段(语义落地)
在该阶段:
- 冻结图神经网络部分的参数( GNN encoder 的参数不动),这样模型不能"作弊"通过拟合转移模式来绕过文本对齐。
- 专注于调整混合编码层和 LLM 的参数(通常用 LoRA 之类的轻量适配器,避免全参数微调的成本)。
- 通过对齐节点与文本信息的提示任务,学习节点 ID 与文本信息之间的关联。
这一阶段的核心任务是让模型学会"这段文本对应哪个节点/物品",从而把文本语义锚定到 ID 表示上。在冷启动/长尾场景下,这个对齐尤其重要,因为即使物品没有足够的交互数据,它的文本描述仍然可以提供稳定的语义 anchor 。
阶段 2:主要提示调优阶段(行为模式对齐)
在该阶段:
- 解冻(或部分解冻)图神经网络的参数,让 GNN 可以学习图结构中的信息,适应下一跳预测的任务。
- 通过行为模式建模提示任务,捕捉会话中的用户偏好,并最终预测下一步点击的物品。
- 保留第一阶段学到的语义对齐(语义 anchor 不丢),同时让模型学习行为模式。
在这两个调优阶段,损失函数保持不变,都是通过交叉熵损失( cross-entropy loss)进行优化:
论文的训练日程里,给出了一个很"工程化"的安排:辅助阶段训练 1 个 epoch(快速建立语义对齐),主阶段每个数据集训练约 3 个 epoch(按原文设定)。这个设定背后的直觉是:语义对齐相对简单(文本和节点的对应关系是比较确定的),不需要太多 epoch;但行为模式学习更复杂(会话数据有噪声,需要多轮训练来收敛)。
技术细节: GNN 信息传播与 LLM 编码层
会话图构建
会话推荐任务的基础是将用户的点击行为序列转化为图结构。假设给定一个用户点击序列
- 图的表示:构建的会话图表示为
,其中 表示节点集合, 表示有向边的集合。例如,对于序列 ,构建的会话图如下: - 节点
(去重后的物品集合) - 边
(有向边,表示点击顺序)
- 节点
注意
信息传播与聚合( GNN 的核心机制)
图神经网络的核心步骤是通过信息传播机制( message
passing)更新每个节点的表示。我们通过对节点的邻居节点进行聚合来更新该节点的嵌入。假设节点
信息聚合( Aggregator):聚合节点
的邻居节点的信息,生成中间状态 : 常见的聚合函数包括平均( mean)、求和( sum)、最大值( max)等。 节点状态更新( Updater):使用聚合后的邻居信息
更新节点 的状态: 常见的更新函数包括 GRU-style 更新、简单拼接后经过 MLP 等。
经过
图级表示生成( Graph Readout)
为了得到整个图(会话)的表示,需要将所有节点的嵌入汇总为图级别的表示。这一步称为图读出( Graph Readout):
- 平均池化( mean pooling):对所有节点表示取平均。
- 最大池化( max pooling):对所有节点表示逐维取最大值。
- 注意力池化( attention pooling):根据每个节点的重要性加权求和(通常最后一次点击的物品权重最高)。
LLM 的编码层与输出层
混合编码层的工程细节
为了使 LLM 能够处理会话中的图结构数据, LLMGR 设计了混合编码层。该层结合图中的节点 ID 、会话 ID 以及文本信息,将这些元素编码为可被 LLM 处理的输入向量。
关键的工程问题是:节点 ID 的嵌入维度(例如 64)和文本嵌入维度(例如 4096)不同,怎么让它们能在 LLM 里一起处理?
解决方案是线性变换:
然后,文本信息通过 LLM 的分词器和词嵌入层转化为嵌入表示
最终,混合编码层将文本嵌入和节点嵌入进行连接(或其他融合方式,如门控、注意力),生成 LLM 的输入:
LLM 输出层
经过 LLM 的处理后,输出为 LLM 层的结果,假设为
这个输出分布就是我们最终用来排序候选物品的依据。
实验设计与结果:论文报告了什么
论文通过在真实世界数据集上的大量实验,验证了 LLMGR 的有效性。这部分我会保留论文里最有信号的细节和数字,方便你评估这个方法是否值得尝试。
实验设计的总体思路
实验的核心是通过在不同的数据集上验证 LLMGR 模型的有效性,并且和其他现有的最先进方法( SOTA)进行对比。为了更好地验证 LLMGR 的性能,实验针对五个核心研究问题( Research Questions, RQ)展开:
- RQ1: LLMGR 在会话推荐( SBR)场景中的表现如何?它能否超过现有的最先进模型?
- RQ2: LLMGR 的有效性和在不同模型间的移植性如何?(即能否把 LLMGR 的组件"嫁接"到其他基线模型上,看能否带来增益)
- RQ3: LLMGR 的各个组件(如辅助任务、图神经网络、混合编码层等)如何分别贡献于整体模型的性能?(消融实验)
- RQ4: LLMGR 如何处理数据稀疏性问题,尤其是在冷启动场景中,它的表现如何?(这是最关键的一个问题,因为 LLMGR 的卖点就是缓解稀疏性)
- RQ5: LLMGR 能否提供合理的解释来预测用户偏好,从而提高推荐效果?(可解释性)
为了回答这些问题,实验设置了不同的数据集、比较方法以及评价指标,分别从多个角度验证 LLMGR 的性能。
数据集的选择
实验中使用了三个真实世界的公开数据集,这些数据集都来源于亚马逊平台( Amazon),具体如下:
- Music(音乐相关商品数据集):该数据集包含了用户与音乐相关商品(如乐器、 CD 、音响设备等)的交互数据,例如购买、点击等。
- Beauty(美妆数据集):该数据集记录了用户在美妆商品类别(如化妆品、护肤品、美容工具等)中的互动行为。
- Pantry(家庭必需品数据集):此数据集包含了用户与家庭日用品相关的购买行为和浏览记录(如食品、清洁用品等)。
为什么选择这些数据集?
- 这些数据集能够涵盖不同种类的用户行为模式和物品类别,便于检验 LLMGR 模型的适应性和泛化能力(音乐、美妆、日用品的用户行为模式差异很大)。
- 数据集中的稀疏性较高,尤其是在冷启动场景中,适合验证 LLMGR 如何应对数据稀疏性问题。 Amazon 数据集里有大量长尾物品(只有少数几次交互),这是测试文本语义是否有用的理想场景。
- 这些数据集都包含丰富的文本侧信息(物品标题、描述、类别、品牌等),适合验证 LLMGR 对文本信息的利用能力。
数据预处理
- 为确保数据质量,按照惯例,剔除了那些与物品交互少于 5 次的用户和物品,这样可以保证模型在训练时有足够的数据(避免极端稀疏导致的训练不稳定)。
- 数据划分采用了"留一法"( leave-one-out):对每个用户的交互序列,最后一个物品用于测试,倒数第二个用于验证,剩下的物品用于训练。这是会话推荐任务的标准划分方式。
比较方法(基线模型)
为了验证 LLMGR 的有效性,实验中选择了多个最先进的基准方法进行比较。这些方法在会话推荐任务中表现良好,且各自的原理不同(有基于马尔可夫链的、基于 RNN 的、基于 GNN 的、基于注意力的),便于全面对比 LLMGR 的性能。
基准模型列表:
- FPMC( Factorized Personalized Markov Chain):经典的基于马尔可夫链的推荐方法,通过考虑用户的最近一次交互,预测下一次可能的点击。它结合了矩阵分解技术,用来学习用户的长期偏好和短期兴趣。
- CASER( Convolutional Sequence Embedding Recommendation):一种基于卷积神经网络( CNN)的推荐方法,使用横向和纵向卷积操作来捕捉用户行为序列中的高阶交互关系(例如"点了 A 和 B 之后通常会点 C"这种联合模式)。
- GRU4Rec( Gated Recurrent Unit for Recommender Systems):基于递归神经网络( RNN)的会话推荐方法,堆叠了多个 GRU 层,通过序列建模学习用户偏好。这是会话推荐里的一个经典基线。
- NARM( Neural Attentive Session-based Recommendation):一种混合了注意力机制和 RNN 的模型,能够有效捕捉会话中的短期行为模式和长期兴趣(通过注意力机制聚焦到会话中最相关的物品)。
- STAMP( Short-Term Attention Priority Model):基于注意力机制的模型,通过捕捉用户的短期兴趣(例如最近点击的商品),从历史点击中提取用户当前的兴趣。
- SRGNN( Session-based Recurrent Graph Neural Network):基于图神经网络( GNN)的模型,将会话中的点击行为转换为图结构,使用 GNN 学习物品之间的转移模式(就是前面介绍的 SR-GNN)。
- GCSAN( Global Contextual Self-Attention Network):结合 GNN 和自注意力机制,能够提取会话中的局部上下文信息和全局语义信息(前面介绍过)。
- NISER( Normalized Item and Session Graph Representation):一种基于 GNN 的方法,通过标准化物品和会话图的表示,缓解了热门物品偏差问题( popular bias,即模型倾向于总是推荐热门物品)。
- HCGR( Hyperbolic Collaborative Graph Representation):在非欧几里得几何空间(双曲空间)中的 GNN 方法,利用双曲空间来减少高维空间中的数据扭曲,特别适合处理幂律分布的推荐场景(前面介绍过)。
这些基线覆盖了从传统方法( FPMC)到深度学习方法( RNN 、 CNN 、 GNN 、 Attention),是一个比较全面的对比实验设置。
评价指标
在 LLMGR 框架中,模型的目标是预测用户在会话中的下一个点击行为。最终的预测结果是每个候选物品的点击概率分布。为了评估模型的推荐质量,我们使用以下几种常见的评价指标(这些都是会话推荐/下一跳预测任务的标准指标):
HitRate@K(命中率)
HitRate@K 是一种常用的指标,用来评估推荐系统在前 K 个推荐结果中是否包含了用户真正感兴趣的物品。
计算方法:如果模型在前 K 个推荐物品中包含了用户实际点击的物品,我们称之为"命中"( hit)。
公式:
其中: 是测试集中的会话集合; 是会话 中的真实物品( ground truth); 是模型预测的前 K 个推荐物品; 是指示函数,若条件为真则取值为 1,反之为 0 。
HitRate@K 衡量的是在前 K 个推荐结果中,是否至少命中了一个用户实际感兴趣的物品。其值在 0 到 1 之间,值越大表示推荐系统的命中率越高。这是一个"二值"指标(要么命中,要么没命中),不关心排序位置。
NDCG@K(归一化折扣累积增益)
NDCG( Normalized Discounted Cumulative Gain)@K 是一种基于排序的指标,旨在衡量推荐列表中正确物品的排序质量。它不仅关注是否推荐了正确的物品,还关注这些物品在推荐列表中的位置(排在越前面,得分越高)。
计算方法: NDCG 计算的是累积增益( Cumulative Gain, CG),并根据物品的排序位置进行折扣调整( discount)。直觉是:排在第 1 位的正确物品应该比排在第 10 位的正确物品得分更高。
公式:
其中: 是推荐列表的长度; 是推荐物品在列表中的位置( 1-indexed); 是指示函数,表示位置 的物品是否为真实的目标物品; 是归一化因子,用于将 NDCG 的值限制在 0 到 1 之间(理想情况下,真实物品排在第 1 位,此时 NDCG 最大)。
NDCG
更加注重推荐物品的顺序:如果模型推荐的正确物品排在前面,其得分会更高;如果排在后面(例如第
19 、 20 位),得分会因为
MRR@K(平均倒数排名)
MRR( Mean Reciprocal Rank)@K 是一种衡量推荐系统准确性和排序的指标。它关注的是第一个正确推荐的物品在列表中的排名(即"用户需要往下翻几个才能看到正确物品")。
计算方法: MRR 是第一个正确推荐的物品的倒数排名的平均值。
公式:
其中: 是所有会话的数量; 是会话 中第一个正确物品在推荐列表中的位置(如果前 K 个里没有推荐正确物品,则此项为 0,或定义为 )。
MRR 衡量的是第一个正确物品的平均排名位置。例如,如果正确物品平均排在第 2 位,则 MRR ≈ 0.5;如果平均排在第 5 位,则 MRR ≈ 0.2 。值越高表示模型推荐正确物品的位置越靠前,用户体验越好。
参数配置
为了确保实验的公平性,所有基线模型和 LLMGR 模型使用了相同的超参数设置(或在相同的搜索空间里调优):
基线模型的通用设置:
- mini-batch 大小: 1024;
- dropout 率: 0.3,防止过拟合;
- 学习率:从
中调优(网格搜索); - 嵌入维度: 64(这是 ID embedding 的维度);
- 最大序列长度: 50(超过 50 次点击的会话会被截断)。
模型的训练使用了 Adam 优化器。针对 GNN 模型(例如 SRGNN 、 GCSAN 等),调优了 GNN 的聚合层数量(从 1 层到 5 层),以找到最优配置。
LLMGR 实现细节(这部分很重要,关系到复现):
- 基础 LLM: LLMGR 基于 LLaMA2-7B 模型(原文设定),并使用 HuggingFace 库进行开发。
- 模型加速:使用 DeepSpeed 技术,在 2 个 Nvidia Tesla A100 GPU 上进行训练(这是论文的硬件设置,说明训练成本相对可控,不需要几十上百张卡)。
- ID 嵌入来源: ID 嵌入( item embedding)直接从预训练的 GCSAN 模型中提取,且在实验中没有进行修改(这是一个工程 trick,避免从头训练 ID embedding,加快收敛)。
- 优化器:使用 AdamW 优化器优化
LLMGR 模型,学习率在
中调优(注意这个搜索空间比基线模型小,因为 LLM 微调通常用更小的学习率), batch size 为 16(受限于 LLM 的显存占用, batch size 通常比传统模型小)。 - 学习率调度:使用 cosine scheduler 调整学习率( warm-up + cosine decay),并设置了权重衰减值为 1e-2(防止过拟合)。
- 训练轮数:在辅助任务调优阶段,模型训练 1 个 epoch(快速建立语义对齐);在主要任务调优阶段,模型在每个数据集上训练 3 个 epoch(原文设定)。
这些细节说明 LLMGR 的训练成本虽然比纯 GNN 模型高(毕竟用了 7B 的 LLM),但通过两阶段策略和轻量化调优( LoRA 、小 batch size 、少 epoch),训练时间仍然是可控的。
实验结果分析
RQ1: LLMGR 在会话推荐任务中的性能(与 SOTA 方法对比)
实验结果表明, LLMGR 相比于现有的基准模型(如 GRU4Rec 、 STAMP 、 SRGNN 、 GCSAN 等),在各项指标( HitRate@K 、 NDCG@K 、 MRR@K)上均表现更优,特别是在高 K 值时(例如 K=20), LLMGR 的排名能力更强。
相对于最具竞争力的基准模型(通常是 GCSAN 或 HCGR), LLMGR 在以下指标上有明显的提升:
- HR@20:提高了约 8.68%(相对提升,即如果基线是 0.50, LLMGR 是 0.5434);
- NDCG@20:提高了 10.71%;
- MRR@20:提高了 11.75%。
这表明 LLMGR 模型不仅能够准确预测用户下一个可能点击的物品(命中率提升),还能较好地对推荐列表进行排序( NDCG 和 MRR 提升更明显),让正确物品排在更靠前的位置。
这个提升幅度在推荐系统里是比较显著的,尤其是在已经有很多强基线( GCSAN 、 HCGR)的情况下,还能拉开近 10% 的差距,说明文本语义的引入确实有价值。
RQ2: LLMGR 的有效性和移植性(能否"嫁接"到其他模型上)
为了验证 LLMGR 的移植性( portability),实验将其应用于其他基准模型上,观察其性能的提升情况。具体做法是:把 LLMGR 的"语义模块"( LLM + 混合编码层 + 多任务调优)嫁接到其他基线模型(如 GRU4Rec 、 STAMP)上,看能否带来增益。
实验表明:
- LLMGR 在所有测试模型(如 GCSAN 、 GRU4Rec 、 STAMP)上的表现均有所提升。这说明 LLMGR 的设计是模块化的,可以作为"插件"增强其他模型。
- 对于简单的基准模型(如 GRU4Rec 、 STAMP,它们本身不用 GNN), LLMGR 提供了显著的性能提升,表明即使是较简单的模型,结合 LLMGR 的语义模块也可以超越许多 SOTA 的会话推荐方法。
在不同的模型上, LLMGR 平均提升了约 8.58%( Music 数据集)和 17.09%( Beauty 数据集)。这表明 LLMGR 具有良好的移植性,并且可以应用于多种模型,增强其性能。
这个结果很有实用价值:如果你已经有一个跑得还行的基线模型,可以尝试把 LLMGR 的语义模块嫁接上去,不需要从头重新设计整个系统。
RQ3: LLMGR 组件的贡献分析(消融实验)
为了分析 LLMGR 中各个组件的贡献,消融实验( ablation study)去除了辅助任务(如节点-文本对齐任务),只保留主要任务进行训练。结果显示:
- 移除辅助任务后,模型性能在多个指标上显著下降,特别是 NDCG 和 MRR 指标(这两个指标更关注排序质量),这表明节点-文本对齐任务在提升模型排序能力方面起到了关键作用。
- 在 Music 数据集中,移除辅助任务后 HitRate@20 下降了 2.04%;而在 Beauty 数据集中,下降幅度更大, NDCG@20 降低了 4.16%。
这个消融实验验证了两阶段策略的必要性:如果跳过第一阶段(语义对齐),直接训练主任务,模型的表现会明显变差,尤其是在排序质量上( NDCG/MRR 下降更明显)。这说明语义对齐确实帮助模型学到了更好的表示,而不仅仅是"多训练了一些数据"。
RQ4: 冷启动分析( LLMGR 的核心卖点)
为了验证 LLMGR 在冷启动场景中的表现(这是 LLMGR 最重要的卖点),实验将数据集划分为"暖启动"和"冷启动"场景:
- 暖启动( warm-start):用户与物品的交互数据丰富(例如物品有 50+ 次交互),系统可以从中学习到充足的偏好信息。
- 冷启动( cold-start):用户与物品的交互数据非常少(例如物品只有 5 – 10 次交互),传统推荐系统难以从中学习到稳定的表示。
实验表明:
- 在冷启动场景中, LLMGR 的表现显著优于传统的基准模型,能够有效处理数据稀疏性问题。
- 与暖启动场景相比,冷启动场景下 LLMGR 的性能提升更为显著(相对提升幅度更大),这主要得益于 LLM 模型在处理少量数据时所展现的语言理解和知识迁移能力(即使物品交互少,文本描述仍然可以提供稳定的语义信号)。
这是 LLMGR 最有说服力的一个结果:它的增益主要来自于解决了传统方法的短板(稀疏/冷启动),而不是在暖启动场景下"锦上添花"。这说明方法的设计确实对准了实际痛点。
RQ5: 可解释性分析
论文还做了一些定性分析( qualitative analysis),展示了 LLMGR 在预测时的一些案例。例如,通过查看模型在辅助任务上的对齐结果,可以看到模型确实学会了"把相似的文本描述对齐到相似的节点上",并且在主任务上,模型能够根据会话图的结构和文本语义,给出合理的下一跳预测。
这部分的分析主要是定性的(案例展示),但它帮助理解模型"为什么 work"——不是黑盒地提升了指标,而是确实学到了文本和图结构的对齐。
工程视角:你真要用它上线,应该怎么做
论文展示了 LLMGR 在离线评测上的效果,但如果你真的要把它用到生产系统里,还需要考虑一些工程问题:
别把 prompt 当线上依赖
prompt 在 LLMGR 里主要是训练时的监督信号接口,用来逼模型学到正确的跨模态对齐。上线时不需要每个请求都跑一大段 prompt 推理——那样成本和延迟都爆炸。
更现实的部署方式是:
- 离线预计算:对所有物品的文本描述,离线跑一次 LLM,得到文本表示( text embedding),存起来。
- 在线轻量融合:用户发起请求时,只需要用轻量的图编码器( GNN/序列模型)处理会话,然后与预计算的文本表示融合,最后做排序。
- LoRA 或蒸馏:如果实在需要在线跑 LLM,可以用 LoRA 适配器(参数量小)或蒸馏成小模型(例如蒸馏成 BERT-base),降低推理成本。
文本要清洗
营销话术、重复模板、无意义的修饰词(例如"Best Choice! Top Quality! Limited Offer!")会让语义"看起来很像",反而伤害排序。在用 LLMGR 之前,最好先做文本清洗:
- 去掉营销话术和 HTML 标签。
- 提取结构化信息(品牌、类别、关键属性)。
- 如果描述太长,截断或摘要( LLM 的 token budget 有限)。
关注长尾/冷启动切片
整体指标( overall metrics)上涨不一定代表你解决了稀疏问题——有可能只是在头部物品上涨了一点点,但长尾还是不行。最好做分桶分析( stratified analysis):
- 把物品按交互次数分桶(例如 <10 次、 10 – 50 次、 50+ 次)。
- 分别计算每个桶的指标,看 LLMGR 的增益主要来自哪里。
- 如果增益主要来自头部物品,说明文本语义没有真正解决稀疏问题;如果增益主要来自长尾/冷启动桶,那才是真正有价值的。
计算成本与效率权衡
LLMGR 用了 7B 的 LLM,训练成本肯定比纯 GNN 模型高。论文里用了 2 张 A100,训练时间没有明确给出,但根据经验,两阶段加起来可能需要几小时到一天(取决于数据集大小)。
如果你的系统对成本敏感,可以考虑:
- 用更小的 LLM(例如 LLaMA2-1.3B 或 BERT-base)。
- 只在冷启动/长尾物品上用 LLMGR,头部物品还用传统 GNN(混合部署)。
- 定期离线更新文本表示,在线只做轻量融合。
Q&A
为什么不让 LLM 直接"生成下一件商品"?
因为会话推荐本质是大规模排序问题:候选集合大(几千到几万个物品)、需要负采样与校准分数、且延迟/成本非常敏感。 LLM 的生成式输出很难直接给出可用的排序分数(你总不能让它输出"物品 A: 0.87, 物品 B: 0.43, ..."这种格式吧)。
LLMGR 的策略是让 LLM 做语义,把排序留给擅长做排序的模型( GNN + MLP head)。这样既利用了 LLM 的语义理解能力,又保持了推荐系统的高效排序框架。
这是不是等价于"BERT embedding + GNN"?
这是一个很好的问题,也是建议做的关键对照实验之一。简单的"BERT embedding + GNN"(即用预训练 BERT 编码物品文本,然后拼接到 GNN 的节点表示上)确实是一个很自然的 baseline 。
LLMGR 的主张是:通过多任务 prompt + 分阶段对齐,让文本语义更"能落到节点上、能在稀疏里更稳",而不是"任何文本编码器都能自动解决冷启动"。具体来说:
- 辅助任务(节点-文本对齐)逼模型学到"这段文本对应哪个节点",而简单拼接 BERT embedding 做不到这个。
- 两阶段训练让语义对齐和行为学习分开优化,避免互相干扰。
- LLaMA2 这种大 LLM 的语义理解能力(尤其是 zero-shot / few-shot 迁移能力)比 BERT 更强,在长尾/冷启动里可能更有优势。
但这需要实验验证——如果简单的"BERT + GNN"也能达到类似效果,那 LLMGR 的成本就不值得了。
两阶段真的必要吗?能不能一步到位?
论文里的消融实验( RQ3)已经部分回答了这个问题:去掉辅助任务后,性能明显下降(尤其是 NDCG/MRR)。
从方法论上,两阶段解决的是典型优化陷阱:
- 语义未对齐时,主任务会被行为噪声驱动(模型只能依赖 ID 和边,结果和传统 GNN 没区别)。
- 语义已对齐后,再学行为模式,训练更稳,也更容易把增益落在长尾/冷启动切片里。
但也有可能存在其他训练策略(例如联合训练 joint training + 加权损失),这需要进一步探索。
上线时需要每个请求都跑 LLM 吗?
不一定。一个合理的部署模式是:
- 离线预计算:对所有物品的文本描述,离线跑一次 LLM(或 LoRA 微调后的 LLM),得到文本表示,存到向量数据库里。
- 在线轻量计算:用户发起请求时,用轻量的图编码器( GNN/序列模型)处理会话图(这部分很快),然后查表拿到物品的文本表示,做融合和排序(这部分也很快)。
这样,在线延迟主要是 GNN + 融合 + 排序,不需要每次都跑 LLM 推理。
LLMGR 适合什么场景?不适合什么场景?
适合的场景:
- 有丰富的物品文本侧信息(标题、描述、属性、评论)。
- 稀疏性/冷启动问题严重(大量长尾物品、新物品上线频繁)。
- 希望保持现有的推荐框架( GNN/SBR),只是想注入语义信号。
不适合的场景:
- 物品文本信息很少或质量很差(例如只有简单的 SKU 编号)。
- 交互数据非常充足、冷启动不是问题(这种情况下,传统 GNN 可能就够了,加 LLMGR 的收益不大)。
- 成本敏感,且不能接受 LLM 的训练/推理开销(即使用轻量化策略)。
参考资料
- 本文标题:Integrating Large Language Models with Graphical Session-Based Recommendation
- 本文作者:Chen Kai
- 创建时间:2025-05-12 14:00:00
- 本文链接:https://www.chenk.top/Integrating-Large-Language-Models-with-Graphical-Session-Based-Recommendation/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!