MiniOneRec 开源推荐框架技术解析
概述
MiniOneRec 是一个开源的生成式推荐框架,支持从 0.5B 到 7B 参数的模型扩展。核心流程包括 SID 构建(RQVAE)、SFT(0.5b~7b)以及 RL(受限解码 + 混合奖励)。实验证明 LLM 具有 Scaling 特性,且将 SID 与文本对齐至关重要。
代码实现
前置数据集
代码路径:MiniOneRec/data.py
类 Tokenizer 为普通分词器增加了包装,可处理连续的 bos/eos 特殊字符串。
- SidSFTDataset: 多样化指令,输入用户最近交互 item 列表,预测下一个交互 item。
- SidItemFeatDataset: sid2title 或 title2sid 任务。
- FusionSeqRecDataset: 带意图识别的商品推荐。
SFT 训练
代码入口:MiniOneRec/sft.py
- 运行
train.py,传入主干 LLM(base_model)。 - 传入 SID token,MiniOneRec 将其融入普通 tokens 而非 special tokens。
- 考虑是否冻结 LLM 自带 token 的 embedding 和参数,仅训练新传入的 SID token embedding。
- 处理三种类型数据集。
- 执行训练。
TokenExtender: SID
SID 索引示例存储在 JSON 文件中。indices 是字典结构,如 indices["0"]=["<a_236>", "<b_231>", "<c_226>"]。函数 get_new_tokens 返回 SID 的子 token 集合。需注意代码逻辑可能读取了所有实体的 SID token 集合,而非码本 token 集合,部分未见过实体可能被分配到未使用的 SID 索引 token 上。
如何只对新 token 的 embedding 做训练
先冻结所有参数,然后打开 embedding 参数的 requires_grad,并通过 register_hook 控制哪些 token 的梯度保留。直接对 Tensor 切片设置 requires_grad 属性不可行。
print("Freezing LLM parameters, only training new token embeddings")
for param in model.parameters():
param.requires_grad = False
if sid_index_path and os.path.exists(sid_index_path) and new_tokens:
embedding_layer = model.get_input_embeddings()
if embedding_layer.weight.shape[0] > original_vocab_size:
embedding_layer.weight.requires_grad = True
def mask_grad(grad):
# grad shape: [vocab_size, hidden_dim]
grad[:original_vocab_size].zero_()
grad
embedding_layer.weight.register_hook(mask_grad)
()

