Skip to content

从数据到回答:LLM 全链路

一个 LLM 产品不是“调用一次模型 API”。它是一条从数据治理、训练、对齐、发布、请求编排到反馈闭环的链路。面试系统设计题最容易失分的地方,是把模型当成没有版本、没有成本、没有风险的黑盒。本页用一条可追踪的数据流把每一层串起来。

一、先看全景:两个闭环而不是一条直线

text
离线能力闭环:原始数据 -> 清洗/去重 -> Tokenizer -> 预训练 -> SFT/偏好优化 -> 离线评测 -> 发布
在线产品闭环:用户请求 -> 鉴权/策略 -> 上下文组装 -> 模型推理/工具 -> 输出校验 -> 观测/反馈 -> 评测集

离线闭环决定模型“学会了什么”;在线闭环决定用户“实际得到什么”。二者用版本和数据相连:线上 bad case 进入标注、脱敏与回归集,新的训练或 prompt 版本再经过离线评估后发布。没有这个回路,模型质量一旦回退就只能靠用户投诉发现。

二、数据层:训练开始于删数据

2.1 数据不是越多越好

原始网页、代码、文档、问答、合成样本会包含重复、模板化内容、乱码、隐私、版权风险、低质量翻译和互相矛盾的事实。大模型训练具有放大效应:高频的脏模式会被反复学习,低质量数据既浪费 token 预算,也会降低指令跟随与事实可靠性。

一条典型数据管线包含:

  1. 采集与许可记录:来源、时间、许可范围、地域与删除请求要可追溯。
  2. 解析与规范化:统一编码、抽取正文、保留语言与文档类型等 metadata。
  3. 质量过滤:长度、字符比例、语言识别、重复句、广告模板、困惑度或质量分类器。
  4. 去重:精确哈希去重处理完全相同文本;MinHash/SimHash 或语义去重处理近重复。
  5. 安全与隐私处理:检测 PII、密钥、账号、受限内容;不能只依赖正则,还要有复核和删除链路。
  6. 混合与切分:为语言、代码、数学、长文档设置配比,并严格隔离训练、验证、测试集。

2.2 去重为什么是能力问题

训练集大量重复会让模型记住某些样本而非泛化,验证集若与训练集污染,离线分数会虚高。对 benchmark 的污染尤其危险:模型看似“会做题”,实际可能记住了题目或答案。面试中应区分三个概念:训练去重降低样本冗余,评测去污染保证结论可信,在线知识库去重降低检索结果同质化;三者工具相似,但风险目标不同。

2.3 数据混合是一个控制旋钮

设语料集合为 D_i,采样概率为 p_i,训练并非简单地按原始数据量混合。小而重要的数据域常被上采样,大而低质量的数据域可能被下采样。若代码比重过低,代码能力不足;若合成指令数据过度重复,模型会学到固定套话。混合策略需要版本化,并对每类数据贡献做消融评估。

三、Tokenizer:数据与模型权重的契约

文本必须先映射为 token id。Tokenizer 的词表、特殊 token、规范化规则与 chat template 共同定义了模型看到的输入空间。训练集里新增了 <tool_call><image> 或角色标记,却没有正确扩词或初始化 embedding,会导致这些符号无法被稳定学习。

关键工程约束:

  • tokenizer 版本必须与 checkpoint 绑定;替换 tokenizer 意味着 embedding 和 LM head 的 id 语义不再对齐。
  • 长度统计应以 token 计,不能只看字符数;中英文、代码、JSON 的压缩率差异明显。
  • 训练、评测和线上服务要使用同一 chat template,否则模型实际接收到的是不同任务格式。
  • 特殊 token 应有明确的停止、转义和日志策略,避免用户文本伪造控制标记。

详见 Tokenizer 与分词Mask 与 Padding

四、预训练:让模型学会世界的统计结构

自回归预训练的最常见损失是:

$$\mathcal{L}=-\frac{1}{N}\sum_{t=1}^{N}\log p_\theta(x_t\mid x_{<t})$$

每个位置预测下一个真实 token。teacher forcing 允许训练阶段并行计算所有位置,但必须用 causal mask 防止未来 token 泄漏。优化器根据 loss 的梯度更新参数;训练数十亿到万亿 token 后,权重中形成语言、代码、世界知识和模式识别能力的压缩表示。

4.1 训练系统关心什么

  • 数据并行:不同 GPU 处理不同 batch,聚合梯度;通信瓶颈主要是梯度同步。
  • 张量并行:把大矩阵切到多卡,解决单卡放不下模型;层内通信频繁。
  • 流水线并行:把层分段放到不同设备;需处理 micro-batch 调度与 pipeline bubble。
  • 混合精度:前向/反向使用低精度加速,关键累积用更高精度保持稳定。
  • checkpoint:保存模型、优化器、学习率调度、数据位置和随机状态,支持恢复与可复现。

训练 loss 降低并不等于产品质量提升。loss 是 token 预测的平均指标,无法完整覆盖工具调用、拒答、长文档事实性或用户偏好;它是必要信号,不是发布标准。

五、后训练:把“会续写”变成“可被使用”

5.1 SFT

监督微调让模型观察高质量的多轮消息、答案、结构化输出和工具轨迹。训练时通常只对 assistant token 计算 loss,用户输入和 system 指令被 mask 掉。需要注意:模板错一个角色分隔符、EOS 或 loss mask,模型就会学习错误的轮次边界。

5.2 偏好优化与安全对齐

偏好数据形式通常是同一 prompt 下的 chosen/rejected 回答。RLHF、DPO、IPO、KTO 等方法在实现细节上不同,但共同目标是让模型更偏向有帮助、诚实、安全且风格合适的响应。好的回答不能只说“DPO 不用训练奖励模型”;还要补充它依赖偏好对质量、参考策略和超参数,仍需防范 reward hacking、过度拒答与能力回退。

5.3 工具与结构化输出训练

如果产品需要调用订单系统、数据库或浏览器,训练样本必须覆盖:何时调用、参数如何填、调用失败如何解释、何时不该调用、如何引用结果。只训练“输出一段 JSON”不等于具备可靠工具能力;实际还需要 schema 校验、权限检查、幂等键和审计日志。

六、评测:把“感觉不错”换成证据

评测至少分四层:

层次问题例子
基准能力模型总体能力如何数学、代码、知识 benchmark
任务能力目标业务能否完成意图识别、字段抽取、工单总结
安全可靠性会不会越权或编造注入、PII、拒答、事实引用
系统指标能否稳定经济地服务P50/P95、TTFT、错误率、单请求成本

发布前的比较应该锁定模型版本、prompt 版本、工具版本、检索索引、采样参数和测试集版本。若只改了 prompt 却拿不同流量和不同温度比较,A/B 结论不可解释。线上应保留可脱敏的 trace:请求路由、上下文 token 数、模型、工具调用、延迟、输出校验结果和用户反馈。

七、在线请求的逐步拆解

以企业知识助手为例,一次请求不应直接从“用户问题”跳到“模型回答”:

text
1. 身份与租户校验
2. 内容安全、限流、请求大小检查
3. 意图路由:普通对话 / RAG / 工具任务 / 人工转接
4. 检索或读取可信业务上下文,并按 ACL 过滤
5. 组装 system、history、检索证据、工具结果和输出契约
6. 选择模型、区域、超时和采样配置
7. 流式生成;若需要则执行受策略约束的工具循环
8. 校验 JSON/schema、敏感输出、引用覆盖与业务规则
9. 返回答案与可解释证据,记录 trace 和成本

7.1 上下文预算是在线系统的核心

上下文窗口不是无限背包。请求会竞争有限 token 预算:system 指令、聊天历史、检索 chunk、工具结果和预留输出长度。可用公式表达:

$$T_{input}+T_{reserved\ output}\leq T_{context\ window}$$

超过窗口时不能盲目截断末尾,因为可能删掉安全策略或最近一轮用户目标。常见策略是固定 system 预算、保留最近若干轮、对历史摘要、对检索结果 rerank 后按证据价值填充,并给输出保留硬预算。每一种策略都要在长会话和关键任务上评测。

7.2 模型路由不是“永远用最大模型”

路由器可以根据语言、任务风险、上下文长度、延迟 SLO、结构化输出需求与成本预算选择模型。低风险的分类、摘要或提取由小模型承担;复杂推理或关键决策升级到强模型;高风险操作要求人工确认。路由本身也要可观测,避免“模型省钱了但失败率升了”被平均指标掩盖。

八、失败处理与降级

在线系统必须假设模型和工具会失败:超时、限流、空输出、schema 不合法、工具参数缺失、检索无证据、内容策略命中、外部系统返回 5xx。合理的降级不是把错误偷偷改写成看似确定的回答,而是区分:

  • 可重试:网络瞬断、幂等读取、瞬时限流;使用指数退避和总 deadline。
  • 可切换:兼容模型或区域;需验证能力与合规边界一致。
  • 需要澄清:缺少关键参数或证据不足;向用户提出最小必要问题。
  • 需要拒绝或转人工:高风险操作、权限不足、策略命中或不可验证事实。

对写操作尤其要设计幂等键、审批、补偿和审计。模型给出“调用成功”的自然语言不构成事实,必须以工具返回的结构化结果为准。

九、版本、观测与反馈闭环

一份可复现的线上 trace 至少记录:

json
{
  "request_id": "...",
  "policy_version": "2026-07-20",
  "prompt_version": "support-rag-v18",
  "model": "provider/model@revision",
  "temperature": 0.2,
  "input_tokens": 1840,
  "retrieval_index": "kb-2026-07-19",
  "tool_calls": [{"name": "search_ticket", "status": "ok"}],
  "latency_ms": 2310,
  "validation": {"schema": "pass", "citation": "pass"}
}

日志应脱敏、分级、设保留期,并满足删除与访问控制要求。不能为了调试把用户原始隐私、密钥或完整敏感文档永久写入 trace。Bad case 要按任务、用户群、语言、文档类型和失败模式切片;否则平均分上升可能掩盖一个重要群体明显退化。

十、面试高频问答

Q1:LLM 项目怎样形成闭环?

**答法:**离线端将合法、可追溯的数据经过清洗、训练、对齐和评估形成可发布模型;在线端做鉴权、上下文编排、模型/工具调用、输出校验和观测。线上 bad case 经脱敏标注进入固定回归集,驱动下一轮 prompt、检索或训练更新。关键是所有版本可关联,才能知道一次回退来自哪个环节。

Q2:为什么要同时做离线评测和线上监控?

**答法:**离线评测可控、可复现,适合比较版本并设置发布门禁;线上流量具有真实分布、真实延迟与真实用户行为,能发现测试集没有覆盖的漂移。两者不能互相替代:只看线上会让问题影响用户后才暴露,只看离线会遗漏集成和数据分布问题。

Q3:如何解释“模型回答错了”的排查顺序?

**答法:**先确认问题是否可回答以及证据是否存在;再看身份/ACL 与检索是否取回正确内容;检查上下文是否被截断、模板和工具结果是否注入正确;确认模型/采样/路由版本;最后看输出校验和展示层是否改变了原始答案。这样能把“模型幻觉”拆成可修复的链路故障。

Q4:如何控制 LLM 成本?

**答法:**成本由输入、输出、模型单价、缓存命中、重试和工具调用共同决定。先通过 token 观测找最大头,再做上下文压缩、检索精排、语义缓存、模型路由、输出长度约束和批量处理。不能只把所有请求切到小模型,因为必须同时看质量、人工兜底率和业务损失。

十一、白板回答模板

当面试官让你“设计一个企业 LLM 助手”,可按以下顺序组织:

  1. 明确目标、成功指标与不能做的高风险动作。
  2. 画身份/租户边界和可信数据源。
  3. 画请求编排:路由、RAG、工具、模型、输出校验。
  4. 说明 token/延迟/成本预算和降级路径。
  5. 给出离线评测、线上 trace、灰度和回滚方案。
  6. 说明 bad case 如何回流,而不是把系统停在一次性 demo。

本页的重点不是让每个人去训练底座模型,而是建立系统感:每个答案、每一次工具调用、每一次发布都应有数据来源、版本和可验证的边界。

基于 MIT 许可发布