前途科技前途科技
  • 服务
  • 关于
  • AI
    • AI 大模型
    • 具身智能
    • 算力芯片
  • 科技
    • 智能终端
    • 软件·互联网
    • 汽车·出行
    • 科学前沿
  • 资源中心
    • 深度研究
      • AI 前沿
      • 教程
      • AI 知识库
      • 案例研究
    • 行业报告
      • 白皮书
      • 行业报告
      • 研究报告
      • 技术分享
      • 专题报告
    • 精选案例
      • 金融行业
      • 医疗行业
      • 教育行业
      • 零售行业
      • 制造行业
  • 服务
  • 关于
联系我们
教程/09.06 · 00:00/12 MIN/作者:苏晚/0 阅读

350M 模型 100 步 GRPO 微调:结构化输出合规率从 22.6% 抬到 29.7%

Hugging Face 最新教学把小模型做结构化输出这件事拆到了工程量级:llama.cpp 跑基线、按错误类型定向做数据增强、TRL 的 GRPO 在免费 GPU 上跑 100 步。7.1 个百分点的提升不是终点,值得看的是可搬到产线上的那个闭环。

如果你把大模型接到过后端系统,就知道最先炸的往往不是模型答得对不对,而是它有没有按你要的形状把结果吐出来——字段名错一格、必填项漏一个、外层套没套 array,下游解析器直接抛异常。这类事故在评测榜单上通常被折进推理、抽取的总分里,真正做产品的人反而看不到那个决定“能不能接进来”的合规率。

Hugging Face 9 月 3 日更新的这篇教学(原文:Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps,作者 Leonie Monigatti 与 Liquid AI 的 Ben Burtenshaw、Sergio Paniego 团队),把结构化输出合规率这件事第一次拆成了一个完整、可复现、成本极低的闭环:跑 IFStruct 基线拿到错误分布 → 按错误类型做定向数据增强 → 用 TRL 的 GRPO 在 350M 的模型上跑 100 步 → 同一套评测复测。

整条链路 GPU 用 16GB 免费档就能跑完,样本 500 条,训练总步数 100,最终把 LFM2.5-350M 的合规率从 22.6% 抬到 29.7%——7.1 个百分点绝对值的提升,但更值得抄的是这套流程本身。

先把基线跑透,别拿别人报的分当自己的起点

第一步是复现 LFM2.5-350M 在 IFStruct 上的表现。IFStruct 是一个专门测 LLM 输出格式合规性的开源基准(Liquid4All/ifstruct,公开数据集在 LiquidAI/ifstruct-v1.0),2000 条测试样本覆盖 JSON、YAML 两种格式、Wrapper key 与 Bare list 两种顶层结构、24 类实体(相机评测、临床试验、发票、招聘、菜谱等)。

模型服务用的是 llama.cpp——重点在这里:教学环境用一台 M5 Max、36GB 统一内存的 MacBook Pro 起 llama-server,brew install llama.cpp 装好后一条命令拉起:

llama-server \
  -hf LiquidAI/LFM2.5-350M-GGUF:BF16 \
  -c 32768 -np 4 -ngl 99 \
  --alias LiquidAI/LFM2.5-350M \
  --host 127.0.0.1 --port 8080

-ngl 99 是把所有层卸到 GPU,-np 4 是四并发,-c 32768 是上下文窗口。IFStruct 评测器通过 OpenAI 兼容接口打过来,跑一遍 2000 条:

Overall: 452/2000 passed (22.6%)
  JSON:        180/1000 (18.0%)
  YAML:        272/1000 (27.2%)
  Wrapper key: 288/1011 (28.5%)
  Bare list:   164/989  (16.6%)

博客里 IFStruct 官方报的 350M 分是 21.1%,本地这台设备跑出 22.6%——差 1.5 个百分点,作者选择相信自己这套 llama.cpp/BF16 的跑数,把它作为对照基线。别拿别人的报数直接减:不同服务栈、不同量化、不同并发、不同随机种子都可能带一到两个点的漂移,训练前后对比必须用同一套 eval 栈。

错误分布是训练目标的路标

评测输出里最有价值的其实不是那个 22.6%,而是下面这一段错误统计:

7228x required field missing        必填字段缺失
 738x wrong item count              数组元素个数不对
 540x type mismatch                 类型不符
 317x Unclosed code block           未闭合的代码块
 190x extraneous field 'notes'      多出来的字段
 100x expected bare list, got wrapper  该给数组给了对象

这类分布告诉你两件事:一是模型对 schema 有大方向理解但不守细节(不然大多数错就该是“完全不像 JSON”,而不是“少个字段”);二是它对某些格式约定几乎没概念(“该给顶层数组给了对象”这类结构错,加 prompt 提示改善有限,得让它见过训练样本)。

有了这两条判断,数据增强就不是拍脑袋的事。作者拿英伟达的 nvidia/Nemotron-RL-instruction_following-structured_outputs 数据集里约 500 条样本做训练,动了两处:

  • 40% 的样本追加“请把输出放在围栏代码块里”这条指令。原始 Nemotron 数据里模型总是直接吐 raw JSON,遇到“要 markdown 代码块”这类约束会漏——用这批增强样本教它“读到什么格式要求就切什么格式”。
  • **另外不重叠的 20%**改成“顶层是一个数组、并规定元素个数”的任务。这直接对准了 IFStruct 里 16.6% 的 bare list 通过率与 738 次 wrong item count 错。

注意,这两处增强都不是拿“我猜哪里不好”当理由,是拿 base 模型跑出来的错误分布反推。这也是为什么第一步基线值必须跑透——它给你的不只是一个分数,是接下来所有决策的依据。

GRPO 三件事:LoRA 边界、reward 结构、100 步

训练用的是 TRL 的 GRPO(Group Relative Policy Optimization),一种 REINFORCE 家族里适合结构化输出这种可判分任务的算法。三处关键配置:

标签:LoRALLM微调Hugging Face
苏晚
苏晚Su Wan

前途科技 · 前沿主笔

关注 AI 与前沿科技的观察者,前途科技前沿内容主笔。

查看全部文章

想了解 AI 如何助力您的企业?

免费获取企业 AI 成熟度诊断报告,发现转型机会

置顶文章

350M 模型 100 步 GRPO 微调:结构化输出合规率从 22.6% 抬到 29.7%
置顶

350M 模型 100 步 GRPO 微调:结构化输出合规率从 22.6% 抬到 29.7%

「Next-token predictor」是错的心智模型:为什么它决定了你怎么用大模型
置顶

「Next-token predictor」是错的心智模型:为什么它决定了你怎么用大模型

前途科技前途科技
服务关于快讯技术商业报告
前途科技微信公众号

微信公众号

扫码关注

Copyright © 2026 AccessPath.com, 前途国际科技咨询(北京)有限公司,版权所有。|京ICP备17045010号-1|京公网安备 11010502033860号|隐私政策|服务条款

LoRA 目标模块。LFM2.5-350M 是液态神经网络(Liquid AI 的混合注意力+卷积架构),所以模块命名与常规 Llama 不同:

LoraConfig(
    r=16, lora_alpha=32, bias="none", task_type="CAUSAL_LM",
    target_modules=[
        "q_proj", "k_proj", "v_proj", "out_proj", "in_proj",
        "w1", "w2", "w3",
    ],
)

可训练参数约 6M,占全模型 1.66%——在结构化输出这种“形式对齐”任务上,动这么点就够。这也是全流程能塞进 16GB 免费 GPU 的关键:不训主干、不改嵌入。

三条 reward 函数,都归一到 [0, 1]:

  1. json_format_reward:能否被解析。要的形式(围栏 vs 裸 JSON)给满分 1.0;错形式但可解析给 0.2;完全解析不出来给 0.0。这个二档设计比“能解析就 1,不能解析就 0”要好——它显式惩罚“输出对但形式错”。
  2. field_count_reward:顶层字段数是否对得上。exact match 给 1.0,差得越多线性衰减。这个直接对应“wrong item count”那类错。
  3. schema_validation_reward:完整走一遍 JSON Schema 验证。计违反数、必填项没盖住的部分不给分。这是最重的一档。

加权比 [1.0, 0.5, 2.0]:schema 验证权重最高(合规率就是它),json_format 次之,field_count 最轻(因为它相对好学)。权重分配本身也是工程判断——如果你的下游对字段数极其敏感,就该抬 field_count 的权重。

训练参数:

GRPOConfig(
    learning_rate=5e-5,
    max_steps=100,
    warmup_steps=10,
    num_generations=8,             # 每个 prompt 组的采样数
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    max_completion_length=1024,    # 嵌套 JSON 要留空间
    temperature=1.1,               # 多样性采样
    beta=0.01,                     # KL 惩罚,防止漂离基础模型
    reward_weights=[1.0, 0.5, 2.0],
)

100 步、500 条数据、免费 GPU——总算力开销小到可以在一次咖啡时间里跑完。GRPO 每步会给每个 prompt 采 8 条 completion,用 reward 排序算相对优势,KL 惩罚(beta=0.01)把偏移拉住。

结果的信号在细分里,不在总分里

训好之后同一套 llama.cpp 栈复测:

维度基线GRPO 后Δ
总体22.6%29.7%+7.1
JSON18.0%31.9%+13.9
YAML27.2%27.5%+0.3
Wrapper key28.5%29.7%+1.2
Bare list16.6%29.7%+13.1

看总分是 7 个点的稳步涨幅,看细分能一眼看出训哪儿涨哪儿——JSON 和 Bare list 都涨了 13 个点以上,正对着前面数据增强动的那两处;YAML 几乎没动(训练数据里没针对 YAML 增强);Wrapper key 微涨(原本就相对好)。这是一次训练目标非常清晰的对齐。

实体粒度也一样能对上:test__event_ticket_booking 从 45.8% 涨到 57.9%,log_parser_examples 从 29.2% 涨到 45.8%,rental_car_booking 从 34.2% 涨到 46.8%。而低分类目里,test__recipe 只有 4.3% 的起点,训练后仍旧是尾部——本轮增强没覆盖到“复杂嵌套配料表”这类 schema,指望它自动涨是幻觉。

但也别只报好消息

有两处细节这篇教学没回避,值得复述:

没超过大模型。GRPO 之后的 350M 是 29.7%,IFStruct 官方榜里 Qwen3.5-2B 是 33.15%。“逼近”不等于“超越”——如果你的产线对合规率要求是 95%+ 那种硬指标,350M+GRPO 也顶不上单机部 2B/7B 的一次调 API。这篇教学的价值不是“用 350M 替代 2B”,是“在受限硬件/延迟预算里,把小模型往上抬到值得考虑的位置”。

有些错反而涨了。GRPO 后 required field missing 从 7228 变成 7331,wrong item count 从 738 变成 890,还多出来 102 例“该给数组给了 wrapper”——这类是过度矫正带来的新错。reward 权重把 schema 抬到 2.0 之后,模型更倾向于“猜出更多字段”,结果里错必填的绝对次数没降,甚至微升。这不是失败,是提醒:单一 reward 权重是全局配置,会同时移动多个错误类型的曲线,做产品的人要预留一轮回归看新错分布,不能只看总分。

这个闭环为什么值得抄

把上面几段拼起来,你会看到一个和“再拿更大模型试一下”完全不同的做法:

  1. 基线不是别人报的分,是你自己的服务栈跑出来的分。同一套 llama.cpp + BF16 GGUF,训练前跑一次,训练后跑一次,中间不换环境。这一条就能挡掉大部分“我训了但看不出提升”的乌龙——多半是 eval 换栈了。
  2. 错误分布决定训练目标。少填、错数、错顶层结构——不同的错误对应不同的数据增强策略。不看 base 错误就动手做数据,等于蒙眼训练。
  3. 数据增强用比例混,而不是整包换。40% 加围栏、20% 改数组、剩下 40% 保持原样——每一档都对准一类错,同时保住原分布不塌。
  4. 奖励函数按“能不能上线”的粒度写。能解析、字段数、schema 通过——三档从粗到细覆盖真实故障,权重按项目痛点调。
  5. 训练规模匹配任务。100 步、500 样本、6M 可训参数——形式对齐用不着大动干戈,动多了反而砸掉本来能答对的部分。这也是为什么用 GRPO 而不是全量微调:形式对齐是“教它按模具倒”,不是“教它一件新事”。

对于产线里已经用小模型(3B 以下)做结构化抽取的团队,这套流程可以直接搬:把你的 schema 拿出来做 IFStruct 风格的评测集(哪怕只有 200 条起手),跑一次基线,把错误分布贴到 issue 里对着看,一周之内就能把合规率抬 5-10 个百分点。省下的算力和延迟预算,够你把更贵的推理能力留给真正需要推理的环节。

复现要点

跑一遍教学作者需要的最少条件:

  • 一台带 GPU 的机器:训练 16GB 显存起(Colab/Kaggle 免费档合格),评测在 M 系列 MacBook 也能跑(llama.cpp 走 Metal 后端)。

  • 依赖:uv(Python 环境)、llama.cpp(模型服务)、TRL/PEFT/Transformers。

  • 代码与数据:训练 notebook 在 Liquid4All/cookbook;IFStruct 评测器在 Liquid4All/ifstruct;训练数据 nvidia/Nemotron-RL-instruction_following-structured_outputs;基础模型 LiquidAI/LFM2.5-350M-GGUF。

  • 训练后合并 LoRA + 转 GGUF:trainer.model.merge_and_unload() → save_pretrained → python llama.cpp/convert_hf_to_gguf.py ... --outtype bf16,之后就能挂回 llama-server 复测。

从“看不见的合规率”到“看得见、可复现、能对着错误清单调”的工程闭环——这才是这篇教学里最耐得住抄的一段。

NeoMME:单塔 Transformer 取代 VLM+投影+解码器,索引缩到 6KB/页
置顶

NeoMME:单塔 Transformer 取代 VLM+投影+解码器,索引缩到 6KB/页

//

24小时热榜

Meta 自研加速器 MTIA 300:将 NIC 内嵌芯片,集合通信损耗降至不足 0.5%
TOP1

Meta 自研加速器 MTIA 300:将 NIC 内嵌芯片,集合通信损耗降至不足 0.5%

银河通用发布 Galbot ET1:24小时预订破200台,人形机器人仍难摆脱「表演」标签
TOP2

银河通用发布 Galbot ET1:24小时预订破200台,人形机器人仍难摆脱「表演」标签

3

350M 模型 100 步 GRPO 微调:结构化输出合规率从 22.6% 抬到 29.7%

10小时前
350M 模型 100 步 GRPO 微调:结构化输出合规率从 22.6% 抬到 29.7%
4

GitHub HydraFusion:多模型编排媲美 Opus 5,成本低 67%

10小时前
GitHub HydraFusion:多模型编排媲美 Opus 5,成本低 67%
5

Audacity 4.0 发布:Qt 重构界面,剪辑模型全面重做

10小时前
Audacity 4.0 发布:Qt 重构界面,剪辑模型全面重做
6

乌克兰战场无人机数据流向商业市场:超百家企业获取飞行数据

10小时前
乌克兰战场无人机数据流向商业市场:超百家企业获取飞行数据
7

微软 Project Zenith:面向开发者的开箱即用 Win11 配置

10小时前
微软 Project Zenith:面向开发者的开箱即用 Win11 配置
8

HEIR:Google 同态加密编译器让 ML 推理在密文上直接运行

10小时前
HEIR:Google 同态加密编译器让 ML 推理在密文上直接运行
热门标签
大模型AgentRAG微调私有化部署Prompt EngineeringChatGPTClaudeDeepSeek智能客服知识管理内容生成代码辅助数据分析金融零售制造医疗教育AI 战略数字化转型ROI 分析OpenAIAnthropicGoogle

关注公众号

前途科技微信公众号

扫码关注,获取最新 AI 资讯

免费获取 AI 落地指南

3 步完成企业诊断,获取专属转型建议

已有 200+ 企业完成诊断