核心结论

对于类别数量少、类别互斥、语义边界稳定的任务,向量嵌入 (Embedding) 相似度分类可能比让一个超小生成式模型直接输出类别更可靠,而且不需要训练 BERT。

这不是因为 embedding 模型“更聪明”,而是因为两种方法的任务形式不同:

  • 生成式模型需要理解指令、记住允许的类别、选择主意图并生成合法输出;
  • embedding 分类只需要把输入和类别描述映射到同一个向量空间,再比较相似度。

后者绕开了小生成模型最脆弱的“指令遵循 + 闭集输出”环节。

本机对照实验

使用 BGE-M3 (BAAI General Embedding-M3) 和本地 Qwen3-0.6B 做了同题对照:

  • 情绪二分类:积极 / 消极,各 20 题;
  • 主题四分类:天气 / 烹饪 / 编程 / 旅行,各 10 题;
  • 所有类别彼此独立,避免复用之前客服工单任务中的业务灰度。

结果

方法情绪二分类主题四分类
BGE-M3 + 类别词100%95.0%
BGE-M3 + 类别定义100%97.5%
BGE-M3 + 两条类别原型平均100%95.0%
Qwen3-0.6B + prompt65.0%60.0%

Qwen 的测试关闭 thinking、temperature=0,并在 system prompt 中给出允许类别和类别定义。它不仅会判断错,还会输出“台风”“爬山”“日志”“Promise”等题面词,而不是允许的类别名。

BGE-M3 的最朴素版本只把输入分别与“积极/消极”或四个类别词计算余弦相似度,就已经超过了 Qwen3-0.6B;将类别词替换为一句定义后,四分类从 95% 提升到 97.5%。

为什么 embedding 在这里更适合

1. 任务目标和模型训练形式一致

情绪、主题、意图等分类本来就可以理解为“输入靠近哪个语义区域”。embedding 模型的目标是提供稳定的语义表示;相比之下,生成式模型还要完成一条额外链路:

理解文本 → 理解指令 → 记住标签集合 → 做分类 → 生成合法标签

0.6B 模型在最后两步尤其容易失败。embedding 方法则是:

输入向量 → 与类别向量比较 → 取最高相似度

2. 结果天然是固定集合中的一个

只要代码只在预先定义的类别向量中取最大值,模型不会凭空生成“日志”“极光”“品控问题”这种新类别。闭集约束由程序保证,而不是寄希望于小模型遵守 prompt。

3. 成本和吞吐更容易控制

BGE-M3 接口返回 1024 维向量,实测单请求支持 32 条短文本。分类只需要预先计算类别向量,然后对输入做一次 embedding 和若干余弦相似度计算。长批量、缓存和离线处理都比较自然。

原始客服工单任务:类别词不够用

同一个 BGE-M3 又被用于之前的 100 道客服工单 7 类任务,但这次严格只给类别词,不给定义和原型:

退款退货 / 催单物流 / 技术咨询 / 投诉升级 / 账户安全 / 售前咨询 / 闲聊无关

结果是 40% (40/100),与 Qwen3-0.6B 关闭 thinking 的 41% 几乎相同。但这不表示两者能力相同,而是说明这组业务标签不适合作为裸语义锚点:

  • BGE-M3 对“退款退货”召回 100%,因为文本中大量存在“退货、退款、换货”等词面信号;
  • 对“技术咨询”召回只有 4.2%,对“投诉升级”只有 5.9%,对“闲聊无关”是 0%;
  • “技术咨询”这个标签并不会自动让 embedding 知道它还包括发票补开、安装环境、固件排障和质保流程;
  • Qwen 的主要问题是指令遵循和非法类别输出,BGE-M3 的主要问题是类别词没有承载足够的业务定义。

所以,embedding 的结果取决于类别文本是否是好的语义锚点。对于业务分类,应该给每个类别写可比较的定义,例如:

技术咨询:用户已经购买或正在使用产品时,询问安装、配置、故障排查、发票或质保流程。

再将输入与这些定义做相似度比较,而不是直接与“技术咨询”四个字比较。

同一批 100 道客服题随后用 7 段完整业务定义重测:准确率从裸词 40% 升到 56%。两种表示的逐类 Recall 如下:

类别裸类别词完整业务定义
退款退货100%33.3%
催单物流50.0%100%
技术咨询4.2%62.5%
投诉升级5.9%0%
账户安全63.6%100%
售前咨询46.7%73.3%
闲聊无关0%33.3%

这不是全面提升,而是一次召回再分配:定义救回了抽象类别,却把“已收货要退换”吸向物流;投诉升级仍然完全没有形成独立向量区域。它也无法执行“即使威胁投诉,核心仍是退款”这类优先级规则。业务定义有用,但不足以替代需要主次判断的路由规则;下一步应在工单 embedding 上训练轻量分类器。

embedding 不是万能的

BGE-M3 仍会犯“语义相似但业务意图不同”的错误。例如:

  • “空气炸锅做薯条需要多少度、烤多长时间?”用单个类别词时被天气压过,天气与烹饪相似度几乎打平;
  • “想去看极光,哪个季节和城市更合适?”在类别词和类别定义版本中都被判成天气,因为“极光”是很强的表面主题词;
  • 两条类别原型求平均并不总是更好,还把“去京都旅行五天”判成了天气。

因此,embedding 解决的是“表示和固定选择”问题,不会自动解决:

  • 复杂场景推理;
  • 多意图主次关系;
  • 业务优先级;
  • 隐含否定和反讽;
  • 类别定义本身的歧义。

更实用的工程方案

规则 / 关键词
    ↓ 高确定性样本
Embedding + 类别定义相似度
    ↓ 分数高且间隔足够
直接分类
    ↓ 分数低或两个类别接近
轻量分类器 / 微调模型 / LLM 复核
    ↓ 高风险或业务争议
人工或业务规则兜底

其中可以设置两个阈值:

  • 最高相似度阈值:最高分太低时,说明文本可能不属于已知类别;
  • 分差阈值:第一名与第二名太接近时,说明类别边界不确定。

如果类别和样本长期稳定,可以在 embedding 上训练逻辑回归 (Logistic Regression) 或线性分类器。它需要的训练成本通常比 BERT 微调低很多,同时能学习领域特有的决策边界。

与 BERT 的关系

并不是“BERT 没用了”,而是应区分几种成本:

  • 只有少量稳定类别、没有标注数据:先用 embedding + 类别定义,几乎零训练成本;
  • 有一批领域标注数据、需要稳定边界:embedding + 轻量分类器可能是最佳性价比;
  • 语言、领域和任务变化大:可以考虑 encoder 微调或 LLM;
  • 需要解释、结构化抽取或复杂主次判断:embedding 只能做第一层筛选。

传统 NLP (Traditional Natural Language Processing, NLP) 和专用分类器并没有因为 LLM 出现而消失。固定业务中,可控性、延迟、成本和可重复性常常比通用知识覆盖面更重要。

相关:模型离确定性的人类经验判断还很远 (Models Are Still Far from Deterministic Human Experiential Judgment)、模型能力边界的不可预测性、BERT 与 DistilBERT (BERT and DistilBERT)、AI 依赖与二次理解 (AI Dependence & Second Understanding)


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/LLM