【学习笔记1】AI 基础概念:机器学习、深度学习、大语言模型的区别

张开发
2026/6/26 16:59:34 15 分钟阅读
【学习笔记1】AI 基础概念:机器学习、深度学习、大语言模型的区别
详细介绍 AI 基础概念机器学习、深度学习、大语言模型的区别先用一张图把三者的关系说清楚——它们是包含关系不是并列关系。这张图说明了一件最重要的事LLM 是 DL 的一种DL 是 ML 的一种ML 是 AI 的一种。它们不是平行的技术而是一层套一层。下面逐层解释每一个概念。人工智能AI这是一个大帽子。只要是让计算机模拟人类智能行为的技术都叫 AI。包括最早的专家系统用 if-else 写死规则、搜索算法、甚至国际象棋程序。AI 不一定要学习——规则写死也算。早期的专家系统Expert Systems不仅是 AI而且曾是 AI 领域最显赫的“正统”代表。在 AI 的发展史上它被称为**符号主义Symbolism**或“逻辑驱动型 AI”。为什么 if-else 也是 AI在 20 世纪 60 年代到 80 年代AI 的主流定义是**“让机器模拟人类的推理逻辑”**。当时的科学家认为人类的智能体现在“知识”和“逻辑”上。如果能把领域专家的知识提取出来写成成千上万条if-then规则机器就能像专家一样做决策。例子著名的医疗诊断系统MYCIN。if病人血液中存在某种细菌andif病人发烧超过 38.5°C...then结论有 80% 的概率患有某种感染建议使用某抗生素。虽然它底层是硬编码的逻辑但它表现出了解决复杂专业问题的能力这符合当时对“智能”的定义。普通的if-else语句本身只是“逻辑指令”只有当这些指令规模化、系统化地用于模拟人类决策时它才被视为 AI简单的逻辑不是 AI如果你写一段代码if (temperature 30) { open_fan(); }这通常不被称为 AI。这只是一个简单的自动化脚本或条件控制。原因它的逻辑过于简单没有体现出“智能”所需的复杂推理或对不确定性的处理。它更像是一个“开关”。复杂的规则系统AI 的雏形专家系统如果你写了 10,000 条if-else涵盖了某个医生诊断某种疾病的所有经验if (symptom fever temperature 39 white_cell_count high) { ... }再结合权重计算和逻辑推理机。这就是 AI。在计算机科学史上这被称为**“硬编码 AI”**。它的智能不在于代码本身而在于通过海量的逻辑组合模拟出了专家的判断力。现代 AI不写死 if-else现代机器学习如神经网络与普通if-else的本质区别在于谁来写逻辑普通程序程序员观察规律 - 程序员写出if-else- 机器执行。机器学习程序员设计框架 - 机器观察海量数据 -机器自己生成内部的“逻辑”参数。总结界限在哪里我们可以用一个比喻来形容普通的if-else就像是一个**“路牌”**你告诉车看到这个牌子就左转。这只是死指令。专家系统古典 AI就像是一个**“迷宫导航图”**虽然都是指令但它极其复杂能应对各种岔路。现代机器学习就像是一个**“自动驾驶员”**你没告诉它具体哪厘米该转弯但它通过学习自己掌握了开车的“感觉”。所以普通的if-else是构建 AI 的“砖块”。一块砖头只是砖头普通程序但成千上万块砖头按照复杂的逻辑架构垒起来就可以是一座“智慧宫殿”AI 系统。机器学习MLML 是 AI 的一个子集核心思想是不手写规则而是给机器大量数据让它自己找规律。用 Java 类比传统编程是你写if (price 100) return 贵机器学习是你给它 10 万条商品数据 标注它自己学出来一个判断贵不贵的模型。ML 里常见的算法有决策树、随机森林、SVM、线性回归等。这些算法需要人工提取特征比如价格、品牌、销量这些字段要你自己想好再喂给它。深度学习DLDL 是 ML 的子集核心突破是用多层神经网络自动提取特征不再需要人工做特征工程。还是类比ML 时代你要告诉模型看图片要看边缘、颜色、纹理DL 时代你直接把原始像素扔进去神经网络自己学会了先找边缘再组合成形状再组合成物体这个层次结构。这就是深度的含义——多层深层的网络。DL 爆发的关键是 GPU 并行计算 海量数据从 2012 年 AlexNet 开始。大语言模型LLMLLM 是 DL 的子集专门用来处理语言。核心架构是 2017 年 Google 提出的 Transformer。LLM 的训练方式是给模型海量文本让它学会预测下一个词。听起来很简单但当参数量达到数百亿甚至数千亿这个能力会涌现出推理、写代码、翻译等各种智能。GPT、Claude、Llama、通义千问都属于这一类。核心概念接下来是需要牢记的几个核心概念补充几个关键点Token 为什么重要因为所有 AI API 都按 Token 计费。你好请问今天天气怎么样 大约是 15 个 Token。调用 API 要时刻留意输入 输出的 Token 消耗这直接决定成本。Embedding 为什么重要这是 RAG检索增强生成的基础。把你的文档转成向量存进向量数据库用户问问题时先搜索相似向量再把相关文档片段塞给 LLM 回答。整个知识库问答系统都建立在 Embedding 上。推理 vs 训练的区别— 作为应用开发者你 99% 的时间都在做推理也就是调用已经训练好的模型 API。训练模型需要大量 GPU 和数据不是你的活儿。偶尔可能会做微调Fine-tuning但也不是从头训练。上下文窗口— 这是最容易踩的坑。每次 API 调用你需要把所有对话历史都带上因为模型没有记忆。历史越长Token 消耗越多。上下文窗口满了之后早期的内容会被截断模型就忘了。设计多轮对话系统时要特别注意这一点。用一句话总结三者区别机器学习是让机器从数据中学规律的方法论深度学习是用神经网络实现机器学习、自动提取特征的技术大语言模型是用超大规模 Transformer 神经网络专门处理语言的深度学习模型。Token 是什么文本 → Token 切分示例用 Java 最熟悉的概念来类比Token 其实就是词法分析器Lexer切出来的词素。Java 编译器在编译源码时第一步是词法分析把int x 10 20;切成[int, x, , 10, , 20, ;]这样一个个 token。AI 的 Tokenizer 做的事情完全一样——把原始文本切成模型能处理的最小单元。区别只是Java 编译器的 token 是关键字、运算符这种有语法意义的单位AI 的 Token 是按高频字符序列切的更像是字节对编码BPE不完全按词语边界切。所以programming会被切成programming两个 Token因为模型认为把常见的子词分开学习更高效。三个你必须记住的数字感一般来说1000 个英文单词约等于 750 个 Token1000 个汉字约等于 1500 个 Token。所以写 System Prompt 时用中文比英文要多花将近一倍的 Token这直接影响成本。一个典型的 API 调用场景你发一段 500 Token 的对话历史 100 Token 的问题模型返回 200 Token 的回答这次调用总共消耗 800 Token。每次多轮对话你都要把完整历史带上Token 会线性叠加。跟 Java 开发直接相关的三个坑第一Token 是输入 输出合计计费的。很多人只算输入忘了输出也要钱。如果你让模型生成一篇长文输出可能比输入贵得多。第二max_tokens参数控制的是输出上限不是总量。你设max_tokens100模型最多输出 100 Token 就截断。如果生成到一半被截断你拿到的是不完整的 JSON程序直接崩。第三多轮对话的 Token 累积是个隐形成本。第 1 轮 200 Token第 10 轮你可能已经在输入 2000 Token 的历史了。生产系统要做对话摘要或滑动窗口来控制成本。用一行代码感受一下 Token如果你想实际数一段文本有多少 Token可以用 Tiktoken 库OpenAI 开源的或者直接调各家 API 的计数接口。Claude 的 API 响应头里也会返回本次消耗的 Token 数开发时可以打出来感受一下量级。Embedding 向量用 Java 来理解——Embedding 就是把语义存进一个数组然后用距离来衡量相似度用 Java 代码感受一下 Embedding 是什么想象你有一个方法输入任意字符串输出一个float[]// 概念上Embedding 就是这样一个函数 float[] embed(String text); float[] cat embed(猫); // → [0.82, -0.14, 0.67, ...] float[] kitty embed(小猫咪); // → [0.79, -0.11, 0.65, ...] 距离很近 float[] car embed(汽车); // → [0.12, 0.91, -0.43, ...] 距离很远这个数组有 1536 个维度OpenAI ada-002 的维度每个维度捕捉了文字的某种语义特征。你不需要知道每个维度具体代表什么重要的是语义相似的词向量距离就近语义不相关的词距离就远。和数据库索引的关系传统 MySQL 的 B-Tree 索引解决的是精确匹配或范围查询——WHERE name 猫或WHERE price BETWEEN 100 AND 200。它完全不理解语义你搜买车它找不到购置汽车。向量索引解决的是语义相似查询——给定一个查询向量找出向量空间里距离最近的 TopK 个结果。这个距离通常用余弦相似度来算就像两个向量之间的夹角夹角越小越相似。// 传统索引的思维方式 SELECT * FROM docs WHERE content 如何养猫; // 精确匹配 // 向量索引的思维方式 float[] queryVec embed(如何养猫); ListDoc results vectorDb.search(queryVec, topK5); // 能找到猫的饲养指南、宠物护理、小猫日常照料... 语义相近的都能搜到RAG 系统的完整流程这是 Embedding 在实际工程中最重要的用途【建库阶段离线】 公司文档 → 切片每段500字 → 调Embedding API转向量 → 存向量数据库 【查询阶段在线】 用户问题 → 转向量 → 向量数据库检索最相似的3-5段原文 → 把原文塞进 Prompt → 让 LLM 根据原文回答这就是为什么 AI 能回答你公司内部知识库的问题——它实际上是先用向量搜索找到相关文档再让 LLM 读文档来回答而不是凭空知道的。实际开发中需要关心的两件事第一是选 Embedding 模型。text-embedding-ada-002OpenAI、text-embedding-3-small是常用选择国内可以用通义千问的 Embedding API。中文文档建议用对中文训练过的模型效果差异很大。第二是选向量数据库。如果你已经用 PostgreSQL直接装pgvector插件最省事如果是独立部署Qdrant 用 Java 客户端很顺手大规模场景用 Milvus。本质上它们都是把找距离最近的向量这件事做得又快又准。可以使用 Hologres 作为向量数据库但使用需要开启 Proxima 插件在你需要的 Database 下执行只需执行一次 CREATE EXTENSION IF NOT EXISTS proxima;这一步就像是在 Java 项目里引入了一个Dependency没有它数据库就不认识向量相关的函数和索引类型在实际工程中仅仅找出“最像的 Top 5”往往是不够的。如果用户问了一个完全无关的问题比如你的库里全是“养猫知识”用户问“怎么修火箭”向量数据库依然会给你返回 5 条“相对最接近”的废话。为了过滤掉这些无关结果我们会设置一个相似度分值比如 0.8SELECT id, content, pm_cosine_similarity(feature, {0.12, 0.88, ...}) as score -- 计算相似度得分 FROM my_knowledge_base WHERE pm_cosine_similarity(feature, {0.12, 0.88, ...}) 0.8 -- 只取相似度大于 0.8 的结果 ORDER BY score DESC LIMIT 5;AI 推理和训练训练 编译推理 运行时最核心的一句话训练是让模型学会某件事推理是用学会的模型做事。你调用POST /v1/messages这个 API就是在做推理——模型的参数在你调用的瞬间是完全固定的不会因为你的输入而改变就像运行中的 JVM 不会去修改.class文件一样。训练过程到底在干什么直觉版训练本质上是一个超大规模的猜测-纠错循环给模型看 今天天气真___ 模型猜测 棒概率 0.3、好概率 0.5、差概率 0.1 正确答案 好 计算误差 Loss 模型预测与正确答案的差距 反向传播 沿误差梯度调整数十亿个参数每个参数微调一点点 重复 这个过程在万亿级别的文本数据上跑数周这就是为什么训练要消耗天文数字的算力——不是做一次是把这个循环重复万亿次每次都要更新数百亿个参数。还有一个中间地带微调Fine-tuning作为应用开发者偶尔会听到微调这个词它介于训练和推理之间用一个已经训练好的大模型比如 Llama在你自己的小数据集比如公司的客服对话记录上继续训练一小段时间让它在特定领域表现更好。资源消耗比从头训练小几个数量级但还是需要 GPU。实际上大多数业务场景用好 Prompt Engineering 和 RAG 就能解决真正需要微调的场景比你想象的少得多。判断标准很简单如果你需要的是知识比如公司文档内容用 RAG如果你需要的是风格或格式比如让模型始终用特定的语气回复才考虑微调。对写代码最直接的影响推理有延迟而且是流式的。模型不是算出完整答案再返回而是一个 Token 一个 Token 往外吐这就是你在 ChatGPT 上看到文字一个个蹦出来的原因。所以 Java 里调用 AI API 时一定要处理流式响应SSE / Server-Sent Events否则用户要盯着空白等 5–10 秒才看到第一个字体验很差。这是进入阶段二调用 API之后最先要搞定的工程问题。上下文窗口先用一个 Java 最熟悉的东西来类比——上下文窗口就是模型的工作内存类似线程栈大小有限超出就丢弃。为什么有限制从硬件说清楚模型处理 Token 时需要计算每个 Token 和其他所有 Token 之间的关系这就是 Attention 机制。计算量是 Token 数的平方级别——窗口翻倍计算量翻四倍显存也翻四倍。这是物理限制不是厂商故意卡你。所以即便现在 Claude 支持 200K Token 的窗口实际塞满了也会变慢、变贵。用 Java 代码感受多轮对话的坑模型没有服务器 Session没有 ThreadLocal没有任何记忆。每次 API 调用都是一个无状态请求。所以你必须在代码里自己维护对话历史然后每次都完整带上ListMessage history new ArrayList(); history.add(new Message(system, 你是一个 Java 技术助手)); // 第1轮 history.add(new Message(user, 什么是 Spring AOP)); String reply1 callApi(history); history.add(new Message(assistant, reply1)); // 第2轮 —— 必须把完整 history 带上模型才记得上一轮 history.add(new Message(user, 那它和 AspectJ 有什么区别)); String reply2 callApi(history); // 带着第1轮的所有内容 history.add(new Message(assistant, reply2)); // 聊到第20轮... history 可能已经有几千 Token 了这就是为什么多轮对话的 API 费用会随轮数线性增长——每轮都要把所有历史重新发一遍。三种工程策略的选择时机滑动窗口最简单适合客服类场景——用户一般只关心最近几轮早期的你好、请问有什么能帮您根本不重要直接扔掉没问题。摘要压缩适合需要记得整体脉络的场景比如长篇文档分析。每隔 N 轮先让 AI 把历史总结成一段 200 Token 的摘要替换掉原来的 2000 Token 历史再继续对话。外部记忆结合向量数据库适合需要跨会话记忆的场景比如记住用户的个人偏好。把重要信息向量化存起来下次对话开始时先检索相关记忆注入 Prompt实现跨会话的长期记忆。实际项目里这三种往往组合使用滑动窗口控制短期历史摘要保留中期脉络向量库存储长期偏好。这是做 AI 应用绕不开的工程问题比调 API 本身要复杂得多。模型参数量先用一个 Java 最熟悉的类比打底——参数就是模型里的变量训练就是找出让这些变量取什么值能让预测最准。参数是什么——用 Java 代码打比方想象一个极度简化的预测下一个词的函数// 超简化版神经网络的一层 float[] layer(float[] input, float[][] weights, float[] bias) { // weights 里的每一个 float 就是一个参数 // 训练就是找出让预测最准的 weights 和 bias 的值 float[] output new float[weights.length]; for (int i 0; i weights.length; i) { float sum bias[i]; for (int j 0; j input.length; j) { sum input[j] * weights[i][j]; // 矩阵乘法 } output[i] Math.tanh(sum); // 激活函数 } return output; }真实的 LLM 就是把这样的矩阵乘法叠了几十层到几百层。7B 的模型意味着所有weights和bias里的 float 加起来有 70 亿个。参数越多模型能记住的知识和能表达的规律就越复杂。内存怎么算每个参数存储为 fp162 字节7B × 2 字节 ≈ 14GB 显存70B × 2 字节 ≈ 140GB 显存。一张消费级 RTX 4090 只有 24GB 显存跑 7B 的全精度都困难跑 70B 完全不可能。这就是量化存在的原因——把参数从 fp16 压缩到 4bitINT4内存降低 4 倍精度略有损失但通常可以接受。量化后的 7B 大约只需 4GB 显存一台 Mac M2 都能本地跑。B 之外还要看什么参数量只是一个维度实际能力还受训练数据质量、训练方式、对齐程度影响。所以不能光看 B 数Mistral 7B 发布时打败了很多 13B 模型因为架构设计和训练数据更好。Claude Haiku 参数量比 Llama 70B 少得多但在很多任务上表现更强因为 Anthropic 在对齐和训练质量上投入了更多。所以选模型的正确姿势是看 Benchmark 分数 自己跑业务场景测试不要单纯比参数量。Java 开发者的实用决策树大多数情况下你根本不需要关心参数量直接调云端 API 就好。只有在这几个场景才需要考虑自己部署小模型数据安全要求不能出境金融、医疗、调用量极大导致 API 费用不可接受、需要极低延迟的边缘场景。这时候才去研究 Ollama、vLLM 这类本地部署框架把 7B 或 14B 的模型跑在自己服务器上。Temperature 参数Temperature 控制的是模型选词时有多随机——用 Java 来说就是给Random的种子加了一个可调节的噪声放大器。从代码层面理解 Temperature 做了什么模型每次生成一个 Token本质上是在做一次概率采样。模型先输出一个原始分数logits再经过 softmax 变成概率分布最后从这个分布里抽一个词// 伪代码Temperature 的作用 float[] logits model.predict(context); // 原始分数如 [3.2, 1.1, 0.4, ...] // Temperature 就是在 softmax 之前除以 T float temperature 0.7f; for (int i 0; i logits.length; i) { logits[i] / temperature; // T1 → 分数差距放大 → 高分词更占优 // T1 → 分数差距缩小 → 各词概率趋于均匀 } float[] probs softmax(logits); // 转成概率 int nextToken sample(probs); // 按概率随机抽一个T0 时除以接近 0 的数最高分词的概率趋近 100%等于变成argmax每次都选概率最高的词输出完全确定。T2 时各词概率被压平低概率词也有机会被选中输出就开始乱。top_p 是 Temperature 的好搭档实际 API 调用里你会看到两个参数一起出现。top_p也叫 nucleus sampling限制的是只从累积概率达到 p 的候选词里选// top_p 0.9 的意思 // 把所有词按概率从高到低排取前 N 个词 // 直到它们的概率加起来超过 90%只在这 N 个词里采样 // 相当于自动过滤掉所有太离谱的词实践中的常用组合需要确定性的场景设temperature0, top_p1普通问答设temperature0.7, top_p0.9创意场景设temperature1.0, top_p0.95。不要同时把两个值都调得很极端容易得到奇怪结果。Java 调用 API 时怎么传这两个参数// 以 Claude API 为例 String requestBody { model: claude-sonnet-4-6, max_tokens: 1024, temperature: 0.0, messages: [ { role: user, content: 从以下文本中提取 JSON 格式的姓名和年龄张三28岁 } ] } ; // temperature0 → JSON 抽取场景输出格式稳定不会随机加字段记住一个原则就够了让模型做找答案的事抽取、分类、结构化用低 Temperature让模型做创造内容的事写文案、头脑风暴用高 Temperature。这条规则覆盖了 90% 的 Java 后端 AI 开发场景。

更多文章