RLMRec: 利用大型语言模型进行推荐系统的表示学习
这是由 @Re-bin 实现的 RLMRec 模型的 PyTorch 版本,该模型在这篇论文中提出:
利用大型语言模型进行推荐系统的表示学习 Xubin Ren, Wei Wei, Lianghao Xia, Lixin Su, Suqi Cheng, Junfeng Wang, Dawei Yin, Chao Huang*
WWW2024
* 表示通讯作者
在本文中,我们提出了一个与模型无关的框架 RLMRec,该框架通过大型语言模型赋能的表示学习来增强现有的推荐系统。它提出了一种将表示学习与大型语言模型结合的范式,以捕捉用户行为和偏好的复杂语义方面。RLMRec 结合了辅助文本信号,开发了由大型语言模型赋能的用户/物品画像范式,并通过跨视图对齐框架将大型语言模型的语义空间与协同关系信号的表示空间对齐。
📝 环境
你可以运行以下命令更快地下载代码:
git clone --depth 1 https://github.com/HKUDS/RLMRec.git
然后运行以下命令创建一个 conda 环境:
conda create -y -n rlmrec python=3.9
conda activate rlmrec
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install torch-scatter -f https://data.pyg.org/whl/torch-1.13.1+cu117.html
pip install torch-sparse -f https://data.pyg.org/whl/torch-1.13.1+cu117.html
pip install pyyaml tqdm
😉 该代码是基于 SSLRec 框架开发的。
📚 文本属性推荐数据集
我们使用了三个公开数据集来评估 RLMRec:Amazon-book, Yelp, 和 Steam。
每个用户和物品都有一个生成的文本描述。
首先,请通过运行以下命令下载数据。
cd data/
wget https://archive.org/download/rlmrec_data/data.zip
unzip data.zip
你也可以从 [Google Drive] 下载我们的数据。
每个数据集包含一个训练集、一个验证集和一个测试集。在训练过程中,我们使用验证集来确定何时停止训练以防止过拟合。
- amazon(yelp/steam)
|--- trn_mat.pkl # 训练集(稀疏矩阵)
|--- val_mat.pkl # 验证集(稀疏矩阵)
|--- tst_mat.pkl # 测试集(稀疏矩阵)
|--- usr_prf.pkl # 用户的文本描述
|--- itm_prf.pkl # 物品的文本描述
|--- usr_emb_np.pkl # 用户文本嵌入
|--- itm_emb_np.pkl # 物品文本嵌入
用户/物品画像
- 每个画像都是用户/物品的高质量文本描述。
- 用户和物品画像都是通过大型语言模型从原始文本数据生成的。
用户画像
(在usr_prf.pkl
中)展示了用户倾向于喜欢的特定类型的物品。物品画像
(在itm_prf.pkl
中)阐述了该物品可能吸引的特定类型的用户。
😊 你可以运行代码 python data/read_profile.py
作为示例来读取如下所示的画像。
$ python data/read_profile.py
用户 123 的画像:
画像:根据用户购买和评论的书籍类型,他们可能会喜欢具有强烈人物发展、探讨家庭动态和引发思考主题的历史
小说。用户似乎也喜欢深入探讨各种视角的节奏较慢的情节。具有意想不到的转折、不相关人物之间的联系和优美
描述性语言的书籍也可能适合这位读者。
推理:用户购买了几本历史小说,如《Prayers for Sale》和《Fall of Giants》,这表明他们对探索过去感兴趣。
此外,他们评论过的书籍,如《Help for the Haunted》和《The Leftovers》,涉及复杂的家庭关系。另外,
用户欣赏引发思考的主题和以人物为中心的叙事,这在他们对《The Signature of All Things》和《The Leftovers》
的评论中体现出来。用户还喜欢描述性语言,这在他们对《Prayers for Sale》的评论中得到了体现。
语义表示
- 每个用户和物品都有一个使用文本嵌入模型从其自身画像编码的语义嵌入。
- 编码的语义嵌入存储在
usr_emb_np.pkl
和itm_emb_np.pkl
中。
与原始数据的映射
我们数据集的原始数据可以从以下链接找到(感谢他们的工作):
- Yelp: https://www.yelp.com/dataset
- Amazon-book: https://cseweb.ucsd.edu/~jmcauley/datasets/amazon/links.html
- Steam: https://github.com/kang205/SASRec
我们在 data/mapper
文件夹中以 JSON 格式提供了映射字典,用于将我们处理过的数据中的 用户/物品 ID
映射到原始数据中的 原始标识
(例如,Amazon-book 中物品的 asin)。
🤗 欢迎使用我们处理过的数据来改进你的研究!
🚀 运行代码的示例
评估骨干模型和 RLMRec 的命令如下。
-
骨干模型
python encoder/train_encoder.py --model {model_name} --dataset {dataset} --cuda 0
-
RLMRec-Con (对比对齐):
python encoder/train_encoder.py --model {model_name}_plus --dataset {dataset} --cuda 0
-
RLMRec-Gen (生成对齐):
python encoder/train_encoder.py --model {model_name}_gene --dataset {dataset} --cuda 0
支持的模型/数据集:
- model_name:
gccf
,lightgcn
,sgl
,simgcl
,dccf
,autocf
- dataset:
amazon
,yelp
,steam
超参数:
- 每个模型的超参数存储在
encoder/config/modelconf
中(通过网格搜索获得)。
有关参数的高级用法,请使用 --help 参数运行代码。
🔮 画像生成和语义表示编码
这里我们提供一些使用 Yelp 数据生成用户/物品画像和语义表示的示例。
首先,我们需要完成以下三个步骤。
- 安装 openai 库
pip install openai
- 准备你的 OpenAI API 密钥
- 在这些文件的第 5 行输入你的密钥:
generation\{item/user/emb}\generate_{profile/emb}.py
。
然后,以下是生成所需输出的命令示例:
-
物品画像生成:
python generation/item/generate_profile.py
-
用户画像生成:
python generation/user/generate_profile.py
-
语义表示:
python generation/emb/generate_emb.py
对于语义表示编码,你也可以尝试其他文本嵌入模型,如 Instructor 或 Contriever。
😀 我们设计的指令保存在 {user/item}_system_prompt.txt
文件中,也保存在 generation/instruction
文件夹中。你可以根据自己的需求修改它们并生成所需的输出!
🌟 引用
如果你发现这项工作对你的研究有帮助,请考虑引用我们的论文:
@inproceedings{ren2024representation,
title={Representation learning with large language models for recommendation},
author={Ren, Xubin and Wei, Wei and Xia, Lianghao and Su, Lixin and Cheng, Suqi and Wang, Junfeng and Yin, Dawei and Huang, Chao},
booktitle={Proceedings of the ACM on Web Conference 2024},
pages={3464--3475},
year={2024}
}
感谢你对我们工作的关注!