用大模型做分类器——把提示词丢进上下文、拿回一个标签——用起来很别扭。尤其让人难受的是,它往往表现得还不错。
不妨先想清楚,一个合格的分类器到底该具备什么,再看看"大模型即分类器"能对上几条。
大模型当分类器,缺的是什么
第一是校准和阈值控制。大模型给出的判定往往是硬标签;你或许能拿到token的对数概率,但没有任何机制能保证这些概率是良好校准的。就算直接问模型"你有多确信",同样没有理由相信这个置信度是准的。连带的麻烦是,你很难用一套有原则的方式去权衡精确率和召回率。
第二是信息利用。大模型擅长处理非结构化数据,可我们手上常常还有规整的结构化数据。把这些塞进提示词,模型并不一定真去用它;即便是提示词里的文字部分,我们也无从知道模型到底用没用上。信号就这么白白流失了,实在令人沮丧。
此外,模型自带一些先验信息,未必贴合你的数据分布。比如它不知道你测试的人群里正类是稀有还是相对常见。你可以把这类背景告诉它,但每换一个人群就得改一次;而且正如第一点所说,改完是否被正确纳入判断,依然说不清楚。
第三是可解释性。某种程度上,提示词是高度可解释的,毕竟它是用散文写成的;可惜我们并不清楚模型内部到底发生了什么、提示词的哪些部分被正确遵循了(或者根本没被遵循)。
这些毛病不能怪大模型——它本来就不是为分类而设计的,也没有机制去合理地完成上面这些事。但问题只在于我们想错了框架。
LLM分类就是特征工程
换一个合适的框架来驾驭大模型的能力,就能既拿到大模型的能力,又享受标准机器学习算法的便利。先尝个鲜:用简单的逻辑回归把大模型判定包一层——
p(y = 1 | x) = σ(α + β · LLM(x))
注意,当β趋于无穷时,这基本就退化回了原来的大模型分类器。但那是个很笨的参数选择策略。正常做法是用训练数据估计参数,于是问题塌缩成两种情况,直接取经验估计即可:
p(y = k | LLM(x) = 1) = Σᵢ I(yᵢ = k 且 LLM(xᵢ) = 1) / Σᵢ I(LLM(xᵢ) = 1)
现在回头看看那几条诉求。
校准和阈值控制方面,只用大模型预测作为特征时,你会得到两个按经验比例给出的预测,期望上是校准的。随着特征增多,会得到更多不同的取值点;只要模型足够灵活,这些预测大致也是良好校准的,而且还有办法进一步改进。更重要的是,既然输出的是真实概率,就能按需要挑选操作阈值,去权衡精确率和召回率。
信息利用方面,这就是个逻辑回归,当然可以加入其他协变量。逻辑回归在训练集上拟合,自然就适配了那个数据集的基线和协变量结构。甚至可以给样本重新加权,去瞄准其他感兴趣的分布。
可解释性方面,大模型判定本身的解释难题还在,但至少现在能看清这个判定是如何影响最终决策的,尤其是在还纳入了其他协变量的情况下。
我们基本把想要的模型好性质都找回来了。还能再往前走吗?
LLM分类是很好的特征工程
如果对分类器表现不满意,该怎么办?在"大模型即分类器"的框架下,你唯一的选择是折腾提示词。这件事玄学味十足,网上建议满天飞,真知灼见却很少。祝你好运。
换成机器学习的视角,提升模型的办法就清晰了。
- 收集更多数据。这确实不够酷,因为大模型分类器的吸引力正在于免训练,所以在这个特征工程范式里还需要训练数据,难免让人失望。但我觉得这没想象中那么不方便:你总归需要一个测试集来评估表现(你本来就会量化性能的,对吧?),那再多准备一点训练数据也没那么麻烦。
- 把特征做得更好。改散文很复杂,但至少可以筛查特征:如果认为某个特征理应总是导向正类,就能用经验数据去验证并调试。也可以把特征本身当作一个次级目标来评估,递归地把它做得更好。
- 造更多特征。可以用模型的残差去发现该补哪些特征,而不是纠结措辞。比如直接取判定token的对数概率;或者让分类器多跑几次(如果判定前有推理过程,这些对数概率可能取到0或1);还可以让大模型给出子判定或其他特征。
- 改进模型架构。这部分完全是即插即用。不喜欢逻辑回归,可以换xgboost或神经网络,哪怕用大模型实现一套基于规则的系统也行。
说到底,大模型分类的本质是特征工程。想清楚这一点,那些拧巴的地方就有了着落。
热门跟贴