大山哥AGI头像
本地重排不是模型微调:推荐 UI 如何选择规则与模型封面图

本地重排不是模型微调:推荐 UI 如何选择规则与模型

推荐顺序变化与模型权重变化分开

用户点过两次“轻便”,页面把轻量商品排到前面。这个功能可以有用,但若实现只是调整本地分数,就应称为会话重排。把一个偏好权重加到排序公式里,不等于微调了大模型,也不证明推荐质量提升。

2026 年 10 月 22 日的 Decisions API 公告讨论有限答案决策;10 月 6 日的 EmbeddingGemma 2 资料讨论嵌入能力。它们分别给分类和表征提供了候选技术,选择哪一种,要从页面的问题开始。

先问需要改变什么

如果规则是“用户勾选轻便后,先看符合重量上限的商品”,过滤和稳定排序就够了。如果请求是“出差带着方便,但不要牺牲降噪”,可能需要分类或语义检索,将意图变成可检查的标签与候选。若要学习跨会话的参数,则涉及训练数据、目标函数、参数更新与离线评估,已经不是前端排序函数。

模型输出的偏好不能覆盖用户明确的筛选条件。用户说预算不超过某个数值,候选超预算就应排除或解释例外,而不是因为相似度高悄悄混进来。数值价格仍由权威商品服务提供。

规则、分类、训练各自改变什么

一个有开关的稳定重排

下面把偏好限制在会话内。商品 ID 是稳定身份,原始顺序作为同分时的规则,关闭个性化直接恢复基线。它没有训练、嵌入和模型调用。

保存为 rerank.mjs,执行 node rerank.mjs:

import assert from "node:assert/strict";

function rerank(items, { enabled, preferLight, maxPriceCents }) {
  if (!Number.isSafeInteger(maxPriceCents) || maxPriceCents < 0)
    throw new Error("invalid budget");
  const ids = new Set();
  const rows = items.map((item, index) => {
    if (typeof item.id !== "string" || ids.has(item.id))
      throw new Error("unique stable IDs required");
    ids.add(item.id);
    if (!Number.isSafeInteger(item.priceCents) || item.priceCents < 0 ||
        !Number.isFinite(item.weightGrams) || item.weightGrams <= 0)
      throw new Error("invalid catalog row");
    return { item, index };
  }).filter(x => x.item.priceCents <= maxPriceCents);
  if (!enabled) return rows.map(x => x.item);
  return rows.map(x => ({ ...x, score: preferLight && x.item.weightGrams <= 250 ? 1 : 0 }))
    .sort((a, b) => b.score - a.score || a.index - b.index)
    .map(x => x.item);
}
const items = [
  { id: "a", priceCents: 10000, weightGrams: 300 },
  { id: "b", priceCents: 12000, weightGrams: 200 },
  { id: "c", priceCents: 9000, weightGrams: 220 },
  { id: "d", priceCents: 90000, weightGrams: 100 }
];
const opts = { enabled: true, preferLight: true, maxPriceCents: 20000 };
assert.deepEqual(rerank(items, opts).map(x => x.id), ["b", "c", "a"]);
assert.deepEqual(rerank(items, { ...opts, enabled: false }).map(x => x.id), ["a", "b", "c"]);
assert.equal(items[0].id, "a");
assert.throws(() => rerank([items[0], items[0]], opts));
assert.throws(() => rerank(items, { ...opts, maxPriceCents: NaN }));
console.log("stable rerank fixtures passed; no model trained");

重量阈值 250 克只是示例规则,不代表某品类的科学标准。真正的业务规则应由产品需求与商品字段约定决定。单纯排序也可能造成用户正在操作的卡片移动:稳定 ID 只保住组件身份,不保证键盘焦点附近的阅读顺序不变。可以在用户完成本次操作后再应用新排序,并提示顺序已更新。

模型值得接进来的证据

分类模型应有人工标注的请求集,记录错分、拒答和模糊输入。语义检索则需要测召回与误检;嵌入相似不等于商品满足硬性要求。规则路线也要记录维护量,否则“零模型费用”可能掩盖长期人工成本。

端侧路径需要分别记录下载、初始化、预处理和推理;服务端路径需要算网络与排队。INP 关注交互到下一次呈现,不能拿一次网络决策耗时冒充 INP。后台标签页与冷启动样本也不应混入同一张平均值表。

会话偏好可以少收集一些数据,但“本地处理”不自动解决隐私问题。持久化什么、多久过期、能否关闭、错误偏好如何清除,都要有明确产品行为。

已运行的是 Node v26.3.0 的排序边界测试;尚未接入模型、浏览器焦点、真实用户或推荐实验,不能宣称准确率和转化收益。

参考资料:Decisions API,2026-10-22;EmbeddingGemma 2,2026-10-06;INP,持续更新的指标文档。采用前人工复核产品版本与文档。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/cannonmonster01/article/details/169170511

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--