跳转至

LLM 生命周期:从数据到线上模型

这篇讲 LLM 是怎么“出生”的。

不是从数学公式开始,而是从工程流水线看:

数据
  ↓
Tokenizer
  ↓
预训练
  ↓
后训练
  ↓
评测
  ↓
压缩和部署
  ↓
线上反馈

先看全局图。

flowchart TD
    A["Raw Data"] --> B["Data Cleaning"]
    B --> C["Dedup / Filter / PII Removal"]
    C --> D["Tokenizer Training"]
    D --> E["Pretraining Dataset"]
    E --> F["Pretraining"]
    F --> G["Base Model"]
    G --> H["SFT"]
    H --> I["Preference / RLHF / DPO / RFT"]
    I --> J["Instruction / Chat / Tool-use Model"]
    J --> K["Eval Suites"]
    K --> L{"Pass?"}
    L -->|"No"| H
    L -->|"Yes"| M["Quantize / Package"]
    M --> N["Serving"]
    N --> O["Trace / Feedback"]
    O --> P["Data Flywheel"]
    P --> H

这个图说明一件事:

LLM 不是训练一次就结束,而是数据、训练、评测、部署、反馈不断循环。

阶段 1:数据

模型最早来自数据。

常见数据来源:

  • 网页。
  • 书籍。
  • 论文。
  • 代码。
  • 问答。
  • 对话。
  • 企业内部文档。
  • 人工标注数据。
  • 合成数据。

但原始数据不能直接喂给模型。

需要处理:

步骤 目的
清洗 去掉乱码、模板页、广告、无意义内容
去重 避免重复数据浪费训练,降低记忆风险
过滤 去掉低质量、违法、有害、隐私内容
PII 处理 处理手机号、邮箱、身份证等敏感信息
分类 区分网页、代码、数学、对话、领域数据
配比 控制不同数据类型占比

数据决定模型的底色。

如果模型训练语料里代码少,它代码能力通常不会特别强。

如果后训练数据里工具调用格式少,它就不容易稳定调用工具。

阶段 2:Tokenizer

Tokenizer 决定文本如何变成 token。

例子:

"上下文工程"
  ↓
[token_1, token_2, token_3]

为什么 tokenizer 重要?

  • 它影响上下文长度。
  • 它影响训练效率。
  • 它影响中文、代码、多语言表现。
  • 它影响 API 里的 token 成本。
  • 它影响模型能否很好处理特殊格式。

Tokenizer 里常见特殊 token:

<bos>
<eos>
<|user|>
<|assistant|>
<|tool_call|>
<|tool_result|>

这些特殊 token 后面会和 chat template、工具调用格式连起来。

阶段 3:预训练

预训练是 LLM 的基础能力来源。

最常见的目标是:

给前面的 token,预测下一个 token

例如:

输入:Transformer 是一种
目标:神经

模型通过海量样本学习:

  • 语言规律。
  • 事实知识。
  • 推理模式。
  • 代码结构。
  • 文档格式。
  • 世界常识。

预训练产物叫 base model。

base model 通常还不是一个好助手。

它更像:

会续写一切文本的通用模型

阶段 4:后训练

后训练把 base model 变成可用助手。

SFT

SFT 是监督微调。

它让模型学习:

用户指令 -> 理想回答

例子:

{
  "messages": [
    {"role": "user", "content": "解释一下 KV Cache"},
    {"role": "assistant", "content": "KV Cache 是..."}
  ]
}

SFT 主要解决:

  • 听指令。
  • 对话格式。
  • 输出风格。
  • 结构化回答。
  • 工具调用样式。

Preference / DPO / RLHF

SFT 让模型“会答”。

偏好训练让模型“答得更好”。

常见数据是:

同一个问题
回答 A 更好
回答 B 更差

模型学习偏好:

  • 更有帮助。
  • 更安全。
  • 更诚实。
  • 更符合人类期望。
  • 更少废话。

DPO 是常见的偏好优化方法。

RLHF 是更经典但更复杂的路线。

RFT

RFT 可以理解成在可验证任务上强化。

适合:

  • 数学。
  • 代码。
  • 工具调用。
  • 结构化任务。

因为这些任务可以给明确反馈:

测试是否通过
答案是否正确
JSON 是否合法
工具调用是否成功

Tool-use tuning

Agent 模型还需要学工具调用。

它要知道:

  • 什么时候调用工具。
  • 调哪个工具。
  • 参数怎么填。
  • 工具结果回来后怎么继续。
  • 什么时候停止工具调用并回答。

这和普通聊天不同。

数据里要有类似:

user -> assistant tool_call -> tool_result -> assistant final

这样的轨迹。

如果你想系统区分 SFT、DPO、RLHF 和 RFT,继续读:后训练与对齐入门:SFT、DPO、RLHF、RFT

阶段 5:Chat Template

模型不是直接看到 JSON messages。

服务端会把 messages 渲染成模型训练时熟悉的格式。

例如:

[
  {"role": "system", "content": "你是一个助手。"},
  {"role": "user", "content": "解释 attention。"}
]

可能被渲染成:

<|system|>
你是一个助手。
<|user|>
解释 attention。
<|assistant|>

这就是 chat template。

如果 chat template 和模型训练格式不匹配,模型会表现异常。

所以:

API messages
  ↓
chat template
  ↓
token ids
  ↓
Transformer

这条链必须一致。

阶段 6:评测

模型训练完不能直接上线。

需要评测:

评测类型 看什么
通用能力 语言、知识、推理、代码
指令跟随 是否听用户要求
安全 是否拒绝危险请求
工具调用 工具选择和参数是否正确
RAG 是否忠于检索资料
长上下文 是否能利用远处信息
结构化输出 JSON、XML、函数调用是否稳定
Agent 任务 多步工具链是否成功

对于 Agent 产品,尤其不能只看最终答案。

要看:

trace
tool calls
arguments
observations
final response

阶段 7:压缩和部署

训练产物通常很大。

部署前可能会做:

  • 量化。
  • 蒸馏。
  • 权重格式转换。
  • LoRA 合并。
  • Tensor parallel 切分。
  • KV Cache 精度设置。
  • 服务镜像打包。

部署框架可能是:

  • llama.cpp。
  • vLLM。
  • SGLang。
  • TGI。
  • 自研推理服务。

部署后要关注:

  • TTFT。
  • TPOT。
  • throughput。
  • latency。
  • concurrency。
  • OOM。
  • GPU 利用率。
  • 成本。

阶段 8:线上反馈和数据飞轮

模型上线后,真正的学习还没有结束。

线上会产生:

  • 用户反馈。
  • trace。
  • 失败样本。
  • 安全拦截。
  • 工具调用失败。
  • 低分回答。
  • 人工修正。

这些可以回流成:

  • eval case。
  • SFT 数据。
  • preference 数据。
  • tool-use 数据。
  • prompt 改进。
  • memory / skill 改进。

这就是数据飞轮。

但要注意:

线上数据不能直接无脑回灌训练。

必须做:

  • 隐私处理。
  • 质量过滤。
  • 去重。
  • 人工或模型审核。
  • 版权和合规检查。
  • 安全过滤。

LLM 生命周期和 Agent 的关系

Agent 产品不是只靠 prompt。

它依赖模型在生命周期中学到的能力:

Agent 能力 主要来自哪里
语言理解 预训练
指令跟随 SFT / 偏好训练
工具调用格式 tool-use tuning
安全拒绝 safety tuning
代码能力 代码预训练 + SFT + RFT
长上下文 架构、训练、位置编码、推理系统
JSON 稳定性 SFT、约束解码、eval

如果模型没有学过工具调用,只靠 prompt 让它稳定 function call,会很难。

如果模型训练时没有见过某种 chat template,上线时格式不匹配,也会掉效果。

和上下文工程的关系

模型生命周期决定模型“学过什么”。

上下文工程决定模型“这一轮看到什么”。

两者要配合:

模型训练过 tool call
  +
上下文里提供清晰 tool schema
  +
runtime 能执行工具

工具调用才会稳定。

常见误区

误区 1:预训练模型就是聊天模型

不是。

base model 会续写文本,但不一定会可靠执行用户指令。

误区 2:SFT 数据越多越好

不一定。

低质量 SFT 数据会教坏模型。

质量、覆盖、格式一致性很重要。

误区 3:模型上线后就结束

不是。

上线后还要持续 eval、收集失败、修 prompt、改工具、补数据。

误区 4:Agent 问题都能靠 prompt 修

不一定。

有些问题来自:

  • 模型训练能力不足。
  • chat template 不匹配。
  • 工具 schema 设计差。
  • runtime 权限不清。
  • eval 缺失。

下一步

继续读: