尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Laya:一键打通LoRA微调与部署,构建System 1决策模型

Laya:一键打通LoRA微调与部署,构建System 1决策模型 这篇教程的主角是 Laya——一个今年在 GitHub 上冲到 17K Star 的开源项目。严格说它不是某个全新的基座模型而是一套把“微调 部署 决策”串成一条流水线的工作流框架核心目标就一个让你用一个下午从零产出一个能直接顶到业务线里的 System 1 决策模型。System 1 这个词来自卡尼曼的《思考快与慢》指的是人类那种直觉、快速、几乎不费力的判断放到 AI 场景里就是响应速度快、逻辑链条短、结果高度确定性的任务工单要不要转人工、这条评论该不该进审核池、这笔交易命中了哪条规则。这类任务不需要长篇推理但需要稳定、快、便宜而通用大模型恰恰在这三件事上都不擅长——所以需要微调。Laya 火起来的原因很简单它把过去 Jev 那套方案里最痛苦的环节——环境配置、数据格式、LoRA 参数调优、模型导出、推理服务——全部封装成能直接跑通的命令。这篇文章我从环境配置开始完整走一遍基座选型、txt 文档转数据集、LoRA 微调、导出合并、vLLM 部署最后接一个 System 1 决策实战。适合谁看想用 Qwen 这类开源模型做私有化决策服务的开发者和算法工程师尤其是踩过那种“文档齐全但就是跑不起来”的坑的人。1. 先说清楚Laya 解决的是哪一类问题1.1 为什么 17K Star 涨得这么快一个工具能短时间拿到这么多 Star通常不是因为它发明了什么新算法而是因为它精准踩中了一批人共同的痛点。微调这件事本身早就不新鲜了LLaMA-Factory、trl、unsloth 这些项目都很成熟但如果你真的从零开始操作过会发现“能跑”和“跑通”之间隔着一条巨大的鸿沟环境版本要互相兼容、数据集格式要完全对齐、LoRA 参数要靠经验试错、训练完还要把 adapter 合并回去、最后再单独部署一个推理服务。每一步单看都有文档串起来却处处是坑。Laya 做的就是把这条链路标准化。它内置了数据集校验器能直接告诉你 JSON 里哪一行缺字段它封装了训练配置模板默认参数就是为“短文本、结构化输出”这类决策任务调过的它还集成了导出和部署命令训练完一条命令合并、一条命令起服务。对我来说它最大的价值不是省掉了多少手动操作而是把原来需要“懂原理才能踩坑”的事情变成了“按流程操作就能成功”。17K Star 背后站着的是大量不想把时间耗在 glue 代码上的业务开发者和算法工程师。另外还有一个现实原因现在大家都在做业务私有化部署模型不能随便用外部 API 传数据。Laya 这类工具天然契合私有化场景——所有过程都在本地 GPU 上完成数据不出内网产出的模型也是自己可控的。这个诉求在 2025 年之后变得特别强烈Star 涨得快并不意外。1.2 System 1 决策到底指什么卡尼曼把人的思维分成两套System 1 是快思考直觉、自动、几乎不消耗意志力比如你看到 22 会脱口而出 4System 2 是慢思考需要推理、计算和注意力比如解一道二元一次方程。后来这个框架被 AI 社区借用了大家发现大模型的能力结构其实也能这么切分。System 1 决策任务有非常明显的特征第一输出空间是收敛的答案通常是类别标签、结构化字段或者固定格式的一句话第二推理深度很浅不需要多步推导第三延迟要求高单次响应要控制在几百毫秒级别第四调用量大可能是每秒几十上百次。典型例子包括客服工单自动分类、评论风险审核、意图路由、OCR 结果校验、交易风控预筛选。这些任务你用 GPT-4 级别的通用模型也能做但成本高、延迟不稳定而且通用模型总会“想太多”——你问它是哪一类它非要先解释一遍自己的判断逻辑。微调一个专用小模型来做这类任务本质上是在“压缩”通用能力模型不需要懂诗歌创作只需要把“输入文本 → 决策标签”这个映射学得足够准。这就是 Laya 这类流水线最合适的应用场景。我在做工单路由项目时体会特别深通用大模型回答“这个客户想干嘛”总是带一堆语气词和补充说明而微调后的 7B 模型只会输出一个类别名又快又干净。1.3 和 Jev 那套老方案差在哪Jev 是我之前常用的那套做法思路其实也没错选基座 → 自己整理数据 → 用脚本调 LLaMA-Factory → 手动合并导出 → 再写一个 FastAPI 服务包一层。但它的问题在于每一步都需要人工盯。数据格式稍微写错一个字段名训练不会报错但模型完全学不进去LoRA 的 rank 和 learning rate 组合不对loss 看起来在下降推理结果却在复读合并导出时 template 没选对部署出来的模型回答风格和训练时完全是两个样。我整理了一个对比能更直观看出区别环节Jev 那套老方案Laya 流水线环境准备手动装依赖版本冲突自己解决一键检查环境并给出修复建议数据集格式对着文档手搓 JSON内置模板 校验器错误直接定位到行训练参数靠经验试容易翻车决策任务预设模板关键项有注释说明导出合并命令记不住经常选错参数封装好的 export 子命令部署服务另写 Web 服务还要配并发内置 vLLM 启动支持 OpenAI 兼容接口不是说 Jev 不能干活而是它把太多隐形成本甩给了使用者。Laya 的做法是“默认给你一个能跑通的基线你再去调优”这个体验差异对新手来说是决定性的。我建议所有刚接触微调的人第一条原则就是先跑通默认配置再谈优化不要上来就追求花哨的 trick。2. 环境准备与安装从零开始2.1 硬件选型显存是第一约束微调大模型第一步不是装软件而是确认你的显卡够不够用。以本文用的 Qwen2.5-7B 为例全量微调需要大概 60GB 以上的显存普通人根本不用考虑而 LoRA 微调只训练一小部分参数配合 4-bit 量化可以把显存需求压到 10GB 以内这就是为什么 LoRA 能成为社区默认方案。不同显卡能做什么我整理了一张表显卡显存可行方案体验评价8GBQwen2.5-7B 4-bit 量化 LoRAbatch size 1能跑但训练慢适合小数据集验证16GBQwen2.5-7B LoRAbatch size 2~4最推荐的起步配置流畅度可以接受24GB7B 可以开较大 batch14B 可尝试量化 LoRA训练比较从容还能同时跑推理服务48GB可以上 32B 量化 LoRA适合复杂决策任务资源充裕我自己长期用一张 24GB 的卡做实验。说实话对 System 1 决策这类任务7B 量级的模型已经非常够用没必要追求更大。你真正应该关心的是数据质量和推理延迟而不是模型参数量的数字游戏。如果只有 8GB 显存也别灰心4-bit 量化路线完全能跑只是训练时间会拉长到以小时为单位。注意显存不够时优先开 gradient checkpointing再把 batch size 调到 1用梯度累积找补效果远好于直接换更小的模型。2.2 Python 环境与依赖安装无论你之前有没有装过深度学习环境我建议都新建一个干净的 conda 环境避免把系统 Python 搞乱。这里有一个教训我早期直接在 base 环境里装后来某个包升级把系统工具链搞坏了重装系统才解决。所以隔离环境是必须的。conda create -n laya python3.10 -y conda activate laya接下来安装 PyTorch。版本选择要看你的 CUDA 驱动版本NVIDIA 驱动支持向下兼容所以直接装 CUDA 12.1 的 PyTorch 通常没问题pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121然后安装 Laya 本体。它本身依赖 LLaMA-Factory、transformers、peft 这些组件正常情况下一句话就能装完pip install laya如果网络环境拉取慢可以从 GitHub 仓库克隆后本地安装。安装完成后我习惯先跑一次环境自检命令它能一次性检查 GPU 驱动、CUDA 可用性、关键依赖版本是否匹配比你自己一个个 import 测试要省事得多laya check这个命令的输出会明确告诉你哪些组件缺失、哪个版本不兼容并给出推荐版本号。我实测下来它比裸装 LLaMA-Factory 省去大量“版本迷宫”时间。装完建议顺手装一个 vLLM后面部署阶段会用到pip install vllm如果你用的显卡是 8GB 这种小显存还需要装 bitsandbytes 来做 4-bit 量化加载pip install bitsandbytes提示不要盲目升级到最新版 transformers。LLaMA-Factory 和 vLLM 对 transformers 版本都有明确要求装完laya check如果报版本冲突按提示锁版本别自己乱动。2.3 验证安装跑通一个小实验环境装完先别急着微调用基座模型跑一次推理确认整条链路是通的。这一步非常关键它能帮你区分“是模型问题还是环境问题”。我用 Laya 提供的交互命令加载 Qwen2.5-7B-Instruct 做一次问答laya chat --model Qwen/Qwen2.5-7B-Instruct如果显存不够加上量化参数laya chat --model Qwen/Qwen2.5-7B-Instruct --quantization bitsandbytes能正常返回内容说明模型加载、Token izer、GPU 计算这几个核心环节都 OK。我在这一步踩过一个典型坑CUDA 装的是 CPU 版本laya check显示 GPU 不可用但 chat 命令又能运行只不过慢得离谱。所以验证时一定要看输出里有没有 “device: cuda” 之类的字样确认模型确实加载到了 GPU 上。另外如果输出中文乱码大概率是终端编码问题把终端切到 UTF-8 即可不是模型问题。3. 基座模型选型与数据准备3.1 为什么示例选 Qwen2.5-7B其他选择怎么判断本次教程的完整链路我基于 Qwen2.5-7B-Instruct 来演示。选它有几个原因一是社区生态最完善遇到问题基本都能搜到答案二是中文能力在同等规模里属于第一梯队做中文业务决策不需要额外适配三是它在 7B 这个档位上的指令跟随能力比较稳微调后不容易“跑偏”。但如果你只是为了跑通流程也可以从更小的模型开始。很多人问 Qwen3 0.6B 这种小模型能不能微调我的答案是可以跑通但决策质量上限明显。0.6B 适合做非常简单的规则匹配类任务比如判断一句话里有没有包含“退款”关键词稍微复杂一点的语义分类它就力不从心了。如果你手里有 16GB 以上显存不用犹豫直接上 7B 档位。如果你的任务本身逻辑很重比如需要多条件判断可以考虑 14B 甚至 32B 的量化方案但相应地推理延迟会上升你要想清楚是否能接受。我整理了一个选型思路供参考任务复杂度推荐基座说明关键词/规则匹配Qwen3-0.6B / 1.7B快、省显存适合超高并发语义分类/意图识别Qwen2.5-7B-Instruct本教程主选均衡之选多条件决策/结构化抽取Qwen2.5-14B / 32B 量化效果更好但延迟和显存成本翻倍另外基座模型的指令版本一定要选带 Instruct 后缀的而不是 base 版本。base 模型只学会续写文本没有对齐过指令格式直接微调会让训练难度陡增。这个错误我见过太多次了。3.2 把 txt 文档转成微调数据集很多人拿到一堆业务文档第一反应是“直接扔给模型学习”。这是最大的误区。模型微调需要的是“问题-答案对”而不是原始文本。你要做的是把业务资料转化为一批模拟真实决策场景的问答数据。这里我分享一条非常实用的路线先用 Python 把 txt 切块再用本地 Ollama 加载一个通用模型自动生成问答对。整个过程数据不出本机成本几乎为零。先看切块脚本import re def load_and_chunk(path, chunk_size512, overlap64): with open(path, encodingutf-8) as f: text re.sub(r\s, , f.read()) chunks, step [], chunk_size - overlap for i in range(0, len(text), step): chunks.append(text[i:i chunk_size]) return chunks切成 512 字左右、带 64 字重叠的块是为了让每个块都保有完整的语义边界。如果块太长模型生成问答时会丢细节太短则上下文不足。切好之后调用本地 Ollama 服务来生成问答对import requests from concurrent.futures import ThreadPoolExecutor def build_prompt(chunk): return ( 你是数据标注员。根据下面的业务资料生成3个问答对。 问题要具体答案必须只基于资料内容不得编造。 输出JSON数组格式[{\instruction\:\问题\,\output\:\答案\}]。\n\n资料\n chunk ) def ask_ollama(prompt, modelqwen2.5:7b-instruct): resp requests.post( http://localhost:11434/api/generate, json{model: model, prompt: prompt, stream: False}, timeout120, ) return resp.json()[response] def process_chunk(chunk): prompt build_prompt(chunk) raw ask_ollama(prompt) try: return json.loads(raw.replace(json, ).replace(, ).strip()) except Exception: return []用 ThreadPoolExecutor 并发处理所有分块最后汇总去重就能得到一份初始数据集。这套方法的本质是 Self-Instruct用模型增强数据虽然没有人工标注那么准但用来给模型做领域对齐足够用了。with ThreadPoolExecutor(max_workers4) as pool: results pool.map(process_chunk, chunks) all_pairs [] for r in results: all_pairs.extend(r)注意生成完一定要人工抽检。Ollama 生成的问答偶尔会夹带幻觉内容尤其是数值、条款类信息抽检比例不要低于 5%。3.3 数据集质量检查清单数据格式正确不等于数据质量合格。我在 LLaMA-Factory 上报过很多次“训练完模型变傻”的问题最后排查下来全是数据问题。这里的核心检查项有六个字段完整、无重复、标签均衡、长度适中、答案无幻觉、指令多样性。字段完整性交给 Laya 的校验器处理它会直接告诉你哪一行缺了 instruction 或 output。重复问题要自己动手用文本哈希去重import hashlib, json def dedup(pairs): seen, result set(), [] for p in pairs: key hashlib.md5((p[instruction] p[output]).encode()).hexdigest() if key not in seen: seen.add(key) result.append(p) return result标签均衡是另一个容易忽略的坑。如果你的决策任务有 6 个类别其中“其他”类占了 80%模型学完之后会对“其他”产生强烈偏向少数类几乎永远分不对。解决方法是控制每条样本的类别分布让模型在训练时见过足够多的少数类样本。如果原始数据不均衡最简单的办法是对少数类样本做改写生成语义相似但表述不同的变体。还有一个通用原则System 1 决策数据集的答案要短、要确定。如果你的答案是一大段解释文字模型学出来也会啰嗦如果你的答案是固定格式的 JSON模型学出来就是稳定输出 JSON。数据形态决定了推理形态这一点想清楚再设计 prompt 和答案格式。4. LoRA 微调实操核心环节4.1 LLaMA-Factory 配置逐项解读数据准备好之后就进入整个流程的核心LoRA 微调。Laya 底层调用 LLaMA-Factory所以最可靠的方式是直接用 LLaMA-Factory 的训练命令这样出问题时你能看到完整的日志。先把数据集注册到 LLaMA-Factory 的 data 目录下在 dataset_info.json 中加入如下配置{ laya_decision: { file_name: laya_decision.json, formatting: alpaca, columns: { prompt: instruction, response: output } } }这个文件决定了训练脚本能不能找到你的数据。我见过不止一个人在这里把字段名写错结果训练时数据量显示为 0模型训完跟没训一样。接下来是训练命令我用的是这套配置llamafactory-cli train \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --stage sft \ --finetuning_type lora \ --dataset laya_decision \ --dataset_dir ./data \ --template qwen \ --output_dir ./output/laya-7b-lora \ --num_train_epochs 3 \ --learning_rate 1e-4 \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --lora_rank 8 \ --lora_alpha 16 \ --lora_dropout 0.05 \ --optim adamw_torch \ --max_length 2048 \ --warmup_ratio 0.1 \ --logging_steps 10 \ --save_steps 500 \ --eval_strategy steps \ --eval_steps 500逐项解释一下关键参数。lora_rank是 LoRA 矩阵的秩决定了新增参数的量级对于决策任务 8 起步完全够用不是越大越好lora_alpha是缩放系数一般取 rank 的 2 倍16 和 8 是社区里验证过最稳的组合。learning_rate1e-4 是 LoRA 微调的常见起点比全量微调高一个数量级是正常的因为训练的参数少。per_device_train_batch_size2 加gradient_accumulation_steps8等效 batch size 是 16这个量级对 7B 模型比较健康——batch 太小梯度噪声大太大容易过拟合。max_length2048 是因为决策任务文本普遍短没必要开到 4096长度开大只会浪费显存和训练时间。template qwen必须跟基座模型匹配这点不能错否则训练出的模型在推理时会出现“系统性跑偏”。4.2 训练启动与监控命令敲下去之后最先看到的是数据集加载日志确认显示的真实样本数和文件行数一致。然后进入训练循环这时不要只盯着 loss 数值看要把 loss 曲线趋势和具体数值结合判断。我总结的经验是决策类任务微调初始 loss 通常在 1.5~2.5 之间前几个 step 会快速下降到 1 以下最终收敛到 0.1~0.5 左右。如果你的初始 loss 是 10 以上大概率是数据或模型加载出了问题别等它慢慢降直接排查。训练过程中要注意显存占用。如果看到 CUDA out of memory优先把per_device_train_batch_size改 1或者加--gradient_checkpointing true。这能省出近一半显存代价是训练速度降低 20% 左右但对 7B 模型来说完全值得。--save_steps 500意思是每 500 步保存一次 checkpoint建议至少保存 3 个以上中间版本方便后面回滚或对比。提示训练日志里保存的 loss 是基于训练集的它低不代表效果好。判断是否过拟合要看 eval loss 和训练 loss 的背离程度。两者差距越来越大说明模型开始背训练数据了。4.3 训练里最容易翻车的几个点第一个翻车点是 loss 直接变成 NaN。常见原因包括学习率过高、数据里有异常长文本或者特殊字符。处理方式很简单先把学习率降到 5e-5 重试再检查数据里有没有不可见字符和超长样本。第二个翻车点是模型训完只会复读输入。这个我踩过太多次了九成原因是数据格式错乱模型根本没学到“指令→回答”的映射。排查方法是在训练前随机打印 20 条数据人工看一遍格式不要只依赖校验脚本。另一个原因是lora_rank太低导致模型容量不够但这种情况相对少见优先怀疑数据。第三个翻车点是训练曲线正常、eval 也正常推理效果却一塌糊涂。这种时候要检查推理时用的 template 和训练时是否一致以及是否忘了合并 LoRA 权重。我在后面专门讲合并导出这一步是“训练成功但部署失败”的最大根源。5. 导出、部署与 System 1 决策接入5.1 LoRA 权重合并导出训练生成的 output 目录里保存的是低秩 adapter它本身不能独立运行必须把 LoRA 权重合并回基座模型。这一步用 LLaMA-Factory 的 export 命令注意两个要点一是--model_name_or_path要和训练时完全一致二是 template 要一致llamafactory-cli export \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --adapter_name_or_path ./output/laya-7b-lora \ --template qwen \ --finetuning_type lora \ --export_dir ./merged/laya-7b \ --export_size 6 \ --export_legacy_format false--export_size 6是把权重切分成 6GB 左右的分片方便后续拷贝和上传如果只在本地用也可以不设。--export_legacy_format false是为了输出新版 safetensors 格式避免某些旧加载脚本的兼容问题。合并完成后用之前的 chat 命令加载合并目录跑几个训练集里的问题确认效果和训练时验证的结论一致。我提醒一句合并后的模型目录包含完整的 7B 权重大概 15GB 左右别拿这个目录再去做 LoRA 训练它已经是“另一个模型”了。如果你想继续迭代请保留原始基座模型和 adapter 目录随时可以重新合并。5.2 用 vLLM 拉起推理服务合并出完整的模型文件后部署就变得非常简单。vLLM 是目前性价比最高的推理引擎自带 PagedAttention 和连续批处理能把 7B 模型的吞吐量拉到纯 transformers 实现的数倍。用下面的命令直接启动vllm serve ./merged/laya-7b \ --served-model-name laya-7b \ --max-model-len 4096 \ --gpu-memory-utilization 0.9 \ --port 8000--gpu-memory-utilization 0.9意思是允许 vLLM 用到 90% 显存留出一点余量给其他进程。--served-model-name laya-7b是给服务起的名字后面客户端请求时要用这个值。启动成功后vLLM 会提供一个 OpenAI 兼容的接口这意味着所有适配 OpenAI API 的 SDK 都能直接连不用改业务代码。先用 curl 验证一下curl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: laya-7b, messages: [{role: user, content: 我的订单三天没更新了你们还想不想干了}], max_tokens: 128, temperature: 0.1 }如果返回内容里带着你训练时的决策格式说明部署成功。如果输出很乱先别怀疑模型先检查请求里的 system prompt 是否和训练时的指令风格一致。5.3 决策接口实战工单路由与内容审核服务起来了接下来就是把它接进业务。我拿工单自动路由来演示客户留言进来模型需要判断属于哪个类别然后交给对应处理流程。这种场景非常适合 System 1 决策因为类别是固定的不允许自由发挥。先定义一个稳定的 system prompt你只做一件事把客户留言归类为[售后, 物流, 退换货, 发票, 夸赞, 其他]之一。 只输出类别名不要解释不要加标点。然后封装一个决策函数import requests, time API_URL http://localhost:8000/v1/chat/completions HEADERS {Content-Type: application/json} SYSTEM_PROMPT 你只做一件事把客户留言归类为[售后, 物流, 退换货, 发票, 夸赞, 其他]之一。只输出类别名不要解释不要加标点。 def decide(text: str, timeout30): payload { model: laya-7b, messages: [ {role: system, content: SYSTEM_PROMPT}, {role: user, content: text}, ], temperature: 0.1, top_p: 0.9, max_tokens: 32, } t0 time.perf_counter() resp requests.post(API_URL, jsonpayload, headersHEADERS, timeouttimeout) cost_ms (time.perf_counter() - t0) * 1000 content resp.json()[choices][0][message][content].strip() return content, cost_ms这个函数的核心约束有两个temperature压到 0.1让输出尽量确定max_tokens只给 32逼模型不要废话。实测下来微调后的模型在这种设置下平均响应延迟在 200ms 左右效果非常稳定。如果模型偶尔输出“售后“带引号或者多余空格可以在返回后加一个简单的后处理映射到标准标签。同样的模式可以套用到评论审核、意图识别、内容风控等多个场景。关键在于你的训练数据格式和推理时的 system prompt 要保持一致否则模型会懵。5.4 延迟优化让“快思考”真的快System 1 决策模型的价值全在延迟上所以部署阶段一定要做延迟优化。我实测过几个有效手段。第一把max_tokens限制在合理范围决策任务的输出一般不超过 32 个 token这能大幅减少 decode 阶段耗时。第二vLLM 的连续批处理理论上能吸收突发流量但如果你有稳定的高并发场景建议用--enable-prefix-caching它对重复 system prompt 的请求效果明显因为前缀的 KV cache 可以复用。第三监控要配套。vLLM 自带/metrics端点可以看 p50、p99 延迟和吞吐量。我习惯把 p99 作为核心指标因为它比平均值更能反映真实体验的尾部延迟。如果 p99 超过 500ms优先检查是不是显存被打满导致切换或者请求体里带了太多历史消息。决策任务只应该传当前这一条输入历史上下文属于 System 2 的场景别混用。6. 常见问题速查表与避坑实录6.1 问题速查表把整个流程走完一遍之后我把实操中最常遇到、搜索频率最高的问题整理成了一张速查表你可以直接存下来当参考现象可能原因处理办法训练启动就报 CUDA out of memorybatch size 过大或未开梯度检查点加--gradient_checkpointing truebatch 改 1日志显示加载数据集为 0 条dataset_info.json 字段名错误对照官方文档检查 columns 映射训练 loss 为 NaN学习率过高或数据有异常字符学习率降到 5e-5清洗特殊字符训练正常但推理复读输入数据格式错乱、没学到映射打印 20 条数据人工检查格式推理结果和训练时不一致合并导出时 template 不一致统一使用 qwen template 重新导出vLLM 启动时报版本冲突transformers 或 tokenizers 版本过新按报错提示锁定稳定版本输出类别带引号或杂字符训练数据答案不干净推理后加后处理映射到标准标签小显存量化加载报错bitsandbytes 版本不匹配用 pip 重装与 CUDA 匹配的 bitsandbytes这八条是我和身边朋友实际踩过、确认有效的解决方案比单纯看报错日志再上网搜索要快得多。但注意每条方案都只是“大概率解决”如果套用后问题依旧别硬扛把完整日志贴给社区带上 GPU 型号、CUDA 版本、依赖版本基本都能定位。6.2 几条独家经验第一永远先跑 100 条数据的小实验。拿 100 条高质量样本用默认参数训练 1 个 epoch验证整条链路能走通再全量上。一次全量训练如果中途失败光是排查就够呛小实验把通路的开关都验证过了后面只是时间问题。第二决策任务不要迷信大模型。我在多个场景实测过7B 微调模型在边界清晰的分类任务上效果完全可以和更大的通用模型掰手腕而且延迟和成本都有数量级的优势。真正决定天花板的是你的数据质量和判断边界是否清晰如果数据本身都是模糊的换再大的模型也白搭。第三训练跑完先别急着高兴要留出完整的对比测试集。在实验阶段就把验证集固定下来包含每个类别的正反例每次微调完都跑一遍用准确率、F1 这些指标量化对比。没有这套基线你后面换数据、调参数都只能靠感觉很容易自我感觉良好然后上线翻车。所有超参数也要记录在配置文件里方便复现。我自己的习惯是每个实验建一个目录里面放配置、数据版本号、测试结果一个月之后还能完整还原当时的实验环境。最后再分享一个小技巧微调完成后用训练集和验证集各抽 50 条分别跑一遍推理把输出结果打印出来人工看。这一步能把数据泄漏、过拟合、格式漂移这些隐蔽问题直接暴露出来。训练集效果远好于验证集说明过拟合两者都差说明数据质量有问题。这个“20 分钟人工验收”的环节能帮你省下后面上线后排查问题的几小时甚至几天。这个流程我从头到尾走了很多遍最大的体会是微调本身不难难的是把每个环节的隐性假设搞清楚。Laya 这类工具的意义就是把这些隐性假设变成显式的检查和默认配置让新手也能稳稳地跑到终点。你只要按照这份教程把环境、数据、训练、部署一条龙跑通一次后面再做任何决策模型都会顺手很多。
返回列表