首页 / 文章

用于0.8B SQL Agent的软标签蒸馏技术:为何较弱的Qwen教师模型更胜一筹

通过使用冻结轨迹中的top-k软标签对LoRA进行微调,一个0.8B参数的SQL智能体在220项任务中完成了55项,而性能较弱的Qwen模型反而优于性能更强的GPT模型。

发布者:REACTAPP.TOP阅读约 20 分钟4637 词

来源: Small-Model Distillation — Part 2: Off-Policy Soft-Label KD for a 0.8B SQL Agent

简述版

在之前的实验中,该0.8B参数的SQL智能体通过逐个复制更大的“教师”模型中的标记,将220个任务中仅能解决1个的任务数量提升到了46个。这次只做了一处改动:如果智能体不仅能看到自己最终选择的标记,还能看到教师模型中的部分不确定性信息,会出现什么情况?其他所有设置保持不变:训练框架、220个任务的评估标准、动作结构、0.8B参数的智能体以及LoRA微调方案,只有学习信号会发生变化。

教师模型的固定轨迹被重新评分,每个位置上概率最高的20个标记会被保存下来,其余部分则用少量剩余值表示。随后将传统的加权硬标记训练方法与top-k软标签蒸馏方法进行了对比。最佳实验结果为220个任务中解决了55个,而使用硬标记训练的智能体仅解决了46个,两种方法结合使用时则解决了49个任务。

标题中的数字并非最有趣的部分。在八次单源测试中,柔和的标签让情况变得更糟。最优秀的教师也并非最强者。同系列中表现较弱的模型Qwen,其得分仅为96/220,但它对自身生成内容的匹配度远高于更强的GPT模型(115/220),因此它给出的概率能为学习者提供更清晰的指导。真正的优势则来自于将两种来源混合使用。

需要提前说明一点:GPT本身的token概率从未被公开过。此处展示的GPT生成内容是由Qwen进行评分的,因此它们只是替代数据,并非真正的GPT对数概率提炼结果。

测试内容

更宏观的目标是让小型模型在特定任务上表现得更好。该智能体仍是之前的SQL修复智能体,它会接收用户提出的问题以及有错误的SQL代码,能够查看SQLite数据库、执行查询、读取结果并提交修正后的SQL代码。评分依据是隐藏的确定性测试,没有使用大型语言模型作为评判标准。

早前的硬令牌训练已经证明小型模型能够完成这一循环流程。未经调优的基模型大多只是重复操作,从未提交过任何结果。而在经过硬令牌监督微调后,它执行查看、查询和提交操作的频率大幅增加。

对难处理标记进行训练是一种粗陋的方法。学习者只需复现教师所写的标记,却无从知晓教师有多确定、还考虑了哪些其他选项,以及次优选项是否几乎同样好。在SQL中,这些缺失的信息可能会影响表名和列名、谓词、连接操作、字面值以及结构化操作的语法。

那么问题就在于:在保持跟踪数据和基准测试不变的情况下,top-k软标签蒸馏是否能提升同一个0.8B规模的智能体性能。

研究比较了两种起点模型。一种是基础模型unsloth/Qwen3.5-0.8B,另一种则是基于Qwen3.5-35B-A3B 8位版本的成功路径提前训练过的Qwen3.5-0.8B难处理标记适配器。换句话说,软标签训练应该是从零开始,还是以难处理标记训练的结果为基础继续进行?

SQL智能体任务

该测试环境与之前的硬令牌测试相同。每个任务都包含一个用户问题、一个有错误的查询以及一个SQLite数据库。模型需要从若干结构化操作中选择:检查模式、执行SQL语句或提交最终SQL语句。只有当提交的SQL语句通过隐藏测试时,该任务才算解决。

一个典型且规模较小但真实的任务:在chinook数据库中,用户希望获取最新的track_id,然后利用它来筛选track表中的记录。有错误的查询如下:

WITH vars AS (SELECT COUNT(*) AS vars_id FROM track)
SELECT * FROM track WHERE track_id = vars_id

该缺陷与格式无关。COUNT(*)并非最新的标识符,需要采用类似MAX(track_id)的修复方式。模型必须在工具循环中自行处理这个问题:或许需要检查架构、运行探测、读取观测结果,最后以框架所接受的精确结构化格式提交SQL。

BAML即边界标记语言,仍负责将提示语封装为结构化输出层。它确定了决策的格式,并整合出发送给模型的请求。自由形式的教师文本永远不会成为学生训练数据的一部分;模型学习的是由简短的draft和可执行的output操作构成的标准JSON格式决策。

{"draft":"Need schema first.","output":{"action":"inspect_schema"}}
{"draft":"Test a candidate query.","output":{"action":"run_sql_query","sql":"SELECT ..."}}
{"draft":"Submit corrected SQL.","output":{"action":"submit_sql","sql":["SELECT ..."]}}

每次评估都会复用上一次运行的设置,因此唯一会变化的是训练信号。有两个设置值得特别说明。8192这个序列上限是提示词与生成内容的总预算:系统提示词、任务描述、之前的操作记录、架构信息、查询结果、结构化输出指令以及生成内容所占的额度都包含在此范围内。最大生成token数则单独列出,因为它限制了单次模型调用的次数。学生可以读取大量状态信息,但每轮仍必须输出一个简洁的操作指令。评估结果通过终端输出以及提交次数、错误提交数、SQL错误、重复操作导致的停止以及最大轮次限制等行为指标来呈现。

最优秀的学生并非主要在JSON处理上出错,他们能够顺利达到submit_sql阶段。真正具有挑战性的是SQL判断能力,以及当探测过程出现异常时的应对能力。

训练思路

硬令牌蒸馏会为每个位置提供一个目标令牌。而软标签蒸馏则提供一个小概率分布。假设教师的目标中包含如... FROM users ...这样的表令牌,硬训练会判定下一个令牌为users。软标签训练则能说明教师对几个相近选项赋予了多高的概率。虽然最终选中的令牌仍然有效,但学习者还能了解到有些选项的优先级比其他选项更高。

对于大型语言模型而言,存储完整词汇表的概率成本很高。一个词汇表可能包含数十万个令牌,且每个教师的决策会涉及多个助手目标位置。因此实际采用的折中方案是稀疏版本:每个助手目标位置仅保留前20个最高概率的教师概率,其余令牌则用剩余的概率值表示。

为何要保留尾部数据?假设已保存的前20个概率值之和为0.996,剩下的0.004仍属于教师模型的概率分布。若将前20个概率值调整至1.0,就会让学生产生过度自信的目标值。因此,目标值会被刻意设定为记住仍有一部分概率存在于已保存数据之外。

这种方法仍属于离线策略。学生是从之前收集的轨迹数据中学习,而在评分过程中从不进行实际操作。

简短的代码演示

实现该方法的最简单方式是跟踪处理流程中的某一行数据。对于软标签,并未构建新的智能体环境,而是直接复用从硬令牌轨迹运行中得到的那些成功的教师决策,以相同的BAML提示格式呈现,然后再为辅助目标令牌补充概率信息。

这是一行关于硬令牌监督微调(SFT)的说明。SFT是在输入输出对上进行训练,其中只有答案令牌会影响损失值:

row = {
    "messages": conversation_before_teacher_decision + [
        {"role": "assistant", "content": canonical_decision_json(teacher_decision)}
    ],
    "teacher_draft": teacher_decision.draft,
    "teacher_action": teacher_decision.output,
}

软标签行保留相同的规范消息和教师元数据,并在助手的目标位置获得教师强制设定的标记分数。此处的“教师强制”指的是将已知的目标文本输入概率模型,逐个标记地询问在该上下文中该文本出现的概率。系统存储对数概率而非原始概率,因为在数值表示和训练过程中,对数概率更为安全:

row = {
    "messages": [..., {"role": "assistant", "content": target_decision_json}],
    "distillation": {
        "probability_model": "Qwen3.5-35B-A3B 8-bit",
        "top_k": 20,
        "row_weight": 1.18,
        "token_scores": [
            {
                "position": 1661,              # full-sequence token position
                "target_token_id": 412,
                "target_logprob": -0.21,
                "top_token_ids": [412, 879, 91],
                "top_logprobs": [-0.21, -2.81, -3.51],
                "top_mass": 0.90,
                "tail_mass": 0.10,
            }
        ],
    },
}

评分模块只有一个功能:对已固定的行打上标记概率。Qwen3.5-35B-A3B 8位评分器从不需要生成新的决策。提示语会在没有助手回复的情况下被处理,完整序列则会在有回复的情况下被处理,目标部分则逐个标记进行评分:

prompt = chat_template(messages[:-1], add_generation_prompt=True)
full = chat_template(messages, add_generation_prompt=False)
prompt_ids = tokenize(prompt)
full_ids = tokenize(full)
target_ids = full_ids[len(prompt_ids):]
prefill_teacher_cache(prompt_ids[:-1])
driver_ids = [prompt_ids[-1]] + target_ids[:-1]
for i, target_id in enumerate(target_ids):
    logits = qwen_35b(driver_ids[i]).logits
    logprobs = log_softmax(logits)
    top_ids, top_logprobs = top_k(logprobs, k=20)
    save_token_score(
        position=len(prompt_ids) + i,
        target_token_id=target_id,
        target_logprob=logprobs[target_id],
        top_token_ids=top_ids,
        top_logprobs=top_logprobs,
        tail_mass=1.0 - sum(exp(top_logprobs)),
    )

仅助手端的掩码处理方式与硬令牌运行模式保持一致。提示词令牌属于上下文信息,而助手目标令牌则用于监督。对于智能体而言,这一点比普通问答更为重要,因为提示词中包含了模式观察结果、之前的工具输出以及SQL查询结果。这些令牌是用来作为条件参考的,而非用于预测:

labels = full_ids.copy()
labels[: len(prompt_ids)] = -100
hard_ce = cross_entropy(student_logits, labels)

与普通SFT相比,训练时需要的张量更多。一个批次通常会包含input_ids、attention_mask以及掩码后的labels,除此之外,它还会存储每个位置的权重、前k个令牌的编号及其对数概率、这k个位置的掩码,以及剩余部分的概率。填充操作会在未使用的位置填入中性值,因此损失函数可以无需额外处理直接忽略这些值:

batch = {
    "input_ids": pad(input_ids, pad_id),
    "attention_mask": pad(attention_mask, 0),
    "labels": pad(labels, -100),
    "position_weights": pad(position_weights, 0.0),
    "topk_token_ids": pad(topk_token_ids, [0] * top_k),
    "topk_logprobs": pad(topk_logprobs, [0.0] * top_k),
    "topk_mask": pad(topk_mask, [False] * top_k),
    "tail_probs": pad(tail_probs, 0.0),
}

控制条件为加权硬令牌微调。虽然仍有一个选定的令牌作为目标,但助手令牌的交叉熵会乘以一个置信度权重,该权重取自评分器对该目标的对数概率。评分器认为概率较高的情况会被赋予更大的权重,而概率较低的情况则会被赋予更小的权重:

z = (mean_target_logprob - dataset_mean_logprob) / dataset_logprob_std
row_weight = clip(2 / (1 + exp(-z)), 0.25, 1.75)
loss = row_weight * hard_ce

将范围限制在 [0.25, 1.75] 可防止任何单行数据主导整个批次,同时那些可靠性较高的行仍能以较大优势超过那些不稳定的行。

在软标签处理方面,损失函数中加入了概率匹配项。以下仅为该项形态的简要描述,并非实际代码:

teacher_top_probs = exp(top_logprobs) * topk_mask
teacher_top_probs *= (1.0 - tail_mass) / sum(teacher_top_probs)
student_logprobs = log_softmax(student_logits_at_target_positions)
student_top_logprobs = gather(student_logprobs, topk_token_ids)
student_tail_prob = 1.0 - sum(exp(student_top_logprobs))
topk_kl = sum(teacher_top_probs * (log(teacher_top_probs) - student_top_logprobs))
tail_kl = tail_mass * (log(tail_mass) - log(student_tail_prob))
loss = hard_ce + topk_kl + tail_kl

信息从教师流向学生:学生追求的是教师的分布,如果该分布分配给该区域的概率过低,则会面临惩罚。在真正的训练器中,交叉熵与蒸馏操作均仅在经过偏移的辅助目标位置上计算。

实际的学生训练仍然是LoRA微调。LoRA即低秩适配技术,它几乎保持基础模型不变,仅在选定的注意力机制和MLP模块上附加小型可训练的适配矩阵。这样一来,无需每次都对0.8B模型进行完整微调,就能低成本地对比多次训练结果。

student = load_student("unsloth/Qwen3.5-0.8B", max_seq_length=4096)
student = add_lora_adapters(
    student,
    rank=32,
    alpha=32,
    target_modules=[
        "q_proj", "k_proj", "v_proj", "o_proj",
        "gate_proj", "up_proj", "down_proj",
    ],
)
trainer_class = make_trainer_class(Trainer, soft_label_args)
trainer = trainer_class(
    model=student,
    train_dataset=scored_train_examples,
    eval_dataset=scored_validation_examples,
    data_collator=distillation_collator,
    batch_size=1,
    gradient_accumulation_steps=8,
    learning_rate=5e-5,
    epochs=3,
)
trainer.train()
adapter = save_lora_adapter(student)

实际实现与此类似:make_trainer_class会返回一个Hugging Face的Trainer子类,该子类会应用已保存的稀疏top-k损失与残差尾部损失。注意这与TRL的在线版DistillationTrainer有所不同,后者是在训练器内部进行教师模型评分的。三种软标签权重均保持为1.0:硬交叉熵损失、蒸馏损失以及温度参数。温度参数特意保持不变,因为稀疏特征值本身就是1.0,且此次研究并非旨在探讨温度缩放的效果。

最后的评估是真正的实际应用,而非教师模型强制干预。训练好的适配器会被重新接入SQL-agent框架,必须逐轮处理那220个保留的测试任务:

for task in held_out_eval_tasks:
    state = start_sql_agent_task(task)
    for turn in range(8):
        messages = render_baml_messages(state)
        decision = model_with_adapter.generate_action(
            messages,
            max_new_tokens=512,
            temperature=0.0,
        )
        state = execute_action_and_append_observation(state, decision)
        if state.solved or state.stopped:
            break
    results.append(score_final_submission(state))

许多离线蒸馏方法都在最后这一步失败。教师引导测试的是学生是否能在教师设定的情境中预测教师接下来的操作。而逐步推进测试则是检验学生是否能够接受自己早先做出的选择、挑选有用的查询方式、避免重复,并提交正确的SQL语句。此处只有第二个指标才是重要的。

实验的运行方式

这很容易被误认为是在线策略蒸馏,但实际上并非如此。学生生成的任何内容都不会被评分,它只是事后从教师已经生成的记录中学习。

这些数据来源于对已冻结的成功生成轨迹的评分过程。教师的操作早已存在,概率模型仅用于判断在给定上下文中每个选定标记出现的概率,而不会生成新的决策。这两个被评分的数据集被分开处理(GPT的轨迹由Qwen评分,Qwen的轨迹也由Qwen评分),并且每组数据都会根据最终生成序列的长度进行过滤,因为架构观察结果和之前的工具输出也是学生需要吸收的内容,而不仅仅是最终答案。需要注意的是:GPT的轨迹被视为由Qwen代理评分的,并非使用GPT自身的概率模型进行评分,且在评分过程中学生不会采取任何操作。

针对这些已评分的数据,采用了三种不同的训练方式:

  • 加权硬令牌微调(控制方法)。每个位置选择一个令牌,每行的权重由评分器的置信度决定。这是一种带有置信度调节功能的SFT方法。区别在于:这不是软标签蒸馏,因为学习者能看到权重,却看不到top-k分布。
  • Top-k软标签蒸馏(待测试方法)。使用相同的硬目标,同时加入第二个信号,要求学习者将概率分配到评分器所认定的top-k个选项上,剩余概率则分配给其他所有选项。区别在于:这是一种离线方法,且是在冻结的轨迹上由教师强制引导的,教师从不对学习者自己的样本进行评分。
  • 教师数据与源数据的混合使用。 GPT-proxy和Qwen-self两组数据会被合并、随机排序,然后用于从两个方向训练基础学生模型。其特点在于:它是在不同教师的数据之间进行混合,而非将各教师的数据分布合并为一种,且每条数据都保留了生成它的评分器信息。
  • 混合使用多种数据源能得到最清晰、最容易理解的结果:更多样化的成功样本以及更丰富的每个标记的目标值,使得小型基础模型有更多可学习的内容,远超过单独使用任一数据源时的情况。

    数据集与过滤

    教师模型的样本是刻意不重新生成的。它们来自硬标记训练阶段,因此比较的重点在于监督信号本身,而非新一轮的数据生成。

    在那一轮测试中,两位测试者都使用了相同的879个训练任务。GPT 5.5 medium在879个任务中答对了446个,从而产生了1046行SFT数据。Qwen3.5-35B-A3B 8-bit则答对了394个任务,产生了1232行数据,因为其成功的推理过程持续时间更长。在220个任务的评估中,GPT 5.5 medium表现更佳,得分分别为115分和96分,因此这里的Qwen测试属于同系列模型对比,而非最强模型对比。

    这种替代方法的局限性不容忽视。要获得真实的GPT 5.5 medium软标签,需要该模型自身的词元概率,而这些数据并不可用。因此,GPT推理过程实验实际上提出了一个更具体的问题:同系列的Qwen模型评分机制能否为GPT的选择提供任何有用的信息?

    对于每一行,都会生成BAML提示词,即实际被使用的提示内容。已知的助手目标则通过Qwen3.5-35B-A3B 8位模型进行强制处理,而仅会为助手目标位置存储令牌得分。

    在开始任何训练之前,需要检查得分数据的两项内容:其一是有多少数据量符合4096个标记的限制;其二则是Qwen的评分结果与各原始数据源的匹配程度。负对数似然值越低越好,因为这说明概率模型认为目标行为更容易被解释。正因如此,Qwen自行评分的数据与GPT代理评分的数据差异如此之大:Qwen对自己生成的轨迹的信心远高于对GPT 5.5中等版本生成的轨迹的信心。Qwen自行评分的数据行目标负对数似然值的平均值为0.297,而GPT代理评分的数据行这一数值为0.876。在所有Qwen自行评分的样本中,目标标记均位于存储的前20个标记之内(占比100.00%),而在GPT代理评分的样本中,这一比例则为98.56%。

    合并后的数据集初始有2278行。经过4096令牌过滤后剩余2253行,其中2141行用于训练,112行用于验证。在数据分割之前,通过固定种子对行进行了打乱,以避免验证集反映原始数据的顺序。

    训练设置

    主要实验设计包括八次运行,这些运行涵盖了三种二元选择的所有组合:跟踪源(GPT代理或Qwen模型本身)、方法(加权硬标签或软标签)以及学生初始状态(基础状态或硬令牌预热启动)。另外还有两次运行,均基于基础模型且使用合并后的数据,一次采用加权硬令牌,另一次采用软标签,这样总共得到了十个训练后的模型。合并预热启动的实验被排除在外。前八次运行表明预热启动效果在很大程度上取决于跟踪源,而合并启动的实验则是为了回答一个更简单的问题:在基础模型上,混合不同教师的数据是否有帮助?

    训练超参数采用硬令牌轨迹基线。适配器在注意力投影(q_proj、k_proj、v_proj、o_proj)和MLP投影(gate_proj、up_proj、down_proj)上均使用秩为32、alpha值为32的LoRA。其他设置包括:学习率为5e-5,每台设备的批次大小为1并采用8次累积步骤,训练周期为3轮,在NVIDIA GPU上使用bf16格式,同时启用Unsloth及可用时的FlashAttention 2。其余设置还包括5%的验证集比例、种子值为42,以及完整训练序列的长度上限为4096个令牌。

    对于软标签,温度值为1.0,硬交叉熵与蒸馏的权重均为1.0。该代码会同时保留存储的top-k质量值与剩余尾部质量值,这是一种针对以稀疏形式序列化的概率值所采用的简单数值处理方法。

    训练样本量并不相同:基于GPT代理评分的训练使用990行数据,基于Qwen自我评分的训练使用1151行数据,而结合两种评分方式的训练则使用2141行数据。在批量大小为1且累积步数为8的情况下,三个训练周期分别进行了372次、432次和804次优化器更新。在实验标签中,Base表示未经调优的unsloth/Qwen3.5-0.8B模型,GPT proxy指由Qwen3.5-35B-A3B 8位版本对GPT 5.5中型模型生成的轨迹数据,Qwen self表示由Qwen模型自身对其生成的轨迹数据进行评分,而Combined则表示在训练前将这两种评分结果合并后的数据集。

    在处理验证损失时需格外谨慎。这些损失在单一目标函数中是有意义的,但由于加权硬标签和软标签训练的损失包含不同的项,因此无法直接相互比较。最低的验证损失来自基础版Qwen的加权硬标签训练结果,该模型仅解决了220道题中的40道,而尽管损失较高,最佳结果却来自结合了软标签方法的训练。

    准备工作和训练是在不同的硬件上进行的。配备大内存的机器便于在本地加载并评估Qwen3.5-35B-A3B 8位版本,不过实际的教师强制评估过程耗时较长:GPT模型的评估大约需要60分钟,Qwen模型则需要41分钟。学生们则使用NVIDIA GPU进行训练。那些单次来源的训练过程,记录显示每次持续约23至30分钟,而规模较大的综合训练则分别需要约52分钟(加权硬标签)和55分钟(软标签)。

    按问题分类的结果

    第一张图表试图一次性展示所有内容,却混淆了两个不同的问题:从基础模型开始训练会发生什么,以及从硬令牌轨迹模型继续训练会发生什么。因此,结果按研究问题进行了划分。

    作为参考,在固定的220个任务评估中,各基准模型的表现如下:不进行微调的模型得分为1/220,硬令牌学生模型得分为46/220,以Qwen作为教师模型的得分为96/220,以GPT作为教师模型的得分为115/220。top-k软标签实验的目的并非要超越这些基准模型,而是想看看更丰富的监督信号是否能在相同条件下进一步提升0.8B参数的学生模型性能。

    从基础模型开始。所有经过训练的模型表现均优于未经调优的1/220模型。仅使用GPT或仅使用Qwen进行训练的结果相近,根据所用方法不同,分别解决了41到43个任务。将两种模型结合使用则产生了更大差异:结合加权硬令牌方法的模型解决了49/220个任务,而结合top-k软标签方法的模型解决了55/220个任务,大约相当于四分之一的任务量。从绝对数值来看提升有限,远不及最佳教师模型的115/220,但值得关注的是0.8B模型从近乎零的水平提升了多少,而非能否赶上最佳教师模型。基于基础模型的初始条件,结论是应同时利用这两种“教师”模型,且在合并后的数据上软标签方法的效果优于加权硬令牌方法。

    继续讨论硬令牌学生模型。此处的情况不太明确。该检查点已经解决了220题中的46题。通过对GPT轨迹使用加权硬令牌进行进一步训练,其正确率提升至220题中的48题,而使用相同轨迹的软标签则又下降到220题中的44题。在Qwen模型自行评分的轨迹上,情况则相反:使用加权硬令牌时正确率降至220题中的38题,而软标签则上升至220题中的49题。

    一个出乎意料的发现是:只有当评分结果与轨迹数据一致时,软标签才能发挥作用。Qwen3.5-35B-A3B 8-bit模型的表现最差,正确率为220题中的96题,而GPT模型的正确率为220题中的115题;不过前者的概率值更符合其自身的轨迹数据,因此软标签在该模型上有效(49/220),而在通过代理方式评分的GPT轨迹上则效果不佳(44/220)。一致性比模型的原始强度更为重要。

    智能体循环中发生了什么变化。基础模型几乎从不提交结果。硬标记轨迹强化学习让它学会进入循环并提交结果,但许多提交的内容都是错误的。结合软标记训练后,成功率再次上升,成为整体表现最好的训练次数。即便如此,它仍提交了171个任务,仅解决了55个,这意味着116个提交的查询未能通过隐藏测试,同时还出现了39次重复动作的终止情况。

    这就是结果的真实情况。该模型失败的主要原因并非无法生成有效的BAML动作,而是因为它仍然会做出糟糕的SQL决策,有时还会陷入循环之中。

    最可靠的行为指标是转向次数。混合软标签运行模式的平均转向数为3.39次,而硬令牌热启动模式的平均转向数为3.48次,两者差异很小,无法用额外步骤来解释这种提升。稍好的动作组合则可以解释这一现象:正确提交的数量多于热启动模式,错误提交的数量少于混合加权硬运行模式,同时SQL错误更少,达到转向上限后停止的情况也更少。每次评估调用生成的令牌数量并未被记录,因此没有输出令牌的相关数据。可以安全报告的数字来自训练过程:提示词和目标令牌的数量、完整序列的长度以及top-k覆盖率。

    关于如何解读图表后面的表格的说明:“submitted”包括正确提交和错误提交两种情况,“wrong submits”则等于提交总数减去成功提交数。“SQL-error tasks”这一列并非互斥概念——只要某个任务的SQL查询在循环过程中出现错误,就会被归入该列,因此它可能与最终的任何结果重合。

    失败分析

    如果仅依据基础模型的整体运行结果来判断,结论会显得过于简单:不同水平的教师加上较模糊的标签,问题便迎刃而解。但分开查看的情况就没那么整齐了。令人意外的是,某些水平较弱的教师反而比水平较强的教师表现更好,因为它们的概率与自身的运行轨迹相符。在同系列的Qwen路径上,模糊标签的得分提升最为明显,当多种数据源结合时这一趋势更为显著。而在Qwen仅能间接评估的GPT运行轨迹上,模糊标签的得分提升幅度较小,同时还影响了GPT的暖启动效果。

    这很有道理:Qwen3.5-35B-A3B的8位概率能够很好地描述其8位动作,因此0.8B版本的Qwen模型有更清晰的信号可供模仿。

    在推理过程中会保留最后一个词。在教师引导的情况下,问题在于当上下文与教师的行为相似时,学生能否猜出教师的下一步动作。而该训练框架则要求更高的能力:它能否从自己先前的操作中恢复,选择合理的查询方式,避免陷入循环,并最终生成正确的SQL语句?两者虽有关联,但绝非同一回事。

    验证损失从另一个角度反映了相同的情况。在55/220的测试中,软标签组合方法的验证损失为0.5684,高于解决了49道题的硬标记组合方法的0.3478。最低的损失值为0.2544,出自基础版Qwen的自我评分硬标记方法,但它仅解决了40道题。较低的教师强制损失并不意味着智能体性能更好。

    教师引导组合方法带来的启示最多。GPT引导方式促使学生更频繁地提交答案。Qwen引导方式虽然评分更简单且属于同一系列,但却导致了更多循环现象。软标签混合方法并未简单取各方法的优点,重复停止的情况依然存在。尽管如此,它的成功题数仍是最高的,与硬标记混合方法相比,它产生的SQL执行错误更少,且在轮次限制到达时结束的测试次数也更少。

    加权硬控制方法也有其自身的经验教训。通过评分器的置信度对行进行加权比拟合稀疏概率分布更为高效,而且在基于GPT代理评分的暖启动数据上,它能生成最佳的单元格结果。但它无法告知学生在每个位置上其他可选方案的信息,只能指示“以更强的力度或更弱的力度复制此标记”。当评分器与源文本匹配且数据种类足够丰富,避免学生过度模仿某一位老师的风格时,top-k软标签方法较为适用。

    硬件方面的经验

    需要两种类型的机器。由于评分工作要求将Qwen3.5-35B-A3B 8位版本保留在内存中,并在冻结的目标数据上运行,因此配备128GB统一内存的高内存容量Mac电脑是合理的选择,这样的机器能够存储量化后的教师模型。虽然速度不算快,但可以在使用付费GPU资源之前在本地完成所有准备工作。

    训练过程的需求恰恰相反。LoRA微调涉及大量矩阵运算,包括前向传播、反向传播、注意力核计算以及优化器步骤。尽管NVIDIA GPU的总内存较小,但由于这些张量存储在VRAM中并通过CUDA内核处理,其速度依然更快。由此可得的一个规律是,容量与处理速度是两个独立的问题:较大的系统RAM有助于存储和准备数据,而GPU的VRAM结合CUDA则能让训练更快完成。最终的工作流程是尽可能在Mac上完成所有操作,只有当数据和脚本准备就绪时才启动远程GPU。

    经验总结

    在通过实际应用来评估的前提下,软标签蒸馏值得用于智能体微调。词元级别的不确定性比硬标签包含更多信息,但它仍属于局部监督方式,无法让模型自行学会从错误的工具调用中恢复、避免循环,或在出现新观测结果时进行更有效的探索。

    代理软标签应当如实标注。此处的GPT数值并非GPT本身的概率,而是经过Qwen评分后的结果。这仍然是一项有用的实验,只是并非真正的GPT对数几率蒸馏。

    同一系列中的教师模型反而可能优于更强大的模型。评分工具与实际行为的匹配程度比其评分数值本身更为重要。

    带有尾部处理的稀疏top-k方法是一种可行的折中方案。虽然保存完整词汇表的logits能获得更完整的信息,但存储、传输和训练的成本都很高。保留20个标记加上足够的残差尾部,可使目标标记在几乎所有情况下都保持可见。

    混合多个教师模型比仅选择其中一个效果更好。最佳方案是将GPT 5.5中等代理评分的行与Qwen自身评分的行结合,并使用软标签对基础模型进行训练。

    现状与局限

    那么这种方法真的有用吗?在特定条件下是有效的。在最佳设置下,top-k软标签蒸馏提升了0.8B SQL智能体的性能:将GPT代理评分的行与Qwen自身评分的行输入到基础模型unsloth/Qwen3.5-0.8B中,该智能体解决了220道题中的55道,明显优于采用离线硬标记策略的智能体(220道题中46道)以及混合硬标记策略的智能体(220道题中49道)。

    不要将此理解为“柔和的标签总能胜出”。教师策略、学生初始化、概率对齐以及迭代行为都至关重要,最终表现更好的教师并非评估分数最高的那个。仍然存在的问题在于智能体层面:错误的SQL语句、重复的动作,以及循环内的不完善恢复机制。

    这正是该基准测试值得保留的原因。学生在教师引导下可能表现良好,但一旦需要自主行动就会出错。后续研究应保持训练环境不变,检验新的训练方法是否能真正改善迭代过程,而不仅仅是降低离线损失。