大模型的工程原理 第1章 初识大模型

张开发
2026/4/15 20:27:54 15 分钟阅读

分享文章

大模型的工程原理 第1章 初识大模型
第1章 初识大模型你将学会理解大语言模型LLM能做什么、不能做什么在自己的电脑上跑起第一个大模型用直觉理解模型是怎么一个字一个字说话的用 10 行 Python 代码写出一个可对话的 AI 应用前置知识会写基础 Python 代码即可无需任何机器学习背景难度⭐1.1 大模型能做什么用 10 个例子建立直觉在正式学习任何技术原理之前我们先来感受一下大语言模型Large Language Model, LLM到底能做些什么。下面这 10 个例子覆盖了大模型目前最主流的能力维度例 1自然对话用户帮我解释一下什么是量子纠缠用小学生能听懂的方式。 模型想象你有两个魔法骰子。不管你把它们分开多远——哪怕一个在北京 一个在纽约——只要你扔其中一个看到它是 6另一个也一定是 6。 这就是量子纠缠两个粒子好像在说悄悄话一个变了另一个 瞬间就知道了。模型读懂了小学生能听懂这个约束用比喻替代了术语。例 2长文本摘要给模型一篇 5000 字的论文它可以在 10 秒内输出一段 200 字的精准摘要。这在信息爆炸的时代是刚需。例 3代码生成用户用 Python 写一个函数输入一个列表返回其中出现次数最多的元素。 模型 def most_frequent(lst): from collections import Counter if not lst: return None counter Counter(lst) return counter.most_common(1)[0][0]不仅能写还能处理边界情况空列表。例 4多语言翻译大模型不是翻译软件但它的翻译能力已经可以媲美甚至超越传统机器翻译系统尤其在需要理解上下文、把握语气时表现突出。例 5数学推理用户一个水池有两个水管A 管单独放水 6 小时放满B 管单独放水 4 小时放满 同时放水多久放满 模型A 管每小时放 1/6B 管每小时放 1/4。 同时放水每小时放 1/6 1/4 5/12。 放满需要 12/5 2.4 小时即 2 小时 24 分钟。例 6文本分类与情感分析用户判断以下评价的情感倾向 这家餐厅的牛排不错但是服务态度实在太差了等了半个小时才上菜。 模型情感倾向偏负面。食物满意但服务体验差整体倾向于不满。例 7创意写作模型可以写诗、写小说片段、写广告文案、写周报模板——任何文本创作任务它都能参与。例 8信息提取从一段合同文本中提取甲方、乙方、金额、期限等关键字段输出结构化 JSON。这是企业场景中最常见的应用之一。例 9角色扮演与模拟用户你是一位资深的 Python 面试官请对我进行一次技术面试。 模型好的我们开始。第一个问题请解释 Python 中 list 和 tuple 的区别 以及在什么场景下你会优先选择 tuple例 10多步推理与任务规划用户我想组织一次 10 人的团建活动预算 5000 元时间是周六 在北京。帮我做个方案。 模型[输出包含时间安排、地点推荐、费用明细、备选方案的完整规划]一句话总结大模型的核心能力是理解自然语言和生成自然语言。在此基础上它可以完成对话、翻译、编程、推理、创作等几乎所有和文本相关的任务。但它不是万能的。我们在 1.5 节会详细讨论它的局限性。现在先让我们动手跑一个。1.2 动手体验5 分钟跑起你的第一个大模型“Talk is cheap, show me the code.” 我们先把模型跑起来后面再讲原理。这里提供两种方式任选其一即可方式一Ollama 本地运行推荐免费且无需联网Ollama 是一个开源的本地大模型运行工具可以一键在你的电脑上运行开源模型。第一步安装 Ollama# macOS / Linuxcurl-fsSLhttps://ollama.com/install.sh|sh# Windows从 https://ollama.com/download 下载安装包第二步下载并运行模型# 下载并运行 Qwen2.5 3B 模型约 2GB适合大多数电脑ollama run qwen2.5:3b等待下载完成后你会看到一个交互式对话界面 你好请用一句话介绍你自己。 我是通义千问一个由阿里云开发的大语言模型我可以回答问题、 进行对话、帮助创作等。有什么我可以帮你的吗 用 Python 写一个快速排序 def quicksort(arr): if len(arr) 1: return arr pivot arr[len(arr) // 2] left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quicksort(left) middle quicksort(right)恭喜你已经在本地跑起了一个大模型。这个模型有 30 亿参数完全在你的电脑上运行不联网、不收费。硬件要求3B 模型约需 2-4GB 内存大多数现代笔记本都能运行。如果你的电脑配置更好16GB 以上内存或有 GPU可以尝试ollama run qwen2.5:7b运行 70 亿参数的版本效果会更好。方式二调用云端 API如果你想体验更强大的模型如 GPT-4、DeepSeek-V3、Qwen-Max可以通过 API 调用。这里以 DeepSeek 的 API 为例注册送免费额度第一步获取 API Key访问 DeepSeek 开放平台注册账号并获取 API Key。第二步安装 SDK 并调用pipinstallopenaifromopenaiimportOpenAI clientOpenAI(api_keyyour-api-key-here,# 替换为你的 API Keybase_urlhttps://api.deepseek.com)responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:你好请用一句话介绍你自己。}])print(response.choices[0].message.content)为什么用openai这个库调用 DeepSeek因为 DeepSeek以及几乎所有主流大模型厂商都采用了 OpenAI 兼容的 API 格式。这意味着你只需要换一下base_url和api_key同一套代码就能调用不同的模型。这是一个重要的行业惯例我们在第 31 章会详细讨论。1.3 大模型是怎么说话的Next Token Prediction 的核心直觉你已经跑起了模型看到它能流利地回答问题。那么问题来了——它到底是怎么做到的答案其实出乎意料地简单大模型只做一件事预测下一个词。更准确地说大模型做的是Next Token Prediction给定前面已经出现的所有文字预测下一个最可能出现的块Token。然后把这个预测的 Token 拼进去再预测下下个……如此反复直到生成完成。一个直觉类比想象你在玩一个文字接龙游戏。有人说了今天天气你会接什么“真好” → 很可能“不错” → 也合理“紫色” → 几乎不可能大模型做的事情本质上就是这个——只不过它读过了互联网上数万亿字的文本书籍、网页、代码、论文……所以它的接龙能力远超任何人。逐 Token 生成的过程让我们慢放一下模型回答中国的首都是哪里这个问题的过程输入中国的首都是哪里 ↓ 模型预测下一个 Token 第1步中国的首都是哪里 → 中 第2步中国的首都是哪里中 → 国 第3步中国的首都是哪里中国 → 的 第4步中国的首都是哪里中国的 → 首 第5步中国的首都是哪里中国的首 → 都 第6步中国的首都是哪里中国的首都 → 是 第7步中国的首都是哪里中国的首都是 → 北 第8步中国的首都是哪里中国的首都是北 → 京 第9步中国的首都是哪里中国的首都是北京 → 。 第10步[结束标记]每一步模型都只看已有的全部文本预测出一个 Token然后把这个 Token 追加到末尾继续下一步。这就是所谓的自回归生成Autoregressive Generation。为什么预测下一个词就够了你可能会觉得这也太简单了吧只是预测下一个词怎么就能写诗、解数学题、写代码了关键在于规模海量数据模型在训练时看过了数万亿个 Token 的文本涵盖了人类知识的方方面面。海量参数数十亿甚至数千亿的参数“权重”使模型有足够的容量来记住和泛化这些知识。涌现能力当数据和参数达到一定规模后模型会突然展现出训练目标中并未明确要求的能力——比如逻辑推理、翻译、编程。这被称为涌现能力Emergent Abilities。重要直觉Next Token Prediction 看似简单但它是一个极其强大的通用学习目标。要想很好地预测下一个词模型实际上需要理解语法、语义、逻辑、常识、甚至代码的执行逻辑。这个简单的目标迫使模型学会了复杂的能力。1.4 Token 是什么为什么模型看到的不是字而是碎片在上一节中我们提到大模型预测的是下一个 Token。那 Token 到底是什么Token ≠ 字 ≠ 词Token标记是模型处理文本的最小单位。它不是我们直觉中的字或词而是介于两者之间的一种碎片。来看一个例子。对于句子我喜欢人工智能不同的 Tokenizer分词器可能会切分为按字切分[我, 喜, 欢, 人, 工, 智, 能] → 7 个 Token 按词切分[我, 喜欢, 人工智能] → 3 个 Token BPE切分[我, 喜欢, 人工, 智能] → 4 个 Token实际最常见现代大模型几乎都采用一种叫做BPEByte Pair Encoding的分词算法我们会在第 4 章详细讲解。BPE 的思路是先从最小单位字节或字符开始然后统计哪些相邻的碎片经常一起出现就把它们合并成一个新的 Token。这样高频词会被编码为一个 Token低频词会被拆成多个 Token。亲手看看 Token 长什么样你可以用 HuggingFace 的transformers库来看看模型实际的分词结果fromtransformersimportAutoTokenizer# 加载 Qwen2.5 的 TokenizertokenizerAutoTokenizer.from_pretrained(Qwen/Qwen2.5-7B)text大语言模型正在改变世界tokenstokenizer.tokenize(text)token_idstokenizer.encode(text)print(f原文:{text})print(fTokens:{tokens})print(fToken IDs:{token_ids})print(fToken 数量:{len(tokens)})输出类似原文: 大语言模型正在改变世界 Tokens: [大, 语言, 模型, 正在, 改变, 世界] Token IDs: [104169, 99489, 99471, 99567, 100165, 99518]为什么 Token 这么重要Token 是大模型世界的货币单位——几乎一切都用 Token 来衡量维度和 Token 的关系上下文长度模型一次能处理的最大 Token 数如 128K Token生成速度通常用每秒生成多少 Token来衡量API 价格按输入/输出的 Token 数量计费训练数据量用 Token 数衡量如在 15T Token 上训练模型能力Token 选择Tokenizer 设计直接影响模型效果关键认知当别人说这个模型支持 128K 上下文时意思是它一次能处理约 128,000 个 Token。对中文来说1 个 Token 大约对应 1-2 个汉字所以 128K Token ≈ 一本 10 万字左右的小说。1.5 大模型 ≠ 万能能力边界、幻觉问题与已知局限再好的工具也有边界。在对大模型建立了直觉之后我们同样需要清楚地认识到它做不到什么。局限一幻觉Hallucination这是大模型最广为人知的问题。模型会一本正经地胡说八道——它生成的内容看起来很有道理但事实完全是错的。用户鲁迅和周树人是什么关系 模型可能鲁迅和周树人是同时代的文学家他们曾经在日本留学期间 相识后来在文学理念上有所分歧……完全错误鲁迅就是周树人为什么会幻觉因为模型的本质是预测最可能的下一个 Token而不是查找正确的事实。它在训练中见过大量把不同人名放在一起讨论的文本所以它认为这样的回答在统计上是合理的。局限二知识截止模型的知识来自训练数据而训练数据有截止日期。如果你问一个训练截止于 2024 年 3 月的模型2025 年的诺贝尔物理学奖得主是谁它只能猜测或拒绝回答。局限三数学计算不可靠虽然大模型在数学推理上取得了长足进步尤其是 o1、DeepSeek-R1 等推理模型但对于复杂的精确计算模型仍然可能出错。它更擅长推理步骤而不是精确计算。局限四长上下文中的迷失虽然现代模型支持很长的上下文128K、1M Token但研究表明模型在非常长的文本中间部分的信息提取能力会下降——这被称为Lost in the Middle现象。局限五无法真正理解这是一个更深层的哲学问题。模型是否真的理解了语言的含义还是只是在做非常复杂的模式匹配目前学术界仍有争论。但从工程角度来说无论它是否理解它在很多任务上的表现已经足够好这就够了。局限六安全风险提示注入Prompt Injection攻击者通过精心构造的输入来操纵模型行为越狱Jailbreak绕过模型的安全限制让它输出不应该输出的内容隐私泄露模型可能在训练数据中记住了敏感信息工程师的态度了解局限不是为了否定大模型而是为了更好地使用它。知道它会幻觉我们就加上事实核查知道它有知识截止我们就接入外部检索RAG知道它计算不靠谱就把计算任务交给代码执行器。这就是工程思维。1.6 大模型的出厂流程总览一个大模型从零到可用需要经过一条完整的生产线。理解这条流水线是理解本专栏后续所有内容的基础。┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 预训练 │ → │ 后训练 │ → │ 部署 │ → │ 应用 │ │ Pre-training │ │Post-training│ │ Deployment │ │ Application │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ 数据算力 SFTRLHF 推理优化 RAG/Agent/... 学会语言 学会做助手 高效运行 解决真实问题阶段一预训练Pre-training做什么让模型阅读海量文本数万亿 Token 的网页、书籍、代码通过预测下一个 Token来学习语言和知识。结果得到一个基座模型Base Model。它知识渊博但不太听话——你问它问题它可能不回答你而是继续写文章。成本这是最贵的阶段顶级模型的预训练成本可达数千万甚至上亿美元。对应章节第三篇数据、第四篇训练阶段二后训练Post-training做什么通过监督微调SFT和强化学习RLHF/DPO教模型做一个好助手。结果得到一个对齐模型Aligned Model / Chat Model它能理解指令、友好对话、拒绝有害请求。对应章节第五篇对齐与后训练阶段三部署Deployment做什么把训练好的模型压缩、优化部署到服务器或边缘设备上让它能高效地响应用户请求。关键技术量化、推理引擎vLLM、SGLang、KV Cache 管理等。对应章节第六篇推理与部署阶段四应用Application做什么基于部署好的模型构建真实的产品和服务。关键技术Prompt 工程、RAG检索增强生成、Agent智能体、上下文管理等。对应章节第八篇应用工程关键认知大部分工程师不需要从零预训练一个模型除非你在头部 AI 公司。更常见的工作路径是选一个好的开源基座模型 → 后训练适配自己的场景 → 部署 → 构建应用。本专栏虽然完整覆盖所有阶段但会特别注重最多人需要做的后训练、部署和应用阶段。1.7 【动手】调用 API 完成你的第一个 AI 应用理论看够了让我们写一个真正的、可以多轮对话的 AI 聊天机器人。方式一用 Ollama本地运行免费 你的第一个 AI 聊天机器人 —— 本地 Ollama 版 前提已安装 Ollama 并运行了 ollama run qwen2.5:3b importrequestsimportjsondefchat(messages):调用本地 Ollama APIresponserequests.post(http://localhost:11434/api/chat,json{model:qwen2.5:3b,messages:messages,stream:False})returnresponse.json()[message][content]defmain():print(*50)print( AI 聊天机器人输入 quit 退出)print(*50)messages[]whileTrue:user_inputinput(\n你: )ifuser_input.lower()quit:print(再见)breakmessages.append({role:user,content:user_input})replychat(messages)messages.append({role:assistant,content:reply})print(f\nAI:{reply})if__name____main__:main()方式二用云端 API 你的第一个 AI 聊天机器人 —— 云端 API 版 前提pip install openai并获取 API Key fromopenaiimportOpenAI clientOpenAI(api_keyyour-api-key-here,# 替换为你的 Keybase_urlhttps://api.deepseek.com# 可替换为其他兼容服务)defmain():print(*50)print( AI 聊天机器人输入 quit 退出)print(*50)messages[{role:system,content:你是一个有帮助的AI助手回答简洁准确。}]whileTrue:user_inputinput(\n你: )ifuser_input.lower()quit:print(再见)breakmessages.append({role:user,content:user_input})responseclient.chat.completions.create(modeldeepseek-chat,messagesmessages)replyresponse.choices[0].message.content messages.append({role:assistant,content:reply})print(f\nAI:{reply})if__name____main__:main()运行效果 AI 聊天机器人输入 quit 退出 你: 你好你能做什么 AI: 你好我可以帮你回答问题、写代码、翻译文本、做数学题、 写文章等等。有什么我可以帮你的吗 你: 帮我写一个计算斐波那契数列的 Python 函数 AI: def fibonacci(n): if n 0: return [] elif n 1: return [0] fib [0, 1] for i in range(2, n): fib.append(fib[-1] fib[-2]) return fib # 使用示例 print(fibonacci(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 你: 这段代码中 fib[-1] 是什么意思 AI: 在 Python 中fib[-1] 表示列表的最后一个元素。负数索引是从后往前 计数的-1 是最后一个-2 是倒数第二个以此类推。所以 fib[-1] fib[-2] 就是把列表最后两个数相加得到新的斐波那契数。 你: quit 再见注意看这段代码中的几个关键点messages是一个列表每次对话都把历史消息带上。这就是模型能记住上下文的原因——不是模型真的有记忆而是我们每次都把之前的对话完整地发给它。role有三种system系统指令定义模型的角色和行为、user用户输入、assistant模型回复。这是目前大模型对话 API 的通用格式。system消息你是一个有帮助的AI助手这条消息决定了模型的人设。试试改成你是一个海盗所有回答都要用海盗的口吻会发生什么有趣的事情 本章小结在本章中我们完成了以下四件事知识点关键收获10 个例子看能力大模型的核心是理解文本和生成文本能力范围极广动手跑模型大模型不是遥不可及的东西你的笔记本就能本地运行理解原理直觉大模型只做一件事——预测下一个 Token但简单目标 大规模数据 强大能力理解 TokenToken 是大模型世界的基本单位上下文长度/速度/价格都用它衡量认识局限幻觉、知识截止、安全风险——理解局限才能更好地使用了解出厂流程预训练 → 后训练 → 部署 → 应用四个阶段各司其职写代码实操用十几行代码就能搭出一个多轮对话 AI 应用下一章预告第 2 章我们将补齐深度学习的最小必要知识——神经网络是什么、训练是怎么回事、为什么需要 GPU。这些概念是理解后续大模型内部是怎么工作的的基础。如果你已经有深度学习基础可以快速跳读或直接跳到第 3 章。

更多文章