Session意图漂移建模 - 跨会话用户购买意图变化检测
Skill-Session-Intent-Shift · 14-用户分析
1. 解决的问题
现有电商推荐系统多依赖商品标题、价格等表层属性推断用户意图,且只关注单次购买或单会话内的短期偏好变化。SessionIntentBench 的核心创新在于:提出意图树(Intention Tree)概念,通过跨会话建模用户意图的时序演化,构建大规模多模态意图基准。
2. 核心算法逻辑
现有电商推荐系统多依赖商品标题、价格等表层属性推断用户意图,且只关注单次购买或单会话内的短期偏好变化。SessionIntentBench 的核心创新在于:提出意图树(Intention Tree)概念,通过跨会话建模用户意图的时序演化,构建大规模多模态意图基准。
3. 业务应用场景
业务问题:桑基图展示了页面间流量(如"首页→分类页→PDP→加购→支付"),但缺少"为什么用户走这条路"的语义信息。例如同样是"PDP → 加购"路径,有的用户是目标型(直接搜索特定型号奶粉来购买),有的是探索型(随机浏览发现心仪产品),有的是比价型(连续访问多个 PDP 后才加购)。意图漂移检测可以为桑基图每条路径的"边"标注语义标签,让运营人员直观理解流量结构。
| 字段 | 类型 | 示例 | |------|------|------| | user_id | string | "usr_abc123" | | session_id | string | "sess_2026042001" | | event_type | category | "view" / "click" / "add_cart" / "purchase" | | page_type | category | "homepage" / "category" / "pdp" / "cart" / "checkout" | | product_id | string | "ASI
最低要求:至少3个连续商品访问构成一个完整会话,有可提取的商品属性信息。
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:3 · 路径:未检测到
"""
Session Intent Shift Detection — 跨会话意图漂移检测
arXiv: 2507.20185 | SessionIntentBench (ACL 2026 Findings)
功能:
1. 从会话数据构建意图树(规则+embedding模拟LLM意图推断)
2. 跨会话意图漂移检测(余弦相似度 + 属性变化追踪)
3. 为桑基图路径标注意图语义标签
4. 意图演化阶段预测(探索/比较/目标购买)
环境依赖: pip install numpy scikit-learn
可选依赖: pip install openai # 如需接入真实LLM意图推断
"""
import math
import random
import hashlib
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Tuple
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# ─────────────────────────────────────────────
# 1. 数据结构
# ─────────────────────────────────────────────
@dataclass
class Product:
"""电商商品(母婴品类)"""
product_id: str
title: str
category: str # 品类:如 "Baby Formula", "Stroller", "Diaper"
price: float
attributes: Dict[str, str] = field(default_factory=dict)
# 例:{"material": "organic", "age_range": "0-6m", "brand": "Similac"}
def get_embedding(self, dim: int = 32) -> np.ndarray:
"""
模拟商品向量表示(真实场景可替换为 text-embedding-ada-002 等)
用商品属性的哈希值生成确定性伪随机向量
"""
seed_str = f"{self.category}|{self.price:.0f}|" + "|".join(
f"{k}:{v}" for k, v in sorted(self.attributes.items())
)
seed = int(hashlib.md5(seed_str.encode()).hexdigest(), 16) % (2**31)
rng = np.random.RandomState(seed)
vec = rng.randn(dim).astype(np.float32)
return vec / (np.linalg.norm(vec) + 1e-9)
@dataclass
class IntentionEntry:
"""单步意图条目(对应论文中 Intention Tree 的一个节点)"""
step: int # 在会话中的时间步
intent_text: str # 意图描述,如 "寻找有机奶粉,追求性价比"
key_attribute: str # 驱动此意图的关键属性,如 "price: affordable"
comparison: str # 与上一商品的比较依据(Task3 输入)
intent_vector: np.ndarray = field(default_factory=lambda: np.zeros(32))
def drift_score(self, other: "IntentionEntry") -> float:
8. 论文来源
- 2507.20185