美学推荐内核 · 算法全景 · v0.8
美学推荐算法:从四种「逛法」到下一帧
用户用四种方式和 aha 相处——看展、相框、录音、生成。每种留下不同的信号,沉淀成三层时间尺度:此刻心情、近来意图、长期身份。核心一句话:说的话调「给你看什么」,做的事定「你是谁」。打分是「熟悉 ←→ 惊喜」的混合——既能"多给你已爱的",也能"找让你『原来如此』的"(倒 U 惊奇带),配比随档案成熟度走、也交给你拨。v0.8 新增:离线评估台 + 在线 lift 埋点(可证伪)· 冷启动置信门控(不把猜测当定论)· 语音 wish 改 LLM 解析(会处理否定)。
一 · 四种逛法 · 各自喂什么信号
museum / art看展模式
主动翻看真迹:停留、点心动、收藏、跳过;序幕「二选一」选 A=偏好、没选的 B=轻排斥。你主动做的,信号最重。
→ mu_event like/collect/dwell/open/skip
→ mu_collection
frame相框模式
电台式被动轮播。双击收藏、下滑不喜欢。关键:展示 ≠ 观看——放着没互动只算一次弱「曝光」,3 天自愈,像电台慢慢摸清你。
→ mu_event expose / like / dislike
(带 strike 衰减)
frame · 长按语音录音模式
长按说出想看什么 → MiMo ASR 转文字 → LLM 解析成情绪与门派(会处理否定:"不要太安静"→高唤起,关键词版会答反)。音频不留,只存文字。
→ mu_wish text / av / vv / region / parsed
intent-compiler生成模式
在意图编译器输入灵感、生成并保存图。你主动要的方向,是最强的正信号之一。
→ mu_event gen
→ mu_generation
所有信号最终落在三张表:mu_event(行为·revealed,带 work_id)· mu_wish(陈述·stated,语音/文字)· mu_collection(收藏)。再由 profile.py 回放重算出 mu_profile(12 维 μ + 门派 + 三盏灯)与 mu_history(成长快照)。事件流是唯一真相,画像永远可回放、可解释。
二 · 同一套真实坐标(画与人共用)
世界观平面
再现-表现 ⊥ 结构-感知
2D · dWV
语言
构图/空间/造型/光影/色彩/笔触/边缘
7D · dLang
情绪 VAD
愉悦 × 唤起 × 控制
3D · dAff
组合距离 d(a,b) = 0.5·dWV + 0.3·dLang + 0.2·dAff (各子空间归一到 0–1)
人 μ = 12 维(世界观 2 + 语言 7 + 情绪 3),与每位大师同维 → 直接算余弦/距离。落点在 6 个世界观区 × 8 个亚型 = 48 种门派原型。同一空间里,"匹配"就是算距离;"本命画家"就是离你最近的那个点。
三 · 三层时间尺度 · 谁驱动谁(最关键)
≤ 30 分钟此刻心情
你刚说的话 + 相框这几帧的反应。立即转向:你说"想看安静的山水",下一帧马上偏过去。
驱动 相框 next_frame 读 mu_wish(30min)+ 本画 mu_event
~ 7 天半衰期近来意图
近 45 天的 wish,按 7 天半衰期加权。反复说才累积成偏好,偶尔一次的奇想自然淡掉。把推荐锚点 μ 朝目标推一点(只动被提到的维度)。
驱动 为你推荐 foryou wish_signal → μ_eff
长期长期身份
只看行为(revealed),一句口头话都不写进来。你是谁,由你"做了什么"算——收藏/心动/停留/跳过。这是门派、本命、三盏灯的来源。
驱动 审美档案 compute_profile → 12 维 μ
为什么分三层? 陈述偏好(stated,你说的)高意图但易变;揭示偏好(revealed,你做的)稳但慢。经典推荐系统的智慧是两者结合、互不覆盖——所以 wish 进推荐、不进身份;否则今晚一句"想看点猛的"会永久带偏你的画像。
四 · 打分核心 · 熟悉 ←→ 惊喜 的混合(v0.8 关键改动)
相关度 = (1−探索度)·熟悉 + 探索度·惊喜 ,再加 安静 / 精品 两项加分
rel = (1−ex)·(1−d) + ex·exp(−(d−d*)²/2σ²) | total = rel + 0.15·calm + 0.30·qual (σ=0.20)
为什么 v0.8 要补「熟悉」这一极? 旧版只有倒U(惊奇带),压根没有"靠近你口味"的项——对口味一致型用户结构性失效(离线评估实测:最近邻命中第 1、纯倒U 第 92)。而用户天生分一致 vs 探索两类、又一时无法自动判别,于是把这一维做成可拨的「熟悉↔惊喜」滑块,默认随档案成熟度(刚起步偏熟悉、越成熟越敢给惊喜)。
熟悉 sim=1−d
越靠近你的重心 μ 越高 = "多给你已爱的"。冷启动主要靠它(评估证明它稳稳打过随机)。
1 − dKG(画, 你)
惊喜 倒U·d*
落在你惊奇带 d*(不近不远)= "原来如此"。成熟后才放大,这是不返回最近邻的那一极。
exp(−(d−d*)²/2σ²)
安静 +0.15
唤起贴近低设定点 0.34;夜间(22–7)自动加权。低唤醒护栏。
1 − |唤起 − 0.34|
精品 +0.30
作品质量分(VLM+策展),保底不推垃圾。探索度 ex = 「惊喜」滑块,三项权重都可旋钮调。
quality ∈ [0,1]
默认探索度 ex = clamp(0.25 + 0.45·成熟度, 0.2, 0.7):n 越多越偏惊喜。相框 next_frame 默认「顺心」台同一套混合(显式台 探索/惊喜/安静/同派 手动覆盖)。近来 wish 偏置在算 d 之前先把锚点推一步:μ_eff = clamp(μ + 0.6·conf·(target−μ))。实验室版 kg-me 另跑更完整的 MMR 重排 + aversion + Σ 自检(暂未进生产)。
「惊喜」这一极:为什么是倒 U,不是越近越好
横轴 = 候选离你多远 d,纵轴 = 惊喜得分。峰在 d*(你的个人惊奇带,从行为反学):太近(已知,没惊喜)、太远(接不住,看不懂)都低分,"刚好新"才高。「熟悉」那一极则单调偏好越近越好;两极由探索度 ex 调和。
五 · 相框电台 · 「展示≠观看」的特有逻辑
①契合 × 衰减 × 探索 + 随机采样
每帧打分 = 倒U契合 × 行为衰减 × 探索保底,再乘一道随机,像电台既懂你又有意外。
w = (0.7·fit+0.3·qual) × 衰减 × (0.55+0.9·rand)
②双击=强正 / 下滑=强负 / 沉默=弱衰减
收藏 ×2.2;不喜欢 ×0.25^次数(明确就压住);放着没双击 → ×0.82^strike,strike 是曝光的时间衰减和。
strike = Σ exp(−Δt / 3天) ← 3 天自愈,不永久封禁
③召回冷却 + 在看才计
刚放过的短期压制(避免立刻重复);页面不可见/没在看时不记曝光(presence gating)——真没看就不算数。
age<150s ×0.12 · 收藏过&age<1天 ×0.45
④频道 · 时段 · 氛围色
选台(顺心/安静/名作/探索/同派/惊喜)调权重;夜间偏低唤起;背景氛围色随画的 VAD 暖冷而变。
ch 调 base · tod∈22–7 抬低唤起 · tint(vad)
六 · 闭环 · 自学习 + 负反馈 + 自检
① 惊奇带 d* 自学习
从你接受的作品到 μ 的距离均值反学你的个人惊奇带。有人爱大跳、有人只小步,d* 因人而异、越逛越准,不再写死。
② 对比学习:没选的也是信号
序幕二选一里被拒的那幅记为 skip;累计 ≥2 时,把 μ 沿"远离被略过那类"推一点(μ += 0.35·(μ−μ_neg),逐维有界)。每轮取舍把 μ 拉得更准。
③ 三盏灯(近期看画状态)
取最近约 50 次参与的滑动窗,相对你稳定的终身重心 μ / 惊奇带 d*来算,所以会随近况自然波动(而非冻结的一生平均)。顿悟密度=近期强心动落在你"惊奇甜点 d*"附近的程度(以 d* 为峰的高斯倒U;旧版用"到 μ 平均距离"做自指阈值会恒等于 1,已弃) · 审美成长=近窗重心偏离 μ 的漂移 + 触及世界观区的开阔度(探新升、守旧落) · 安静感=近窗唤起的低唤醒(设定点 0.34)且平顺。
④ Σ 协方差椭球(实验室版)
离散从"一个半径"升级为"各轴各自的 std"——世界观平面画成椭圆,报出你最笃定/最摇摆的轴。即 N(μ,Σ) 里的 Σ。
七 · 验证 · 诚实(v0.8 新增:让它可证伪)
① 离线评估台
真实事件做留一法 + 99 负采样,把生产 foryou 和 random/最热/最近邻/纯倒U 赛跑(HR@10·AUC)。诚实结论:旧的纯倒U 在"预测下一个 like"上比随机还差(缺相似度项)→ 直接催生了 v0.8 的「熟悉」极。脚本 eval_recsys.py。
② 在线 lift 埋点
离线代理看不见 serendipity。所以记录每次推荐曝光(mu_rec_log),再看它之后是否真被 心动/收藏/驻足。lift>1 = 推荐比平均更易被参与。设置页有看板,随真实使用累积。
③ 冷启动置信门控
12 维 μ 要 ~20+ 正反馈才稳。档案按数据量诚实分级:初识(<8)/ 成形中(<20)/ 清晰(≥20),低成熟度标"初步看",不把冷启动当定论。
④ 用户分两类(已实证)
数据充足的用户里,有人"口味一致"(下一个 like 在 μ 附近)、有人"爱探索"(是跳跃),需要相反策略。没法自动判别 → 暴露成「熟悉↔惊喜」旋钮。这就是 v0.8 的设计动因。
七½ · v0.9 精度升级(多峰召回 + 学维度权重 · A/B 中)
① 不用单一重心:kNN 多峰召回
单质心会把多峰口味(既爱宋画留白、又爱浓烈表现主义)平均成"平庸的中间",推出来谁都不像。新路径按候选到你 k 个最近喜欢作品的距离打分(取最近 3 个的均值),保住每个口味簇。<3 个正样本自动回退重心法。
② 学每人维度权重
旧距离 7 个语言维等权。新路径按你喜欢作品在每维的方差定权:你越一致(方差小)=越在意 → 权重越高,归一到均值 1。个性化距离,有人吃色彩、有人吃构图,各得其所。
③ 默认不变,可证伪再切
作为 opt-in 路径(?algo=knn),不动默认;曝光埋点标 strat=knn,用第七节那把 在线 lift 尺子和重心法 A/B,赢了才切默认。诚实:精度提升是假设,等数据判。
④ 之后:协同 / 竞技场 BT / MMR
再往后(未做):协同过滤(口味相似的人还喜欢)需用户量;用美学竞技场的人类 BT 共识校准现在的"精品"先验(把 VLM 断言换成实测);MMR 多样性重排(一屏别都长一样)。
八 · 可调参数(页面旋钮 / 代码常量)
| 参数 | 含义 | 默认 |
| 探索度 ex(熟悉↔惊喜) | 0=纯熟悉(相似)1=纯惊喜(倒U);「惊喜」滑块,默认随成熟度 | clamp(.25+.45·成熟度,.2,.7) |
| calm / qual 加分权重 | 安静 / 精品(me.html「推荐口味」旋钮) | 0.15 / 0.30 |
| 成熟度 maturity | =clamp(n/22);分级 初识<8 / 成形中<20 / 清晰≥20 | n 越多越成熟 |
| σ (sigma) | 惊奇带宽度(越小越挑剔) | 0.20 |
| d* 惊奇带 | 从你接受的跳跃幅度反学,clamp[0.15,0.6] | 学习·初始0.30 |
| arousalSet | 安静设定点(低唤醒) | 0.34 |
| 子空间权重 SPW | 世界观 : 语言 : 情绪 | 0.5 : 0.3 : 0.2 |
| algo(召回法 · v0.9) | 空=重心法(默认);knn=多峰召回(到最近3个喜欢作品)+学维度权重 | ?algo=knn 开 |
| kNN k / 维度权重 | 取最近 k 个正样本均值;语言维权重=1/(该维方差+0.15) 归一均值1 | k=3 |
| 事件权重 EVENT_W | like/collect 3 · dwell/gen 2 · open 1 · view 0.3 · skip −1 | — |
| wish 半衰期 / 窗口 | 近来意图衰减(halflife / window) | 7天 / 45天 |
| wish 拉动 GAMMA · conf | μ_eff = clamp(μ + GAMMA·conf·(target−μ)) | 0.6 · ≤1 |
| 相框 strike 自愈 τ | 曝光衰减半衰常数(电台自愈) | 3 天 |
v0.8 一句话:打分从"纯倒U"升级为「熟悉↔惊喜」混合(补上缺失的相似度极),配比随成熟度、也交给用户;并第一次装上可证伪的尺子(离线评估台 + 在线 lift)和冷启动诚实门控。
三处用真实 KG 做强:打分空间用语言7轴/世界观/VAD 真坐标;近来 wish 走 LLM 解析;成长用 6 个世界观区当课程。
v0.9 续:新增多峰召回(kNN)+ 学每人维度权重作 opt-in 路径(?algo=knn),修单质心对"多峰口味"的钝感;默认不变,走在线 lift A/B,赢了再切。
生产引擎 _profile_aha.py(8093)· 实验室完整内核 kg-me.html · 诚实:倒U惊奇=真科学(Berlyne);权重与默认配比仍部分手调,正用评估台走向"数据定参数";协同过滤/竞技场BT校准/MMR/谱系锚/Σ 尚未进生产。