|
@@ -7,8 +7,9 @@ import type { RecallSignals, VideoMatchEnrichedVO } from '../api/types'
|
|
|
* 公式 (VIDEO):
|
|
* 公式 (VIDEO):
|
|
|
* sim_norm = clip((sim - lower) / (1 - lower), 0, 1)
|
|
* sim_norm = clip((sim - lower) / (1 - lower), 0, 1)
|
|
|
* rov_norm = clip((rov - rovClipLow) / (rovClipHigh - rovClipLow), 0, 1)
|
|
* rov_norm = clip((rov - rovClipLow) / (rovClipHigh - rovClipLow), 0, 1)
|
|
|
- * composite = alpha × sim_norm + (1 - alpha) × rov_norm
|
|
|
|
|
- * ROV 缺失时: composite = alpha × sim_norm(质量分为 0)
|
|
|
|
|
|
|
+ * composite = alpha × boost × sim_norm + (1 - alpha) × rov_norm
|
|
|
|
|
+ * boost 仅作用于相关性分(解构维度权重),ROV 是视频粒度不加 boost
|
|
|
|
|
+ * ROV 缺失时: composite = alpha × boost × sim_norm
|
|
|
*
|
|
*
|
|
|
* 公式 (ARTICLE):
|
|
* 公式 (ARTICLE):
|
|
|
* sim_norm = clip((sim - lower) / (1 - lower), 0, 1)
|
|
* sim_norm = clip((sim - lower) / (1 - lower), 0, 1)
|
|
@@ -209,23 +210,20 @@ function rankVideoArticle(
|
|
|
? (params.boostsByCode?.[item.configCode] ?? getDefaultBoostForCode(item.configCode))
|
|
? (params.boostsByCode?.[item.configCode] ?? getDefaultBoostForCode(item.configCode))
|
|
|
: params.deconstructBoost
|
|
: params.deconstructBoost
|
|
|
const hasRov = rov != null && Number.isFinite(rov)
|
|
const hasRov = rov != null && Number.isFinite(rov)
|
|
|
- const boost = (item.modality === 'VIDEO' && hasRov) ? codeBoost : 1
|
|
|
|
|
|
|
|
|
|
if (!hasRov) {
|
|
if (!hasRov) {
|
|
|
if (item.modality === 'VIDEO') {
|
|
if (item.modality === 'VIDEO') {
|
|
|
- // VIDEO 缺 ROV → rovNorm=0,alpha 公式生效,alpha 低时自然沉底
|
|
|
|
|
- const composite = boost * params.alpha * simNorm
|
|
|
|
|
- return { composite, simNorm, rovNorm: 0, boost, lowerBound, passesThreshold }
|
|
|
|
|
|
|
+ const composite = codeBoost * params.alpha * simNorm
|
|
|
|
|
+ return { composite, simNorm, rovNorm: 0, boost: codeBoost, lowerBound, passesThreshold }
|
|
|
}
|
|
}
|
|
|
- // ARTICLE 缺 ROV → 退化为纯 sim 排序
|
|
|
|
|
- const composite = boost * simNorm
|
|
|
|
|
- return { composite, simNorm, rovNorm: 0, boost, lowerBound, passesThreshold }
|
|
|
|
|
|
|
+ const composite = simNorm
|
|
|
|
|
+ return { composite, simNorm, rovNorm: 0, boost: 1, lowerBound, passesThreshold }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const rovDenom = params.rovClipHigh - params.rovClipLow
|
|
const rovDenom = params.rovClipHigh - params.rovClipLow
|
|
|
const rovNorm = rovDenom > 0 ? clip01((rov - params.rovClipLow) / rovDenom) : 0
|
|
const rovNorm = rovDenom > 0 ? clip01((rov - params.rovClipLow) / rovDenom) : 0
|
|
|
- const composite = boost * (params.alpha * simNorm + (1 - params.alpha) * rovNorm)
|
|
|
|
|
- return { composite, simNorm, rovNorm, boost, lowerBound, passesThreshold, weightedQuality: rovNorm }
|
|
|
|
|
|
|
+ const composite = params.alpha * codeBoost * simNorm + (1 - params.alpha) * rovNorm
|
|
|
|
|
+ return { composite, simNorm, rovNorm, boost: codeBoost, lowerBound, passesThreshold, weightedQuality: rovNorm }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const STORAGE_KEY = 'vector_recall_ranking_params'
|
|
const STORAGE_KEY = 'vector_recall_ranking_params'
|