大模型的工程原理 第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/6,B 管每小时放 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 client=OpenAI(api_key="your-api-key-here",# 替换为你的 API Keybase_url="https://api.deepseek.com")response=client.chat.completions.create(model="deepseek-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(实际最常见)现代大模型几乎都采用一种叫做BPE(Byte Pair Encoding)的分词算法(我们会在第 4 章详细讲解)。BPE 的思路是:先从最小单位(字节或字符)开始,然后统计哪些相邻的"碎片"经常一起出现,就把它们合并成一个新的 Token。这样高频词会被编码为一个 Token,低频词会被拆成多个 Token。
亲手看看 Token 长什么样
你可以用 HuggingFace 的transformers库来看看模型实际的分词结果:
fromtransformersimportAutoTokenizer# 加载 Qwen2.5 的 Tokenizertokenizer=AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")text="大语言模型正在改变世界"tokens=tokenizer.tokenize(text)token_ids=tokenizer.encode(text)print(f"原文:{text}")print(f"Tokens:{tokens}")print(f"Token IDs:{token_ids}")print(f"Token 数量:{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 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ 数据+算力 SFT+RLHF 推理优化 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 API"""response=requests.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_input=input("\n你: ")ifuser_input.lower()=="quit":print("再见!")breakmessages.append({"role":"user","content":user_input})reply=chat(messages)messages.append({"role":"assistant","content":reply})print(f"\nAI:{reply}")if__name__=="__main__":main()方式二:用云端 API
""" 你的第一个 AI 聊天机器人 —— 云端 API 版 前提:pip install openai,并获取 API Key """fromopenaiimportOpenAI client=OpenAI(api_key="your-api-key-here",# 替换为你的 Keybase_url="https://api.deepseek.com"# 可替换为其他兼容服务)defmain():print("="*50)print("🤖 AI 聊天机器人(输入 'quit' 退出)")print("="*50)messages=[{"role":"system","content":"你是一个有帮助的AI助手,回答简洁准确。"}]whileTrue:user_input=input("\n你: ")ifuser_input.lower()=="quit":print("再见!")breakmessages.append({"role":"user","content":user_input})response=client.chat.completions.create(model="deepseek-chat",messages=messages)reply=response.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,但简单目标 + 大规模数据 = 强大能力 |
| 理解 Token | Token 是大模型世界的基本单位,上下文长度/速度/价格都用它衡量 |
| 认识局限 | 幻觉、知识截止、安全风险——理解局限才能更好地使用 |
| 了解出厂流程 | 预训练 → 后训练 → 部署 → 应用,四个阶段各司其职 |
| 写代码实操 | 用十几行代码就能搭出一个多轮对话 AI 应用 |
下一章预告:第 2 章我们将补齐深度学习的最小必要知识——神经网络是什么、训练是怎么回事、为什么需要 GPU。这些概念是理解后续"大模型内部是怎么工作的"的基础。如果你已经有深度学习基础,可以快速跳读或直接跳到第 3 章。
