知识图谱增强推荐 - CoLaKG (LLM × KG)
Skill-KG-Augmented-Recommendation-CoLaKG · 08-知识图谱
1. 解决的问题
海外华人妈妈购买奶粉需综合考量品牌(HiPP/Aptamil)、成分(DHA/HMO 益生元)、段位(1段/2段)、认证(EU 有机/Non-GMO),传统 CF 无法解读这些维度
2. 核心算法逻辑
传统 KG 推荐(KGAT/KGIN)把 KG 结构硬编码为 embedding,缺失语义理解。CoLaKG 用 LLM 读懂 KG:对每个 item 提取局部子图 → LLM 生成语义文本理解 → 文本 embedding → 通过余弦相似度构建全局 itemitem 语义图 → 与 CF 协同 embedding 门控融合。推断期不调用 LLM(离线预计算),工程友好。
3. 业务应用场景
- 业务问题:海外华人妈妈购买奶粉需综合考量品牌(HiPP/Aptamil)、成分(DHA/HMO 益生元)、段位(1段/2段)、认证(EU 有机/Non-GMO),传统 CF 无法解读这些维度。新品奶粉(无购买历史)冷启动困难 - 数据要求:商品属性 KG(品牌-成分-认证三元组) + 用户购买历史 - CoLaKG 配置: - 节点:奶粉 SKU + 属性节点(品牌/成分/认证) - 局部子图:每款奶粉的 1-2 跳邻居(同品牌/同成分/同认证) - LLM 语义化:"这是一款适合 0-6 月新生儿、含有机 HMO 益生元、持 EU 有机认证的德国奶粉" - 业务价值:新品奶粉冷启动 Re
- 业务问题:母婴用品有显著时序性消费(纸尿裤 NB→S→M→L,辅食工具 4M→1Y→3Y),传统推荐无法跨品类关联成长轨迹 - 数据要求:商品 KG(适用月龄边) + 用户购买序列 - CoLaKG 配置: - LLM 理解每个 item:"NB 纸尿裤适合体重<5kg 新生儿" - 全局语义图捕获不同品类同月龄的 item(NB 纸尿裤 ↔ 3M 安抚奶嘴 ↔ 防胀气奶瓶) - 跨品类 proactive 触达 - 业务价值:跨品类购买转化率提升 15-20%,冷启动新用户(1-2 次购买)效果显著;月均增量 GMV 80-150 万元
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 易处:官方 PyTorch 开源代码完整,有预计算 embedding 可直接复用
- 难处:LLM 语义化需要 GPT-4o/Qwen2.5 调用预算(一次性,~5-10 万)
- 难处:商品 KG 必须先构建,可配合 Hierarchical-Product-KG Skill
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
CoLaKG 最小骨架
论文 arXiv:2410.12229 (SIGIR 2025)
官方代码: https://github.com/ziqiangcui/CoLaKG-SIGIR25
"""
from __future__ import annotations
import torch
import torch.nn as nn
import torch.nn.functional as F
class KGSemanticAggregator(nn.Module):
def __init__(self, embed_dim: int):
super().__init__()
self.attn = nn.Linear(embed_dim * 2, 1)
def forward(self, x: torch.Tensor, edge_index: torch.Tensor, edge_weight: torch.Tensor) -> torch.Tensor:
src, dst = edge_index[0], edge_index[1]
h_src, h_dst = x[src], x[dst]
alpha_raw = self.attn(torch.cat([h_dst, h_src], dim=-1)).squeeze(-1) * edge_weight
alpha_exp = torch.exp(alpha_raw - alpha_raw.max())
denom = torch.zeros(x.size(0), device=x.device).index_add(0, dst, alpha_exp) + 1e-10
alpha = alpha_exp / denom[dst]
messages = alpha.unsqueeze(-1) * h_src
agg = torch.zeros_like(x).index_add(0, dst, messages)
return agg
class CoLaKG(nn.Module):
def __init__(self, n_users: int, n_items: int, embed_dim: int = 64, llm_embed_dim: int = 768):
super().__init__()
self.user_emb = nn.Embedding(n_users, embed_dim)
self.item_emb = nn.Embedding(n_items, embed_dim)
self.semantic_proj = nn.Linear(llm_embed_dim, embed_dim)
self.kg_agg = KGSemanticAggregator(embed_dim)
self.gate = nn.Sequential(nn.Linear(embed_dim * 2, embed_dim), nn.Sigmoid())
def forward(
self,
users: torch.Tensor,
items: torch.Tensor,
item_item_edge_index: torch.Tensor,
item_item_weight: torch.Tensor,
llm_embeddings: torch.Tensor,
) -> torch.Tensor:
s = self.semantic_proj(llm_embeddings)
s_aug = self.kg_agg(s, item_item_edge_index, item_item_weight)
e_v = self.item_emb.weight
gate = self.gate(torch.cat([e_v, s_aug], dim=-1))
item_repr = gate * e_v + (1 - gate) * s_aug
u = self.user_emb(users)
v = item_repr[items]
return (u * v).sum(dim=-1)
def main() -> None:
8. 论文来源
- 2410.12229