paper2skills Playbook

知识图谱增强推荐 - CoLaKG (LLM × KG)

Skill-KG-Augmented-Recommendation-CoLaKG · 08-知识图谱

causalexperimentrecommendationknowledge_graph推荐与搜索知识图谱与RAGWF-D 选品扫描
年化 ROI100-200 万元
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色选品负责人 / 运营负责人 · 数据分析师 · 供应链负责人
适用平台Amazon 品类体系 · 竞品 ASIN 网络分析
什么情况下用品类很多,不清楚品类间的关联,没法做系统性类目扩张规划;竞品矩阵太复杂,品牌/SKU/渠道理不清
成功是什么样的建立品类知识图谱,清晰看到哪些是入口品/引流品/利润品,指导下一步选品扩张方向
业务痛点
品类太多不知道先做哪个竞品关系理不清楚不知道用户买了奶瓶还会买什么类目扩张没有逻辑

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