
出于对高端厨师刀的热爱,作者深入挖掘 Reddit 讨论,旨在通过命名实体识别(NER)技术,从海量评论中提取品牌、型号及钢材信息。相比按条计费的大型语言模型(LLM),微调开源小模型成为降低成本的關鍵路径。
核心方案与成果
项目采用“大模型标注+小模型微调”的策略。首先利用 Gemini 3.1 Pro API 一次性标注 4,290 条 Reddit 评论,随后基于这些标签微调 GLiNER large v2.5 (459M) 模型。最终模型在预留的 225 条验证集上,相对于 Gemini 标签的 F1 分数达到 0.83。若启用每类阈值优化,材料类别的召回率可从 0.787 提升至 0.911。
成本方面,Gemini 标注费用为 9 美元,Tesla T4 GPU 训练耗时约 24 分钟,成本约 2.50 美元。这意味着模型在第 4,291 条评论处理时即可收回成本,后续可在本地机器免费运行。
实施细节与技术挑战
在数据标注阶段,为避免 LLM 在字符偏移量计算上的误差,提示词仅要求返回精确子字符串及标签,再由 TypeScript 代码在本地计算偏移量。同时,引入约 30% 包含误报触发词但无实际产品的评论作为负样本,以提升模型判别力。
训练过程并非一帆风顺,前五次运行均因配置或张量处理错误失败。核心故障源于 words_mask 张量的构建:GLiNER 期望该张量为词索引(特殊/填充 token 为 0,真实词首子 token 递增),而非传统的二进制注意力掩码。错误的掩码导致模型无法正确聚合子 token,损失值停滞且无报错。修复索引逻辑后,模型在第 6 次运行中成功收敛。
经验总结
该项目证明,在小规模微调任务中,代码层面的张量构建错误往往比模型或数据本身更具隐蔽性。平坦的损失曲线可能由错误输入引起,而非数据难度。相较于追求更完美的标签集,对手动构建的张量添加严格断言更能保障开发效率。目前,该模型已驱动 New Knife Day 网站,实时追踪 Reddit 用户的刀具讨论。