paper2skills Playbook

Semantic ID Retrieval for Recommendation (RPG)

Skill-Semantic-ID-Retrieval-RPG · 05-推荐系统

experimentforecastingrecommendationrag客服与VOC推荐与搜索WF-C 客服分诊
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
老客复购率上不去相关产品没有被看到Bundle 凑单没人用新品没有曝光机会

1. 解决的问题

传统推荐系统用无序的one-hot ID或量化向量表示商品,丢失了语义信息。

2. 核心算法逻辑

核心问题:传统推荐系统用无序的onehot ID或量化向量表示商品,丢失了语义信息。"三段奶粉"和"二段奶粉"在向量空间里可能是遥远的点,尽管它们在语义上高度相关。

3. 业务应用场景

业务问题:Momcozy 在欧美多国销售,商品信息用英语、德语、法语维护。用户用不同语言搜索"breast pump" / "Milchpumpe" / "tire-lait",传统ID-based检索无法跨语言关联同一商品。

RPG 应用: 1. 语义ID编码:每个商品生成多语言语义ID - 核心语义:`[吸奶器][电动][便携][单边]` - 语言变体:`[breast_pump][electric][portable][single]` / `[Milchpumpe][elektrisch]` 2. 用户query编码:将用户搜索词编码为语义ID前缀 3. 检索:在语义ID空间中找最相近的商品

预期产出: - 跨语言搜索准确率:60% → 85% - 新品自动关联:上架即被相似商品的用户看到 - 检索延迟:<10ms(与候选集大小无关)

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI:检索准确率提升25-40%,跨语言运营成本降低50%
  • 难度:⭐⭐⭐☆☆(3/5)— 概念新颖,但可用TF-IDF/BERT简化实现
  • 优先级:⭐⭐⭐⭐☆(4/5)— Meta开源,落地路径清晰,但需向量检索基建

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
Semantic ID Retrieval — RPG-inspired implementation
用于推荐系统的语义ID编码与检索
"""

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity


class SemanticIDEncoder:
    """语义ID编码器"""

    def __init__(self, max_tokens=8):
        self.max_tokens = max_tokens
        self.token_vocab = {}
        self.token_idx = 0

    def encode(self, item_attributes):
        """
        将商品属性编码为语义ID

        Args:
            item_attributes: dict,如 {
                'category': '奶粉',
                'subcategory': '3段',
                'brand': '爱他美',
                'origin': '德国',
                'feature': '益生菌'
            }
        """
        tokens = []
        for key, value in item_attributes.items():
            token = f"{key}={value}"
            if token not in self.token_vocab:
                self.token_vocab[token] = self.token_idx
                self.token_idx += 1
            tokens.append(self.token_vocab[token])

        # 补齐到固定长度
        while len(tokens) < self.max_tokens:
            tokens.append(-1)

        return tokens[:self.max_tokens]

    def decode(self, token_ids):
        """将语义ID解码为可读的属性描述"""
        inv_vocab = {v: k for k, v in self.token_vocab.items()}
        return [inv_vocab.get(tid, '[PAD]') for tid in token_ids if tid != -1]


class SemanticRetrieval:
    """语义ID检索系统"""

    def __init__(self, embedding_dim=128):
        self.encoder = SemanticIDEncoder()
        self.vectorizer = TfidfVectorizer(max_features=embedding_dim)
        self.item_ids = []
        self.item_embeddings = None

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。