LR/SVM在封闭分类任务上仍具竞争力,零训练数据、零推理成本、完全可审计,文中给出关键词+TF-IDF+线性模型的实用组合,对高精度有限类别尤其适用。
分类是语言模型最常用、却最不值得用的任务。把一篇文档归入八个类别之一是一个封闭输出问题,而这恰恰是经典方法被设计用来处理的形态,而且在运行成本上差距是三个数量级。
零训练数据,零推理成本,完全可审计,而且你可以用一行代码修复一个特定错误。它们在同义词、否定和任何需要判断的情况下都会失败,而且会积累异常直到没人敢碰那个文件。不过对于少量明确、高精度的类别来说仍然是正确答案——而且值得先写,因为构建它们的过程会告诉你这些类别实际上是什么。
TF-IDF 或字符 n-gram 送入逻辑回归或线性 SVM。在笔记本上几秒训练完,一次预测在亚毫秒级,学习的权重可以直接检查——你可以打印出驱动一个类别的二十个特征。Wang 和 Manning 的《Baselines and Bigrams》(ACL 2012)始终提醒人们,一个精心构建的版本在情感和主题任务上仍然可以与更复杂的系统竞争。fastText(Joulin、Grave、Bojanowski 和 Mikolov,2016)用子词特征扩展了同样的思路,报告在多核 CPU 上十分钟内训练超过十亿词,在不到一分钟内将五十万句子分类到数十万个类别——这些数字来自论文,也是这一行存在的原因。
一个 22M 到 110M 参数的编码器——MiniLM、DistilBERT、或一个小型多语言模型——在你的标签上微调。这是本地方案中的准确率选项:它能读取上下文,所以否定和词序都能处理。它需要 GPU 来舒适地训练,需要几百到几千个标签,在 CPU 上推理时每个文档花费个位数毫秒。相关的问题是微调是否是正确的选择。
描述类别,发送文档,解析标签。无需训练数据,第一天就能用,能处理你今天早上才发明的类别,而且能处理其他方案无法处理的细微差别。但它也是唯一一个按文档收费的选项,需要一次网络往返,而且输出空间实际上并不是封闭的——将其约束到你的标签集是一项单独的工作。
没有人对这些做过基准测试。下面的计算基于标注假设;用你自己的假设替换,结果可能会移动。
假设:100 万篇文档要分类,平均 300 个 token——3 亿个输入 token。
假设:4 vCPU 实例每小时成本 $0.05。
假设:线性模型在 0.2 ms 内分类一个文档;小型微调编码器在 CPU 上需要 8 ms。
假设:托管模型在最便宜端每百万输入 token 收费 $0.10,中端为 $1.00,输出小到可以忽略。
第二行和第四行之间的比例在运行成本上大约是 3000× 到 30000×,而且这是一个比例而不是差值:在一千万篇文档和一亿篇文档上都成立。相比之下,托管模型几乎没有固定成本,这就是它在低容量时胜出的全部原因。盈亏平衡推导计算的是交叉点。
标签预算实际上能买到什么
对每个本地方案的反对意见都是"我们没有标注数据",而它通常比听起来小得多。
把一篇文档标注到几个类别中需要秒级,而不是分钟级。以每篇文档 10 秒计算,1000 个标签不到一个人三个小时的工作量——而一个基于一千个精心挑选样本的线性模型是一个真正的系统,不是玩具。值得宽松把握的粗略指导:每个类几百个样本足以有效地微调一个小编码器;每个类一两千个是线性模型快速提升的极限;大多数业务分类体系一万个就边际效益递减了。
还有一种捷径让选择不那么非此即彼:用托管模型一次性标注几千篇文档,让人类审核并纠正,然后在结果上训练本地模型。你只需要付一次 API 费用而不是永远付下去,最终得到一个在进程中运行的组件。这就是普通意义上的蒸馏——总体模式是一样的——对于分类来说它异常简单,因为输出只有一个 token。
不要跳过人类审核步骤。在未经审核的模型输出上训练会将其系统性错误烘焙到一个组件里,而这个组件现在会以更快的速度和更低的成本犯这些错误,而且你将没有一个独立于它们的评估集。
延迟、确定性、可审计性
成本是四个差异中最不有趣的一个。
延迟。进程内亚毫秒对比网络上的数百毫秒。这不是百分比差异,而是架构差异:低于一毫秒,分类是请求处理器内的一个函数调用。在 400 ms 时它需要一个队列、一个 worker、超时和重试策略,而且它要么阻塞用户要么变成异步的。
确定性。一个带有固定权重的拟合模型会对相同输入永久返回相同标签。托管端点可以在不通知的情况下更新——静默模型更新是一个有记录的操作风险——而且除非你固定了采样,否则相同的 prompt 可以在不同调用中产生不同的标签。
可审计性。对于线性模型,你可以产生导致一个决策的精确特征和权重。如果分类影响到一个人——审核、资格认定、投诉优先级——这个差异不是学术性的;它是解释和事后生成的可能故事之间的差异。
尝试它们的顺序
按成本升序,在第一个在你自己文档的保留集上清除你标准的方案处停止。先写规则,因为它们定义了类别。在你拥有的任何标签上拟合线性模型,因为它需要一个下午而且它是衡量后续所有决策的基线。如果线性模型的错误是上下文相关的,就微调一个小编码器。只有当类别真正需要阅读理解时、当容量低到账单可以忽略时、或者当你本周就需要一个可用的方案时,才使用托管模型。
然后考虑级联而不是选择:本地模型处理有信心的大多数,只有低于置信度阈值的文档才升级。以 5% 的升级率,上表中的 API 行下降到每百万文档 $1.50 到 $15,而困难案例仍然得到更好的处理。
升级计算是可核查的而不是假设的:通过托管模型进行分类像其他服务一样按 token 计费,所以你自己的升级率和文档长度可以从每个模型的价格直接得到这个数字。结论仍然指向同样的方向,而且值得直说:对于固定分类法在高容量下,本地线性模型便宜三个数量级,快三个数量级,确定性强,且可解释——没有任何 token 价格能让托管方案赢得这场比较。
Sentiment Analysis: Harder Than It Looks
Keyword Extraction and Summarising Without Generation
Evaluating Classical NLP vs LLM Approaches