02 · LLM / AI Agent / BYOK
TuneSmith — 从业务目标到微调交付的工作台
面向小团队和个人的微调工作台:业务目标 + 样例数据 → Agent 联合分析与真实转换预览 → 全量校验 → 独立分区 → 本地训练 → 同开发集对照 → 冻结题集第二轮 → 采用决策与最终验收。训练底座:SFT/DPO/GRPO + FSDP/DeepSpeed + MLflow Registry
概述
TuneSmith 是面向小团队和个人使用者的微调工作台:让请不起算法工程师的团队,也能从「一个业务目标 + 一份样例表格」出发,走完数据理解、训练、验证、直到可交付验收的微调闭环。产品重心在训练之前——把「我有一份数据」变成「这是一套有效的训练集」这段专业判断,由 BYOK 分析 Agent 与真实转换预览共同完成:业务用户通过逐行前后预览确认语义,而不是审计代码。 核心闭环:目标 + 样例 → Agent 联合诊断与澄清问题 → 数据处理方案 + 真实前后转换预览 → 全量数据校验 → 按业务对象分组的独立分区(内容哈希版本化)→ 真实 tokenizer 预检(截断与答案丢失统计)→ Agent 推荐训练方案 → 本地训练(一次授权 OOM 技术恢复)→ 基座 vs 微调同开发集对照 → 坏例证据 → 下一轮假设 → 固定评测题集下的第二轮 → 基座/父轮/新模型三模型对照 → 采用/继续/停止/证据不足决策 → 独立测试集最终验收。整条闭环在一个页面(目标与数据)或等价 CLI 中完成。 安全与诚实约束贯穿全链路:Agent 起草的长尾解析与评分代码只在真实操作系统隔离中执行(Docker network=none/read-only/cap-drop=ALL/非 root,或 macOS Seatbelt 默认拒绝),先通过业务正例与反例验证,隔离不可用即失败返回,绝不回退宿主;基座权重、数据版本与评测协议以 SHA-256 内容摘要标识,文件变化使旧确认与缓存对照失效;评测题集每轮冻结,新数据只进训练、不改写评分分母;生成失败与截断保留在分母,开放任务标记「待业务核对」,不伪造准确率。 平台底座:跨平台训练引擎(NVIDIA 4-bit QLoRA / Apple Silicon bf16 / CPU 自动检测),SFT/DPO/GRPO/领域适配四种后训练技术,FSDP/DeepSpeed/DDP 分布式策略,MLflow 实验追踪 + Model Registry 血缘管理,8 页 Streamlit 全生命周期面板。 当前状态:完整闭环(含第二轮改进与最终验收工作流)已在本地用虚构数据端到端验证——真实 Qwen3 训练 + 真实 GLM 分析,验证证据存于 docs/validation/;真实客户任务与业务验收是进行中的里程碑。
技术深潜
Overview
Launch Dashboard一行看懂整个产品——每个阶段都先确认真实业务含义,再继续往下走:
业务目标 + 样例 ─▶ Agent 联合分析 ─▶ 处理方案 + 真实转换预览
─▶ 确认语义 ─▶ 全量数据校验 ─▶ 按业务对象分组的独立分区
─▶ tokenizer 预检 ─▶ Agent 推荐训练方案 ─▶ 本地训练
─▶ 同开发集对照 ─▶ 坏例证据 ─▶ 下一轮假设
─▶ 冻结题集下的第二轮 ─▶ 采用 / 继续 / 停止
─▶ 独立测试集最终验收产品原则
用预览确认,不审代码
业务用户通过逐行前后预览(原始行 → 模型输入 → 答案)确认语义,不需要审计 Python。
BYOK 分析 Agent
GLM Coding Plan / GLM API / 本地服务 / OpenAI 兼容端点。密钥只从环境变量读取——不落盘、不进任务快照。
把专业判断前移到训练之前
产品重心是把「我有一份数据」变成「这是一套有效的训练集」——这段通常需要算法工程师的专业判断。
一个页面或一个 CLI
整条闭环在「目标与数据」页面或等价的 scripts/data_intake.py 命令中完成——底层是同一套服务。
Core Loop
8 页面板
🎯 目标与数据
从这里开始:描述目标、上传样例、Agent 分析 → 预览 → 全量 → 分区 → 训练 → 对照 → 下一轮 → 验收
训练实验室
预设 → 表单 → YAML 预览 → 子进程启动 → 实时 loss 曲线;提交前数据预检;一键合并导出
实验管理
MLflow 运行列表、筛选、指标图表、参数差异
评估
领域图表:按难度准确率、实体类型拆解、校准曲线
模型对比
并排指标差值、执行摘要、成本估算
模型注册表
版本 + 血缘、champion/challenger 别名
数据向导
CSV/Excel → 列映射 → 训练集 + 7 项质量检查 → 直送训练实验室
对话
与任何训练产物对话——自动发现 outputs/ 下的 adapter,逐 token 流式输出
Architecture
目标与数据页面 workbench 服务层 Agent (BYOK)
├─ 数据任务会话 ──→ ├─ 组合 / 沙箱 ←── ├─ 供应商
├─ 预览/确认 ─→ ├─ 分区 / 训练预检 │ (GLM/本地/
├─ 训练/对照 ─→ ├─ 训练记录 / 恢复 │ 兼容端点)
└─ 下一轮 ──→ ├─ 业务对照评测 └─ 分析与解读
├─ 坏例诊断
Streamlit (8 页) └─ 验收 / 迭代轮次Safety & Trust
Agent 起草的代码与每一条对照结论,都在一组「天然可信任」的约束下运行:
绝不回退宿主执行
Agent 起草的解析/评分代码只在真实操作系统隔离中运行(加固 Docker 或 macOS Seatbelt),先过业务正例与反例。沙箱不可用时显式失败——绝不静默改在宿主机执行。
内容哈希身份
基座权重、数据版本、评测协议以 SHA-256 内容摘要标识。文件变化使旧确认与缓存对照失效——旧身份绝不复用。
冻结评测题集
开发集与最终测试题每轮冻结。新数据只能扩充训练、不能改写评分分母——轮间差异始终可比。
失败留在分母
生成失败与截断计入总分母;开放任务标记「待业务核对」,不伪造准确率;一轮的结论可以是「证据不足」。
长尾适配沙箱
docker run --rm --pull=never \
--network=none --read-only --cap-drop=ALL \
--security-opt=no-new-privileges --user=65534:65534 \
--pids-limit=16 --memory=256m --memory-swap=256m \
--tmpfs=/tmp:rw,noexec,nosuid,size=8m \
python:3.12-slim worker.py # agent-drafted long-tail transform
# macOS fallback profile: sandbox-exec, deny-by-defaultTraining Engine
什么是 QLoRA?
QLoRA(量化低秩适配)将 4-bit 量化与低秩适配器结合,在消费级 GPU 上微调大语言模型,显存占用降低约 84%。
平台抽象
PlatformInfo 单例封装硬件检测。模型加载按 is_cuda / is_mps 分支:
CUDA: device_map="auto" + BitsAndBytesConfig(4-bit NF4)
MPS: 无 device_map,加载后 .to("mps"),无量化
CPU: float32,无 device_map
Flash Attention 2: 仅 CUDA(平台检查开关)
Trust remote code: True(Qwen3 必需)5 阶段训练流水线
prepare_model() → 加载 + 量化(CUDA)/ bf16(MPS)+ PEFT 应用 LoRA
prepare_data() → AlpacaDataset / FinanceDataset / MedicalEntityDataset
setup_trainer() → HF Trainer + DataCollator + 回调(进度、内存、检查点、MLflow)
train() → tracker.start_run() → trainer.train() → tracker.end_run()
evaluate() → 困惑度 + 准确率 + 定性生成关键决策
动态 report_to
根据配置标志计算 report_to。无后端时返回 ["none"],避免 TensorBoard 导入崩溃。
quantization_bits=None
MPS/CPU 使用 None(非 0)禁用量化。配置校验拒绝无效值。
TrainingRunner Persistence
JSON 文件存储运行元数据,子进程状态在 Streamlit 页面刷新后仍存活。
DCP 可重分片 checkpoint
训练中保存的分布式 checkpoint 可跨卡数恢复(N 卡存、M 卡续);HF 格式与导出分离。
Showcase
医疗实体匹配
一个真实领域上的完整闭环实例:医疗实体示范同时也是数据向导模板的来源。
业务目标 :「变体药品/医院名归一化到标准编码」
样例分析 :Agent 识别 别名 → 标准名 列,采样候选,按编辑距离分层难度
分区 :实体分组切分——同一实体的所有变体留在同一分区
评测 :Top-1 选择准确率,按 简单/中等/困难 分层
结果 :微调后的 Qwen3 替代生产数据流中的模糊字符串匹配Code
Core Pipeline
bnb = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-4B-Instruct-2507",
quantization_config=bnb,
device_map="auto",
trust_remote_code=True,
)
model = prepare_model_for_kbit_training(model)
lora = LoraConfig(
r=32, lora_alpha=64,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_dropout=0.05, bias="none",
)
model = get_peft_model(model, lora) # ~40M 可训练 / 7B 总量快速开始
python scripts/data_intake.py create --input ./sample.csv --goal "…" --scope sample从业务目标 + 样例数据开始python scripts/data_intake.py agent-config --provider glm-codingBYOK 分析 Agent(GLM/本地/兼容端点)python scripts/launch_dashboard.pyMLflow + Streamlit · 8 页