←返回大模型学习资料
学习资料第 0 章 · 大模型全景与分类

CHAPTER 00 · MODEL LANDSCAPE

大模型
全景与分类

大模型并没有一张所有人都必须服从的单一分类表。理解它,更可靠的方法是同时观察几个维度:它处理什么模态、开放到什么程度、规模和架构如何、通过什么训练目标获得能力,以及最终被放进什么任务和系统。本章从零开始搭一张可以反复使用的地图,让你以后看到一个新模型时,能说清楚它属于哪一类、适合解决什么问题、还缺哪些证据。

难度:入门建议:先通读,再做分类实验范围:文本、视觉、多模态与科学模型9 个主题单元
TEXTBOOK MAP · FOUNDATION MODELS

本章学习地图:从“它是什么”到“我怎么选”

分类不是背诵名词,而是为比较、实验和交付建立共同语言。

说明:本章使用“多个正交维度”而不是唯一排行榜。正文中的模型名称只作为概念例子;具体版本、许可和指标应以对应的模型卡、论文或官方文档为准。

使用方式:本章先建立判断框架,再进入具体模型。每读完一个主题小节,试着用自己的话回答“它处理什么输入、输出什么结果、能力从哪里来、我凭什么相信它”。代码块可以复制运行,表格可以直接改成自己的模型观察表。
翻页规则:底部左右卡片切换 9 个主题单元;左侧目录展开到 0.1.1~0.9.10,可直接跳到具体小节。

01 · LANDSCAPE

从人工智能到基础模型:先建立一张全景地图

第一次接触“大模型”时,人很容易被模型名称、参数数字和产品宣传淹没。今天叫语言模型,明天又出现视觉模型、扩散模型、Embedding 模型和多模态模型;有的模型通过 API 提供服务,有的公开权重,有的只公开论文。若只按新闻标题记忆,很快会把“模型”“产品”“接口”“训练方法”混成一个词。本节先把这些对象拆开,再说明为什么本章坚持使用多个分类维度。

看懂知道 AI、机器学习、深度学习、基础模型和大模型之间的包含关系。
说清能把模型、权重、API、应用系统和评估结果分别描述。
开始做用一组统一问题阅读任何新模型,而不是只比较一个参数量。

0.1.1 为什么没有一张“唯一正确”的大模型分类表

“分类”这个词听起来像是把对象放进互斥的抽屉,但大模型通常同时拥有很多属性。例如,一个模型可以是文本输入、文本输出的语言模型,也可以通过图像编码器扩展成视觉语言模型;它可以是开放权重的本地模型,也可以被某个公司包装成云端 API;它可以用于通用对话,也可以经过行业数据微调后用于法律检索。若只问“它到底属于哪一类”,答案往往不完整,因为你只给了一个维度。

更可靠的做法是把分类问题改写成一组坐标:它处理什么数据?输入和输出分别是什么?权重和代码是否可获得?模型有多大、运行时激活多少参数?内部采用什么架构?通过什么训练目标获得能力?最后被放进什么任务、行业和部署环境?这些问题彼此有关,却不互相替代。一个模型在“模态”轴上属于多模态,在“开放程度”轴上可能属于开放权重,在“架构”轴上可能是稠密 Transformer,在“用途”轴上又可能是通用对话模型。

因此,本章不会给“大模型”强行规定一个参数门槛,也不会把某个厂商的产品列表当成学科标准。我们会给出一套可复用的观察框架:先描述事实,再说明判断依据,最后记录仍然未知的地方。这样做的好处是,即使模型版本更新、名称变化或新模态出现,学习框架仍然成立。

0.1.2 从人工智能、机器学习到深度学习

人工智能(AI)是一个宽泛的目标:让机器完成通常需要感知、推理、规划、决策或生成的任务。它可以使用规则、搜索、概率模型、优化算法,也可以使用神经网络。机器学习(ML)是实现 AI 的一类方法,让系统从数据中学习参数,而不是把所有规则逐条写死。深度学习(DL)通常指使用多层神经网络学习表示和预测的机器学习方法。三者是由宽到窄的关系,不是三个互相竞争的产品名称。

早期机器学习系统常依赖人工设计的特征。例如,垃圾邮件分类器可能使用邮件长度、链接数量、关键词比例等特征,再训练一个分类器。深度学习把“如何表示输入”也纳入学习过程,模型可以从字符、像素或声音波形中逐层形成更抽象的表示。表示学习能力越强,模型越容易迁移到不同任务,但也越需要数据、计算资源和严谨的评估。

大模型并没有离开机器学习这棵树。它仍然需要数据、参数、损失函数、优化器和评估,只是训练规模、数据覆盖、模型容量和迁移方式发生了变化。“大”带来更强的表示和泛化潜力,也带来更高的成本、更复杂的故障模式和更严格的治理要求。把大模型神秘化,会让后面的训练、推理和部署都变得难以理解。

AI目标:让系统完成智能任务
机器学习从数据和经验中学习参数
深度学习用多层网络学习表示
基础模型大规模预训练后迁移到多任务

0.1.3 “模型”到底是什么:从输入到输出的可计算函数

可以先把模型理解成一个带参数的函数。给它输入 x,模型根据参数 θ 计算输出 y:y = f(x; θ)。训练的过程,是利用样本和目标调整 θ,让输出在某个损失函数下更接近目标;推理的过程,则是固定参数,给出新的输入并计算结果。这个抽象不要求你一开始就会矩阵微积分,却能帮助你区分“学习参数”和“调用模型”。

模型输出不一定是最终答案。分类模型可能输出类别概率,Embedding 模型输出向量,语言模型可能输出下一个 Token 的概率分布,视觉编码器输出图像特征,扩散模型在多步采样中逐渐生成图像。应用系统还会在模型前后加入检索、规则、工具、缓存和权限控制。因此看到一个聊天界面时,不要马上把界面里的全部行为归因于单个模型;先问它前后有哪些组件。

“模型知道什么”也需要谨慎表述。参数中保存的是训练后形成的统计规律和表示,不是一个可以随时查询、保证正确的数据库。模型可能在训练语料中见过某个事实,也可能把相近模式拼接成看似合理但错误的句子。外接检索可以提供最新资料,工具调用可以执行计算或查询,但它们不是把模型本身变成永远正确的知识库。理解输入、参数、上下文和外部工具的边界,是判断答案可信度的第一步。

0.1.4 什么是基础模型:先学通用表示,再适配任务

“基础模型(foundation model)”强调的是先在广泛数据上进行大规模预训练,再作为多个下游任务的底座。它与只为一个固定标签训练的模型不同:基础模型通常提供可迁移的表示或生成能力,后续可以通过提示、微调、适配器、检索和工具编排应用到多个场景。语言模型、视觉编码器、语音模型、蛋白质结构模型都可以在各自领域成为基础模型。

基础模型并不等于“通用万能模型”。通用性来自训练数据覆盖、目标设计、架构和迁移方式,而不是来自一个宣传标签。一个在互联网文本上预训练的模型,可能不懂企业内部术语;一个图像生成模型,可能不适合做精确计量;一个科学模型,可能只在受控数据分布中表现可靠。基础模型是起点,不是对所有任务的最终保证。

在实践中还会遇到“基座模型”“预训练模型”“指令模型”“聊天模型”等说法。基座或预训练模型通常更接近原始训练目标,可能需要明确提示格式;指令模型经过监督微调,更擅长遵循自然语言请求;聊天模型还可能加入对话模板、拒答策略、工具协议或服务层限制。它们可能来自同一个模型家族,但并不是同一个检查点。比较时要把版本、训练阶段和调用方式写清楚。

表 1.1 · 容易混淆的五个对象
对象它回答什么问题常见误解阅读时要记录
模型架构计算图怎样组织?架构名称就是完整模型层数、注意力、编码器/解码器等
模型权重训练后参数是什么?权重公开就等于完全开源下载方式、版本、许可证
模型接口怎样把输入送进去?API 行为等于模型全部能力输入格式、限制、计费和版本
应用系统如何完成一个真实任务?系统所有输出都来自模型检索、工具、规则、缓存和权限
评估结果在什么测试上表现如何?一个分数代表普遍能力数据集、指标、提示、版本和限制

0.1.5 “大”不只指参数量

参数量是最常见的规模指标,但不是唯一指标。模型还可能在训练数据量、训练计算量、上下文长度、词表大小、层数、隐藏维度、专家数量、视觉分辨率和推理服务规模上变“大”。同样的参数量,在不同精度、不同硬件和不同批大小下,内存与速度也会不同。看到“7B”“70B”时,先把它翻译成“参数数量的一个近似标记”,不要直接翻译成“能力排名”。

规模通常带来更大的表示容量,但收益取决于数据质量、目标、优化和任务匹配。一个较小但数据干净、领域贴合的模型,可能在固定任务上超过更大的通用模型;一个参数很多但上下文处理、工具接口或安全策略不合适的模型,也可能不适合生产。工程选择要把效果、延迟、成本、隐私和可维护性放在同一张表里,而不是只看最大数字。

还要区分总参数与一次推理实际参与计算的参数。稠密模型通常每个 Token 都经过大部分参数;稀疏或专家混合模型可能拥有很多总参数,却只激活其中一部分专家。后者可能在容量和计算成本之间取得不同平衡,但会引入路由、负载均衡和部署复杂性。后面专门讲规模与架构时,我们会把这两个概念拆开。

0.1.6 训练、推理和应用:三个不同的时间点

训练是让参数从数据中更新的过程,通常包含数据准备、前向计算、损失计算、反向传播、优化器更新、检查点保存和验证。推理是使用固定参数处理新的输入。应用编排则是在推理前后增加模板、检索、工具和业务规则。三者都可能被用户称为“用模型”,但资源、风险和评价方法完全不同。

例如,企业问答系统可能先把用户问题转换为向量,再从知识库检索片段,把片段和问题拼成上下文,交给语言模型生成答案,最后用规则过滤敏感内容并记录日志。模型本身可能只负责最后的生成步骤。若答案错误,原因可能是切分错、检索错、上下文太长、提示模板错、模型理解错或后处理错。没有链路意识,就会把整个系统的问题归因于“模型不行”。

学习时建议把每次实验写成“输入—处理—输出—证据”。输入是什么版本和格式?经过了哪些清洗、编码和检索?输出是概率、向量、文本还是文件?证据在哪里,能否重复?这四个问题比“模型聪不聪明”更容易转化为代码和测试,也更适合后面学习训练和部署。

图 0.1 · 从模型到应用系统的四层链路本站自制概念图,使用 HTML/CSS 绘制。
输入数据文本 · 图像 · 音频 · 结构化记录
↓
模型计算编码 · 预测 · 生成 · 表示
↓
外部能力检索、工具、规则、缓存
运行约束权限、延迟、成本、安全
↓
应用结果回答 · 分类 · 搜索 · 报告 · 动作

模型是系统中的一个计算环节。评估真实应用时,需要分别检查模型能力和系统编排。

0.1.7 模型家族、检查点、版本与产品名称

一个模型家族可能包含多个尺寸、语言版本、模态版本和训练阶段。家族名称描述的是一组有共同设计或来源的模型;检查点是某次训练后保存的具体参数;版本号说明了接口、权重或服务行为的变化;产品名称则可能包含模型、系统提示、工具和运营策略。把家族名当成精确版本,会导致实验无法复现,也会让性能比较失真。

阅读资料时,把以下字段写在一起:发布方、模型家族、具体检查点或 API 版本、发布时间、参数或激活参数、上下文限制、支持的输入输出、许可证、评估设置和下载/调用方式。缺少其中任一项,都应该在比较表中标为“未知”,而不是凭名称猜测。未知本身也是信息,它提醒你还需要查哪份文档。

模型名字里的“base”“chat”“instruct”“vision”“mini”“large”等词也没有跨厂商的统一含义。它们只能作为线索,不能取代模型卡或官方说明。比如“vision”可能表示能看图,也可能只表示包含图像编码器;“large”可能指参数量,也可能指服务档位。专业的描述要回到输入、输出、权重、训练阶段和实测结果。

0.1.8 能力、行为和可靠性不是同一个维度

能力是模型在某类任务上完成目标的潜力,行为是给定提示和上下文时实际表现出来的输出,可靠性则包括在不同输入、边界情况和重复运行下是否稳定。一个模型可能在公开基准上得分很高,却在你的中文术语、长文档或结构化输出任务上不稳定;也可能在开放式对话中很流畅,却不能保证每个数字都正确。

因此,评估模型不能只看“会不会”,还要看“何时会错、错了能否发现、失败成本是多少”。低风险的头脑风暴可以接受一定随机性;医疗、金融、权限操作和代码部署则需要更强的证据、人工复核和回滚机制。模型分类应当最终落到风险场景,而不是停留在漂亮的标签上。

你可以把可靠性拆成四个问题:输出是否符合任务格式?事实是否有可追溯来源?重复运行是否稳定?失败时是否有提示、拒答或人工接管?这四个问题在第 7 节的模型选择和第 14 章的评估部署中都会再次出现。提前建立这套语言,后面学习会少走很多弯路。

0.1.9 用多个正交维度描述同一个模型

“正交”不意味着这些维度完全独立,而是说它们回答不同的问题。写模型简介时,可以按下面的顺序组织:先写模态和 I/O,再写开放程度,再写规模与架构,接着写训练阶段,最后写用途与运行方式。这样读者能快速知道模型做什么、能否拿到、为什么能做、怎样使用以及有哪些限制。

表 1.2 · 一份可复用的模型描述模板
维度问题示例写法证据优先级
模态接受和产生什么数据?文本输入、文本输出;或图文输入、文本输出官方模型卡/接口文档
开放程度什么东西可以获得?仅 API、开放权重、代码与权重均可得许可证与下载页面
规模总参数、激活参数和上下文如何?参数量以官方口径记录,未知则标注未知技术报告/模型卡
架构采用什么计算结构?解码器式 Transformer、MoE 或扩散网络论文/技术报告
训练阶段它是基座、指令还是领域适配?预训练检查点,或经过指令微调的版本训练说明与模板
用途适合什么任务和风险等级?摘要、问答、检索生成,需人工复核评估结果与本地测试

0.1.10 用 Python 写出“模型描述”这个抽象

现在先不调用真实模型,用一个普通字典模拟模型卡。重点不是这几行代码有多复杂,而是把描述字段结构化。结构化之后,才能排序、筛选、比较、保存和复查;如果所有信息只散落在聊天记录里,过一周就很难知道某个判断来自官方文档还是自己的印象。

PYTHON · model_profile.py
models = [
    {
        "name": "示例语言模型 A",
        "modalities": ["text"],
        "input": "文本",
        "output": "文本",
        "access": "api",
        "stage": "instruct",
        "uses": ["问答", "摘要"],
        "evidence": ["官方文档", "本地回归测试"],
    },
    {
        "name": "示例视觉模型 B",
        "modalities": ["image", "text"],
        "input": "图像 + 文本",
        "output": "文本",
        "access": "open-weight",
        "stage": "pretrained",
        "uses": ["图像理解"],
        "evidence": ["模型卡"],
    },
]

for model in models:
    print(f"{model['name']}: {model['input']} -> {model['output']}")
    print("  需要继续确认:", ", ".join(model["evidence"]))
预期输出:每个模型都有清楚的输入、输出、开放方式和证据字段;没有填写的事实不要用猜测补齐。

这个例子还故意保留了“证据”字段。模型资料不是越多越好,而是要知道每个字段从哪里来。后面做比较时,可以把证据进一步拆成 URL、访问日期、版本和测试脚本。这样你不仅能说“模型 A 支持图像”,还能够回答“依据哪份文档、在哪个版本、用什么输入验证过”。

0.1.11 初学者最容易犯的五种概念错误

第一,把大模型等同于聊天机器人。聊天只是交互方式,模型还可以做分类、生成向量、识别图像、补全代码或预测结构。第二,把参数量等同于智力。参数是容量指标,不是跨任务的保证。第三,把开放权重等同于开源。权重、代码、数据、许可证和训练细节可能公开程度不同。第四,把模型输出当作事实数据库。生成结果需要根据任务风险进行验证。第五,把 API、模型和应用系统当成同一个对象。系统可能包含多个模型和工具。

遇到这些错误时,不要靠背诵新定义解决,而要回到四个问题:输入是什么?输出是什么?哪部分参数或组件负责计算?我有什么证据?例如“这个视觉模型会看图”需要继续追问:它是否接受原始图片?分辨率上限是多少?输出是类别、区域、文字还是对话?是否有公开评估?问题问得越具体,宣传语就越容易被还原成可测试的事实。

0.1.12 把分类变成可执行的阅读动作

阅读一个新模型时,可以先做一次 60 秒扫描:圈出模型名称和具体版本;找到输入输出示例;寻找模型卡、论文或官方文档;记录许可和访问条件;找一个代表性评估;写下它明确不保证什么。第一遍不需要理解全部细节,只需要建立“事实清单”和“待确认清单”。第二遍再去读架构和训练细节,避免一上来被数学符号拖走。

完成扫描后,把模型放在多个轴上,而不是给它一个总标签。例如:文本到文本/API 可用/解码器式/指令微调/通用问答/需要人工复核。这句话已经比“这是一个很强的模型”包含更多可行动信息。你可以根据任务替换轴上的选择,逐渐形成自己的模型语言。

0.1.13 本节练习:画出自己的全景坐标系

CHECKPOINT 0.1.1把“模型”拆成六个问题

任选一个你听过的模型或模型产品,不要求立刻查完所有资料,先写出六行:①它接受什么输入;②它输出什么结果;③它是否需要外部检索或工具;④代码、权重和数据分别能否获得;⑤它处于预训练、指令微调还是领域适配阶段;⑥你愿意在哪个低风险任务上先测试它。再标出其中哪些是事实、哪些只是你的推测。

合格答案不在于立刻写出所有技术细节,而在于把“已知”和“未知”分开。例如可以写“官网明确给出图文输入,这是事实;参数量在搜索文章中看到,但尚未找到官方口径,这是待确认;我想用它做摘要,这是使用设想”。如果一个模型无法找到许可证、版本或输入限制,就把这些空白保留在记录中。

把新闻标题翻译成可验证的句子

新闻标题喜欢使用“首个”“最强”“全能”“端到端”“开源”和“百亿参数”等浓缩词。阅读时可以逐词拆开:所谓“首个”是在哪个时间、哪个任务和哪个数据集上成立?所谓“最强”比较的是准确率、人工偏好、延迟还是成本?所谓“全能”支持哪些输入输出组合,哪些任务没有测过?所谓“端到端”是否真的由一个模型完成,还是把预处理和后处理隐藏在产品里?翻译之后,标题就从结论变成了待验证的假设。

“模型会学习”也需要说明学习的对象。预训练可能让它学习文本中的共现规律,监督微调可能让它学会按照模板回答,偏好训练可能改变拒答和语气,检索系统可能在运行时提供新文档。把这些来源拆开后,你会发现很多争论其实是在谈不同层次:有人谈参数中的表示,有人谈应用中的外部知识,有人谈产品的交互设计。

还要注意时间。模型、接口、许可证、价格和安全策略都可能更新;一年前的文章不一定能说明今天的服务行为。模型分类卡中加入访问日期,不是形式主义,而是让未来的你知道结论属于哪个版本。若发现页面更新,保留旧记录并在新记录中写出变化,不要无声覆盖。

对于初学者,最容易落入的陷阱是把“知道名称”误认为“理解模型”。名称只能帮助定位文档,不能代替输入输出、训练阶段和评估。你可以给自己设一个门槛:每记住一个模型名,就至少写一条它的输入、一条它的输出、一条限制和一条来源。四条信息比十个品牌名更有学习价值。

表 1.3 · 从宣传语到验证问题
宣传语需要追问可留下的证据
全能模型具体支持哪些模态和任务?I/O 矩阵、任务测试
最强模型在哪个数据集、协议和版本上最强?评估表、原始输出
开源模型代码、权重、数据和许可分别怎样?仓库文件、许可证、模型卡
长上下文长度单位、有效性和成本是多少?长度测试、延迟和缓存记录
行业模型领域数据、专家评估和适用边界是什么?数据说明、专家测试、限制清单

一次完整的模型描述示范

假设你要向同学介绍一个“图文问答模型”。不要只说“它是一个多模态大模型”,可以按六个轴说:它接受图像和文字问题,输出文字;模型的具体版本和最大输入需要查官方文档;权重是否可下载、代码是否公开、许可证是否允许目标使用,要分别记录;架构可能包含视觉编码器和语言生成部分,但需要技术报告确认;若它是指令微调版本,说明它更偏向遵循请求,而不是重新训练了全部知识;应用上可以先测试课程图表问答,不能把一次正确回答当成医学或财务判断依据。

这段描述同时包含事实、待确认和使用建议。事实是“图文输入、文本输出”这一接口约定;待确认是具体版本、分辨率和许可证;使用建议是“先测试课程图表”。把三者分开,读者就能知道哪些内容可以直接引用、哪些内容需要继续查、哪些内容只是一个低风险实验计划。

再把描述写成一句可复用的摘要:“这是一个图像+文本到文本的指令模型,具体规模和许可待核对;它适合先做带人工复核的图表问答原型,关键风险是小字、数量、空间关系和来源引用。”这句话没有夸大能力,却给出了下一步。任何新模型都可以用同样的句式介绍。

如果同学追问“它是不是比文本模型聪明”,不要接受这个问题的模糊前提。可以改问:在相同提示和相同评估样例上,图文输入是否比先 OCR 再文本生成更准确?视觉编码增加了多少延迟和成本?图片不能出域时是否有本地部署方案?这样,比较就回到了任务、证据和约束。

一张地图怎样帮助你处理新名词

当你第一次看到“视觉语言模型”时,先不要急着记住品牌。沿着本章的坐标走一遍:模态上,它至少涉及图像和文本;I/O 上,它可能是图文到文本,也可能支持文本到图像;开放性上,可能是 API、开放权重或仅论文;架构上,可能由视觉编码器、连接器和语言模型组成;训练上,可能经历图文对比、图文指令微调和偏好训练;用途上,可能服务图表问答、图片描述或视觉代理。一个名词就这样被拆成可查的字段。

再看“基础模型”和“应用模型”的区别。基础模型的描述重点是预训练数据、架构、规模和迁移能力;应用模型的描述重点是输入表单、输出契约、检索来源、权限和业务指标。如果一篇文章把一个带检索和工具的应用系统称作“大模型”,你可以在笔记中同时保留两个层级:底座是什么,系统增加了什么。

地图还能帮助你发现缺口。若你能写出模态和用途,却说不清许可证,下一步查开放性;若你能说出参数量,却不知道激活参数和上下文,下一步查规模;若你能描述 API,却不知道输出是否有来源,下一步查评估和系统。学习不再是从头再读,而是沿着缺失坐标补一格。

对于新闻和课程资料,也可以做“日期标记”。把模型名称、来源页面、访问日期、版本和你当时的结论放在一起。几个月后重读时,你可以比较当时和现在的说法,识别哪些内容是稳定概念,哪些内容只是暂时的产品事实。这种时间意识对快速变化的模型生态尤其重要。

最后,把分类写成可沟通的句子,而不是只写表格。表格适合筛选,句子适合向同学解释;句子又必须能回到表格字段。比如“它是开放权重的图文到文本指令模型,适合带人工复核的图表问答,许可和小字识别仍需确认”。这句话既短,又留下了证据入口和风险边界。

本节的三个收束动作

第一,给任何模型写一行“它是什么”,同时列出事实和未知;第二,给任何系统写一行“它怎样工作”,把模型、检索、工具和人工分开;第三,给任何判断写一行“我凭什么相信”,链接到文档、实验或明确的待核对事项。三行可以很短,但必须能够被别人追问。

如果三行写不出来,说明你还停留在名称层。不要急着增加名词,先用一个模型完成一次完整描述。能把一个对象讲清楚,再扩展到第二个对象,比较才不会变成标签堆积。

学完本节后,最小的可迁移技能是“拆词—列轴—找证据—写边界”。这套动作不仅适用于大模型,也适用于任何快速变化的软件和研究主题。下一节的模态分类会提供第一个具体练习。

本节最重要的结果不是记住“基础模型”的定义,而是学会在面对新名词时暂停一下。先把模型放回 AI、机器学习和应用系统的层级,再用模态、开放程度、规模、架构、训练阶段和用途六个问题描述它。接下来的章节会分别展开这些轴:第二节先看模态,第三节看开放程度,第四节看规模和架构,之后再讨论训练、用途、选择与实验。

如果你现在仍然觉得“大模型”很宽泛,这是正常的。宽泛不是缺点,而是说明它不是一个单一产品类别。学习的目标是建立可分解的地图:听到新模型时,能够定位它在地图上的多个位置,并知道哪些位置还没有证据。等你能用这张地图组织资料,后面的 Token、Transformer、RAG 和训练部署就会有清晰的上下文。

把“全景地图”用在真实阅读中

当你第一次打开一个模型仓库、论文摘要或产品说明时,可以按固定顺序做四次停顿。第一次只看输入和输出:它接受的是文字、图片、音频,还是已经整理好的向量?输出是下一个 Token、类别标签、坐标框、向量,还是一段可以执行的动作?如果 I/O 没写清楚,后面的“更强”“更快”都没有可比性。

第二次看能力的来源。模型是在预训练中获得一般规律,还是通过监督微调学会固定格式?回答中的事实来自权重,还是来自检索结果、工具调用和外部数据库?把这几件事分开,才能知道改提示词、换模型、补资料还是加工具,哪一种手段真正对症。

第三次看证据的边界。模型卡、评测报告和营销页面解决的问题不同:模型卡适合确认数据、许可和限制,评测报告适合比较定义明确的指标,营销页面只能作为发现线索。阅读时把“官方声明”“可复现实验”“自己的测试”分别记在三列中,遇到冲突先不急着选边。

第四次看系统责任。一个模型即使能生成答案,也不代表系统可以直接把答案写进数据库、发送给客户或触发付款。凡是会改变外部世界的动作,都应该有格式校验、权限检查、人工确认或回滚机制。全景地图的价值,正是让你在学习新名词之前先看见这些边界。

02 · MODALITIES

按模态分类:模型处理的究竟是什么信息

“模态”可以先理解为信息进入模型时的主要形式和结构:文字、图像、声音、视频、空间数据或科学测量都可以是模态。按模态分类最直观,却也最容易被一句“多模态”带过。真正需要问的是:模型能接收哪些模态,能输出哪些模态,是否把它们映射到同一表示空间,跨模态关系是在训练时学到的,还是由应用层临时拼接出来的。本节从输入输出的角度,把常见模型分支放到同一张表中。

识别区分文本、视觉、音频、视频、科学与多模态模型的输入输出。
解释知道 Token、Patch、帧、频谱和向量分别在表示什么。
选择根据任务需要选择真正支持目标模态的模型,而不是只看产品名称。

0.2.1 模态不是“文件后缀”,而是信息结构

一个 .jpg 文件、一个麦克风采样序列和一段文字,都是文件或字节;模型关心的是这些字节背后的结构。图像有二维空间邻域,音频有时间波形和频率变化,文字有顺序、词形和句法,视频同时包含空间和时间。模型需要把原始数据转换成可计算的表示,再通过网络建立局部与全局的关系。

因此,按模态分类时不要只写“支持图片”。更完整的描述包括输入的格式、分辨率或长度、是否需要预处理、输出的形式和允许的组合。例如“图文输入、文本输出”说明了 I/O 方向,但没有说明图片是否只支持静态图像、是否接受多张图片、是否保留页面布局、是否能进行像素级定位。技术文档中的接口字段和限制,往往比营销标题更重要。

模态也不是能力的同义词。支持音频输入不等于能准确转写方言,支持图像输入不等于能做医学诊断,支持视频输入不等于理解每一帧中的因果关系。模型可能只使用低分辨率缩略图,也可能把长视频抽样成少量帧。描述模态时,要把“能接收”与“能可靠完成什么任务”分开。

0.2.2 文本模型:从离散符号到概率分布

文本对计算机来说不是天然的语义,而是一串字符和符号。语言模型通常会先把文字切成 Token,再把 Token 映射为向量。Token 可以是字符、词、词片段或特殊符号,具体边界由分词器决定。同一句中文、英文、代码和数字,可能产生不同数量的 Token;上下文长度限制通常按 Token 计算,而不是按人眼看到的“字数”计算。

语言模型的常见输入输出组合包括文本到文本、文本到标签、文本到向量和文本到动作。文本到文本可以完成续写、摘要、翻译和问答;文本到标签更像分类器;文本到向量用于检索和聚类;文本到动作则需要额外的工具协议和权限系统。它们都可能使用 Transformer,却不应因为底层架构相似就被看成同一种产品。

还要区分“语言理解”与“语言生成”。编码器式模型更常用于把输入压缩成表示,再做分类或匹配;解码器式模型逐步预测后续 Token,适合开放式生成;编码器—解码器模型把输入序列编码后生成输出序列,常见于翻译和摘要等序列到序列任务。实际系统可以组合这些结构,分类时要以任务和模型说明为准。

文本→文本问答、摘要、翻译、代码生成
文本→标签情感、主题、意图与风险分类
文本→向量检索、聚类、去重与推荐
文本→动作工具调用,需协议和权限控制

0.2.3 视觉模型:图像、空间和视觉生成

视觉模型处理的对象可以是照片、扫描件、图表、界面截图、视频帧或医学影像。最基本的视觉理解任务是分类:整张图片属于什么类别;更细的任务包括检测、分割、姿态估计、光学字符识别和图像描述。视觉生成模型则根据文字、草图或参考图像产生新图像。输入相同,输出任务不同,所需的模型结构和评估指标也不同。

很多视觉模型会把图像切成规则的 Patch,再将每个 Patch 映射为向量;也有模型使用卷积、层级特征或混合结构。Patch 不是“把图片变成文字”,而是把二维空间切成一组可与注意力计算的视觉 Token。图像分辨率越高,Patch 数量通常越多,计算和显存压力也会增加;页面文字很小、图表密集或物体很小的时候,低分辨率输入可能直接丢失关键信息。

视觉问答还涉及图像与文本的对齐。模型需要把视觉表示和语言表示连接起来,才能回答“图中有几辆车”或“这张图表的最高点是什么”。如果系统只把图片做成粗糙描述,再交给文本模型,视觉细节可能在第一步就丢失。评估视觉系统时,应尽量测试原图、缩放图、遮挡图、文字密集图和相似干扰图,而不只测试漂亮样例。

表 2.1 · 视觉任务与输出证据
任务输入输出不能仅凭什么判断
图像分类单张图像类别或概率不能仅凭“看图”判断定位能力
目标检测单张图像框、类别、置信度不能只看总体准确率忽略小目标
分割单张图像像素级区域不能用文字描述替代区域评估
图像描述单张图像自然语言句子不能保证每个细节都被忠实提取
图像生成文字、参考图或噪声新图像不能只用审美评价代替事实一致性

0.2.4 音频模型:时间波形、频谱和语音交互

音频可以表示为随时间变化的采样值,也可以先转换为频谱图。语音识别模型把声音转换为文字,文本到语音模型把文字转换为声音,音频分类模型判断环境声或事件,音乐生成模型则需要处理旋律、节奏和长时间结构。音频输入的关键限制通常包括采样率、声道、时长和语言覆盖;忽略这些条件,测试结果很容易被误读。

语音交互系统常常不是单个模型,而是“语音活动检测—识别—语言模型—合成”的链路。延迟、断句、噪声和说话人重叠都会影响体验。一个系统能把清晰普通话转成文字,不代表它能处理多人会议、远场麦克风或混合方言。分类时要写清楚模型是端到端处理音频,还是只负责链路中的一环。

音频还提醒我们:模态之间的边界可以重叠。语音既包含语言内容,也包含音色、情绪和环境信息;音乐既有离散符号,也有连续波形。若任务是“把访谈转成可搜索文字”,重点可能是 ASR 和文本检索;若任务是“判断说话人情绪”,文字转写会丢失大量信息,需要保留声学特征。正确选择取决于任务真正需要的信号。

0.2.5 视频、三维和时间序列:多了一条时间轴

视频可以粗略看成一组按时间排列的图像,但连续运动、镜头切换、声音和字幕让它远比“多张图片”复杂。视频模型可能对帧采样、镜头分段、动作识别、事件定位或视频问答负责。若模型只抽取少量关键帧,它适合回答“画面里有什么”,却未必适合判断“某个动作何时发生”。时间采样策略本身就是系统设计的一部分。

三维模型和机器人模型还要处理深度、点云、位姿、坐标系和动作空间。科学大模型可能处理蛋白质序列、分子图、天气场、遥感影像或传感器时间序列。这些输入未必能直接套用文字或图片的 Token 化方式,模型的“模态”描述应该包含单位、坐标、采样频率和物理约束。否则一个看似通用的接口可能在单位变化时产生完全错误的结果。

时间序列尤其容易被误判为普通表格。表格中的每一行可能独立,而时间序列的顺序、周期、滞后和缺失模式本身携带信息。预测未来时还必须避免把未来数据泄漏到输入中。无论模型是否被称为“大模型”,都要先确认时间边界和评估方式。

0.2.6 多模态模型:关键在“对齐和融合”,不在标签

多模态模型至少涉及两种不同信息形式,但“支持多模态”有很多层次。最简单的系统是串联:先用 OCR 把图片变成文字,再把文字交给语言模型;更深入的系统会让图像和文字进入共享或可对齐的表示空间;还有系统在模型内部进行跨模态注意力,让文字 Token 直接关注视觉 Token。三者都能实现图文问答,却有不同的能力边界和故障位置。

描述多模态模型时,建议写一张 I/O 矩阵:行是输入模态,列是输出模态,在单元格里注明是否支持、是否需要额外编码器、是否为实验功能。例如文本→文本、图像+文本→文本、文本→图像、音频→文本都可能存在,但不能因为产品页面出现“多模态”三个字,就假设所有组合都可以互相转换。

多模态对齐还可能出现“看到了但没有用对”。模型能识别图片中的猫,却把图片里的数字读错;能听到语音,却把时间戳和文字对不上;能描述视频,却把不同时间点的事件混在一起。评估时应把跨模态关系拆成细任务:对象、属性、关系、顺序、数量和来源,逐项检查而不是只问一个开放问题。

图 2.1 · 多模态系统的三种连接方式本站自制示意图,重点展示信息在哪里发生转换。
文本 / 图像 / 音频
↓
串联先转换成另一种模态
共享表示映射到可比较的向量空间
↓
跨模态关系
↓
回答、生成或动作

同一个产品名可能封装不同连接方式。判断能力时要追问“转换、对齐和融合发生在哪里”。

0.2.7 科学与领域模态:数据的物理意义不能被抹掉

基础科学模型常处理蛋白质序列、分子图、晶体结构、气象网格、遥感信号和实验测量。它们有时也被归为“语言模型”或“视觉模型”,因为序列和网格可以被编码成 Token;但这种形式上的相似不代表语义相同。科学数据通常带有单位、守恒关系、实验条件和不确定度,输出还可能需要经过模拟、实验或专家审核。

例如,蛋白质序列可以用氨基酸符号表示,但模型预测的结构或功能仍要满足空间和生物学约束;分子生成模型输出的字符串必须能被化学工具解析,并且要检查稳定性、毒性和合成可行性;天气预测模型的误差要按空间、时间和变量分层统计。科学模型的模态分类只是入口,物理和领域约束才是可靠性的重要部分。

学习科学模型时,先问数据是否能被公开复现,标签是否来自实验,训练和测试是否按时间或个体隔离,评价指标是否与真实决策相关。不能因为模型名字带有“foundation”或“大”就跳过这些检查。后面的第 13 章会专门讨论行业与科学大模型,但本章先建立一个原则:领域数据的含义不能在通用标签里被抹平。

0.2.8 表示层:Token、Patch、帧和向量的共同点

不同模态最终都需要变成模型可以处理的数值表示。文本常经过 Tokenizer,图像可以经过 Patch 或视觉编码器,音频可以经过频谱或声学编码器,视频可以经过帧和时空块,科学数据可以经过序列、网格或图结构编码。这些表示单位不一定是人类自然语言中的“词”,但都承担类似角色:把原始输入切成可组合、可计算的片段。

表示单位越细,模型可以保留更多局部信息,但序列会变长、成本会增加;表示单位越粗,计算更便宜,却可能丢失小字、短促声音或细粒度空间关系。模型文档如果只给出最大上下文长度,而不说明视觉 Token、音频帧或压缩率,仍不足以判断真实容量。跨模态系统尤其要关注不同表示之间的比例和对齐。

同一模态也可能有多种表示。中文分词器、代码分词器和多语言分词器的 Token 边界不同;图像使用 14×14 或 16×16 Patch,模型看到的视觉序列长度不同;音频使用不同窗口和步长,时间分辨率不同。比较模型时,最好把“原始输入—中间表示—最终输出”画出来,而不是只抄一个模型名称。

0.2.9 按任务反推模态:先写 I/O,再选模型

如果你要做“会议纪要”,输入可能是音频或视频,输出是带说话人和时间戳的文本摘要;如果你要做“报表问答”,输入是图像、表格或结构化数据,输出是带依据的文字;如果你要做“商品搜索”,输入可能是文字、图片或两者,输出是排序后的商品列表。任务一旦写清楚,模态需求就不再模糊。

可以用三步反推:第一,列出必须保留的信息,例如声音中的语气、图片中的布局或视频中的顺序;第二,写出最低限度的输出,例如标签、坐标、文字、向量或动作;第三,判断是否需要联合输入。若把图片转成文字会丢失关键布局,就不要只选文本模型;若任务只需要文字检索,直接使用重量级视觉语言模型可能是浪费。

表 2.2 · 任务到模态的反推表
任务描述必须保留的信息建议 I/O先验证什么
合同条款检索文字、页码、条款边界文档→文本/向量OCR 与切分是否保留页码
图表问答文字、坐标、趋势和图例图像+问题→答案+依据小字、坐标轴和颜色是否读对
会议转写语音、时间、说话人音频→带时间戳文本噪声、重叠说话和方言
动作识别连续帧和顺序视频→事件与时间区间抽帧策略是否漏掉关键动作
分子性质预测结构、单位、实验条件分子结构→数值与不确定度数据切分和物理约束

0.2.10 用 Python 做一个模态 I/O 检查器

下面的代码不依赖任何模型库,只检查一份模型描述是否自洽。它把输入和输出都写成集合,再列出系统中没有覆盖的模态组合。练习的重点是把“支持多模态”从宣传语变成可以检查的字段;以后读取真实模型卡时,可以把同样的结构扩展成 JSON。

PYTHON · modality_matrix.py
model = {
    "name": "图文问答示例",
    "inputs": {"text", "image"},
    "outputs": {"text"},
    "pairs": [("text", "text"), ("image+text", "text")],
}

def describe_io(profile):
    print(profile["name"])
    print("输入:", "、".join(sorted(profile["inputs"])))
    print("输出:", "、".join(sorted(profile["outputs"])))
    for source, target in profile["pairs"]:
        print(f"  {source} -> {target}")

describe_io(model)

# 练习:增加 audio 输入,再说明它是否真的支持 audio -> text。

注意,inputs 和 outputs 只能说明模态集合,不能证明每个组合都可用,所以代码还保留了 pairs。真实系统还应加入最大长度、分辨率、采样率、批量大小和预处理要求。越接近生产,越不能只用一个布尔值表示“支持”。

0.2.11 本节练习:写一份多模态能力边界说明

CHECKPOINT 0.2.2把“支持多模态”写具体

选择一个图文、语音或视频模型,制作一张四列表格:输入模态、输出模态、已验证的任务、尚未验证的风险。至少放入一个“模型能接收但未必可靠”的例子,例如小字图表、多人重叠语音或长视频事件顺序。最后写一句话说明:如果把一种模态先转换成文本,哪些信息会丢失?

可以写成“图像+问题→文本答案;已验证:清晰照片中的大物体识别;未验证:小字号表格、遮挡和精确计数;若先 OCR,可能丢失空间布局、颜色和相对位置”。答案不要求覆盖所有情况,但要把输入、输出、证据和未知边界分开。

同一张图片,可能对应四种不同任务

想象一张课程成绩表。若目标是判断它是不是成绩表,这是图像分类;若目标是找出每个学生所在的行列,这是版面分析或表格结构识别;若目标是读出姓名和分数,这是 OCR 与结构化抽取;若目标是回答“谁的分数最高”,还需要把识别结果转换成可计算的数据,再进行排序。它们都可以被产品页面写成“图片理解”,但输入预处理、输出结构和错误成本完全不同。

同理,一段会议录音可以用于转写、说话人分离、情绪分析、摘要和行动项提取。先转写再摘要的系统比较容易调试,但可能丢失语气和重叠说话;端到端音频模型保留更多声学信息,却可能更难解释和定位错误。选择哪条链路,应由任务需要保留的信号决定,而不是由“端到端”听起来更先进决定。

模态之间的转换还会产生不可逆损失。把视频抽成几张关键帧,会丢失连续动作;把图片 OCR 成文字,会丢失空间关系;把语音转成文字,会丢失音色、停顿和环境声;把科学网格压缩成平均值,会丢失局部极值。设计系统时先列“不可丢失的信息”,再选择编码器和模型,是比先选品牌更稳的做法。

输入大小也应按原始对象和中间表示分别记录。一个 2 MB 的图片不一定只占很少上下文,因为模型可能把它切成很多视觉 Token;一段 30 秒音频如果使用高时间分辨率,序列会明显变长;一篇短 PDF 可能包含大量表格、脚注和页面布局。只有把原始长度、压缩方式和表示长度放在同一张表里,才能估算成本。

多模态评估要给出可观察的答案。不要只问“模型看懂了吗”,而是拆成“对象是否存在、数量是否正确、属性是否匹配、关系是否成立、顺序是否保留、引用区域是否正确”。对音频,还要加说话人、时间戳、语言和噪声;对视频,加帧间顺序、动作开始结束和镜头切换;对科学数据,加单位、坐标和不确定度。细任务能让错误变得可复现。

表 2.3 · 模态转换中的信息损失检查
转换通常保留下来的信息可能丢失的信息补救方式
图像→OCR 文本字符内容位置、颜色、字体层级保留框坐标和版面结构
视频→关键帧部分对象和场景连续动作、短暂事件按事件密度自适应抽帧
音频→转写文本词语和大意音色、停顿、重叠和噪声保留时间戳和声学特征
网格→平均向量总体趋势局部峰值、边界和空间关系使用多尺度或物理约束编码

模态说明的最小完整格式

可以用四行记录任何一个模型:第一行写原始输入,例如“中文文本、单张 JPEG 图片、16 kHz 单声道音频或长度不超过某值的视频”;第二行写中间表示,例如“文本 Token、视觉 Patch、声学帧或时空块”;第三行写输出,例如“文本、类别、坐标、向量、音频或动作参数”;第四行写限制,例如“只支持单图、不能保证小字识别、超过时长会抽样、输出需要后处理”。这种格式比“支持文本和图片”多了边界,但仍然足够短。

对多模态输入,顺序也可能是数据的一部分。图像放在问题前还是后,音频和字幕是否对齐,视频帧是否按时间排序,文本和表格是否保留页码,都会影响结果。接口示例如果没有说明顺序,应该在自己的测试中固定并记录。更换 SDK 或服务时,不要假设它们对同一对象有完全相同的序列化方式。

评估输入时要做“等价对照”。例如比较图表问答的两条路线:路线 A 直接把图片交给视觉语言模型,路线 B 先 OCR 再交给文本模型。两条路线应使用同一批原图、同一问题和同一输出评分;否则你无法判断差异来自模态能力、OCR 质量还是提示模板。对音频,也可以比较原始音频、转写文本和带时间戳文本,观察哪些错误在转换时产生。

还有一个容易忽略的字段是“缺失输入”。真实数据会有空图片、损坏音频、缺页 PDF、乱码文本和传感器断点。系统要明确是拒绝、跳过、请求补充,还是使用降级模型。把异常输入纳入模态分类,能提前发现“接口支持”与“业务可用”之间的差距。

模态学习也要注意人机协作。模型可能负责初步转写或描述,人工负责核对关键数字和空间关系;模型可能负责给候选区域,规则或专用算法负责测量;模型可能给出科学假设,实验和专家负责验证。把每个模态的可靠输出范围写清楚,系统才知道什么时候应该停下来等待人。

表 2.4 · 模态规格卡的四行写法
行要写什么示例
原始输入格式、长度、分辨率、采样或单位PNG 图像 + 中文问题
中间表示Token、Patch、帧、频谱或结构视觉 Patch 与文本 Token
输出文本、标签、向量、坐标、音频或动作答案 + 证据区域
限制未测边界、异常输入和人工接管小字和精确计数需复核

模态边界的案例推演

案例一是“从一张发票提取金额”。如果图片清晰、版式固定,可以使用 OCR 加规则;如果版式变化大,需要版面分析和表格结构理解;如果发票包含手写、印章和遮挡,可能需要视觉语言模型加人工复核。三种方案都能被称作“发票识别”,但数据、指标和责任不同。先描述任务边界,再决定是否需要更复杂的多模态模型。

案例二是“从讲座视频生成复习提纲”。系统要保留音频、字幕、幻灯片和时间顺序;只取几张关键帧可能漏掉板书,单独转写又可能丢失画面中的公式。一个合理的 I/O 规格是“视频→带时间戳的转写、幻灯片片段、章节摘要”,而不是笼统写“视频理解”。

案例三是“根据实验曲线解释异常”。图片中的曲线、坐标轴、单位和实验条件缺一不可。模型能描述曲线形状,不代表能从图像直接推出因果结论;需要保留原始数据、单位和实验记录,并让模型的解释带上不确定性。模态分类在这里帮助你发现“视觉输入不够,科学上下文也必须输入”。

做跨模态对照时,尽量保留同一问题和同一评分。若把图片转成文字后效果变好,可能是 OCR 恰好适合这个任务;若效果变差,可能是空间关系丢失。把中间表示保存下来,才能解释系统在哪一步改变了信息。

不同模态也会有不同的空值语义。空文本可能表示没有内容,空图片可能表示文件缺失,静音音频可能表示环境安静,缺失传感器值可能表示设备故障。不能把所有空值都填成同一个字符串再交给模型,否则系统会把“没有信息”和“信息为零”混淆。

最后,给模态规格卡加一列“可审计性”:输出能否回到原图区域、音频时间、视频帧或科学记录?能回溯的系统更容易发现错误,也更适合高风险任务。若模型只能给一段无法定位来源的自然语言,至少应在系统层保留原始输入和中间结果。

本节的模态判断口诀

先看输入,不看宣传;再看输出,不看想象;再看中间表示,不只看文件;最后看边界,不只看成功。输入决定模型有没有机会观察到关键信息,输出决定系统怎样评分,中间表示决定信息在哪里被压缩,边界决定结果能否进入真实流程。

如果任务只要求文本标签,就不要因为产品支持图片而增加复杂性;如果任务必须保留空间、时间或声音线索,就不要在第一步把它们无损地假设成文字。模态越多,潜在能力越丰富,接口、评估和故障组合也越多。最小可行的模态链路,通常比一次接入所有模态更容易学习和维护。

下一节学习开放程度时,继续沿用同一规格卡:对每种模态分别记录是否可调用、是否有权重、是否有预处理代码、是否有评估和许可证。一个文本模型开放,不代表它配套的视觉编码器也开放;一个多模态 API 可用,不代表图片和音频拥有相同的数据政策。

按模态分类的最终目的,是在模型名字和任务之间建立一条可检查的链路。文本模型、视觉模型、音频模型和多模态模型不是互相替代的四个等级,而是处理不同信息结构的工具。下一节会转向“开放程度”:同样的模态模型,可能只提供 API,也可能公开权重、代码或数据,使用边界会完全不同。

如果你只记住一个动作,就记住先写 I/O:输入是什么,输出是什么,哪些组合被官方明确支持,哪些只是你的推测。再补上表示方式、长度限制和评估任务,你就能把“多模态”从一个宽泛标签变成一份可以实验的规格。

从模态到数据管线:不要跳过中间层

“模型支持图片”只是入口描述,真正决定效果的是图片进入模型前经历了什么。原图可能被缩放、裁剪、压缩或切成 Patch;文字可能被 OCR 成带坐标的片段;音频可能被重采样、分帧并转换成频谱;视频还要决定抽取多少帧、是否保留时间顺序。任何一步都会改变信息密度,甚至改变任务本身。

因此,描述一个模态系统时至少要记录四层:原始数据、预处理表示、模型接口、最终输出。比如发票审核的原始数据是照片,预处理表示是图像和 OCR 文本,接口可能是“图片加问题”,最终输出则应是带字段名、数值、置信度和页码的结构化结果。只写“视觉问答”会掩盖大量工程工作。

跨模态对齐也有不同粒度。全局对齐只要求一句话和整张图大致对应;局部对齐要求词语能定位到区域;时序对齐要求事件发生的时间点一致;因果对齐则要说明某个视觉变化是否真的导致了文字结论。评测指标和错误分析都应跟着对齐粒度变化,不能用一个总分代表全部能力。

学习时可以用同一份资料做四次实验:只给文本,观察语言理解;只给图像,观察视觉识别;给图像和问题,观察跨模态推理;再加入检索文本或工具,观察外部证据是否被正确引用。这样的对照实验比背诵“多模态”三个字更能建立直觉。

模态规格卡的最后三列

为了让模态说明可以真正落地,再补上三列:限制、证据和降级。限制写清文件大小、分辨率、采样率、时长、Token 或帧数上限;证据写清哪些能力有官方示例、哪些来自自己的测试;降级写清缺少图片、音频损坏、OCR 失败或模型不可用时系统怎样处理。这样一张卡既能指导选型,也能直接转成测试清单。

例如“课程截图问答”可以规定图片最长边、是否需要保留公式和表格、答案必须引用截图位置;若图片模糊,系统先请求重新上传而不是让模型猜。若一段录音只有背景噪声,系统应标记为低质量音频;若视频缺少关键帧,系统应说明时间段无法判断。把异常输入写进规格,往往比再添加一个成功示例更能提升可靠性。

模态系统还要记录数据变换是否可逆。压缩后的图片能否回到原图,OCR 文本能否定位坐标,音频转写能否跳回时间戳,视频摘要能否找到对应帧?可逆或可定位的中间结果,能够支持人工复核和错误分析;完全丢失来源的中间表示,会让模型输出变成无法追问的黑箱。

把模态选择写成可测试的最小规格

一个可执行的模态规格至少包含:输入格式、预处理、表示、输出字段、限制、证据位置和失败处理。比如“图像问答”还要注明图片是否需要 OCR、表格是否保留行列、答案是否必须返回框选区域;“音频摘要”要注明语言、采样率、最长时长和时间戳要求。规格写得越具体,越容易判断该用单模态模型、串联模型还是多模态模型。

测试时从最小输入开始,再逐步加入会改变判断的因素:低分辨率、遮挡、噪声、多个对象、文字和图像冲突、跨页关系以及缺失模态。每增加一种因素,都记录模型是识别失败、定位失败、推理失败还是格式失败。这样得到的错误地图,能直接指导数据增强、预处理、检索或人工复核。

多模态系统的答案还应保留“看见了什么”的证据。例如视觉问答返回相关区域,音频问答返回时间段,视频摘要返回帧区间,科学图表解释返回曲线和单位。没有证据位置时,即使答案语言流畅,也难以判断模型是否真的利用了正确模态。

03 · OPENNESS

按开放程度分类:代码、权重、数据与许可证

“开源模型”和“闭源模型”经常被当成二选一,但实际情况至少有四个层面:你能否调用服务、能否下载权重、能否查看或修改代码、能否获得训练数据和完整实验细节。一个项目可能开放权重却使用限制性许可证,也可能开放代码但不开放权重;另一个项目可能只提供 API,却公开了足够的技术报告和评估结果。准确描述开放程度,必须把可获得的材料逐项列出。

区分分清 API 可用、开放权重、代码开放、数据开放和完全开源的差别。
查证知道下载页、模型卡、许可证和使用条款分别回答什么问题。
负责在个人练习、商业产品和敏感数据场景中做出有证据的使用判断。

0.3.1 开放程度是一组坐标,不是一个开关

最稳妥的描述方式,是把开放程度拆成“访问、权重、代码、数据、评估、许可证”六个字段。访问回答你是否能通过 API 或网页使用;权重回答能否下载参数并在自己的环境推理;代码回答训练、推理和预处理逻辑是否可检查;数据回答训练数据、配方或数据来源是否公开;评估回答结果能否独立复核;许可证回答允许怎样复制、修改、分发和商用。

这六个字段之间没有必然的同步关系。公开权重并不自动赋予你把权重放进任何商业产品的权利;公开推理代码也不代表训练数据可以重新分发;公开论文中的指标也不代表你能重现相同结果。模型描述中若只写“开源”,读者仍然不知道哪些材料开放、哪些行为被限制。

学习阶段可以先用一个简单记号:A 代表 API,W 代表权重,C 代表代码,D 代表数据,E 代表评估,L 代表许可证清晰。比如“AW—E—L”表示可通过 API 使用、权重也许开放,代码或数据尚未确认,评估和许可需要继续查。这种记号不是行业标准,却能强迫你把“开放”说具体。

0.3.2 仅提供 API 的模型:使用快,内部不可见

API 模型通过网络接口提供推理服务。用户通常只需要准备密钥、请求格式和输入内容,不必安装权重或管理显卡。它适合快速原型、流量波动明显的应用和不希望维护推理基础设施的团队。服务方可能负责扩缩容、模型更新、监控和安全策略,使用者则需要关注数据传输、计费、速率限制和版本稳定性。

API 的“黑箱”不等于没有证据。可靠的 API 文档应该说明输入输出格式、上下文限制、错误码、数据保留政策、版本标识和计费方式。你可以通过固定测试集、记录请求版本和保存输出,对服务行为做回归测试。即使不能查看权重,也可以用实验知道“在我的任务上它是否稳定”。

API 的主要风险是外部依赖:网络中断、配额变化、模型自动升级、地域和合规限制,以及数据离开本地环境。对低风险公开文本,这些问题可能可接受;对个人隐私、未公开代码、医疗记录或内部战略,必须先确认数据处理条款和组织政策。不要因为调用代码只有几行,就忽略整个供应链。

0.3.3 开放权重:可以下载参数,但仍需读许可

开放权重模型允许用户下载训练后的参数,在本地或自己的云环境中运行。这样可以减少每次请求的数据外传,方便做延迟控制、离线推理和任务微调,也能观察显存、吞吐和量化后的效果。但权重只是模型的一部分,运行仍需要分词器、配置、代码、依赖、硬件和正确的输入模板。

“开放权重”也可能有访问门槛,例如需要申请、接受条款、遵守使用政策或对再分发做限制。下载页面给出的文件大小和参数数量不一定说明所有许可条件;模型仓库里的 README、LICENSE、NOTICE、使用政策和安全说明都要一起查看。若要商用或分发衍生模型,更应保存当时的条款版本和来源链接。

本地运行还增加了运维责任。你需要更新漏洞、限制访问权限、保护权重文件、监控输出、处理恶意输入和记录版本。模型没有自动把这些责任带走。开放权重的优点是可控性更强,代价是你必须真正承担这份控制。

0.3.4 代码开放、数据开放与“完全开源”

代码开放通常意味着某些训练或推理代码可以阅读和修改,但要看开放的是哪一部分:数据预处理、模型定义、训练脚本、评估脚本、部署服务,还是只是一个示例仓库。只有代码而没有权重,可能便于学习架构,却不能直接复现实验;只有权重而没有预处理和评估,可能让结果难以解释。

数据开放更复杂。训练集可能包含第三方版权、个人信息、商业数据或无法再分发的来源,所以很多项目只能给出数据类型、来源统计和过滤规则,而不是直接上传原始数据。对学习者来说,能否获得数据不是唯一标准,还要看数据许可、去重和清洗是否有说明,以及训练数据是否可能造成隐私或偏差风险。

“完全开源”在不同社区中可能有不同口径。有人强调代码、权重和数据都开放,有人还要求训练配方、评估脚本、版本历史和许可证可用。为了避免争论,页面上最好不用一个模糊标签结束描述,而是列出具体材料。读者不需要先接受你的定义,就能看到事实。

表 3.1 · 开放程度的材料清单
材料它让你能做什么缺少时的影响核查位置
API 接口快速调用推理服务受网络、配额和版本影响官方 API 文档与服务条款
模型权重本地推理、量化、微调无法离线使用或检查本地行为模型下载页和仓库文件
模型代码理解结构、修改推理和训练难以确认实现和预处理源代码仓库与版本标签
训练数据分析来源、复现或重新训练数据偏差和版权边界更难判断技术报告、数据说明和许可证
评估脚本按相同协议复核指标分数缺少可比性论文附录、仓库和模型卡
许可证判断复制、修改和分发边界使用风险和责任不清LICENSE、NOTICE、使用政策

0.3.5 许可证不是“能不能下载”的同义词

下载按钮解决的是技术访问,许可证解决的是法律和组织层面的使用边界。它可能规定允许的用途、再分发方式、署名要求、衍生作品、商标使用、责任免责声明或规模门槛。不同模型项目的条款差异很大,不能看到“免费下载”就推断可以任意商用,也不能看到“非商业”三个字就假设所有学习活动都不允许。

本章不替你作法律结论。遇到商业发布、客户数据、医疗金融场景或模型再分发,应该让组织的法务和安全人员阅读具体条款。作为学习者,你至少可以建立一个证据习惯:记录许可证文件的名称和版本、模型来源、下载时间、所做修改、分发方式以及需要保留的声明。以后换模型时,这些记录能快速暴露差异。

还要把模型许可证与数据许可证分开。模型权重的许可可能允许某种使用,但你输入的数据、检索的文档、生成的图片或输出内容仍有自己的版权、隐私和合同边界。一个“开放模型”不能替你解决数据来源问题。系统的合规性取决于整条链路,而不是某个标签。

0.3.6 模型卡:把开放性和限制写成可读文档

模型卡通常是跟随模型仓库的说明文件,应该帮助使用者了解模型是什么、用于什么、不适合什么、如何训练、用过哪些数据、在什么评估上表现如何。Hugging Face 的模型卡文档把模型用途、限制、训练参数、数据集和评估结果列为重要信息,并说明模型卡常以仓库中的 README.md 形式存在。阅读模型卡时,不要只看第一段简介,要向下查限制、许可、评估和使用示例。

模型卡也不是权威真理。它可能不完整、更新滞后,或只覆盖发布方愿意披露的范围。你可以把模型卡当作“证据入口”,再对关键字段做独立验证。例如模型卡说支持中文,你可以准备一组中文边界样例;它说适合摘要,你可以检查长文、表格和来源保留;它说可商用,你仍要核对许可证正文。

如果你自己训练模型,写模型卡是学习的一部分。把训练数据范围、预期用途、已知失败、评估设置和版本写下来,未来的你和其他使用者才不会靠猜测。模型卡不仅是展示页面,也是让模型可复现、可讨论、可退出的最小文档。

0.3.7 托管服务与本地部署:便利性和控制力的交换

托管服务把硬件、运行时和扩容交给服务方,优点是上手快、可以快速试错;本地部署把数据和推理过程掌握在自己的环境,优点是可控、可离线、可定制。两者没有绝对优劣,关键在任务对隐私、延迟、成本、并发、更新和运维的要求。

可以做一个粗略判断:如果输入是公开资料、任务还在探索、调用量不稳定,托管 API 常能快速获得基线;如果输入不能出域、需要固定版本、网络不稳定或要深度改造,开放权重和本地部署更有吸引力;如果团队没有模型运维能力,则要把安全更新、监控和故障处理成本算进去。不要只比较一次调用价格。

无论哪种方式,都应保留一个可替换的接口层。把业务代码直接写死在某个 SDK 的几十个参数里,迁移会很痛苦;用一个自己的 generate() 或 embed() 函数封装输入输出,可以在 API、本地模型和测试替身之间切换。第 6 章函数与模块、第 14 章部署评估会继续用到这种职责分离。

0.3.8 用 Python 建立开放程度记录

下面的示例把开放程度写成结构化记录,并把“未知”保留下来。代码没有判断某个模型是否合法,只负责提醒你哪些材料还没核对。真实项目中可以把链接、访问时间和条款摘要补充进去,再交由负责人员审核。

PYTHON · openness_audit.py
profile = {
    "name": "示例模型",
    "api": True,
    "weights": True,
    "code": False,
    "data": None,
    "evaluation": True,
    "license": "待核对",
}

def missing_materials(item):
    fields = {
        "api": "API 访问",
        "weights": "模型权重",
        "code": "代码",
        "data": "训练数据说明",
        "evaluation": "评估结果",
        "license": "许可证",
    }
    missing = []
    for key, label in fields.items():
        value = item.get(key)
        if value in (False, None, "", "待核对"):
            missing.append(label)
    return missing

print("仍需核对:", "、".join(missing_materials(profile)))
预期输出:代码会列出代码、训练数据说明和许可证等尚未确认的材料。这里的 False、None 和“待核对”不是一回事,正式记录时要分别说明“明确没有”“没有找到”和“还没查”。

0.3.9 开放模型的安全责任:能拿到不等于能放心用

下载权重后,模型可能在本地离线运行,但输入和输出仍然可能带来风险。恶意提示、隐私泄露、训练数据记忆、越权工具调用、模型文件篡改和依赖漏洞都需要考虑。初学时至少做到:只从可信来源下载,校验文件和版本;不要把真实敏感数据直接喂给未审查模型;为模型服务设置权限和网络边界;保存日志并提供停止和回滚方式。

开放代码也要审查依赖。运行安装脚本前先阅读命令,避免直接执行来源不明的远程脚本或授予管理员权限。模型仓库可能包含下载、编译、上传和遥测逻辑,不要把“机器学习仓库”当成天然安全。把模型环境放进虚拟环境或容器,建立最小权限,正是第 14 章工程交付要学习的基础。

0.3.10 练习:给一个模型写“开放性声明”

CHECKPOINT 0.3.3拒绝只写“开源”

选择一个模型,按“API、权重、代码、数据说明、评估、许可证、版本”七行记录。每一行写:已确认的事实、来源链接、访问日期和仍然未知的内容。最后用一句话给出限定性描述,例如“可通过 API 使用,权重和许可证需以官方页面为准;训练数据未完整公开”。

好的答案不会急着给模型贴“开源/闭源”标签,而会列出材料。若只能确认“可以下载权重”,就写“开放权重”,不要推断代码、数据和商用许可。若许可证文字看不懂,标记“需要进一步审核”,而不是把自己的理解当成法律结论。

开放性审计的三个边界

第一是技术边界:你能否获得运行所需的权重、分词器、配置、代码和依赖?只下载一个大文件,可能仍无法复现官方输入格式。第二是权利边界:许可证是否允许你的目标用途、修改、分发和商用?许可可能对主体、规模、地区、产品形态或署名有额外要求。第三是责任边界:模型出现偏差、隐私泄露或安全问题时,谁负责更新、监控和响应?开放材料越多,使用者通常要承担更多本地责任。

审计时建议保存四份快照:下载页或 API 文档的 URL,许可证和使用政策的原文,模型卡的版本说明,以及你自己的核对日期。页面会更新,仓库会重写 README,服务会切换默认模型;没有快照就无法解释为什么上个月可以使用、这个月却出现限制。

对于团队协作,给每个字段指定负责人。工程人员确认权重和依赖,安全人员确认执行脚本和网络权限,法务人员审核许可证,数据人员确认输入和训练数据的隐私边界,评估人员复现实验。学生项目可以由一个人承担多种角色,但仍要在记录中分开写,避免“我觉得应该可以”替代核查。

不要把“可免费调用”与“开放”混为一谈。免费额度可能只是商业服务的试用条件,服务方仍保留权重、数据和运行控制;相反,开放权重模型可能需要你购买硬件、维护环境和支付电力。比较时把一次调用价格、长期基础设施和人的时间放在同一张成本表里。

最后,开放性也影响学习路径。仅 API 的模型适合先练习提示、结构化输出和应用编排;开放权重模型适合观察分词、量化、推理和微调;代码与数据更开放的项目适合研究训练流程。没有必要为了“真正学会”马上下载最大的权重,先选择与你当前问题匹配的开放层级。

表 3.2 · 从下载到上线的开放性核对
阶段要确认的事实可留下的记录常见误区
下载/接入来源、版本、依赖、访问条件URL、哈希、日期、环境从搜索结果直接下载
本地实验输入模板、权重、许可证、日志命令、配置、输出样例只保存成功输出
微调/修改底座与适配器是否兼容底座版本、变更说明把衍生权重当成原权重
产品分发商用、再分发、署名和数据政策审核结论、保留声明用“开源”替代条款审查

把开放性写成一份“材料清单”

拿到一个模型仓库后,可以先按顺序列目录:模型卡或 README、许可证和 NOTICE、配置文件、分词器或预处理、权重文件、推理代码、训练代码、评估脚本、数据说明和安全政策。对每一项写“存在、缺失、需要申请、只给链接或未知”。这样你很快能看出一个项目是偏研究复现、偏本地使用、偏 API 服务,还是只是一个展示页面。

如果某材料缺失,不要立刻给项目负面评价。数据因版权和隐私不能公开很常见,权重因安全或商业原因不公开也很常见;重要的是把缺失记录下来,并判断它对你的目标是否构成阻塞。做个人学习实验时,缺少训练数据可能只影响复现;做商业分发时,许可证和再分发权可能是硬门槛。

版本管理也要具体。记录仓库分支或标签、文件哈希(如果需要)、模型卡最后更新时间、许可证版本和你下载的文件列表。API 还要记录请求使用的模型 ID、响应中的版本字段和服务区域。以后出现行为差异时,这些信息能帮助你判断是权重改变、服务升级、提示模板改变还是数据变化。

对于输入数据,开放模型并不自动授予“可以上传”的权利。公开模型服务可能保存日志,本地推理可能把输入写入调试文件,检索系统可能把文档复制到向量库。你要分别审查传输、存储、日志、备份和删除。把数据治理写进开放性审计,才能避免“模型在本地,所以完全安全”的错误结论。

开放性还影响团队的退出能力。API 服务若涨价、改版或停服,你是否有替代接口和迁移计划?本地权重若停止维护,你是否能修复依赖和漏洞?代码和评估是否足够让新成员接手?在比较候选时加一列“退出成本”,它往往比短期价格更能解释长期选择。

表 3.3 · 模型开放性审计表模板
材料/问题状态来源或证据对当前任务的影响
权重是否可得是/否/需申请/未知下载页、文件列表、访问日期能否本地推理或微调
代码是否可查完整/部分/无仓库、版本标签能否审查预处理和部署
数据说明是否充分详细/概述/缺失技术报告、数据卡偏差、版权和复现风险
许可证是否匹配通过/待审核/不匹配LICENSE、NOTICE、政策能否商用、修改和分发
退出方案有/部分/无替代模型和迁移脚本供应商锁定和长期成本

个人学习、团队原型和生产上线的不同门槛

个人学习可以使用公开、脱敏和自写数据,目标是理解调用、权重和许可证字段;团队原型要增加数据审批、成本上限、日志脱敏和候选替换;生产上线还要有安全评审、版本锁定、监控、回滚、事件响应和责任人。同一个模型在三种场景中的“可用”定义不同,不能用个人实验的成功直接推断组织可以上线。

如果你从 API 开始,建议把调用封装在自己的函数中,并保存模型 ID、请求时间、输入摘要、输出、错误码和计费信息。不要把密钥写进代码或公开仓库;使用环境变量和最小权限。若切换到本地权重,再替换实现而不改变业务层接口。这样可以同时学习 API 便利性和本地控制力。

如果你从开放权重开始,先阅读仓库的启动脚本和配置,确认下载、缓存、遥测和远程代码行为。把模型放在独立环境,固定依赖版本,避免直接用管理员权限执行未知脚本。测试时用公开样例和合成数据,先观察输出,再考虑接入真实资料。开放性是学习机会,也是一项需要谨慎操作的工程能力。

许可证审查要留下“适用事实”和“需要解释”两列。事实包括许可证名称、版本、允许和禁止条款、署名和再分发要求;需要解释的部分包括商业产品、衍生权重、规模门槛和地域限制。不能确定时停在“待审核”,不要用网络评论替代原文。学习资料可以教你提问,但不能替代专业法律意见。

当多个模型都满足硬门槛时,再比较退出成本:迁移到另一模型需要改多少提示、分词、输入格式、评估脚本和后处理?是否存在开放格式、替代权重和可回放测试?越早保留这些抽象,后面越不容易被某个 SDK 的专有字段锁住。

这一节的核心是证据边界:开放性要逐项记录,许可证要读原文,模型卡要结合独立测试,安全和合规责任不能被一个下载按钮替代。下一节会讨论规模与架构,但仍然保持同一习惯:先分清官方口径,再解释数字如何影响运行和选择。

当你以后看到“开源大模型”“开放模型”或“免费模型”时,可以把它们翻译成具体问题:我能拿到什么?允许做什么?缺少什么?谁负责更新和监控?把问题写在笔记里,模型名称的光环就不会代替你的判断。

开放性审计:从“我能用”走到“我能负责”

学习者常把开放性审计做成下载测试:文件能下载、示例能运行,就认为模型开放。更完整的审计要分三次完成。第一次是可获得性审计,记录你能看到和拿到的材料;第二次是权利审计,核对这些材料允许怎样使用、修改和分发;第三次是运行审计,确认在自己的环境中能否固定版本、保护数据、监控输出并在出问题时退出。

可获得性审计可以从仓库根目录开始。先列出 README、模型卡、LICENSE、NOTICE、配置、分词器、权重、推理脚本、评估脚本和示例数据,再给每个文件标记“有、无、链接、需申请、未知”。不要用一个“开源”标签替代清单,因为缺少分词器或输入模板时,权重可能无法按作者的方式运行;缺少评估脚本时,报告中的分数也难以复核。

权利审计需要把对象分开:源代码是一种作品,权重是一种发布物,训练数据是另一组来源,生成输出还可能受输入资料和使用场景的约束。许可证可能对其中一个对象开放、对另一个对象限制;模型服务条款还可能规定日志、再训练、批量调用或商用方式。学习笔记中至少保存对象、许可证、版本、来源和适用范围,避免把一份许可证误套到整条链路。

运行审计关注的是可控性。固定依赖版本和模型哈希,记录分词器与推理参数,给服务设置网络和文件权限,准备一组脱敏测试数据,观察日志是否会写入原文。若模型从远程地址自动下载额外文件,先阅读下载逻辑并改成明确的离线缓存;若仓库要求执行脚本,先在隔离环境中检查它访问了哪些目录和网络资源。

对个人学习而言,API、开放权重和本地小模型都可以成为入口。API 适合快速观察任务边界;开放权重适合学习分词、量化和推理流程;小模型适合在没有高端硬件时练习数据清洗和评估。不要把“最开放”误当成“最适合开始”。选择一个能在你的设备、时间和许可范围内稳定运行的模型,才有机会形成可重复的学习记录。

对团队原型而言,应把开放性写进替换成本。若服务方更新模型而你的评估集、提示模板和输出校验都没有保存,迁移时就无法判断是模型变化还是业务代码变化;若本地权重只能由一个人运行,离职或环境损坏就会导致项目不可维护。把接口、测试样例和版本清单独立保存,才能在 API 与本地模型之间比较。

对生产上线而言,开放性还要和安全责任绑定。模型权重是否可审计,不代表输出自动可信;许可证是否允许商用,不代表输入数据可以上传;代码是否公开,不代表依赖没有漏洞。上线前要让技术、法务、安全和业务共同确认:谁批准版本,谁处理漏洞,谁查看日志,谁决定暂停服务,谁对高风险输出负责。

表 3.2 · 三层开放性审计记录
审计层要回答的问题应保存的证据未通过时的动作
可获得性哪些代码、权重、数据说明和评估材料实际存在?仓库清单、下载地址、版本和哈希标记未知,不把推测写成事实
权利边界能否学习、修改、商用、再分发或提供服务?许可证、使用政策、NOTICE 和法务意见限制用途或更换材料
运行可控性能否固定版本、保护数据、监控和回滚?环境文件、测试集、日志策略和回滚方案先隔离运行,补齐控制措施

最后练习“面向未来写声明”。不要只写“本模型开放,可用于研究”,而要写“截至某日期,API 和权重可用,推理代码可见,训练数据未公开,评估仅覆盖列出的任务,许可证允许哪些用途;本项目未验证哪些场景”。限定性语言不会削弱介绍,反而让读者知道哪些内容可以依赖、哪些内容需要继续核对。

开放性声明应该写出时间、对象和未知项

模型资料会更新,仓库链接也可能指向不同提交,因此开放性说明不能脱离时间。建议把“截至某日期、某版本、某来源”写在每一项材料旁边,并保存网页或文件的校验信息。这样半年后重新查看时,能区分项目真的改变了,还是你当初读到的是另一版文档。

声明还要把“对象”写清楚。模型权重、分词器、视觉编码器、推理框架、示例数据和生成输出可能分别受不同许可约束。一个多模态系统即使语言模型权重开放,配套的图片编码器或数据集也可能有单独条款。把对象混成一行,容易在部署和再分发时漏掉限制。

对于未知项,使用“未披露”“未找到”“尚未验证”三个词比统一写“没有”更准确。“未披露”表示发布方没有公开,“未找到”表示你在已查范围内没有看到,“尚未验证”表示材料存在但还没有完成测试。精确描述未知,能避免团队把暂时的空白误当成否定结论。

学习者可以用最小审计顺序:先读模型卡的用途与限制,再读许可证和使用政策,接着确认权重、代码和数据说明,最后在隔离环境中跑一个无敏感信息的测试。若任何一步出现冲突,就暂停传播结论,保留原文和问题位置。这个顺序比先在社交媒体上转发“开源/闭源”更可靠。

开放性不是越高越好,而是与任务责任匹配。个人练习重视能否运行和能否观察;团队原型重视版本、替换和数据边界;生产系统还要重视安全更新、审计、合规和退出。把使用场景写在声明里,读者才知道同一模型在不同场景下为什么会有不同结论。

开放程度与学习路线如何对应

如果目标是理解 API 调用,可以先选择文档完整、输入输出稳定的托管服务,练习请求、错误处理、速率限制和成本记录;如果目标是理解模型内部,可以选择可下载的小权重,在本地观察分词、层结构、量化和推理参数;如果目标是学习训练,则还要寻找数据说明、训练脚本和评估脚本,不能只凭一个权重文件推断训练过程。

同一个模型在不同学习目标下的“够用”标准不同。做提示词实验时,许可证清晰和接口稳定比权重是否下载更重要;做部署实验时,权重、分词器和推理框架要能一起固定;做论文复现时,数据来源、训练目标、代码版本和评估协议缺一不可。先写学习目标,再决定需要哪一层开放材料。

建立记录时,还要标记材料的可信等级:官方发布文件、项目维护者说明、第三方测评、个人博客和论坛讨论不能等量齐观。第三方内容适合发现问题或找到线索,关键许可和安全结论应回到原文核对。把来源等级写进表格,能减少“很多文章都这么说”造成的误判。

开放性审计的最终结果不是一句“推荐”或“不推荐”,而是一份有条件的结论。例如“适合公开课程资料的离线摘要实验,暂不用于含个人信息的生产场景;原因是权重许可已确认,但训练数据说明、长上下文评估和安全更新流程仍未知”。有条件的结论更容易随着新证据更新。

04 · SCALE & ARCHITECTURE

按规模与架构分类:参数、稀疏性和模型结构

模型大小经常被压缩成一个带字母的数字:几亿、几 B、几百 B。但参数量只是观察模型的一扇窗。你还需要知道这些参数是否在每次推理中都被激活、每个参数使用多少字节、上下文和输入模态带来多少额外计算、模型结构怎样组织信息,以及硬件和量化如何改变实际成本。本节不追求背下某个家族的数字,而是建立一套可以估算和核对的规模语言。

读懂分清总参数、激活参数、层数、隐藏维度、上下文和批量大小。
估算用参数量和精度粗略估算权重显存,知道估算为何只是下界。
比较区分稠密模型、专家混合模型和不同 Transformer 结构的取舍。

0.4.1 参数是什么:模型里可学习的数字

神经网络中的参数是训练过程中被更新的数字,例如线性层的权重和偏置、归一化层的缩放系数、嵌入表中的向量。参数量越大,模型拥有的可调容量通常越高,但它不直接告诉你数据质量、训练充分程度或任务效果。两个参数量相近的模型,可能因为架构、词表、训练数据和目标不同而有很大差异。

“7B”通常表示大约 70 亿个参数,但具体口径可能包含或不包含嵌入、输出层、共享权重和专家参数。查看技术报告时,要确认数字是近似值还是精确配置,是训练总参数还是推理可见参数。不要把网上文章四舍五入后的数字当成严谨规格。

参数也不是模型文件的全部大小。权重需要按精度存储,运行时还需要激活值、注意力缓存、临时张量、分词器和框架开销。训练时还要保存梯度和优化器状态,显存需求可能远高于只做推理。一个模型能下载,不代表你的显卡能以目标上下文和批量运行。

0.4.2 总参数与激活参数:稠密和稀疏的区别

稠密模型在处理每个 Token 时,通常会经过每层的大部分参数。稀疏模型则可能把若干专家放在同一层,由路由器为每个 Token 选择少数专家。专家混合(MoE)模型可以拥有很大的总容量,而每次只激活其中一部分;这会改变计算量和显存访问,但也引入路由负载、专家不均衡和部署复杂度。

阅读 MoE 资料时至少记录两个数字:总参数和每 Token 激活参数。只写“模型有 400B 参数”可能让人高估一次推理的计算,也可能低估加载全部专家权重所需的存储。相反,只写“激活 20B”又可能隐藏部署时需要管理更大权重集合的事实。两者必须同时出现。

稀疏并不自动等于更便宜、更快或更强。路由器需要把 Token 分配给专家,专家之间可能产生通信;小批量或低并发下,硬件利用率未必理想。选择时要用目标硬件、上下文、并发和服务框架实测,而不是只凭激活参数做结论。

表 4.1 · 规模指标的含义
指标回答的问题影响常见误读
总参数模型总共保存多少可学习数字?权重存储、容量和管理成本等同于每次推理计算量
激活参数一个 Token 实际经过多少参数?单步计算和路由开销等同于需要加载的权重大小
上下文长度一次可处理多少表示单位?注意力计算、缓存和可用信息量等同于一定能记住的字数
层数/宽度网络有多深、表示有多宽?表达能力、延迟和显存单独决定任务质量
训练计算量参数被多少数据和步数更新?训练成本和可能的泛化只看参数量就能推断训练充分

0.4.3 精度与权重显存:先做一个下界估算

如果只估算权重存储,可以用“参数数量 × 每个参数字节数”。例如,半精度通常每个参数占约 2 字节,8 位量化约占 1 字节,4 位量化约占 0.5 字节。实际文件还包含量化尺度、元数据和对齐开销,运行时还要为激活、缓存和框架留空间,所以这是下界,不是“买多大显卡”的最终答案。

精度变化也会影响质量和速度。量化把权重压缩到更少的位数,可能降低显存和带宽压力,但对敏感层、长上下文、代码或多模态输入的影响需要实测。不能把“4 bit”理解成所有运算都只用 4 位;有些方案只压缩权重,计算仍在更高精度中完成。模型卡或量化配置要说明具体方法。

PYTHON · memory_estimate.py
def weight_memory_gib(parameters, bytes_per_parameter):
    """只估算权重文件的理论下界,不包含运行时缓存。"""
    bytes_total = parameters * bytes_per_parameter
    return bytes_total / (1024 ** 3)

for label, bytes_per_parameter in [("fp16", 2), ("int8", 1), ("int4", 0.5)]:
    gib = weight_memory_gib(7_000_000_000, bytes_per_parameter)
    print(f"7B {label}: 约 {gib:.2f} GiB")

# 运行时还要加上激活、KV cache、框架和显存碎片。
怎样解读:同一个参数量在不同精度下的理论权重大小不同,但不要用这个数字直接判断能否运行。上下文越长、批量越大,缓存和激活越可能成为瓶颈。

0.4.4 上下文长度和 KV cache:容量与成本的另一条轴

上下文长度表示模型一次处理的 Token 或其他表示单位上限。它不是“模型能永久记住多少”,也不是“每个位置都同样容易被利用”。长上下文会增加注意力计算和缓存,服务端还可能设置更低的输出上限、并发限制或分层计费。视觉和音频输入会先转换成大量表示单位,表面上只是一张图片,内部可能消耗许多上下文位置。

自回归生成常用 KV cache 保存历史 Key 和 Value,避免每一步重新计算整个前缀。缓存随序列长度、层数、头数和头维度增长。批量请求、长提示、多轮对话和工具返回都可能让缓存占满显存。比较模型时,不要只抄“最大上下文”,还要测试在你的输入长度和并发下的吞吐、延迟和错误率。

长上下文也有“有效利用率”的问题。模型可能在短文本上表现很好,但当关键信息埋在很长的上下文中,检索和注意力会变得不稳定。工程上常用分块、检索、摘要和结构化索引来减少无关输入,而不是无限增加窗口。第 10 章 Embedding 与 RAG 会把这个问题变成可测量的检索流程。

0.4.5 Transformer 的三种常见结构视角

从任务角度,Transformer 常被分成编码器式、解码器式和编码器—解码器式。编码器通过双向上下文形成输入表示,适合分类、匹配和抽取;解码器按因果顺序预测下一个 Token,适合开放式生成;编码器—解码器先理解输入,再生成输出,适合翻译、摘要等序列到序列任务。实际模型可能加入前缀语言建模、滑动窗口、混合专家和特殊头部,不能只靠一个标签概括。

从组件角度,还要观察 Token 嵌入、位置表示、注意力层、前馈层、归一化、残差连接和输出头。视觉模型可能在 Transformer 前加入图像编码器,语音模型可能加入卷积或声学前端,扩散模型可能采用 U-Net 或 Transformer 进行去噪。架构图的价值在于说明数据怎样流动,而不是让读者记住所有缩写。

从部署角度,可以再关注是否支持缓存、批处理、张量并行、流水线并行和量化。相同架构在不同框架中,内存布局和算子支持也可能不同。学习者不需要一开始掌握所有并行策略,但要养成一个原则:架构描述、训练描述和部署描述是三份不同的证据。

图 4.1 · 规模指标怎样影响一次推理本站自制账本图:把“大小”拆成可观察的部分。
总参数 × 精度决定权重存储下界
+
输入长度影响激活和注意力
生成长度影响 KV cache
+
批量、并发、路由与框架开销
↓
实际显存、延迟和吞吐

参数量只是账本第一行。要得到工程结论,必须把精度、上下文和运行方式一起测量。

0.4.6 规模和能力:为什么不能只看排行榜

更大的模型通常有更大的容量,但能力还取决于训练数据、目标、优化、对齐、提示格式和评估任务。排行榜常在固定数据集和固定协议上比较,可能放大某些知识或语言风格,不能直接代表你的业务。模型规模与能力之间的关系,更适合用“在相同条件下的趋势”理解,而不是当成绝对排序。

还要注意数据污染、提示工程和评估泄漏。一个模型可能在公开测试题上表现很好,却在未见过的变体、中文专业术语或结构化输出中失误。比较小模型和大模型时,使用相同输入、相同解码、相同超时和相同评分规则,并保存原始输出,才能知道差异来自模型还是实验设置。

0.4.7 选择架构时先看约束,不先看名气

如果任务是高并发短文本分类,编码器式模型或小型专用模型可能更合适;如果任务需要开放式生成和工具调用,解码器式模型更常见;如果任务输入长文档、输出结构化报告,编码器—解码器或检索加生成的组合可能更易控制;如果部署资源有限,量化后的稠密模型或小型模型可能比大而稀疏的模型更稳定。这里没有“最好架构”,只有约束下的合理选择。

在笔记里把约束写出来:允许的延迟、并发、显存、隐私、更新频率、输入长度和错误成本。然后再选择架构和规模。先写约束,能防止被“最新、最大、最强”的标签牵着走;这也是第 7 节模型选择矩阵的起点。

0.4.8 本节练习:把一个参数数字翻译成运行账本

CHECKPOINT 0.4.4不要只抄“XXB”

找一份模型技术说明,记录总参数、激活参数(若有)、精度、上下文长度、层数或隐藏维度、是否稠密/MoE、推荐硬件和量化方案。再用本节代码估算权重下界,列出至少三项未计入的运行开销。最后回答:在你的电脑或云环境中,真正需要测量哪三个指标?

可以选择显存峰值、首 Token 延迟和每秒生成 Token 数;也可以根据任务选择并发下的错误率或长上下文有效性。答案的关键是说明估算只是下界,并把激活、KV cache、框架和批量开销列出来。若官方没有给出激活参数,就明确写“未知”,不要从总参数猜。

从参数账本走向真实基准

第一次估算时,把模型视为一张静态权重表;第二次测量时,要把真实运行条件写进实验:输入 Token 数、输出 Token 数、批大小、并发、精度、量化、硬件、线程数、缓存是否复用和是否流式。每次只改变一个变量,例如固定模型和输入,比较不同量化;或固定精度,比较短上下文和长上下文。否则结果变化无法归因。

延迟最好拆成首 Token 延迟、后续 Token 间隔和完整响应时间。首 Token 受提示长度、权重加载和预填充影响,后续速度受解码和缓存影响,完整时间还包含输出长度。并发下要记录平均值和尾延迟;一个平均 1 秒的系统,可能在高峰时有少数请求等待几十秒。对用户体验来说,尾延迟和超时处理同样重要。

吞吐也要带单位。每秒 Token、每秒请求、每批图片和每小时成本回答不同问题。图像和音频的“Token”不一定与文字 Token 等价,服务框架可能把视觉编码和文本解码分开统计。记录原始输入大小和中间表示数量,才能进行跨模态比较。

架构对资源的影响还包括内存访问。模型参数即使能放进显存,频繁从 CPU 或磁盘搬运也会降低速度;MoE 路由可能让专家权重访问不均;长上下文会增加缓存而不是只增加一次计算。遇到“显存够但很慢”,不要只继续压缩权重,先查带宽、缓存、批处理和算子支持。

规模估算还可以帮助你决定学习顺序。先用小模型或玩具模型验证数据、提示和评估流程,再换成更大模型;先在短上下文测通,再增加长度;先把单请求跑稳,再测并发。这样失败时知道是逻辑错误还是资源问题,也不会把昂贵的 GPU 时间浪费在一个拼写错误上。

表 4.2 · 一次可复现的推理基准记录
字段示例为什么必须记录
模型/量化家族、检查点、fp16 或 int4同名模型可能有不同权重和精度
输入输出512 输入 Token、128 输出 Token长度直接影响预填充和解码
硬件GPU/CPU、显存、驱动算子和带宽决定真实速度
并发1、4、16 请求平均延迟不能代表高峰尾延迟
指标首 Token、Token/s、显存峰值不同指标服务不同决策
版本框架、代码、日期升级可能改变量化和调度行为

一个“7B 模型能不能跑”的完整推理过程

先问权重精度。若是半精度,理论权重约为参数量乘 2 字节;若是 4 位量化,权重下界会明显下降,但量化元数据和运行时计算仍然存在。再问输入长度和输出长度,因为预填充和 KV cache 会随序列增长。然后问批量和并发:单用户能跑不代表四个用户同时请求也能跑。最后问框架和硬件是否支持目标量化算子,否则理论显存够,实际速度也可能无法接受。

如果只是学习 Token 生成,短输入、单批、较低精度可以帮助你快速验证流程;如果要做文档问答,要用最坏文档长度、检索片段数量和生成长度测试;如果要做多模态输入,要把视觉或音频表示带来的额外序列长度算进去;如果要服务多人,还要测尾延迟、排队和缓存复用。不同任务的“能跑”定义不同。

参数量还会影响训练和微调方式。全参数训练需要保存权重、梯度和优化器状态,资源远高于推理;参数高效微调只增加适配器,但仍要加载底座;蒸馏和量化可以降低部署成本,却可能改变输出质量。选择训练路线时,先看可用硬件和目标任务,再决定要不要使用大模型。

架构对比也要避免只看名称。两个解码器式模型可能有不同的位置表示、注意力窗口、归一化顺序和词表;两个 MoE 模型可能有不同专家数、路由策略和通信方式;同样的“上下文长度”可能对应不同的有效利用率。阅读技术报告时,把结构图和配置字段对应起来,写出每个数字的含义。

最小的实测报告可以只有一页:环境、模型版本、精度、输入输出长度、批量、首 Token 延迟、Token/s、峰值显存、错误和限制。它不需要取代完整基准,却能告诉你当前硬件和任务是否值得继续投入。把报告与显存估算并排保存,估算和事实之间的差距本身就是学习结果。

表 4.3 · 规模判断的五步排查
步骤要问的问题若答案不清楚
1. 权重参数量和精度的官方口径是什么?只做理论下界,标注未知
2. 表示输入会变成多少 Token、Patch 或帧?用短样例统计中间长度
3. 缓存上下文和生成会产生多少 KV cache?测不同长度的显存曲线
4. 调度批量、并发、路由和框架怎样工作?先测单请求,再测峰值
5. 目标任务更看重质量、速度还是隐私?回到任务合同和硬门槛

本节结束时,你应该能把“大模型很大”拆成几条可计算的线:参数量描述容量,激活参数描述每次计算,精度影响权重和带宽,上下文影响输入与缓存,架构影响数据流和任务适配,部署方式决定实际延迟与显存。下一节会进入训练目标,解释模型为什么会拥有某种能力,以及基座、指令模型和领域模型是怎样产生的。

看到参数数字时,不要急着比较谁更强。先问数字的口径,再把它放进目标硬件和任务约束中。能完成这次翻译,你就从“看规格表”迈向了“做工程判断”。

把参数数字翻译成一份可运行的账本

看到“7B”“70B”或“671B”时,先不要把它们直接翻译成“更聪明”。参数数量只说明可学习数字的规模,实际运行还要同时考虑权重精度、激活值、临时缓冲、KV cache、并发和框架开销。一个粗略的权重下界是:参数量乘以每个参数占用的字节数。7B 参数用 16 位浮点保存,只有权重就约需要 14GB;用 8 位保存约 7GB,用 4 位保存约 3.5GB。这个估算不等于完整显存需求,却能帮助你先排除明显不可能的配置。

训练和推理的账本不同。训练还需要梯度、优化器状态、激活保存和通信缓冲,显存往往远高于权重本身;推理可以不保存梯度,却会随着输入长度和并发量增加 KV cache。微调也有全参数、参数高效和量化等路径,每种路径需要的显存、磁盘和时间不同。记录“这次实验是推理、全量训练还是 LoRA”比只记录模型大小更有用。

稠密模型每个 Token 通常都会经过大部分参数;混合专家模型(MoE)可以拥有很大的总参数,但每次只激活其中若干专家。比较两者时应同时写总参数和激活参数,并注明专家数量、每 Token 选择几个专家、路由负载是否均衡。总参数更像容量上限,激活参数更接近单步计算量,但通信和路由也会带来额外成本。

上下文长度是另一个容易误读的数字。支持 128K Token 不代表一次输入 128K 后仍然保持同样准确,也不代表成本和延迟可以忽略。长上下文会增加预填充时间和缓存占用,信息埋在中间时还可能出现“检索到但没有正确使用”的现象。学习时要分别测试短上下文、边界长度、重复信息、关键信息位于开头/中间/结尾的情况。

KV cache 的直觉是“已经处理过的历史,不必每次重新计算”。在自回归生成中,它能显著减少重复计算,却会占用显存,并且通常随层数、头数、每头维度和序列长度增长。并发请求越多,缓存越多;开启分页缓存、压缩缓存或限制最大输出长度,都会影响吞吐与延迟。模型规格页若只给上下文长度而不说明缓存策略,运行账本仍不完整。

架构名称也要拆成数据流。编码器更擅长把整段输入变成双向表示,解码器适合按顺序生成,编码器—解码器适合输入到输出的转换;视觉 Transformer 把图像切成 Patch,多模态模型还要加入视觉编码器、投影层或跨模态注意力。不要把“用了 Transformer”当成足够的架构说明,至少画出信息从输入到输出经过的模块。

规模和能力通常相关,但不是简单的单调关系。数据质量、训练目标、去重、课程安排、优化稳定性、后训练和评估覆盖都会改变结果。一个参数更小、训练更干净、指令更贴合的模型,可能在特定任务上胜过更大的通用模型;一个排行榜分数更高的模型,也可能因为格式、延迟或许可不合适而无法用于你的系统。

比较模型时建议做控制变量实验。固定问题集、解码参数、系统提示、检索文档和后处理规则,一次只更换模型或一个部署变量。记录首 Token 延迟、完整响应延迟、每秒 Token、峰值显存、错误率、输出长度和成本。不要把换模型、换提示、换量化、换硬件同时发生的结果写成“模型升级带来的提升”。

PYTHON · memory_estimate.py
def weight_memory_gb(parameters_billion, bits):
    """只估算权重下界,不包含缓存和运行时开销。"""
    bytes_per_parameter = bits / 8
    return parameters_billion * 1_000_000_000 * bytes_per_parameter / 1_000_000_000

for bits in (16, 8, 4):
    size = weight_memory_gb(7, bits)
    print(f"7B @ {bits}-bit: {size:.1f} GB")
预期输出:约为 7B @ 16-bit: 14.0 GB、7B @ 8-bit: 7.0 GB、7B @ 4-bit: 3.5 GB。实际部署还要预留运行时、缓存和框架开销,不能把下界当成显卡购买建议。

量化也不是“免费压缩”。低比特权重可能改变困惑度、事实准确率、代码格式或长上下文表现;不同层、不同权重和不同校准数据对量化敏感度不同。应在自己的任务集上比较原精度与量化版本,记录速度、显存、质量和异常输出,而不是只看文件大小减少了多少。

对于初学者,最有价值的规模练习是建立一张小账本:模型参数、激活参数、精度、上下文、并发、显存、吞吐、延迟、评测集和许可各占一行。每次换模型或换硬件只改对应字段,最后写一句“适合/不适合我的任务的原因”。这样你会逐渐从背诵参数数字,转向解释数字怎样影响真实体验。

表 4.2 · 规模阅读的最小账本
字段它描述什么常见误读建议的验证
总参数模型中可学习数字的总量数字越大,所有任务都越强固定任务集做质量对照
激活参数一次前向实际参与计算的参数只看总参数估算延迟记录 Token 吞吐和路由开销
权重精度每个参数的存储位数文件大小就是完整显存加上缓存、激活和框架开销
上下文长度接口允许的输入历史范围长上下文一定能准确使用全部内容做位置、长度和召回对照
架构信息经过哪些编码、注意力和解码模块同为 Transformer 就完全相同阅读结构图和配置文件
部署指标延迟、吞吐、并发和成本排行榜分数能代表线上体验在目标硬件和数据上实测

当账本中的字段越完整,你越容易发现“更大”到底改变了什么:它可能提高复杂推理,也可能只是增加成本;它可能扩大上下文,也可能让缓存把并发压垮;它可能适合离线部署,也可能许可证和硬件让方案不可行。把这些差异写出来,才算真正理解规模。

规模估算的三个常见反例

反例一是“参数越大,延迟一定越高”。在不同硬件、量化和批处理策略下,小模型可能因为实现不佳、内存搬运或频繁启动而更慢;大模型也可能通过更高吞吐摊薄单请求成本。比较时要在同一设备、同一输入长度、同一并发和同一框架上测首 Token 与完整响应,而不是只比较参数数字。

反例二是“上下文越长,知识越多”。上下文窗口只是接口能容纳的 Token 范围,不是模型能可靠使用的保证。长输入可能包含重复、冲突和无关内容,模型还可能忽略位于中间的关键证据。把长文拆成可检索片段、保留来源和版本,常常比把所有文字一次塞入窗口更稳定。

反例三是“量化只会损失一点点质量”。量化误差在不同层和不同任务上并不均匀,代码缩进、数字、专有名词、少数语言和工具参数都可能更敏感。量化前后至少比较格式通过率、数字准确率、引用正确率、拒答边界和长输入表现;如果只是看一个平均分,可能错过真正影响业务的退化。

算力预算还要按阶段拆分。下载和存储是一次性成本,预填充和生成是每次请求成本,KV cache 是随并发增长的资源,微调和评估则是周期性成本。把这些成本分开,才能判断应该换更小模型、降低精度、缩短上下文、增加缓存,还是把任务改成 Embedding 加检索。预算不仅是财务问题,也是架构选择。

如果你没有 GPU,也可以完成规模学习。先用公开的小模型或 API 记录输入输出,再用纯 Python 计算权重下界、估算 Token 数和比较不同精度;随后观察同一任务在短上下文与长上下文、不同批量和不同输出长度下的延迟变化。理解变量之间的关系,比盲目购买硬件更重要。

最后把规模字段写成可审计的句子,而不是孤立数字。例如:“该检查点总参数约 7B,使用 4-bit 权重时文件约 3.5GB;本地实测 4K 输入、单并发首 Token 为 X ms,峰值显存为 Y GB;未测多并发和长上下文。”这种写法明确哪些是规格、哪些是实测、哪些仍未知。

用同一张表比较不同规模,而不是比较宣传数字

比较两个模型时,先把单位统一。参数量通常以十亿为单位,显存可能用 GB 或 GiB,吞吐可能按每秒 Token,延迟可能区分首 Token 和完整响应;如果单位混在一起,结论很容易偏差。表格中同时保留“规格值”和“实测值”,并注明硬件、批大小、输入长度和输出长度。

小模型的优势不只在文件小。它可能更容易放到边缘设备,冷启动更快,成本更稳定,也更适合把任务拆成多个专用组件;大模型可能在复杂推理、长文整合或多语言覆盖上更有余量。选择时把任务分成“必须准确”“可以近似”“必须离线”“可以联网”四类,再看哪种规模组合满足硬约束。

模型结构还会改变规模的含义。增加层数、隐藏维度、注意力头或词表都会影响容量和计算;共享参数、分组查询注意力、滑动窗口和稀疏路由会改变内存与带宽。两个都写着 7B 的模型,可能因为上下文、词表、架构和实现不同,得到完全不同的部署体验。

规模比较要保留任务分布。若输入以短中文问答为主,就不能用长英文文档基准代替;若输出必须是代码或 JSON,就不能只看开放式聊天偏好;若系统需要图片和表格,就不能拿纯文本分数作唯一依据。模型越大,越需要问“在哪些数据和指标上变大了价值”。

一次可重复的基准至少包含三组样例:代表性样例、边界样例和压力样例。代表性样例回答平均质量,边界样例揭示空值、超长、冲突和少数格式,压力样例观察并发、资源和超时。分别报告三组结果,才能知道模型是平均不错、边界危险,还是资源根本不可接受。

如果结果冲突,不要急着用一个总分压平。可以保留一个简单决策矩阵:硬约束先筛掉不合格模型,再对质量、成本、延迟、许可和维护做加权比较。权重由任务负责人和实际使用者共同确认;如果隐私是不可妥协项,就不应让更高的质量分数抵消它。

05 · TRAINING OBJECTIVES

按训练目标与能力来源分类:模型为什么会变会

一个模型“会什么”,不是因为它被贴上了某个名字,而是因为数据、目标函数、架构、优化过程和后训练共同塑造了它。预训练让模型学习广泛的统计规律和表示;监督微调让它学会按照示例完成任务;偏好优化和安全训练改变它在冲突场景中的行为;检索与工具则把外部信息和动作能力接到模型之外。本节把这些来源逐层拆开,避免把所有能力都归因于“参数里记住了答案”。

理解区分预训练、监督微调、偏好对齐、领域适配和系统编排。
比较知道因果语言建模、掩码建模、序列到序列、对比学习和扩散目标的差别。
诊断遇到输出问题时,能判断应查数据、目标、提示、检索还是工具权限。

0.5.1 预训练:从大规模数据中学习一般规律

预训练通常使用规模较大的、覆盖多个来源的数据,让模型学习语言、图像、声音或科学对象中的规律。语言模型可能预测被截断文本的下一个 Token,视觉模型可能学习图像表示,图文模型可能判断配对是否匹配。预训练目标未必直接等于用户最后想要的任务,却为后续迁移提供了一个通用底座。

预训练数据不是“越多越好”。重复、低质量、错误、偏见、版权不清或包含个人信息的数据,会被模型吸收或放大。数据过滤、去重、语言平衡、时间切分和来源记录都会影响结果。看到“训练了多少 Token”时,还要追问数据是什么、如何清洗、是否存在污染以及训练计算是否足够。

预训练的损失下降也不等于所有能力同步上升。模型可能更擅长常见模式,却在少见事实、长链推理、结构化输出或安全边界上仍然失败。训练指标、离线基准和真实任务需要分开记录。把一个损失曲线直接翻译成“模型更聪明”,是学习阶段很容易出现的过度推断。

0.5.2 因果语言建模:预测下一个 Token

解码器式语言模型常用因果目标:给定前面的 Token,预测下一个 Token。对一串序列 x₁, x₂, …, xₙ,模型学习估计每个位置的 P(xᵢ | x₁…xᵢ₋₁)。训练时可以并行计算多个位置,但注意力要用因果掩码,防止当前位置偷看未来。推理时从已有前缀开始,一次选择或采样一个新 Token。

这个目标看起来简单,却能让模型学习词法、句法、知识共现和代码模式。它也解释了为什么开放式生成可能出现幻觉:模型的直接目标是生成概率上合适的后续,而不是对每个事实做外部核验。温度、Top-k、Top-p 等解码参数会改变输出随机性,但不会自动补上缺失的证据。

因果目标还决定了许多系统特性:提示顺序、对话模板、上下文长度、停止词和 KV cache 都会影响生成。学习时不要把“模型生成一句话”看成一次黑箱调用,尝试记录输入 Token、输出 Token、停止原因和解码参数,才能理解行为变化。

PYTHON · next_token_objective.py
tokens = ["我", "喜欢", "学习", "大模型"]

for position in range(1, len(tokens)):
    context = tokens[:position]
    target = tokens[position]
    print(f"输入={context} 目标={target}")

# 真实语言模型会为目标 Token 计算概率和损失。
# 这里用打印数据流,帮助观察“前缀 -> 下一个 Token”。

代码只是展示目标的数据流,不会训练模型。它提醒我们:语言模型在训练时看到很多“前缀—目标”的配对,推理时则要把上一步生成的结果接回前缀。标签移位、因果掩码或停止条件写错,都会让训练看似运行、实际学不到正确行为。

0.5.3 掩码建模与编码器式表示

掩码语言建模会把输入中的一部分 Token 隐藏,让模型根据左右上下文恢复它们。因为目标位置可以同时利用前后文,编码器式模型容易形成适合分类、实体抽取和语义匹配的双向表示。它不一定适合直接进行长篇开放式生成,但可以作为检索、分类或下游微调的强底座。

掩码目标的设计会影响模型看到的难度:遮挡比例、连续片段、随机 Token 和句子顺序任务都可能产生不同的表示能力。对图像、音频或科学序列也可以设计“遮住一部分、恢复一部分”的自监督目标。关键不是记住“编码器=掩码”,而是理解信息可见范围和输出用途。

编码器式模型常被误称为“不能生成”。更准确地说,它的原始训练目标和输出头更偏向表示与预测;加上合适的解码器或任务头后,也可以参与生成系统。分类标签应描述默认训练目标和实际接口,不要把架构能力说成绝对禁止。

0.5.4 序列到序列与对比学习:让表示服务于匹配和转换

序列到序列目标先编码输入,再生成输出,天然适合翻译、摘要、改写和结构化转换。输入和输出长度可以不同,训练数据通常是成对序列。模型需要同时学习“读懂来源”和“按目标格式写出结果”,所以数据模板、目标语言和特殊 Token 都很重要。

对比学习则更关注表示空间:让正确配对的样本向量更接近,让不匹配的样本更远。图文检索、重复检测、语义搜索和跨模态匹配都可以使用这种思想。它的输出通常是向量或相似度,而不是一段自然语言。把 Embedding 模型当成“不会聊天的语言模型”并不准确,它优化的目标不同,适合的评估也不同。

对比学习中的负样本质量尤其重要。若“负样本”其实语义相近,模型可能被迫把应该接近的对象推远;若训练批次太小,表示空间的覆盖不足。学习第 10 章时,你会看到检索效果不仅取决于向量模型,还取决于切分、召回和重排。

0.5.5 扩散目标:从噪声逐步恢复结构

图像、音频和视频生成中常见扩散思想:先把数据逐步加噪,再训练模型根据噪声状态和条件信息预测去噪方向,采样时从随机噪声开始逐步恢复结构。它与“预测下一个 Token”不同,生成过程有时间步、噪声日程和采样器。两者都能使用 Transformer,但目标和输出形式不同。

扩散模型的提示词遵循程度、细节一致性、采样步数和分辨率之间存在权衡。图像生成中的“看起来像”不能替代文字、人物身份、数量和空间关系的准确性。评估时需要同时看审美、条件一致性、安全和版权风险。模型类别告诉你大致的计算方式,却不能替你定义成功标准。

0.5.6 监督微调:把通用底座变成可遵循指令的模型

监督微调(SFT)使用输入—目标输出的示例,继续更新预训练模型。对话模型可能使用“用户问题—助手回答”数据,代码模型可能使用“需求—程序—测试”数据,行业模型可能使用术语、格式和流程明确的任务样本。SFT 让模型学习目标格式和任务风格,但效果高度依赖示例质量、覆盖范围和标签一致性。

指令微调不是给模型装一个“事实数据库”。如果训练示例本身错误,模型可能更自信地输出错误;如果示例只覆盖一种表达,换成边界输入就可能崩溃;如果答案模板包含隐含偏见,模型会复制这种行为。微调前要定义任务契约:输入格式、输出字段、拒答条件、引用要求和失败处理。

参数高效微调(如 LoRA)只训练一小部分新增参数或低秩适配器,降低显存和存储成本。它不意味着任务数据不重要,也不意味着底座能力完全不变。适配器与底座版本必须成对记录,合并、加载和推理配置也要写进 README,否则换环境时很难复现。

0.5.7 偏好优化与对齐:改变“怎样回答”

对齐训练关注的不只是答案是否符合标签,还包括是否有帮助、诚实、无害、遵循指令和尊重权限。人类偏好、规则评分、拒答示例或自动反馈都可能参与后训练。不同方法的细节很多,但学习者先抓住一个核心:对齐主要改变模型在候选输出之间的选择和行为边界,不会自动创造所有领域知识。

对齐也有代价和副作用。过强的拒答策略可能挡住合理请求,过度迎合可能让模型不愿意指出前提错误,偏好数据若缺少多样性会造成风格和价值偏置。评估对齐时,要同时测试正常任务、边界任务、误导提示、冲突指令和拒答后的解释质量,而不是只看“是否礼貌”。

0.5.8 检索、工具和 Agent:能力常在模型之外

当系统接入检索时,模型可以在运行时读取外部文档;接入计算器时,它可以把算术交给确定性工具;接入数据库或业务 API 时,它可以查询实时数据。这里新增的是系统能力,不一定是模型权重中的新知识。工具调用还需要参数校验、权限、超时、重试、审计和人工接管。

“Agent”通常表示模型参与规划、选择工具和多步执行的系统形态,而不是一种统一的基础模型架构。一个 Agent 可能使用普通语言模型、视觉模型、检索器和规则引擎。遇到失败时,要区分模型决策错、工具返回错、权限拒绝、状态管理错和循环控制错。把所有问题叫作“模型幻觉”会掩盖真正根因。

表 5.1 · 能力来源与应检查的证据
来源主要学到或提供什么适合检查的证据不能直接推出什么
预训练广泛表示和统计规律数据范围、目标、训练曲线、基准不能推出每个事实都正确
监督微调任务格式、指令遵循和风格样本契约、标签质量、边界测试不能推出知识自动更新
偏好/安全训练回答偏好、拒答和行为边界冲突指令、红队和误拒答测试不能推出价值判断没有偏差
检索系统运行时外部资料召回率、来源、引用和时效不能推出生成一定忠实
工具/Agent计算、查询和执行动作权限、参数、日志、回滚不能推出动作天然安全

0.5.9 用一条能力链解释输出

看到一个模型输出时,可以沿能力链倒推:它是从预训练中获得语言或视觉表示,还是从微调示例学会格式?答案中的最新事实来自参数,还是来自检索文档?计算结果是模型估计的,还是工具返回的?拒答是安全策略、权限规则还是模型自身判断?每个问题都指向不同的测试和责任人。

这种倒推不会让系统变得简单,却会让排错变得具体。比如摘要遗漏段落,先检查输入截断和文档切分;引用错误,先检查召回和来源映射;JSON 格式不合法,先检查提示、解码和后处理;工具执行错,先检查参数校验和权限。能力来源的分类,最终服务于故障定位。

0.5.10 把训练阶段写进模型名称旁边

建议在学习笔记里使用“家族—检查点—阶段—适配方式”的写法。例如“某家族/7B/预训练基座”“某家族/指令微调/聊天模板”“某家族/领域适配器/底座版本 X”。不要只写一个品牌名,因为同家族的 base、instruct、vision 和量化版本可能有不同输入模板、输出行为和许可。

0.5.11 本节练习:为一次输出找能力来源

CHECKPOINT 0.5.5画出输出背后的链路

设计一个“回答公司制度问题”的系统,写出从用户问题到最终回答的步骤。至少标出:预训练模型提供什么、指令微调提供什么、检索提供什么、规则或工具提供什么;再为每一步写一个可能失败的原因和一条证据。

一种合理拆分是:模型理解问题并生成候选回答;检索器找出制度原文和版本;提示模板要求引用来源;规则检查是否缺少引用;人工或权限系统处理高风险动作。若答案过时,先查文档版本和召回;若引用不存在,查检索结果和生成格式;不要一上来只改模型温度。

训练目标决定“模型看见什么、学会什么”

训练数据的排列方式会决定模型观察到的关系。因果语言模型把前缀和后续联系起来,掩码目标让模型利用左右上下文,序列到序列目标要求它把一种序列转换成另一种序列,对比目标把匹配对象拉近,扩散目标则让模型学习从噪声状态恢复结构。同一个“文本”可以因为目标不同,形成完全不同的表示和输出习惯。

标签质量决定监督微调的上限。若示例把“无法确认”都写成肯定答案,模型会学到过度自信;若格式有时用 JSON、有时用自然语言,模型很难稳定遵守;若拒答条件没有示例,安全边界只能靠猜。训练集的每一条样本都在暗示一个规则,越是重复出现的规则,越容易被模型当成普遍行为。

数据配比也会造成能力取舍。增加代码数据可能提高程序模式,但可能改变自然语言风格;增加某种语言或领域语料可能改善术语,却让其他语言的容量相对变少;增加合成数据可以扩展覆盖,却可能把生成错误循环放大。看到训练数据比例时,不要只问“总量多不多”,还要问“任务需要的信号是否被覆盖、噪声是否会被重复学习”。

训练阶段之间还可能出现遗忘和冲突。领域继续预训练可能让模型更懂专业词,却损伤通用表达;微调可能让格式更稳定,却降低开放式灵活性;强安全对齐可能让危险请求拒答,却误伤正常研究问题。评估要在同一套通用、领域和边界样例上前后对照,才能知道新增能力的代价。

模型输出的“理由”也不一定等于内部真实过程。思维链、解释文字和引用格式可能是训练出来的行为,不应直接当成证明。需要计算时交给确定性工具,需要事实时给出来源,需要安全判断时保留规则和人工审核。训练目标能塑造行为,却不能替代外部证据。

表 5.2 · 训练阶段的输入、输出与验收
阶段主要数据对常见输出验收问题
预训练原始序列、图像或科学对象通用表示、概率或去噪结果数据来源和目标是否清楚
监督微调任务输入与示范答案格式和指令遵循标签是否一致,边界是否覆盖
偏好对齐候选答案与偏好/规则行为风格和安全边界是否出现过度拒答或迎合
领域适配术语、文档和专业任务领域词汇和流程能力是否保留版本、来源和专家评估
系统编排运行时文档、工具和权限最新信息和可执行动作检索、工具和回滚是否可审计

训练阶段的易错对照

把继续预训练当成事实更新:继续训练领域文本可能让术语更熟悉,但不会自动保证最新事实,也不会自动知道哪些文档可信。要更新知识,可以使用新数据训练,也可以在运行时检索带版本的文档;两者的成本、时效和证据不同。

把监督微调当成能力创造:微调可以改变输出格式、语气和任务行为,却不一定能补上缺失的广泛知识。若样本中包含大量事实,模型可能记住其中一部分,但仍需要验证、引用和版本控制。

把对齐当成正确性证明:回答更礼貌、拒绝更安全,不等于事实更准确。对齐目标往往包含帮助性、无害性和遵循指令等偏好,需要和事实、格式、检索来源分开评估。

把工具结果当成模型能力:模型调用计算器得到准确结果,不代表模型自己会做任意精确计算;模型读取检索文档生成答案,也不代表参数中保存了这份最新资料。系统描述要写清工具和模型的责任边界。

把训练损失当成业务指标:损失下降说明模型更好地拟合了训练目标,但业务可能更关心引用覆盖、字段准确率、召回、延迟和拒答。每一项指标都要与任务合同对应。

可以用“前后对照”检查训练效果:同一批通用样例、领域样例和边界样例,在预训练基座、微调版本、对齐版本和接入检索后分别运行。比较格式、事实、来源、拒答和延迟的变化,记录新增能力和退化能力。这样你看到的不是一个模糊的“升级”,而是一张能力变化表。

表 5.3 · 训练阶段的前后对照实验
版本固定什么观察什么应避免的结论
基座输入和解码参数原始生成和通用表示不因格式不稳就否定知识
指令微调同一任务样例遵循指令和输出格式不因更像助手就断言事实更真
对齐版本同一边界提示拒答、解释和冲突处理不把礼貌当成安全充分
接入检索同一文档版本引用、时效和召回影响不把检索错误都归因于生成模型

本节把“能力”拆成了几个层次:预训练形成通用表示,微调形成任务行为,对齐改变偏好和安全边界,检索与工具把外部信息和动作接入系统。下一节会把这些模型放进通用、行业、任务和系统层级,帮助你判断一个模型到底服务于哪一种使用场景。

当你能回答“这项能力来自哪里”时,模型分类就从静态标签变成了动态解释。你不再只说“这是一个会写代码的模型”,而会进一步说明它依赖什么底座、什么训练样本、什么工具和什么评估。

训练方案的证据链:从数据到行为逐项验收

分析一次训练或微调,第一步是写数据合同。合同至少说明样本来源、许可、时间范围、语言、字段、去重规则、脱敏方式、质量抽检和删除流程。数据越接近真实业务,越要知道哪些内容可以用于训练、哪些只能用于评估、哪些必须永不离开原系统。没有数据合同,后面的分数很难解释,也很难在用户要求删除时找到对应记录。

第二步是写目标合同。目标不是一句“让模型更强”,而要明确模型在优化什么:下一个 Token 的概率、被遮挡片段的恢复、输入输出的转换、正负样本的距离、噪声恢复、任务标签、偏好排序或工具调用成功率。目标函数决定模型在训练中被奖励的行为;如果业务要求引用来源,却只优化流畅文本,模型自然不会稳定地产生可核查引用。

第三步是写样本合同。每条监督样本都应该有明确的输入边界、目标格式和拒答条件。对于结构化输出,统一字段名、类型、枚举值和空值语义;对于问答,标注“资料不足”的正确行为;对于工具调用,区分可执行参数、缺失参数和需要人工确认的参数。样本之间若互相矛盾,应先处理矛盾,而不是期待模型自己学会裁决。

第四步是做切分和泄漏检查。随机切分可能把同一文档的相邻段落同时放进训练和测试,导致分数虚高;时间敏感任务要按时间切分,用户或项目数据要按主体切分,近重复样本要在切分前去重。测试集应尽量代表上线时会遇到的输入,同时保留一套永不参与训练的“盲测集”。

第五步是做能力与退化的双向评估。新版本可能提高领域术语,却损伤通用表达;可能减少危险输出,却增加误拒答;可能让 JSON 更稳定,却在长文本中遗漏信息。用同一套通用、领域、边界、长上下文和格式测试做前后对照,把“提升”和“退化”同时写进报告。只公布上涨的指标,会让读者误解训练效果。

把训练变更写成可复现的实验

训练阶段之间的边界,最好用一个固定实验集来观察,而不是靠记忆推断。准备同一批通用样例、领域样例、格式样例、长上下文样例和安全边界样例,在基座、指令微调、对齐版本以及接入检索的系统上依次运行。输入、解码参数、文档版本和评分规则保持不变,只有待比较的阶段发生变化。

每次实验都记录四类结果。第一类是任务质量,例如字段准确率、摘要要点覆盖、代码测试通过率或图文匹配召回;第二类是行为质量,例如指令遵循、拒答边界、对冲突提示的处理;第三类是系统质量,例如延迟、吞吐、缓存占用和失败率;第四类是证据质量,例如答案是否引用正确来源、能否定位原文、是否把不确定内容标出来。

训练样本应有“正例”和“反例”。正例告诉模型希望看到什么,反例告诉它哪些相似输入不能这样回答。对于课程问答,正例可以是带章节引用的答案,反例可以是资料中没有结论时输出“无法确认”;对于工具调用,正例是完整参数,反例是缺少金额或权限时暂停。只收集成功样本,模型很难学会何时停下。

数据质量检查也要分层进行。格式检查确认字段可解析,语义检查确认答案与来源一致,安全检查确认没有泄露和越权,分布检查确认不同语言、长度、主题和用户类型没有被某一类样本完全代表。自动规则可以筛掉明显错误,但重要样本仍需要人工抽检,并保留抽检规则和比例。

训练中的“遗忘”需要显式测试。领域继续预训练可能让术语更熟,却削弱普通表达;微调可能让输出格式更稳,却忘记少见但重要的通用任务;安全对齐可能减少危险回答,却误拒答合理研究问题。将退化样例列为回归测试,每次发布都跑一遍,必要时采用混合数据、冻结层、适配器或检索来平衡。

训练完成后,先做离线报告,再做小流量试运行。离线报告解释指标和失败案例,小流量试运行观察真实输入分布、用户修改、拒答、延迟和资源成本。不要把离线高分直接等同于线上成功;线上还会出现输入缺失、格式混乱、重复请求、恶意提示和版本迁移等问题。

当一个训练项目被交接给别人时,最重要的不是一句“效果提升了 8%”,而是别人能否重现比较。交付包应包含运行命令、环境版本、数据切分摘要、固定测试集、原始和新版本输出、指标脚本、已知失败和回滚方式。若某项结果不能重现,就在报告中标记不确定,不要用精确数字掩盖实验波动。

表 5.3 · 训练阶段的前后对照实验
版本固定什么观察什么应避免的结论
基座输入和解码参数原始生成和通用表示不因格式不稳就否定知识
指令微调同一任务样例遵循指令和输出格式不因更像助手就断言事实更真
对齐版本同一边界提示拒答、解释和冲突处理不把礼貌当成安全充分
接入检索同一文档版本引用、时效和召回影响不把检索错误都归因于生成模型

训练目标、数据合同和评估证据连在一起,才能解释模型为什么出现某种行为。预训练形成广泛表示,微调形成任务格式,对齐改变偏好和安全边界,检索与工具把外部信息和动作接入系统;没有哪一个阶段单独负责全部正确性。

训练、微调、检索:遇到问题先定位阶段

回答事实错误时,先问输入里有没有正确资料。如果资料没有出现,问题可能是知识缺失,应考虑检索、更新数据或改变任务流程;如果资料已经出现但回答仍错,才进一步检查上下文组织、提示、微调和生成参数。这样可以避免为了“补知识”盲目训练,或者为了“改格式”不断扩大训练集。

输出格式不稳定时,先检查模板和解析器。系统提示是否和训练模板一致,字段是否有明确类型,停止条件是否正确,解码是否允许额外文本,后处理是否会破坏 Unicode 或转义?只有这些环节都稳定后,才判断是否需要监督微调。很多所谓的“模型不听话”,其实是接口合同不完整。

回答过于自信时,分别测试三种输入:有明确来源、来源不足、来源互相冲突。若三种输入都给出同样肯定的语气,说明数据样本或对齐目标没有教会模型表达不确定性;若接入检索后仍引用不存在的段落,问题可能在召回映射或引用校验,而不是预训练知识。把失败按阶段归类,修复才有方向。

工具调用失败时,记录模型生成的参数、验证器的错误、工具返回值和最终回复。参数缺失属于任务格式问题,参数越权属于权限问题,接口超时属于系统问题,工具返回错误属于外部服务问题。它们可能同时出现,但不能都叫作“幻觉”。一份完整日志能帮助你决定应该改样本、改规则还是改重试。

训练数据和线上反馈也不能直接混在一起。用户反馈可能包含个人信息、偏见、错误答案和重复请求,进入训练前要脱敏、授权、去重、标注和抽检。把线上输出原样回灌,可能放大模型自己产生的错误;更稳妥的做法是把反馈先变成带来源和判定的评估样例。

当新版本表现更好时,仍要检查它是否改变了不希望改变的行为。固定一组回归问题,比较事实、格式、引用、拒答、延迟和成本;对变化最大的样例做人工复核;把可接受变化、需要修复变化和必须回滚变化分别标记。训练的成功不是所有分数都上涨,而是目标行为改善且代价在可接受范围。

学习者可以把每次实验写成四句总结:我改变了哪一个训练或系统阶段;我预期它影响哪个行为;哪个指标和案例证明了变化;还有什么未知或退化。四句总结会迫使你把“感觉更好”转成可核查的因果假设,也为之后学习 Transformer、LLM 和 RAG 留下清晰入口。

小规模训练实验的观察顺序

初学者不需要马上训练大模型,可以用很小的文本或图像数据观察目标如何改变行为。先让模型在训练集上过拟合一小批样本,确认数据、标签、损失和反向传播确实连通;再换成未见过的样本,观察泛化;最后加入噪声、缺失字段和冲突输入,观察模型是否知道何时不确定。

每轮实验只改变一个变量:数据量、去重方式、目标函数、学习率、微调层、提示模板或解码参数。保存原始输入、训练配置、损失曲线、验证结果和失败输出。若一次同时改变五个变量,即使分数上涨,也很难知道是哪一步起作用。

小实验最重要的输出不是最终分数,而是一个可解释的对照。例如“加入拒答反例后,资料不足问题的肯定回答减少,但正常问题的误拒答增加”;“换成带时间戳的检索后,引用定位改善,但长文延迟上升”。这样的句子可以继续转成测试,成为后续章节的工程资产。

当你能用几百条样本完成这套观察,再考虑更大的数据、模型或硬件。先理解目标、证据和退化,再扩大规模,能避免把资源消耗误认为学习效果。

训练结论的谨慎表达

描述训练结果时,尽量使用“在某个版本、某套数据、某个协议下,某项指标发生变化”的句式。例如“在固定中文制度问答集上,指令微调提高了结构化输出通过率”,不要直接写成“微调让模型全面变强”。前一种写法能被复查,后一种写法把局部结果夸大成普遍能力。

如果没有训练脚本、数据或完整评估,就把结论标为“根据发布方说明”或“根据有限测试推测”。对于最新知识、事实准确和安全边界,尤其要保留限制。模型的训练阶段能解释行为来源,却不能代替运行时证据。

学习笔记还可以给每次实验加一个“未改变的变量”清单:底座版本、分词器、输入长度、解码参数、测试集和评分规则。未改变的变量写得越清楚,实验结论越容易迁移到下一次比较。

训练阶段的最后核对

在模型卡上看到“预训练”“指令微调”或“对齐”时,先把它们写成阶段记录,再问每个阶段是否有对应的样本、目标和评估。若没有来源或实验,保留“发布方声明”标签;若只有少量样例,保留“有限验证”标签。阶段名称帮助你提出正确问题,但不会自动证明效果。

一个可靠的训练说明还要交代未覆盖的输入、已知退化和回滚版本。这样读者才能知道新能力的范围,也知道出现问题时应回到哪个阶段检查。能力来源越清楚,后续的系统设计越不容易把责任推给一个抽象的“模型”。

06 · USE & SYSTEM LEVELS

按用途与层级分类:通用模型、行业模型和应用系统

同一个模型可以在论文里被称为基础模型,在平台里被称为通用模型,在公司项目里又只是某个问答系统的一部分。若不区分层级,就会把模型能力、行业数据和产品流程混为一谈。本节用 L0、L1、L2 作为便于学习的路线记号:L0 是跨任务的通用底座,L1 是面向行业或领域的适配,L2 是围绕具体任务和业务流程的系统。它们不是官方唯一标准,而是帮助我们安排学习和责任的工具。

分层区分通用底座、行业适配、任务模型和最终应用系统。
匹配根据任务目标选择生成、理解、向量、视觉或工具调用能力。
落地知道模型本身、检索器、工具、权限和业务规则各自负责什么。

0.6.1 L0:通用基础模型

L0 代表在广泛数据上预训练、可以迁移到多种任务的基础模型。语言模型可能覆盖多个主题和写作形式,视觉模型可能学习通用图像表示,多模态模型可能对齐图像与文字。L0 的价值在于复用:下游团队不必从零训练全部参数,而是通过提示、微调、适配器、检索或工具把底座变成自己的系统。

通用不等于没有边界。L0 可能对低资源语言、内部术语、最新信息和严格格式不够可靠;它的训练数据和安全策略也可能与某个行业冲突。使用通用模型时,要把“能做一个演示”与“能承担一个业务决策”分开,逐步增加领域数据、评估和人工复核。

学习 L0 的重点是理解共同机制:表示、注意力、预训练、推理和规模。第 7~9 章会沿着语言主线深入,帮助你知道通用语言模型为何能处理 Token、上下文和生成,而不是把它当作一台会回答问题的魔法机器。

0.6.2 L1:行业和领域适配

L1 面向相对明确的领域,例如医疗、金融、法律、教育、制造、科研或客服。它可能在通用底座上继续预训练领域语料,使用监督样本做指令微调,接入领域知识库,或加入术语、格式和工作流约束。L1 的“专业”来自数据、目标和流程,不只来自模型更大的参数量。

领域适配的第一步通常不是训练,而是定义任务和风险。医疗问答需要区分健康教育、辅助检索和诊断建议;金融系统需要区分报告摘要、风险提示和交易动作;法律系统需要保留法条版本、管辖范围和引用。若目标不清,模型训练越多,错误越难发现。

领域模型还可能继承通用底座的偏差和错误。加一批专业文本不等于覆盖所有临床、法规或实验条件;术语流畅不等于结论有依据。L1 的评估要包含领域专家、时间切分、来源引用、拒答边界和真实工作流,而不是只测通用问答分数。

0.6.3 L2:任务模型与应用系统

L2 是最接近业务目标的一层:合同条款抽取、客户工单分类、会议纪要、商品检索、医学文献问答、代码审查或实验报告生成。它可能只需要一个小分类器,也可能组合多个模型、向量检索、规则引擎和人工审核。L2 的成功标准必须写成业务可验证的结果,如字段准确率、召回率、响应时间、引用覆盖和人工修改量。

应用系统还要处理状态和权限。一个模型可能建议“删除记录”,但真正的删除动作应由权限系统和确定性 API 执行;一个检索系统可能找到了合同条款,但需要保留文档版本和页码;一个客服助手可以拟写回复,但敏感退款仍需人工确认。模型输出是建议还是动作,决定了系统的安全等级。

把 L0、L1、L2 分开,有助于定位问题。通用模型知识不足,可能需要检索或领域适配;领域模型格式不稳定,可能需要样本和约束解码;业务系统延迟过高,可能要改缓存、批处理或模型尺寸;权限错误则不应靠提示词解决。

L0 · 通用广泛数据、可迁移底座
L1 · 行业术语、规范、领域数据
L2 · 任务具体输入、输出和流程
系统 · 交付检索、工具、权限、监控

0.6.4 按核心功能分类:理解、生成、表示和动作

理解型任务把输入映射为标签、结构或判断,例如分类、抽取、匹配和排序;生成型任务产生文本、图像、音频、代码或结构化结果;表示型任务把对象转成向量,用于相似度、聚类和检索;动作型任务让模型选择工具或填写参数,需要额外权限和验证。一个产品可以同时包含四种功能,但每种功能的评估和风险不同。

“推理能力”也不应成为独立的神秘类别。它可能来自更强的预训练表示、指令微调、思维链式提示、工具调用、搜索和验证器的组合。判断一个系统是否真的会推理,应该设计可重复的任务和过程证据,而不是只看一条长答案听起来是否连贯。

Embedding 模型常被忽略,因为它不直接生成自然语言。它把文本、图片或其他对象映射到向量空间,让系统可以按语义相似度检索。向量质量、切分策略、召回和重排共同决定结果。第 10 章会从表示、向量库和 RAG 角度展开,届时你会看到“搜索”本身也是一条模型系统链路。

0.6.5 按部署方式分类:云端、私有化、边缘和离线

云端 API 适合快速使用和弹性并发,私有化部署适合数据边界和固定版本,边缘或端侧模型适合低延迟、离线和设备隐私,混合部署则把敏感处理留在本地、把复杂任务交给云端。部署类别不只是基础设施选择,还会改变模型尺寸、量化、更新和监控方案。

边缘设备常受内存、电量、散热和网络限制,可能需要小型模型、蒸馏、量化和分块推理;云端可以使用更大模型,却要处理成本、并发、数据传输和供应商锁定;私有化需要团队维护驱动、框架、漏洞和回滚。比较部署方式时,至少写清数据是否出域、可接受延迟、并发峰值、更新窗口和故障时的降级策略。

0.6.6 用任务合同描述系统,而不是用“智能”描述系统

任务合同是输入、输出、质量和失败处理的明确约定。例如“读取一份 UTF-8 文档,提取合同编号、有效期和三类风险;每个字段附原文页码;无法确定时输出 null;响应不超过 5 秒;高风险条款进入人工队列”。这比“做一个智能合同助手”更容易选择模型,也更容易验收。

合同还要写出非目标:不自动修改合同、不替代律师意见、不处理未授权文档、不从没有来源的文本推断事实。非目标不是保守,而是给系统划边界。它能帮助你决定哪些请求应该拒答、降级或交给人工,也能避免模型在看似合理的提示下执行越权动作。

表 6.1 · 层级、责任与评估重点
层级主要资产典型问题评估重点
L0 通用底座预训练参数和通用表示知识覆盖、通用能力、偏差跨任务基准、鲁棒性和安全
L1 行业适配领域数据、术语和规范数据代表性、版本和专家边界领域准确率、来源和拒答
L2 任务模型任务模板、微调和输出契约格式、边界输入和业务误差字段级指标、人工修改量
应用系统检索、工具、权限和状态链路错误、越权、延迟和回滚端到端成功率、审计和监控

0.6.7 一个简单的模型选择决策树

选择顺序可以从数据和风险开始,而不是从排行榜开始。先判断输入模态和输出形式,再判断是否需要最新知识、向量检索或工具动作;接着确认数据边界、延迟和预算;最后在可用的模型中比较效果。对于高风险任务,人工审核和确定性规则应在模型选择之前写入方案。

PYTHON · choose_path.py
def choose_path(task):
    if task["needs_action"]:
        return "模型 + 工具协议 + 权限与人工确认"
    if task["needs_latest_knowledge"]:
        return "生成模型 + Embedding + RAG"
    if task["output"] == "vector":
        return "Embedding 模型 + 检索评估"
    if task["input"] in {"image", "image+text", "audio", "video"}:
        return "视觉/音频/视频或多模态模型"
    if task["output"] == "label":
        return "分类或抽取模型"
    return "文本生成模型或序列到序列模型"

task = {
    "input": "text",
    "output": "answer",
    "needs_action": False,
    "needs_latest_knowledge": True,
}
print(choose_path(task))

这个决策树只负责确定路线,不负责替你选择具体厂商或版本。真实项目还要加入隐私、许可、评估、成本、延迟和可维护性字段。它的价值在于让选择从“我听说这个模型很强”变成“这个任务需要哪些能力和外部组件”。

0.6.8 本节练习:从一个模糊需求写成四层系统

CHECKPOINT 0.6.6把“做一个 AI 助手”拆开

任选一个场景,如课程资料问答、实验记录整理或商品搜索。分别写 L0、L1、L2 和系统层:通用底座是什么能力,领域数据怎样进入,任务输出契约是什么,检索/工具/权限/人工审核如何连接。最后列出一个“不应该交给模型自动完成”的动作。

以课程资料问答为例:L0 提供语言理解和生成;L1 可以加入课程术语和常见问法;L2 规定答案必须引用章节和页码,找不到依据时说“不确定”;系统层负责文档切分、向量检索、版本、访问权限和日志。自动修改成绩或提交作业就不应只交给模型。

从“模型选型”到“系统责任表”

真正的项目通常不是一个模型解决全部问题,而是一组组件共同完成任务。可以建立责任表:数据接入负责格式和权限,预处理负责清洗和切分,Embedding 负责表示,检索器负责召回,生成模型负责组织答案,工具负责确定性计算,规则负责硬约束,人工负责高风险决策,监控负责发现漂移。每一行都写输入、输出、指标和失败时的接管人。

责任表能防止两种极端。第一种是把所有问题都交给模型,连权限和算术也依赖生成;第二种是为了追求确定性,把所有内容都写成僵硬规则,无法处理自然语言变化。合理系统会把概率模型放在擅长理解和生成的环节,把确定性代码放在需要精确、可审计和可回滚的环节。

行业模型的“行业”也有不同深度。浅层可能只是系统提示和术语表,中层是检索和模板,深层才是领域继续预训练或监督微调。三者都可以改善体验,但成本、数据要求和风险不同。记录模型在哪一层适配,才能避免把“接入一套行业知识库”宣传成“重新训练了行业大模型”。

任务层级还影响数据治理。L0 训练数据可能很广泛,通常由发布方负责;L1 领域数据需要组织授权、版本和脱敏;L2 用户输入和业务记录可能包含个人信息,必须限制保存和访问;系统日志还可能复制模型输入输出。模型选择和数据治理应该一起做,而不是上线后再补隐私说明。

评估也要按层级拆开。L0 可以看通用语言或视觉基准,L1 看领域术语、事实和专家判断,L2 看字段级准确率、人工修改量和业务成功率,系统看端到端延迟、权限、检索覆盖和回滚。某层分数上升,不代表整个系统成功;一条错误的检索结果可能让一个很强的生成模型给出错误答案。

当系统需要动作时,建议采用“建议—验证—执行”三步。模型先生成结构化建议,验证器检查参数、范围和权限,确定性工具执行并返回结果。高风险动作增加人工确认,所有步骤写入审计日志。这样即使模型判断错,也有机会在执行前拦截;不要让自然语言直接变成不可逆操作。

表 6.2 · 系统组件的职责边界
组件输入/输出适合承担不应独自承担
生成模型上下文→文本/结构理解、改写、候选方案最终事实证明和高风险执行
Embedding对象→向量相似度、召回和聚类直接生成有依据的答案
检索器查询→文档片段提供来源和最新资料替生成模型判断全部语义
规则/验证器结构→通过/拒绝范围、格式、权限和硬约束替代开放式理解
工具/API参数→确定结果计算、查询和执行动作接受未经验证的自由文本
人工审核证据→最终决策高风险和例外处理替代所有自动化流程

三个需求的分层示范

需求一:给公开文章做摘要。输入是文本,输出是短文本,资料不需要实时更新,风险较低。可以先用通用生成模型建立基线,再用固定提示和长度规则评估;不一定需要行业微调,也不一定需要 Agent。重点是摘要是否覆盖要点、是否凭空增加事实、延迟和成本是否可接受。

需求二:回答带版本的课程制度。输入是问题,输出必须包含原文引用和版本。通用模型只负责理解和组织,检索系统负责找文档,任务层规定引用字段和“找不到就说不确定”,系统层负责权限、版本和日志。若制度变化频繁,优先更新知识库而不是反复微调模型。

需求三:根据库存自动下单。输入是自然语言或表格,输出是结构化订单建议,真正执行由业务 API 完成。模型可以解析意图和补齐候选参数,但规则必须检查库存、金额、权限和重复提交;高风险操作需要人工确认。这里系统层的安全和可回滚,比底座模型多几个百分点的开放式能力更重要。

这三个例子使用的模型可能相同,但系统层级和责任完全不同。一个模型在需求一中可以直接生成文本,在需求二中必须接入检索和引用,在需求三中只能提供经过验证的建议。不要因为“模型能回答”就跳过任务合同和权限设计。

层级也决定迭代路线。先做 L2 的规则和数据质量,再确定 L0 的能力是否不足;如果检索召回错误,换更大的生成模型往往没有帮助;如果输出格式不稳定,先改善样本、模板和验证器;如果延迟过高,再比较更小模型、缓存、批处理和本地部署。按故障层级迭代,成本更可控。

对于行业和科学任务,专家参与不是最后的装饰。专家可以帮助定义标签、边界、重要错误和可接受证据;他们还要参与抽样复核和上线后的漂移监控。模型系统的“专业”来自数据、流程和责任共同构成的闭环,而不是一个行业 Logo。

表 6.3 · 需求分层示范
需求L0/L1 能力L2 输出契约系统硬约束
公开文章摘要通用文本理解与生成要点、长度、无新增事实成本、延迟和版权边界
课程制度问答语言理解,必要时领域术语答案、引用、版本、不确定文档权限、检索、审计
库存下单建议意图解析和参数补全结构化订单与缺失字段权限、库存、金额、人工确认
科学假设生成领域表示和候选生成假设、依据、不确定度实验验证、专家审核、可追溯

本节的结果是学会按层级思考:通用底座提供可迁移能力,行业适配提供语境,任务模型提供格式和目标,应用系统提供数据、工具和责任边界。下一节会把这种分层落实为“如何读模型说明、如何比较证据、如何做出可复现选择”。

当一个模型被称为“行业大模型”或“智能 Agent”时,先问它处在哪一层。它是新训练的底座、领域适配器、任务微调模型,还是把现有模型接入检索和工具的系统?层级不同,成本、评估和责任完全不同。

分层之后还要补上 SLO、权限和接管路径

把需求写成 L0、L1、L2 只是第一步,真正上线还需要一份服务目标(SLO)。例如课程问答可以要求“95% 的请求在 4 秒内返回,答案必须有章节引用,检索不到依据时明确说不确定”;库存建议可以要求“所有金额和库存由确定性接口校验,模型不得直接下单,异常请求在 30 秒内进入人工队列”。SLO 把抽象的智能变成可监控的承诺。

权限应沿着数据、模型和动作三条线分别设计。数据权限决定模型能读哪些文档,模型权限决定谁能调用哪一个版本,动作权限决定输出能否触发查询、写入或付款。一个用户有权阅读课程资料,不代表他有权访问教师备注;一个模型能生成订单 JSON,不代表它有权调用下单 API。把三种权限混在一个登录状态里,越权时很难定位。

接管路径要在正常流程中就存在,而不是故障后临时想办法。系统可以设置三种出口:低风险且格式完整时自动完成;信息不足、置信度低或检索冲突时请求补充;涉及敏感数据、高金额或不可逆动作时转人工。每个出口都应有明确条件、提示语、超时处理和日志字段,避免模型用一句“我不确定”把责任推回用户。

层级评估也要分开报。模型级报告回答“在固定输入上输出质量如何”,检索级报告回答“正确资料是否被召回”,工具级报告回答“参数和动作是否正确”,系统级报告回答“用户任务是否完成、成本和延迟是否可接受”。如果只报告生成模型的 BLEU、ROUGE 或人工偏好分数,就无法解释端到端失败。

上线前要定义降级方案。云端模型不可用时,是否切换到本地小模型、规则模板或只返回原文检索结果?Embedding 服务故障时,是否保留最近一次索引?工具超时或返回冲突时,是否停止动作而展示待处理状态?降级不一定保留全部智能,但应保留安全、可解释和可恢复的最小功能。

系统还会遇到版本漂移。行业规则、课程资料、库存和价格会变化,模型服务也可能更新。为每次回答记录模型版本、提示模板版本、检索索引版本、文档时间和工具结果,才能在用户反馈错误时重放请求。版本不是为了增加表格,而是为了回答“当时系统究竟看到了什么”。

对行业和科学任务,人工工作流是系统的一部分。专家不只是最后签字,还可以参与样本定义、边界标注、错误分级、阈值设定和上线后抽检。把专家修改内容回流为新的评估样例,比单纯追求更大模型更容易形成持续改进闭环。

表 6.4 · 四层系统的验收问题
层级验收问题可量化指标失败时的接管
模型在固定输入上是否理解并生成目标内容?准确率、覆盖率、格式通过率换模型、改提示或补样本
知识/检索是否召回正确、最新、可引用的资料?召回率、引用命中、时效返回原文或请求人工检索
工具/规则参数、权限和确定性结果是否正确?参数通过率、拒绝率、回滚率阻断动作并进入人工队列
应用用户目标是否完成且成本可接受?端到端成功率、延迟、修改量降级、重试或人工接管

这样一来,所谓“行业大模型”就能被拆成可学习、可测试和可负责的组件。你既不会低估通用底座的价值,也不会把行业数据、检索和人工流程的贡献全部算到模型参数头上。下一节的模型选择,就会把这些约束变成一张可比较的证据表。

从一个真实需求开始画四层架构

假设需求是“让学生查询课程资料”。L0 可以提供语言理解和生成,L1 可以通过课程术语和资料建立领域语境,L2 规定问题、答案、引用和不确定字段,系统层负责文档导入、切分、Embedding、检索、权限、日志和人工反馈。这样画出来后,任何一次错误都能对应到某个组件,而不是笼统地说“模型不够聪明”。

如果学生问“第三章的练习二答案是什么”,系统首先要判断是否有权访问答案,再按章节和版本检索,生成时必须引用来源;如果学生问“这条规则现在还有效吗”,系统要优先查最新版本,不能只凭模型记忆;如果学生要求自动提交作业,系统要把提交动作与生成答案分开,并要求明确确认。一个通用模型可以参与三种请求,但承担的责任不同。

再看“从实验日志生成报告”。原始日志可能是文本、表格和图片,L0 负责语言和图表理解,L1 负责实验术语和单位,L2 规定报告字段、计算公式和不确定度,系统层保存原始文件、运行代码、版本和审核记录。模型可以提出异常假设,却不能把未经验证的因果结论直接写成最终报告。

“客户工单自动分派”则可能不需要大模型。若标签固定、样本充足、延迟要求严格,一个分类模型或规则系统可能更合适;大模型可以处理少量新类别和解释,但最终队列、优先级和通知由确定性服务执行。按任务拆开后,你会发现“大模型”不是所有层级的默认答案。

分层还可以指导预算。模型调用费、向量索引存储、文档解析、工具 API、日志存储和人工审核都是不同成本。先测每层的请求量和失败率,再决定是否缓存、批处理、蒸馏、量化或更换部署方式。只比较生成模型的单价,往往会漏掉检索和人工环节的主要支出。

分层也可以指导隐私。原始文档可能只能在内网处理,脱敏后的片段可以进入检索库,匿名统计可以用于评估,但原始用户问题和模型输出未必可以长期保存。为每层写数据保留时间、访问角色和删除方式,才能回答用户“我的内容去哪了”。

最小可行系统应该有“停止按钮”。当检索无结果、工具返回冲突、模型输出不符合结构、权限判断不确定或成本超过预算时,系统可以暂停自动化,展示可解释的状态并转人工。比起让模型在每个异常上继续生成一段听起来完整的话,明确停止通常更安全。

当你向别人介绍一个大模型产品时,可以用五句话:它处理什么输入;输出什么结果;底座与行业适配在哪里;外部资料和工具怎样进入;失败、权限和人工接管怎样安排。若五句话说不完整,说明产品仍停留在品牌或宣传层面,还没有形成可学习的系统定义。

本章后面的比较矩阵会继续使用这套方法。先按硬约束排除不可用方案,再比较模型质量;先确定系统责任,再讨论参数规模;先确认来源和许可,再决定是否把数据接入。按层级思考,能让学习路线和工程决策保持一致。

层级判断的反例练习

如果一个平台提供“法律问答”,先不要直接把它叫作法律大模型。它可能只是通用模型加法律文档检索,也可能包含领域微调、引用模板、权限和人工审核。你要分别问:法律知识在哪里,文档版本如何更新,答案怎样引用,越权问题怎样处理,最终责任由谁承担。

如果一个设备提供“端侧多模态 AI”,也要拆开看。图片可能在设备上预处理,复杂推理可能发送到云端;文本模型和视觉编码器可能由不同供应商提供;离线时可能只保留分类或 OCR。广告中的一个标签,不能替代数据流和降级路径。

如果一个科研工具声称“自动发现规律”,应区分候选生成、统计检验、实验执行和科学结论。模型可以生成假设或排序实验,但数据质量、测量误差、控制变量和专家复核仍然属于系统和科学流程。把候选当结论,是层级混淆带来的高风险错误。

做层级练习时,可以刻意把同一个底座放进三个场景:公开文章摘要、带版本的制度问答和库存下单建议。比较它们需要的检索、工具、权限、人工审核和回滚,写出哪些职责不能由模型独自承担。这样你会看到“同一模型,不同系统”的真正含义。

层级也影响学习顺序。先学 L0 的表示和生成,再学 L1 的领域数据与检索,随后学 L2 的任务契约和评估,最后学系统的权限、监控和部署。若一开始只看应用演示,容易把系统编排误认为模型本身;若只研究底座参数,又容易忽略真实任务的边界。

当一个产品把所有能力都写在“模型”一栏时,你可以要求它补一张组件和责任表。能清楚回答的产品,通常更容易评估和维护;只能重复“行业领先”“全能 Agent”的产品,需要更多证据。分类不是为了贴标签,而是为了知道下一步该查哪里。

层级拆分后的最小交付物

通用底座层的交付物是模型身份、接口和能力边界;行业适配层的交付物是领域数据说明、版本和专家规则;任务层的交付物是输入输出契约、样例和评分脚本;系统层的交付物是检索索引、工具协议、权限、日志、监控和回滚。每一层都有自己的文档,别人才能在不猜测的情况下接手。

交付物也应对应故障。模型版本变化,检查模型回归;行业文档更新,重建索引并检查引用;任务字段变化,更新样例和解析器;工具接口变化,跑权限和参数测试;系统延迟升高,查看缓存、并发和外部服务。把变化和检查点绑定,比上线后凭感觉排查更快。

一个成熟的系统会把“模型可替换”作为设计目标。业务代码只依赖统一接口,模型适配器负责不同 SDK 或权重格式,评估脚本使用同一套测试集,报告记录版本和证据。这样你可以比较不同模型,也可以在某个供应商不可用时安全降级,而不必重写全部业务。

当你还在学习时,不必一次实现完整平台。先用文件和纯 Python 做四层的最小模拟:一份模型卡、一个领域资料列表、一个任务 JSON 和一个验证报告。等基础概念稳定,再把其中一层替换成真正的模型、Embedding、检索或工具。小闭环能让每一步的责任都看得见。

层级判断的完成句式

看到任何模型或产品,都可以用一句完整的话复述:“它在 ___ 层,处理 ___ 模态,输入是 ___,输出是 ___;能力主要来自 ___,外部系统还提供 ___;它适合 ___,不适合 ___;上线前必须验证 ___,失败时由 ___ 接管。”这句式会自动暴露遗漏,也能直接变成模型分类卡的字段。

如果一句话里只有品牌、参数和“智能”,说明你还没有完成分层。补上数据、责任、证据和停止条件,才算从产品宣传进入系统理解。

一条可复用的分层检查

每次新增组件,都问它属于模型、知识、工具、规则还是人工流程,并写出输入、输出和责任。若一个组件无法回答这三件事,就先不要把它放进生产链路。

分层结果如何进入项目文档

把四层架构写进项目 README:模型层说明检查点和接口,知识层说明资料来源和更新,任务层说明输入输出与评分,系统层说明权限、日志、降级和回滚。这样新成员可以沿着同一顺序理解系统,也能知道某个变更会影响哪一层。

如果一个问题无法归属于任何一层,先记录为未知并补充任务合同,不要用“模型问题”笼统带过。清楚的归属是后续排错、评估和交付的前提。

07 · MODEL SELECTION

怎么读模型说明并做出可靠选择

选择模型不是从“哪个排行榜第一”开始,而是从任务合同、数据边界和失败成本开始。一个理想模型如果许可证不允许使用、上下文装不下输入、延迟超过业务要求,或者在你的语言和格式上不稳定,就不是合适的选择。本节给出一套阅读顺序:先看模型卡和接口,再看评估设置,然后用自己的小测试验证效果、成本、稳定性和安全边界。

阅读能从模型卡、技术报告和接口文档提取可比较的事实。
验证能设计最小测试集,区分官方基准、自己的任务和未知风险。
决策用加权矩阵记录效果、成本、许可、隐私和运维取舍。

0.7.1 先写任务合同,再打开模型列表

任务合同至少写六项:输入模态与格式、输出结构、质量指标、允许延迟、数据是否可以出域、失败时谁接管。比如“把课程 PDF 的每个小节提取为 JSON,并保留页码;字段准确率至少 95%;单文件 20 秒内;原始文档不能离开本机;无法确定时返回空值并记录日志”。有了合同,模型比较才有尺度。

再补上规模和流量:每天多少请求,峰值并发是多少,输入平均和最坏长度,输出最长多少,是否需要流式响应,是否允许缓存,是否要固定版本。小批量手工测试和生产流量的成本、延迟可能完全不同。不要用一次成功的演示代表整个运行条件。

最后写非目标和风险:模型不做诊断、不自动发邮件、不修改原始数据、不替代人工审批。非目标会影响模型选择和系统架构,也会让评估人员知道哪些“失败”其实是正确拒绝。

0.7.2 读模型卡的固定顺序

第一遍先找身份:发布方、家族、版本、检查点、许可、语言和模态。第二遍找使用方式:依赖、分词器、提示模板、最大输入输出、量化和硬件。第三遍找训练信息:数据范围、时间、过滤、预训练和后训练阶段。第四遍找评估:数据集、指标、基线、提示、解码、硬件和限制。第五遍找安全与已知失败:偏差、拒答、隐私、版权和不适用场景。

模型卡中的“适用用途”与“限制”同样重要。Hugging Face 的官方文档把模型说明、预期用途、潜在限制、训练参数、数据集和评估结果视为模型卡应包含的核心内容。你可以把它当作阅读模板,但仍要检查具体仓库是否真的提供这些字段。缺失信息要标为未知,而不是用宣传语填空。

如果文档中出现“支持超长上下文”“达到人类水平”“适合生产”等句子,把它们改写成可测试的问题:长度上限按什么单位?在什么数据和提示上?生产是否包含安全、监控、并发和回滚?一句宣传语只有转成实验条件后,才可能进入比较表。

0.7.3 评估指标:分数必须带着实验协议一起读

准确率、F1、BLEU、ROUGE、召回率、困惑度、相似度、延迟和吞吐各自回答不同问题。开放式生成还可能需要人工偏好、事实一致性、引用覆盖、格式通过率和拒答准确率。没有“一个总分”能同时代表所有任务。看到一个数字时,先记下数据集、样本数、提示模板、解码参数、评判者和版本。

基准分数的可比性也有边界。不同实现可能使用不同系统提示、少样本示例、工具、检索或后处理;数据集可能已进入训练语料;结果可能来自不同硬件和量化。若条件不一致,排名只能作为线索。自己的小测试不需要很大,但必须固定输入、评分规则和版本,才能比较变化。

评估要覆盖正常、边界和对抗样本。正常样本回答“通常会不会”;边界样本回答“什么时候开始失效”;对抗样本回答“遇到误导和冲突时如何保护系统”。对高风险任务,再加入人工复核、来源核验和回滚演练。一个模型拒绝危险请求,可能是能力边界,也可能是安全策略;两者都要记录。

表 7.1 · 读评估结果时的最小信息
字段必须知道什么缺少时的风险自己的补充测试
任务与数据输入来源、样本数量、切分方式无法判断是否代表目标任务准备一小组真实但脱敏样本
指标定义计算公式、宏/微平均、容错规则同名分数不可比较用固定脚本重算关键指标
提示与解码模板、温度、采样、停止条件差异来自设置而非模型锁定协议并重复运行
版本与精度检查点、量化、框架和硬件复现结果漂移保存版本和运行环境
失败与限制拒答、偏差、长度和已知问题上线后才发现高风险盲区设计边界和人工接管测试

0.7.4 效果之外的五个工程维度

成本:不仅是每次 API 调用价格,还包括输入输出 Token、检索、存储、带宽、GPU 空转和人工审核。延迟:区分首 Token 延迟、完整响应时间和并发下的尾延迟。容量:记录上下文、批量、图片分辨率、音频时长和缓存。隐私:确认数据是否出域、是否保留、是否用于训练,以及日志中是否脱敏。维护:考虑版本升级、漏洞、回滚、监控、依赖和人员能力。

这些维度常常互相牵制。更大模型可能提高复杂任务质量,却增加延迟和成本;本地量化降低显存,却可能改变格式稳定性;更长上下文减少切分工作,却增加缓存和“信息埋藏”问题;托管服务减少运维,却增加供应商和网络依赖。比较矩阵的价值,就是把取舍显式写出来。

0.7.5 小测试集:少而有代表性

建立测试集时,不要只收集你希望模型成功的样例。至少包含:典型输入、最短和最长输入、空值或缺失字段、拼写和格式变化、混合语言、相似但不同的对象、明确不能回答的问题。每个样例附上期望输出、评分方式和失败说明。十几个精心设计的样例,往往比一百个重复问题更能暴露边界。

测试集中的真实资料要脱敏并记录来源。不要把客户信息、私人对话或受版权限制的整本书直接上传到第三方服务。学习阶段可以用自写文本和公开许可数据;需要模拟敏感场景时,用合成内容替代真实身份。测试数据本身也要纳入版本和访问控制。

0.7.6 加权比较矩阵:让“适合”有理由

可以给每个候选模型在效果、成本、延迟、隐私、许可、运维和风险适配上打分,再乘以任务权重。分数不是客观真理,而是把团队的优先级写出来。高风险任务可能把隐私和可审计性权重设得很高;探索性写作可以更看重效果和速度。每次改权重,都要保留原因。

PYTHON · weighted_choice.py
weights = {
    "quality": 0.35,
    "cost": 0.15,
    "latency": 0.15,
    "privacy": 0.20,
    "license": 0.15,
}

candidates = {
    "模型 A": {"quality": 4, "cost": 3, "latency": 4, "privacy": 2, "license": 4},
    "模型 B": {"quality": 3, "cost": 5, "latency": 3, "privacy": 5, "license": 3},
}

def score(values):
    return sum(values[key] * weight for key, weight in weights.items())

ranking = sorted(
    ((name, score(values)) for name, values in candidates.items()),
    key=lambda item: (-item[1], item[0]),
)
for name, total in ranking:
    print(f"{name}: {total:.2f}")

这段代码有两个值得保留的习惯:权重单独命名,排序用负分和名称做稳定的二级键。不要把“总分最高”写成“绝对最好”,因为分数来自你的任务假设,而且某些维度是硬门槛,不应被其他高分抵消。例如许可证不允许使用时,可以先淘汰,再计算其余分数。

0.7.7 硬门槛与软评分要分开

硬门槛是不能妥协的条件:数据不能出域、必须支持中文、必须有结构化输出、必须在某种硬件上运行、许可证必须允许目标使用。软评分是可以权衡的差异:质量高一点、成本低一点、响应快一点。先过滤硬门槛,再做加权排序,能避免一个模型用高质量分数“抵消”严重的合规问题。

硬门槛也需要证据。例如“支持中文”要有文档或样例,“可离线”要有权重和运行依赖,“商用许可”要有条款,“可处理长文档”要有长度测试。没有证据的门槛只能标为未确认,不能直接打勾。

0.7.8 把版本和实验条件绑定

每次评估记录模型版本、分词器、系统提示、解码参数、输入数据版本、代码提交、硬件、时间和随机种子。API 还要记录服务端返回的模型标识和请求 ID(若有)。本地模型要记录量化格式、推理框架和线程数。这样出现结果变化时,才能判断是模型更新、数据变化、代码改动还是硬件差异。

把测试结果记录成可复查的实验单

一条测试记录不应只有“通过”或“失败”。建议同时保存样例 ID、输入摘要、期望输出、实际输出、评分维度、证据位置、运行耗时和失败标签。涉及隐私的原文可以用脱敏后的引用或哈希代替,但要保证复核者能找到同一份测试材料。这样,后来的人看到一个分数时,能沿着“样例 → 输出 → 评分 → 结论”反向检查,而不是只能相信作者的截图。

两个候选模型出现接近分数时,优先比较最影响任务的失败类型,而不是继续追逐小数点后的差异。例如一个模型平均分略高,却经常漏掉引用;另一个模型分数略低,但能稳定返回可验证的字段。对课程资料问答、财务整理等任务,后者可能更适合上线。把“为什么这个失败更严重”写进实验单,权重才真正和业务风险连接起来。

0.7.9 本节练习:做出一张可解释的选择表

CHECKPOINT 0.7.7不要只写“我选 A”

为一个具体任务建立模型比较表,至少比较两个候选。先写三个硬门槛,再写五个软指标和权重;为每个分数附证据或测试编号;单独记录三个未知风险。最后写出选择、放弃和复评条件:什么新证据出现时,你会改选另一个模型?

例如课程资料问答的硬门槛可以是“支持中文、允许文档不能出域、能输出引用字段”;软指标可包括答案正确率、引用覆盖、延迟、显存和维护成本。若某候选许可证未确认,不要用高质量分把它排在第一;先标记为不能上线,等待条款核对。

一次评估必须写清“谁、对什么、怎么测”

模型评估常见的三个缺口是对象不清、任务不清和协议不清。对象不清指没有说明具体检查点、分词器、量化或服务版本;任务不清指只写“综合能力”,没有说明输入、输出和失败代价;协议不清指没有固定提示、解码、评分和人工判定。任何一个缺口都可能让两个结果看起来可比,实际上比较的是不同东西。

评估表可以增加“证据等级”:A 级是官方原始结果或可复现脚本,B 级是你在固定数据上的重复测试,C 级是少量探索样例,D 级是二手转述或个人印象。D 级信息可以帮助发现候选,却不应支持高风险上线。随着项目推进,把关键判断从 C/D 级提升到 A/B 级。

人工评分也要写规则。开放式答案可以按事实正确、来源完整、格式合格、表达清楚和安全边界分别打分;两个评审者要看到同一份指南和样例。若使用另一个模型作为评判者,记录评判提示、版本和可能的偏差,不要把自动评分当成客观裁判。

负面结果同样重要。记录模型拒答、超时、截断、格式错误、引用缺失、重复和越权建议的比例;不要只统计成功样例。对生产系统,加入“可发现性”:错误能否被规则、引用检查或人工审核及时发现?无法发现的错误比明显报错更危险。

评估还要有停止规则。你不需要无限扩大测试集,先定义“达到什么结果可以进入下一步”“什么失败必须回到数据或提示修复”“什么风险直接淘汰候选”。停止规则可以防止在一个看似微小的分数差异上反复调参,而忘记任务和成本。

选择完成后保留一个基线。新版本、量化、提示改动和检索策略都与基线比较,至少保存原始输入、输出、指标和环境。没有基线,就无法知道“优化”是真的改善,还是换了数据和评分方式。

表 7.2 · 评估证据等级与决策使用
等级证据可以支持还不能支持
A官方协议、原始脚本或独立复现建立事实基线直接代表你的业务全部风险
B固定版本上的任务测试比较候选和回归推断未测任务的普遍能力
C少量探索样例发现可能的方向和失败做最终上线承诺
D二手文章、演示和个人印象寻找待查资料替代许可证、评估和安全核对

选择模型时的反直觉问题

“更大是不是一定更好?”不一定。若任务是固定字段抽取,小模型配合规则和验证器可能更稳定;若任务需要复杂跨文档推理,大模型可能更有余量,但也要支付延迟和成本。真正的比较要在同一任务合同、相同错误代价和可接受资源内进行。

“上下文越长是不是越省事?”不一定。把整本资料塞进上下文可能增加成本、延迟和信息埋藏,模型还可能忽略关键段落。合理切分、检索和摘要能减少无关内容,让证据更容易定位。长上下文要用位置、长度和干扰样例测试,而不是只看官方上限。

“自动评判分数高就可以上线?”不一定。自动评判可能偏爱流畅语言,忽略事实、引用、格式或安全;数据集还可能与训练语料重叠。高风险任务需要人工抽检、对抗样例、来源检查和回滚演练。自动评分是加速器,不是责任替代品。

“开源模型一定更可控?”不一定。权重可下载会增加本地控制,但你要负责依赖、漏洞、访问权限、更新和输出监控;API 服务虽然内部不可见,却可能提供成熟的安全和运维能力。可控性要按数据、版本、审计、退出和维护具体衡量。

“同一模型的不同提示只是写法差异?”不一定。系统提示、角色、工具定义、结构化约束和示例会改变输入分布;版本升级也可能改变默认模板。把提示文件纳入版本控制,并把它当作模型调用的一部分评估,才能复现结果。

选择过程可以分为探索、收敛和上线三个阶段。探索阶段允许快速试用和少量样例,目标是发现候选和主要失败;收敛阶段固定版本、数据、提示、指标和权重,目标是比较并淘汰;上线阶段加入安全审核、监控、回滚和责任人,目标是可持续运行。不同阶段的证据标准不同,不要用探索阶段的演示直接跨到生产。

表 7.3 · 探索、收敛和上线的证据门槛
阶段允许的灵活性必须固定的内容退出条件
探索可换模型、提示和样例记录候选、失败和来源形成短名单与风险清单
收敛只改变一个变量版本、数据、协议和指标硬门槛通过,指标达到目标
上线变更需审批和回归监控、日志、权限、回滚风险可发现,责任人明确

这一节的核心是把选择变成证据链:任务合同定义成功,模型卡提供事实,基准说明提供线索,小测试验证你的场景,比较矩阵记录权衡,版本和日志保证复现。下一节会把这套方法做成一个小项目,写出可保存、可读取、可排序的模型分类卡。

以后遇到“推荐一个最强模型”的问题,你可以先问使用场景、数据边界、延迟、预算和许可。如果这些条件还没有写清楚,任何推荐都只能是暂时的候选,而不是最终答案。

从候选列表到最终选择:一套可复用的评估协议

模型选择最好先写协议,再开始跑样例。协议的第一行是任务定义:谁使用系统、输入从哪里来、输出交给谁、错误会造成什么后果;第二行是数据边界:哪些内容允许上传、保存和用于评估,哪些内容必须脱敏或留在本地;第三行是资源约束:响应时间、并发、预算、硬件和可接受的维护工作量。没有这三行,比较很容易被演示效果带偏。

测试集不要只收集“典型问题”。可以按输入来源、长度、语言、格式、主题和风险各取样,再单独加入边界样例。以课程资料问答为例,测试集应同时包含直接事实、跨章节关联、表格内容、图片公式、资料缺失、版本冲突和恶意提示。每个样例写出期望答案、必须引用的证据、允许的近似和不能接受的错误,评分才不会随评审者心情变化。

候选模型应使用同一接口适配层。适配层负责消息格式、图片或文件序列化、超时、重试和错误码,把模型差异转换成统一的输入输出记录;业务评估只读取统一记录,不在每个候选分支里写一套特殊逻辑。这样可以避免某个模型因为专属提示或隐藏后处理而“作弊”,也方便以后加入本地模型或测试替身。

评估时同时保存原始输出和解析后的结果。原始输出用于复盘模型是否添加了多余文字、拒答或引用,解析结果用于统计字段准确率、格式通过率和工具参数。若只保存最终分数,发现异常时无法知道是模型输出错、解析器丢字段,还是评分脚本读取错列。原始记录还要遵守隐私策略,必要时使用脱敏 ID。

质量评分可以拆成多个维度,而不是一个“好/坏”。事实正确性检查答案与来源是否一致,完整性检查是否覆盖任务要求,格式检查字段和类型,引用检查来源是否存在且定位准确,安全检查是否越权或泄露,表达检查可读性和冗余。不同任务的权重不同,但维度名称最好固定,便于跨版本比较。

成本与延迟也要按分位数报告。平均延迟会掩盖偶发超时,至少记录 P50、P95 和超时比例;平均成本会掩盖长文档,最好记录每次输入 Token、输出 Token、检索 Token 和工具调用次数。线上用户感受到的是尾部延迟和失败后的等待,不是实验室里的平均值。

隐私和许可应当是硬门槛。候选模型如果要求数据出域而任务不允许,直接淘汰;如果许可证或数据处理政策没有确认,标记为未知并暂停上线,而不是用质量分数抵消。对于本地模型,也要检查权重来源、依赖、日志和更新责任。选择矩阵的硬门槛列应先于软评分列。

稳定性需要重复运行。对确定性任务可以固定解码参数,对开放式生成可以设置多个种子或重复请求,观察输出变化;对 API 模型还要记录日期、服务端版本和限流情况。一次偶然的好答案不能证明稳定,连续失败也要保留,尤其是格式、引用和工具参数的失败。

人工评审要有抽样策略。可以先自动筛出高分、低分、冲突和异常样例,再让专家重点审查;同时随机抽取一部分普通样例,避免只看极端案例。评审者应知道任务规则,却不必知道候选模型名称,以减少先入为主。分歧样例要保存讨论结果,必要时更新评分指南。

最终选择应写成带条件的决策记录:选择哪个版本、用于哪些输入、不用于哪些场景、依赖哪些外部组件、目前证据等级是什么、上线前还要完成哪些测试、什么时候复评或回滚。把“暂时选择”写清楚,比宣称“最佳模型”更诚实,也更能适应模型和数据的快速变化。

表 7.4 · 模型选择协议的最小字段
字段示例缺失时的风险
任务合同输入、输出、非目标和错误代价无法定义成功与淘汰
固定测试集代表、边界、压力和盲测样例演示代替真实分布
统一协议提示、解码、适配和评分版本候选结果不可比
硬门槛隐私、许可、模态、延迟和格式高分模型带来不可接受风险
原始证据输出、来源、日志、指标和环境错误无法复盘,升级无法回归
退出条件淘汰、回滚、人工接管和复评时间沉没成本驱动继续使用

把这份协议保存成模板,之后比较文本、视觉、Embedding 或多模态模型都可以复用,只需替换模态、指标和风险字段。它会让你在第 10 章学习 RAG、第 11 章学习视觉大模型和第 14 章学习部署评估时,仍然沿用同一套严谨习惯。

选择报告的写法:让别人能复核你的决定

一份选择报告先写结论范围:“在课程资料问答原型中,候选 B 通过了中文、文档不出域和结构化输出三个硬门槛;在固定测试集上引用覆盖和延迟达到目标,暂不代表医疗或生产交易场景。”先限定范围,再给模型名称,读者就不会把局部实验误读成普遍排名。

接着写候选的身份和接口:家族、检查点、版本、模态、上下文、访问方式、量化和分词器。若是 API,记录服务端返回的模型标识和日期;若是本地权重,记录文件哈希、推理框架和硬件。身份字段缺失时,所有后续分数都应标为不可复核。

然后写硬门槛结果。每个门槛都给出通过、失败或未知,以及证据位置。许可证未知不是“低分”,而是暂不允许进入生产;隐私不满足不是可以由质量补偿的缺点;不支持所需模态就不应继续比较细节。硬门槛单独成表,能避免加权平均掩盖不可接受风险。

软指标表要给出定义和样本量。答案质量是怎样评分的,引用命中如何判定,延迟测了多少次,成本包含哪些 Token 和工具调用,人工修改量从哪一批数据统计?数字后面附测试编号或报告链接,别人才能判断差异是否超过噪声。

报告还要列出被淘汰和未选择的候选,并写理由。一个模型可能质量最高但许可证未知,另一个成本最低但格式不稳定,第三个质量略低却能离线运行并且证据充分。记录放弃原因可以避免下次重复同样的试错,也能让团队理解选择不是个人偏好。

最后写复评触发器:模型版本变化、资料库更新、输入分布变化、成本超过阈值、出现新的安全事件或人工修改量上升。触发器出现时重新跑固定测试,而不是凭感觉继续使用。选择报告因此成为一个会更新的文档,而不是一次性的排行榜截图。

对于学习项目,报告可以很短,但字段不能省。哪怕只有两个候选,也要有任务合同、硬门槛、五个软指标、证据链接、失败样例和下一步。小而完整的报告比大而含糊的模型名单更能训练判断能力。

表 7.5 · 选择报告的固定顺序
顺序内容读者要得到的答案
1范围与结论这个结论只适用于什么任务和版本?
2候选身份比较的到底是哪一个检查点和接口?
3硬门槛有没有隐私、许可或模态上的直接淘汰?
4测试协议输入、提示、解码和评分是否一致?
5结果与失败质量、成本、延迟和错误怎样变化?
6复评与退出什么变化会触发重测、回滚或人工接管?

当报告按这个顺序组织,模型选择就从“推荐某个名字”变成了可解释的工程决策。后面的综合实验会把身份、硬门槛、评分和回读全部写入 Python 数据结构,形成一个可以持续维护的最小资料库。

把“推荐”改成可回滚的选择

选择模型不是一次性投票,而是一个带回滚的实验。先指定一个当前基线,所有候选都与基线在同一协议下比较;若新候选只在少数样例上提升,却让成本、延迟或格式退化,就保留基线。基线不是最强模型,而是你已经知道如何运行、评估和退出的方案。

决策表中可以加两列“置信度”和“剩余工作”。高分但样本少的候选,置信度应低;许可证已确认但长文本未测的候选,剩余工作应写清;本地运行稳定但质量略低的候选,可以作为降级路线。这样团队不会把分数误解为完成度。

测试集要防止答案泄漏。若问题来自模型训练过的公开基准,分数可能高于真实新任务;若测试样例过于接近提示模板,格式通过率也会被高估。可以加入自己编写的改写题、时间外样例、实体替换题和反事实题,并保留一小批不公开的盲测数据。

不要忽略用户体验指标。模型质量上升但响应变慢、输出变长、引用位置难找或人工修改量增加,用户可能仍然觉得系统变差。把完成任务所需的总时间、重新提问次数、人工编辑量和失败后恢复时间纳入比较,才能把模型指标连接到真实使用。

对于开放式生成,分数差异可能小于评审噪声。报告中给出样本量、评分者数量、重复运行次数和置信区间或波动范围;如果无法做统计,就明确写“探索性结果”。不要把 0.1 分的差异包装成稳定优势,尤其是在测试集很小的时候。

模型选择还要考虑退出成本。API 迁移可能需要重写提示和限流逻辑,本地模型迁移可能需要重新量化和部署,领域微调可能绑定某个底座版本,检索系统可能绑定某种向量格式。提前保留统一接口、原始数据和评估协议,能降低未来换模型的代价。

当选择理由写完后,让一个没有参与实验的人复核。请他只根据报告回答:为什么选它、它哪里失败、哪项证据仍未知、出现什么情况会回滚。若对方回答不了,说明报告缺少上下文;补齐报告比继续添加一个候选更有价值。

选择结论的三个限制词

用“在……上”限定任务,用“截至……版本”限定时间,用“尚未验证……”限定边界。例如“在固定的课程问答集上,截至 demo-1 版本,候选 B 的引用覆盖较高;尚未验证多轮对话、超长文档和真实用户输入”。限制词让结论不被误读,也为下一次复评留下明确问题。

如果报告无法写出这三个限制词,通常不是模型太复杂,而是任务、版本或测试还没有定义。先补齐证据,再给出推荐。

选择时一定要保留未选择的理由

记录“为什么没有选另一个候选”同样重要。它可能因为许可证未核对、长上下文未测、中文格式不稳、延迟超过硬门槛或维护成本过高。未来条件变化时,这些理由能告诉你是否值得重新测试,而不是从零开始猜。

一份可复核的选择结论,应该同时包含选择、放弃、未知和复评触发器。只留下一个名字和一个总分,别人无法判断你的决策是否仍然适用。

选择完成后的复核问题

请再问一次:如果输入模态变化、资料版本变化、并发量变化或许可证变化,原来的选择还成立吗?如果答案是“不知道”,就在报告里写成复评触发器;如果答案是“不会成立”,提前准备降级或替换方案。能提前说明何时失效,选择才真正可维护。

这一步也能防止把一次测试结果当成永久结论。模型生态、数据分布和任务要求都会变化,选择表应允许更新而不覆盖旧证据。

评估报告还要说明“没有测什么”

除了列出通过的指标,还要列出没有覆盖的语言、输入长度、模态、并发、版本和风险场景。没有测到的内容不能被默认当作稳定能力;在报告中明确空白,能提醒使用者不要越界。

如果两名评审者对答案分歧较大,保留原始样例和讨论结果,并更新评分指南。分歧往往揭示任务合同不够清楚,或者指标无法表达真实目标。修订规则后要重新跑基线,不能只修改最终分数。

最终选择应同时保存候选、淘汰理由、未知项和复评日期。这样当价格、版本、数据政策或任务输入变化时,可以快速决定是否重测,而不是重新从搜索结果开始。

08 · CLASSIFICATION LAB

综合实验:建立自己的模型分类卡与比较矩阵

前面七节给了你分类维度和选择方法,现在把它们做成一个可以运行的学习项目。项目不调用真实模型,也不替你推荐某个厂商;它只负责把模型资料整理成结构化 JSON,检查必填字段,按硬门槛过滤候选,再根据权重生成稳定的比较报告。你可以先用自写的示例记录,之后替换为公开模型卡中的事实。完成后,你会拥有一份可以持续更新、可以复查来源、可以迁移到其他任务的模型知识资产。

输入模型名称、模态、阶段、开放性、用途、证据和任务评分。
处理读取、验证、过滤、排序并计算加权分数,保留未知字段。
输出一份可回读的分类卡和一份带理由的比较报告。

0.8.1 先定义项目的成功标准

项目成功不是“代码运行没有报错”,而是别人拿到文件后能理解记录、重跑脚本并知道结论怎样得到。至少满足五条:第一,所有模型记录都有唯一名称和版本;第二,模态、开放程度、训练阶段和用途可以被程序筛选;第三,未知资料不会被悄悄填成虚构事实;第四,排序规则稳定,分数相同的记录顺序可预测;第五,输出 JSON 能被再次读取,报告能解释每个分数和证据。

再写出非目标:项目不验证许可证的法律含义,不下载模型权重,不调用第三方 API,不把演示分数当成生产结论。把非目标写进 README,可以防止后续不断堆功能,却忘记项目只是一个分类和比较工具。等第 14 章学习部署与评估时,再把真正的运行测试接进来。

0.8.2 设计 JSON 数据结构:每个字段都有责任

一个好的数据结构会让字段职责清楚。建议把身份、模态、开放性、阶段、用途、限制、证据和任务评分分开。modalities 描述输入输出所涉及的模态,access 描述访问方式,openness 描述材料是否可得,stage 描述训练阶段,evidence 描述来源和访问日期,scores 只保存你的任务测试分数。不要用一个 tags 字段承载所有信息,否则后续筛选会失去语义。

未知值应有统一表示。对于尚未找到的材料,可以用 null;对于明确没有的材料,用 false;对于待人工审核的条款,用字符串“待核对”。三种状态不同,验证和报告也应不同。数据结构不应为了“看起来完整”而逼迫你猜答案。

JSON · models.json
{
  "schema_version": 1,
  "updated_at": "2026-08-28",
  "task": "课程资料问答原型",
  "hard_requirements": ["text_input", "citation", "local_or_approved_api"],
  "models": [
    {
      "id": "demo-text-instruct",
      "name": "示例文本指令模型",
      "version": "demo-1",
      "modalities": ["text_input", "text_output"],
      "access": "api",
      "openness": {"weights": false, "code": null, "license": "待核对"},
      "stage": "instruct",
      "uses": ["问答", "摘要"],
      "limits": ["需要外部引用才能回答最新资料"],
      "evidence": [{"kind": "official_doc", "url": "https://example.com", "checked": "2026-08-28"}],
      "scores": {"quality": 3.5, "cost": 4, "latency": 4, "privacy": 2, "license": null}
    }
  ]
}

示例中的域名只是占位符,提交自己的记录时应换成真实的官方文档、模型卡、论文或许可证链接。评分字段允许为 null,表示还没有可靠测试;脚本应该识别它,而不是把空值当成零分。数据文件顶部的 schema_version 用来提醒未来的脚本是否需要迁移。

0.8.3 把读取和保存拆成两个函数

一个函数只做一件事,后续出错才容易定位。load_catalog() 负责打开 JSON 和解析结构,save_catalog() 负责创建目录并以 UTF-8 写入。不要在同一个函数里同时下载模型、清洗资料、计算分数和写报告;职责混在一起,测试会变得困难。即使项目很小,也要从一开始建立输入输出契约。

PYTHON · catalog_io.py
from __future__ import annotations

import json
from pathlib import Path
from typing import Any


def load_catalog(path: str | Path) -> dict[str, Any]:
    source = Path(path)
    with source.open("r", encoding="utf-8") as handle:
        data = json.load(handle)
    if not isinstance(data, dict) or not isinstance(data.get("models"), list):
        raise ValueError("目录必须是包含 models 列表的 JSON 对象")
    return data


def save_catalog(data: dict[str, Any], path: str | Path) -> None:
    target = Path(path)
    target.parent.mkdir(parents=True, exist_ok=True)
    with target.open("w", encoding="utf-8") as handle:
        json.dump(data, handle, ensure_ascii=False, indent=2)
        handle.write("\n")


catalog = load_catalog("models.json")
save_catalog(catalog, "outputs/models-copy.json")
print("模型记录数:", len(catalog["models"]))

这里使用 Path 处理路径,用 encoding="utf-8" 保留中文,用 ensure_ascii=False 让保存后的文件可读。保存到新文件而不是直接覆盖源文件,是学习阶段的安全习惯。确认复制文件可以回读后,再考虑增加更新命令。

0.8.4 验证字段:尽早发现“看似完整”的错误

验证函数应该检查结构和关键值,而不是替你判断模型好不好。结构检查包括:记录是否为字典、id 是否唯一、名称和版本是否非空、模态是否为列表、评分是否在约定范围。事实检查则依赖证据字段:如果写了许可证名称,应该有来源;如果写了某个输入模态,应该有文档或测试编号。验证失败时,错误消息要指出具体模型和字段。

PYTHON · validate_catalog.py
REQUIRED = {"id", "name", "version", "modalities", "access", "stage", "evidence"}
ALLOWED_ACCESS = {"api", "open-weight", "local", "unknown"}


def validate_model(item: dict) -> list[str]:
    errors = []
    missing = REQUIRED - item.keys()
    errors.extend(f"缺少字段 {field}" for field in sorted(missing))
    if item.get("access") not in ALLOWED_ACCESS:
        errors.append("access 不在允许值中")
    if not isinstance(item.get("modalities"), list) or not item["modalities"]:
        errors.append("modalities 必须是非空列表")
    if not isinstance(item.get("evidence"), list) or not item["evidence"]:
        errors.append("至少保留一条证据")
    return errors


def validate_catalog(catalog: dict) -> list[str]:
    errors = []
    seen = set()
    for index, item in enumerate(catalog.get("models", []), start=1):
        if not isinstance(item, dict):
            errors.append(f"第 {index} 条不是对象")
            continue
        model_id = item.get("id")
        if model_id in seen:
            errors.append(f"重复 id:{model_id}")
        seen.add(model_id)
        errors.extend(f"{model_id}: {message}" for message in validate_model(item))
    return errors

验证函数没有把“未知许可证”直接判为结构错误,因为未知是允许存在的状态;但它要求至少有证据,防止一条没有来源的宣传语进入目录。你可以根据任务把硬门槛升级为错误,例如本地部署项目把 access=api 标为不合格,但这属于任务策略,不应写死在通用结构验证中。

0.8.5 分类和筛选:把多个维度组合起来

筛选函数要接收明确参数,如目标模态、访问方式、训练阶段或用途。不要写一个含义模糊的 is_good() 函数,因为“好”在不同任务中不一样。可以先筛选硬门槛,再计算软评分;筛选结果保留原始记录和过滤原因,方便回溯为什么某个候选没有进入排序。

PYTHON · filter_models.py
def matches_requirements(model: dict, requirements: set[str]) -> tuple[bool, list[str]]:
    reasons = []
    modalities = set(model.get("modalities", []))
    if "text_input" in requirements and "text_input" not in modalities:
        reasons.append("不支持文本输入")
    if "citation" in requirements and "citation" not in model.get("uses", []):
        reasons.append("没有记录引用能力")
    if "local_or_approved_api" in requirements:
        if model.get("access") not in {"local", "api"}:
            reasons.append("访问方式未批准")
    return not reasons, reasons


def shortlist(catalog: dict, requirements: set[str]) -> tuple[list[dict], list[dict]]:
    accepted, rejected = [], []
    for model in catalog.get("models", []):
        ok, reasons = matches_requirements(model, requirements)
        if ok:
            accepted.append(model)
        else:
            rejected.append({"id": model.get("id"), "reasons": reasons})
    return accepted, rejected

示例把“引用能力”写成用途记录,实际项目还需要定义引用的具体输出契约和测试。一个模型能生成引用样式,不等于引用真的存在;更可靠的做法是将引用覆盖率作为独立评估指标。这里的筛选只是第一层,不能代替真实测试。

0.8.6 评分与稳定排序:明确未知如何处理

评分函数可以把 null 视为“暂不参与排名”,也可以把它视为不满足上线条件。两种策略都合理,但必须写出来。学习项目中建议采用两阶段:有硬门槛未知的候选先进入“待核对”,不与已确认候选混排;软指标未知则显示“未测”,不悄悄当成最低分。排序时用模型 ID 做二级键,让报告在同分情况下稳定。

PYTHON · rank_models.py
WEIGHTS = {"quality": 0.35, "cost": 0.15, "latency": 0.15, "privacy": 0.20, "license": 0.15}


def weighted_score(scores: dict, weights: dict) -> float | None:
    values = [scores.get(key) for key in weights]
    if any(value is None for value in values):
        return None
    return sum(scores[key] * weights[key] for key in weights)


def rank_models(models: list[dict]) -> list[dict]:
    ranked = []
    for model in models:
        total = weighted_score(model.get("scores", {}), WEIGHTS)
        ranked.append({**model, "total_score": total})
    return sorted(
        ranked,
        key=lambda item: (
            item["total_score"] is None,
            -(item["total_score"] or 0),
            item.get("id", ""),
        ),
    )

排序键中的第一个值让“有完整评分”的记录排在前面,第二个值按总分降序,第三个值保证同分稳定。若任务把隐私或许可证设为硬门槛,可以在排序前过滤,而不是继续给它们打分。评分结果应与原始单项分数同时输出,别人才能复核总分。

0.8.7 生成报告:把结论和证据放在一起

报告至少包括运行日期、目录版本、任务要求、入选模型、排除模型及原因、每个模型的单项评分、总分、未知字段和来源。不要只输出一个列表,因为列表没有说明为什么排序,也没有显示哪些事实尚未核对。Markdown 报告适合阅读,JSON 报告适合程序再次处理,学习项目可以同时生成两种格式。

PYTHON · report.py
from datetime import date


def render_markdown(catalog: dict, ranked: list[dict], rejected: list[dict]) -> str:
    lines = [
        f"# 模型分类与比较报告\n",
        f"- 任务:{catalog.get('task', '未填写')}",
        f"- 目录版本:{catalog.get('schema_version', '未知')}",
        f"- 生成日期:{date.today().isoformat()}\n",
        "## 候选排序\n",
        "| 模型 | 阶段 | 访问方式 | 总分 |",
        "|---|---|---|---:|",
    ]
    for model in ranked:
        score = "待测" if model["total_score"] is None else f"{model['total_score']:.2f}"
        lines.append(f"| {model['name']} | {model['stage']} | {model['access']} | {score} |")
    lines.append("\n## 被过滤的候选\n")
    for item in rejected:
        lines.append(f"- {item['id']}:{';'.join(item['reasons'])}")
    lines.append("\n> 报告分数来自本地目录和任务权重,不是通用能力排行榜。")
    return "\n".join(lines) + "\n"


print(render_markdown(catalog, ranked, rejected))

报告中的“待测”是一个重要结果。它提醒读者不要把缺失信息误解为低分或高分。生成报告时还可以把每个模型的证据链接列出,让后续复查不必重新搜索。若报告用于团队决策,保留原始 JSON、脚本版本和测试样例,不要只保存复制到聊天窗口的一段文字。

0.8.8 写最小测试:验证职责而不是代码长度

测试重点不是把每一行都覆盖,而是验证关键职责。读取函数要验证中文和空列表能否回读;验证函数要抓住重复 ID、缺少字段和非法访问方式;筛选函数要准确给出接受和拒绝原因;排序函数要在同分时稳定;报告函数要包含任务、日期和“待测”标记。每个测试都用最小输入,失败时容易定位。

PYTHON · test_catalog.py
def test_missing_required_field():
    item = {
        "id": "demo",
        "name": "示例",
        "version": "1",
        "modalities": ["text_input"],
        "access": "api",
        "stage": "instruct",
        "evidence": [{"kind": "doc"}],
    }
    errors = validate_model(item)
    assert errors == []

    broken = {key: value for key, value in item.items() if key != "evidence"}
    assert "缺少字段 evidence" in validate_model(broken)


def test_stable_sort_for_equal_scores():
    models = [
        {"id": "b", "scores": {key: 3 for key in WEIGHTS}},
        {"id": "a", "scores": {key: 3 for key in WEIGHTS}},
    ]
    assert [item["id"] for item in rank_models(models)] == ["a", "b"]

测试名称应该说明行为,而不是说明实现细节。比如 test_stable_sort_for_equal_scores 在将来替换排序算法后仍然有意义;test_uses_sorted_function 则没有。对学习项目而言,测试也是一份可执行的知识卡:它告诉你代码承诺了哪些行为。

0.8.9 项目验收表:把分类记录变成可复用资产

表 8.1 · 模型分类实验的验收矩阵
验收项通过标准证据文件失败时先查
结构JSON 可解析,schema_version 存在models.json括号、引号和编码
身份id 唯一,名称和版本非空validate_catalog.py 输出重复记录和复制旧版本
开放性权重、代码、数据、许可证分别记录模型卡摘录与链接把“开源”写成单一标签
筛选硬门槛通过和拒绝原因可解释shortlist.json条件写死或原因丢失
排序权重和未知处理规则公开,顺序稳定report.md空值当零或同分乱序
回读输出 JSON 能再次加载test_catalog.py路径、UTF-8 和写入中断

为资料库留下“可追溯的变化记录”

模型资料库不是填完一次就结束的静态表格。每次修改记录时,最好写明变更日期、修改人、变更字段和依据:例如版本升级、许可证条款变化、官方评估更新,或你自己的测试集增加了新样例。若只是修正拼写,也要避免覆盖原始证据。最简单的做法是在 JSON 中保留 updated_at 和 evidence,同时把旧报告按日期保存;项目变大后再引入版本控制。

还要区分“事实变化”和“判断变化”。模型发布方改了许可证,是事实变化;你因为任务预算改变而调整权重,是判断变化。前者要重新核对来源,后者要在报告中说明新的任务假设。把两种变化混在一个总分里,日后很难解释为什么同一模型的排名突然改变。

当资料库供多人使用时,可以给字段增加维护责任人和复核日期。超过复核日期的许可证、价格、上下文上限和服务版本标为“需要更新”,而不是继续显示成确定事实。这样,目录不仅能帮助你学习分类,也能训练你建立面向真实工程的资料维护习惯。

0.8.10 本节练习:把项目扩展为你的第一份模型资料库

CAPSTONE LAB 0.8.8完成模型分类卡

建立一个包含至少 5 条记录的 models.json,其中至少有一个文本模型、一个视觉或多模态模型、一个 Embedding 模型和一个你暂时无法确认完整许可的记录。实现读取、验证、按硬门槛筛选、稳定排序和 Markdown 报告五个职责。每条记录至少附一条来源或测试证据,最后检查输出 JSON 能否再次读取。

评分重点不是代码长短,而是职责是否清楚:至少拆出“读取目录”“验证记录”“筛选候选”“计算排序”“生成报告”五个函数;未知许可不要偷偷当成可用,硬门槛失败要保留原因;排序要有稳定的二级键;输出 JSON 必须能再次读取。若记录来自在线资料,保留访问日期和版本,避免以后无法解释分数变化。

项目交付前的三次检查

第一次是结构检查:用 JSON 解析器读取文件,确认字段类型和唯一 ID;第二次是行为检查:用一条合格、一条缺字段、一条未知许可和一条同分记录运行脚本,观察接受、拒绝、待测和排序是否符合规则;第三次是冷启动检查:在新的终端和空输出目录中,从 README 开始执行,确认没有依赖内存状态、当前工作目录或手工修改。

报告里不要只放漂亮的排名表。把被过滤的记录、缺失字段、证据链接、评分权重和生成时间一起写出;如果某个候选分数很高但许可证待核对,就在报告顶部标注“不可直接上线”。一份诚实的“待核对清单”比一份看似完整但无法解释的排行榜更有价值。

最后把项目当作学习资产而不是一次性作业:保留原始 JSON、脚本、测试输入、报告和失败记录;每次更新模型版本时复制一份目录,修改 schema_version 或日期,不覆盖旧证据。这样你在第 7~10 章学习评估、Embedding 和 RAG 时,可以继续复用同一套数据结构。

完成这个项目后,你会得到三种成果:一份可以继续扩展的模型分类卡,一套把资料变成证据的阅读流程,以及一段可以复用到其他主题的 Python 代码。下一节会把这些成果整理成复盘清单,检查知识边界,并把第 0 章连接到第 1~14 章的后续路线。

不要追求一次收集所有模型。先用少量、来源清楚、字段完整的记录跑通闭环,再逐步增加。资料库的价值来自可更新和可验证,而不是名字数量。每当模型版本、许可证或评估条件变化时,更新记录并保留旧版本,比较才有意义。

09 · REVIEW & NEXT

复盘、知识边界与下一章入口

第 0 章的任务不是让你背下一张巨大的模型名单,而是建立一套能够迁移的观察框架。现在回到开头的六个问题:模型处理什么模态?开放到什么程度?规模和架构怎样?能力来自哪些训练阶段?它服务于哪个层级和任务?选择它的证据是什么?如果你能对一个新模型逐项回答,并把未知内容写出来,就已经完成了本章的核心目标。

回忆不用看资料,说出本章的分类轴和每一轴的边界。
迁移把分类卡、比较矩阵和任务合同带到下一章的 Python 学习。
验收完成一次冷启动复盘,留下可回读的 JSON、报告和错误地图。

0.9.1 九个主题单元各自解决了什么

第一节把 AI、机器学习、深度学习、基础模型、模型、权重、接口和应用系统放回层级关系;第二节用模态和 I/O 描述文本、图像、音频、视频、科学与多模态模型;第三节把开放程度拆成访问、权重、代码、数据、评估和许可证;第四节解释总参数、激活参数、精度、上下文、稀疏性和架构;第五节说明预训练、微调、对齐、检索和工具分别提供什么能力;第六节用 L0、L1、L2 区分通用、行业、任务和系统;第七节给出阅读模型卡、评估和比较的顺序;第八节把方法落成一个可运行项目;第九节完成复盘和迁移。

这九个主题不是九个互相独立的百科条目。它们形成一条判断链:先知道对象是什么,再知道它处理什么数据,接着确认能否使用、为什么能工作、适合什么任务,最后用证据比较和交付。后面学习 Transformer 时,你会再次看到表示、架构、训练目标和推理约束;现在的分类框架会让那些细节有地方安放。

表 9.1 · 本章知识点覆盖验收
知识点我能否做到最小证据不会做时的补救
概念层级区分模型、权重、API 和应用系统写出一张四层链路图回看 0.1.3、0.1.6 和 0.1.7
模态写清输入、输出和表示单位I/O 矩阵与边界样例回看 0.2.1、0.2.8 和 0.2.9
开放程度逐项记录权重、代码、数据和许可开放性审计表回看 0.3.1、0.3.5 和 0.3.6
规模架构解释总参数、激活参数、精度和缓存显存下界估算回看 0.4.2、0.4.3 和 0.4.4
训练能力说明能力来自预训练、微调还是系统输出链路图回看 0.5.1、0.5.6 和 0.5.8
层级用途把需求拆成 L0、L1、L2 和系统任务合同回看 0.6.1、0.6.3 和 0.6.6
模型选择用硬门槛和软评分做理由充分的选择比较矩阵与测试集回看 0.7.1、0.7.3 和 0.7.6
工程记录JSON 可读、可验证、可排序、可回读分类卡项目报告回看 0.8.2~0.8.9

0.9.2 不要把“未知”当成失败

学习新模型时,很多字段暂时查不到是正常的。未知表示证据还不够,不表示模型一定没有这项能力;空值表示当前记录没有填,否定则表示已有明确依据。把三者混在一起,会让比较表看起来完整,却无法支持决策。专业记录允许有空白,但不允许让空白伪装成事实。

你还可以给未知设置下一步:查官方模型卡、查许可证、做最小输入测试、询问维护者、等待版本说明或让法务审核。每个未知字段都应有一个可行动的后续,而不是留在“以后再说”的角落。这样,资料库就变成了工作队列。

0.9.3 五张最值得保留的卡片

模型身份卡

家族、检查点、版本、发布方、模态和访问方式。用来防止把产品名称当成精确模型。

  • 版本和访问日期
  • 输入输出格式
  • 官方来源链接

开放性卡

API、权重、代码、数据、评估和许可证分别记录。用来防止只写“开源”。

  • 允许与不允许的用途
  • 再分发要求
  • 需要审核的条款

任务合同卡

输入、输出、质量、延迟、数据边界、失败处理和非目标。用来防止“做一个助手”过于模糊。

  • 硬门槛
  • 成功指标
  • 人工接管条件

实验证据卡

固定样例、版本、提示、解码、硬件、结果和限制。用来防止一次演示代替评估。

  • 正常与边界样例
  • 原始输出
  • 失败复现步骤

第五张卡片是迁移卡:记录本章的概念如何连接下一章。比如“模型输入需要被表示为对象;Python 将负责读取、组织和验证这些对象;下一步先学习变量、容器、函数和文件,再把模型分类卡做成可运行脚本”。迁移卡让知识从网页回到你的代码目录。

0.9.4 复盘一个错误:从标签退回证据

假设你把一个模型记成“开源、支持长文本、适合医疗”。复盘时逐项追问:开源指什么材料?长文本的单位、最大长度和实测稳定性是什么?医疗是论文任务、领域微调还是仅仅有宣传案例?如果找不到证据,就把标签改成“开放程度待核对”“长输入待测”“医疗场景未验证”。这不是把模型贬低,而是把判断从愿望改成事实。

再记录当初为什么会误判:只看了搜索摘要、把模型家族和产品混淆、把一次成功样例当成普遍能力,或忽略了许可和数据边界。错误地图比“我以后注意”更有用,因为它告诉你下一次应该在哪一步停下来核对。

0.9.5 冷启动验收:不依赖本章页面也能复述

关闭网页或把资料折叠,尝试在纸上或空白文档中完成四件事:画出模型到应用系统的链路;写出六个分类维度;解释总参数和激活参数的区别;为一个任务写出硬门槛和两个评估指标。然后打开自己的 models.json,看能否解释每个字段、每条来源和每个分数。如果只能照抄页面,说明需要再做一次主动回忆。

冷启动还包括运行证据:在新终端或新目录中运行分类脚本,加载 JSON,生成报告,再删除内存中的数据后重新读取输出。记录 Python 版本、命令、输出和失败信息。这个过程会自然连接第 1 章的环境、解释器、文件和异常处理,不必等到学完整个 Python 才开始。

0.9.6 进入第 1~6 章:把地图交给通用基础

第 1 章从 Python 安装、解释器、变量、控制流、数据结构、函数和文件读写开始。你会在这里学会让分类卡真正运行:读取 JSON,遍历模型记录,处理缺失值,写出稳定排序和错误提示。不要把这些内容看成与大模型无关的编程课;它们是后续数据处理、训练脚本和评估管道的通用语言。

第 2 章进入数据处理,第 3 章补数学直觉,第 4 章学习机器学习,第 5 章学习神经网络,第 6 章用 PyTorch 完成训练实践。你可以带着本章的模型分类卡继续前进:用表格记录数据、用向量解释表示、用损失函数理解训练、用 Tensor 运行一个小模型。这样基础章节不会变成孤立的语法清单。

0.9.7 进入第 7~8 章:从模态地图到文本表示和 Transformer

第 7 章会把“文本模型”的抽象落实为 Unicode、Token、词表、Embedding 和语义检索;你会看到本章的“表示单位”“输入输出”“向量模型”怎样变成代码和实验。第 8 章再进入 Transformer,理解注意力、位置表示、编码器、解码器、因果生成和微调。届时,架构不再只是模型卡上的一行标签,而是可以画图、手算、实现和测试的计算结构。

第 9 章的大语言模型会把预训练、指令微调、对齐和推理串成完整工作流;第 10 章 Embedding 与 RAG 会把本章的检索、证据和任务合同落实到向量数据库、召回、重排和引用;第 11~13 章把模态和领域扩展到视觉、多模态、行业与科学;第 14 章再处理训练、部署、评估、安全和监控。第 0 章的地图会在每一章反复出现。

图 9.1 · 第 0 章到后续章节的迁移路线本站自制学习路线图:先有坐标,再进入实现。
第 0 章全景、分类与选择
↓
第 1~6 章Python、数学、ML、DL、PyTorch
第 7~8 章文本表示与 Transformer
↓
第 9~10 章LLM、Embedding 与 RAG
↓
第 11~13 章视觉、多模态、行业与科学
第 14 章训练、部署与评估
↓
能解释、能实验、能交付

路线不是一条只能向前的直线。遇到瓶颈时,回到对应的基础层补一小块,再继续向目标任务推进。

0.9.8 参考资料:先读原始来源,再读二手解读

本章建议把官方文档、技术报告和论文当作事实入口,把博客、视频和排行榜当作补充解释。模型卡可以告诉你用途、限制、数据和评估;许可证页面决定可用边界;论文说明架构和训练目标;接口文档说明真实输入输出。阅读二手资料时,把其中的数字和结论追溯回原始来源,尤其要注意版本和发布日期。

这些链接用于学习和查证,不代表对任何模型的推荐。访问时记录页面标题、版本和日期;如果页面更新,重新检查你的分类卡。模型生态变化很快,资料库必须带时间戳,才能知道某个判断属于哪个时点。

0.9.9 本章结业练习:用三分钟讲清一个模型

FINAL CHECKPOINT 0.9.9做一次口头模型评审

不看网页,选择一个模型,用三分钟完成一段口头说明:它处于哪个层级,接受和产生什么模态,开放了哪些材料,规模和架构有哪些已知事实,能力来自哪些训练阶段,适合什么任务,不适合什么任务,证据来自哪里,还有哪三个未知需要验证。录音或写下提纲,再对照本章的九节检查遗漏。

评分重点不是能否说出最多模型名称,而是结构是否完整、事实和推测是否分开、限制是否与任务相关、证据是否可追溯。若你说“它很强、很大、支持多模态”,要继续补上“在什么任务、按什么指标、输入输出如何、哪个版本和哪份文档”。

知识边界检查:会描述,不等于会训练

完成本章后,你应该能阅读模型资料、整理分类字段、设计选择矩阵并指出证据缺口,但还不要求你从零训练一个大模型。训练需要更深入的 Python、数据处理、数学、机器学习、神经网络、GPU、分布式和评估知识,这正是后续章节的任务。把“能解释模型类别”和“能实现模型训练”分开,是对学习进度的诚实记录。

同样,你现在可以理解“RAG 是模型外接检索”“多模态需要对齐和融合”“开放权重不等于完全开源”,但还不必立刻搭建向量数据库、部署视觉模型或分析数十亿参数。先把概念、输入输出和证据链练熟,后面的工具学习会更快。过早追逐完整产品,往往会让基础漏洞被复杂框架遮住。

如果别人问你“哪个模型最好”,你可以先要求补充任务、模态、数据边界、延迟、预算、许可和风险。若对方暂时无法提供,就给出“需要更多条件”的回答,并说明可以先做一个低风险基线。专业判断并不总是立即给出一个名字,有时是把问题问得足够具体。

表 9.2 · 学完本章后的能力边界
我已经能做我还需要后续学习对应路线
多维描述模型及其证据读取 Token、张量和注意力计算第 1、7、8 章
按 I/O 匹配模态和任务实现视觉编码、Embedding 或 RAG第 7、10、11、12 章
区分预训练、微调和系统能力编写训练循环和微调脚本第 5、6、9、14 章
建立许可和版本记录完成部署、监控和安全评估第 13、14 章

把复盘变成一次可重复的口述测试

第一轮只用一分钟说清“模型是什么”:层级、模态、输入输出和开放性。第二轮用一分钟说清“它为什么能做”:预训练目标、微调、对齐、检索和工具。第三轮用一分钟说清“我凭什么选”:任务合同、硬门槛、评估证据、成本、延迟、隐私和失败接管。三轮都不允许用“很强”“很大”“很智能”结束,必须补上事实或未知。

口述测试的价值在于暴露隐形混淆。你可能知道“视觉模型”这个词,却说不出输出是标签、坐标、描述还是图像;可能知道“开放权重”,却没有核对代码和许可证;可能知道“长上下文”,却没有测量有效利用率;可能知道“Agent”,却没有写工具权限和回滚。卡顿的位置就是下一次学习的入口。

把口述提纲与分类卡对照,检查每个结论能否回到一个字段或一个来源。没有来源的结论标为推测;没有测试的能力标为待测;没有定义的指标标为待补。每次修改分类卡时,再录一次短复盘,观察自己是否能更快说明重点。这个过程比不断收藏新模型名字更能提升判断力。

如果要和同学协作,可以互换模型卡进行“反向提问”:对方只读你的摘要,追问一个模态边界、一个许可材料、一个评估协议和一个失败处理。你不能打开原始页面,只能根据记录回答;回答不了的地方就补证据。这样能检验资料是否真的可读,而不是只有作者自己看得懂。

复盘还要写一条“停止条件”。当资料不足、风险无法评估或硬门槛不满足时,停止继续比较并标记阻塞;当证据满足、测试达标且回滚方案可用时,才进入下一阶段。知道何时停止,是工程判断的一部分,也能避免在不可靠的信息上不断投入。

表 9.3 · 三分钟口述测试提纲
时间必须说清不能用来代替的词
第 1 分钟层级、模态、输入输出、开放材料“全能”“开源”“支持一切”
第 2 分钟训练阶段、系统组件和能力来源“模型自己知道”“自动推理”
第 3 分钟任务、证据、限制、成本和接管“最好”“肯定可靠”“直接上线”

0.9.10 给下一章留下一个明确入口

如果结业清单有一项还没有完成,不必把整章推倒重来。把卡点写成一个具体问题:我不清楚总参数和激活参数的区别;我不知道如何验证一个模型的输入长度;我不会用 Python 读取 JSON;我无法判断许可证是否允许目标使用。接着把问题放入对应章节。学习路线的价值,不是要求你一次通过,而是让你知道下一步回到哪里。

第 1 章会从环境和 Python 基础开始。进入它之前,准备好一个空目录、一个能运行 Python 的解释器和本章的 models.json。你会把分类记录当作第一份真实数据,学习如何读取、验证、修改和保存。先不用安装大模型库,也不用下载权重;把最小的输入—处理—输出闭环跑通,才是最稳的起点。

到这里,第 0 章的学习闭环完成:你有了一张大模型地图、一套多维分类语言、一个模型选择流程和一个可运行的分类卡项目。下一章开始学习通用基础,但不会离开这张地图;每学会一个 Python、数学或机器学习概念,就把它放回“模型如何表示、学习和交付”的问题中。

最终复盘卡

我现在能解释:大模型没有单一分类标准;模态、开放程度、规模架构、训练目标和用途是不同观察轴;模型能力与应用系统能力不能混为一谈。

我亲手留下:models.json、验证脚本、比较报告、至少一次失败记录,以及一份带来源和日期的参考清单。

我下一步要做:进入第 1 章,先让 Python 解释器、目录、文件和最小脚本稳定运行,再把本章的分类卡交给代码处理。

结业前的完整复盘:把“知道”变成“能证明”

复盘第一步是重新命名对象。不要只写产品名,而要写发布方、模型家族、具体检查点、版本、模态接口和访问方式;如果页面只说“某系列模型”,就把检查点标成未知。名称越精确,后面的参数、许可、评估和输出记录才有可能对应到同一个对象。

第二步是画输入输出图。把原始输入、预处理、中间表示、模型输出、后处理和外部动作画成节点,给每条边标上格式、长度、版本和失败处理。图中若出现“模型直接负责权限”“自然语言直接触发付款”或“没有来源的事实进入报告”,就先把它标成需要修复的风险,而不是继续讨论模型大小。

第三步是做分类轴的交叉检查。模态回答“处理什么信息”,开放程度回答“哪些材料可获得”,规模回答“计算和容量怎样”,训练目标回答“能力怎样形成”,用途层级回答“服务什么任务和责任”。一个字段不能代替另一个字段:知道模型支持图片,不等于知道它有视觉权重;知道它有 128K 上下文,不等于知道它能可靠使用长文;知道它是行业模型,不等于知道行业数据怎样进入。

第四步是复核证据等级。官方模型卡和许可证适合确认用途、限制和权利;技术报告和论文适合确认架构、数据和训练目标;自己的测试适合确认目标任务上的质量、延迟和格式;论坛和二手文章适合发现线索。把不同等级的证据混写,会让猜测看起来像事实。

第五步是检查未知项是否可行动。每个未知字段旁边写“下一步查什么、谁来查、通过标准是什么”。例如许可证待核对,就指定阅读哪份条款;长上下文待测,就指定长度、位置和评分;图像能力待测,就准备低分辨率、遮挡和文字样例;数据处理政策未知,就暂停输入真实资料。未知不是空白,而是一项待完成的工作。

第六步是检查错误地图。把失败按对象、模态、数据、训练、提示、检索、工具、权限和系统状态归类,并记录一个可复现样例。若所有错误都写成“模型幻觉”,你就失去了修复方向;若错误能定位到链路节点,下一步可以是补数据、改接口、加验证器、换模型或转人工。

第七步是做一次反向教学。尝试向没有读过本章的人解释一个模型,让对方只允许你使用分类卡和比较报告提问。对方应该能从你的记录知道模型处理什么、能否使用、适合哪里、怎样评估和什么时候停止。若必须重新打开十几个页面才能回答,说明资料还没有压缩成可迁移的知识。

第八步是做一次冷启动。复制项目到一个空目录,在没有缓存和历史终端状态的情况下读取 JSON、运行验证、生成报告、检查引用和执行测试。冷启动失败通常暴露路径写死、隐式依赖、未记录环境、缺失字段或排序不稳定,这些问题会在后续数据与模型实验中反复出现。

第九步是写“暂不学习”的边界。本章介绍了视觉、音频、多模态、科学模型、Embedding、RAG、Agent 和部署,但没有要求你现在实现每一种。暂不实现不等于不重要,而是先把它们放在地图上,等 Python、数学、机器学习和 Transformer 基础足够后再深入。明确边界能防止学习范围无限膨胀。

第十步是写迁移问题。进入下一章时,不要只问“Python 语法有哪些”,而要问“如何用 Python 读取分类卡、检查字段、处理未知、稳定排序、保存报告和记录错误”。把新知识绑定到已有项目,能让基础学习产生真实反馈,也能让第 0 章的结论在代码中接受检验。

表 9.4 · 结业复盘的证据闭环
环节复盘动作通过证据不通过时的下一步
对象写清家族、检查点、版本和接口身份卡与来源链接回到模型卡和发布页核对
分类沿五条以上分类轴逐项描述I/O、开放、规模、训练、用途字段标记未知,不用标签补空白
证据区分官方、论文、实测和二手信息来源等级与访问日期把关键结论提升到可复现证据
错误用链路节点解释至少三个失败错误地图与重现样例补测试或增加验证组件
迁移把分类卡交给 Python 项目处理可回读 JSON、报告和测试进入第 1 章补环境与文件基础

完成闭环后,你不需要背下所有模型名称,也不需要立刻做出一个复杂产品。你需要的是一种稳定的判断动作:先定义对象和任务,再按模态、开放程度、规模、训练和用途拆解,随后寻找证据、做最小测试、记录未知、设计接管,最后把结论保存成别人可以复查的资料。第 0 章的价值,就在这套动作可以迁移到任何新模型和新论文。

如果某个结论无法被证据支持,就保留它的暂定状态;如果某个任务无法通过硬门槛,就停止比较并说明原因;如果某个系统已经满足目标,就保留基线和回滚。专业的学习资料不是把页面写得永远正确,而是让读者知道结论来自哪里、边界在哪里、下一步怎样验证。

复盘输出的最低质量标准

复盘不是把正文再读一遍,而是要产生新的可检查文件。至少留下对象身份卡、模态 I/O 表、开放性审计、规模账本、训练阶段说明、任务合同、模型比较矩阵和错误地图。每份文件都写版本、日期、来源和未知项,避免下一次学习只能依赖记忆。

覆盖检查要包含正向和反向问题。正向问题是“它能做什么”,反向问题是“什么情况下不能做、失败如何发现、发现后谁接管”。只有正向没有反向,资料会像宣传页;只有反向没有正向,资料又无法指导选择。两者一起写,才能形成可执行的边界。

知识点之间还要能互相引用。模态表应能链接到任务合同,规模账本应能链接到部署指标,训练阶段应能链接到能力证据,开放性审计应能链接到版本记录。交叉引用不是形式工作,它能让你在修改一个字段时发现受影响的测试和结论。

复盘时把“事实、推测、计划”分成三种标记。事实来自官方文档、论文或已保存的实测;推测是根据架构或有限样例得到的暂时判断;计划是下一步要做的测试、核对或迁移。三种标记混在一段话中,读者很难知道哪些内容可以直接依赖。

还要记录一条最小失败路径。比如资料不存在时返回“不确定”,图片模糊时请求重传,许可证未知时停止上线,工具参数越权时阻断动作,模型服务超时时切换降级方案。失败路径越具体,后续 Python、RAG 和部署学习越容易把它实现成代码。

如果和同学或团队共同维护资料,约定字段含义和修改规则。新增模型必须有来源和日期,修改分数必须保留测试集和原因,删除记录必须说明是否仍有旧报告引用,许可证变化必须触发复评。规则不需要复杂,但要让不同的人写出的卡片可以放在一起比较。

当本章的资料开始变长时,优先删掉重复标签和没有证据的形容词,不要删掉限制、案例、表格和失败说明。长资料的价值不在于每个名词都出现,而在于关键概念有定义、有例子、有反例、有操作和有验收。后续每章都沿用这个标准。

最后给自己一个清晰的完成判断:能用自己的话讲清九个主题,能打开一个新模型资料并填写分类卡,能运行项目验证并解释一个失败,能说出下一章要用 Python 解决的具体问题。满足这些条件,就可以进入第 1 章;不满足时,只补对应卡点,不必无限重复整章。

表 9.5 · 复盘资料的检查清单
资料必须包含完成标志
身份卡家族、检查点、版本、模态和来源能唯一定位对象
分类卡开放、规模、训练、用途和限制事实、推测、未知分开
任务合同输入、输出、指标、非目标和风险能判断成功或停止
实验记录协议、原始输出、指标、失败和环境能重跑或解释不能重跑
迁移卡下一章问题、已有资产和补课入口能从 Python 基础开始动手

复盘通过的最低判断

你不必记住所有术语,但要能把一个新模型放进坐标系:先说对象和版本,再说模态 I/O、开放材料、规模架构、训练阶段、用途层级和证据边界。遇到未知时能写出下一步核对动作,遇到高风险时能说出停止或人工接管条件。

如果这些动作都能完成,第 0 章就达到了“可迁移”的标准。接下来学习 Python 时,直接用本章的分类卡做读取、验证、排序和保存练习,让概念在代码中继续生长。

把复盘结果带走

复盘的最终产物不是“已学完”的标签,而是一组能在下一章继续使用的文件和问题:分类卡、比较表、失败样例、来源记录、JSON 验证脚本,以及“如何用 Python 读取和更新它们”的入口。带走这些资产,第 1 章的语法会立刻有真实任务。

若仍有不确定项,把它们列成待验证清单并保留优先级;若某个结论已被测试支持,把测试编号写回分类卡。这样学习资料会随着证据成长,而不是随着时间被新的宣传名词覆盖。

把本章结论交给未来的自己

在复盘文件顶部写三行:已确认的事实、仍然未知的边界、下一次要做的验证。事实附来源或测试编号,未知附风险和负责人,验证附通过标准。每次进入新章节时先读这三行,学习就会围绕真实问题推进,而不会重新陷入无目的的名词收集。

同时保留一条最小可运行命令,例如读取分类卡、运行验证、生成报告和检查输出。命令能在空目录执行,说明知识已经从网页迁移到实践;命令不能执行,就把缺失的 Python、路径或文件知识列为第 1 章的具体任务。

当模型生态变化时,回到这份文件更新版本、来源、许可证和测试结果。旧结论不必删除,标记失效日期和原因即可。保留变化轨迹,才能区分知识本身变化与资料记录变化。

复盘完成

此后每次学习,都从一个可验证的问题开始。