AI之_2_大模型核心技术
前言
Github:https://github.com/HealerJean
一、初探大模型:起源与发展
1、大模型是什么?它从哪来?
大语言模型(LLM) 的核心: 海量数据 + 巨大参数 + 强大算力 = 会聊天、会写诗、会编程的“数字大脑”
- 以前我们训练 AI 写文章,就像教小孩背课文——要一句一句地喂。
- 而现在的大模型,是让 AI “读了全网所有书”,然后自己学会思考和表达。
关键词:
- 数据量:几十亿甚至万亿字(比如全网网页、书籍、代码)
- 参数量:几百亿到上千亿个“记忆点”(比如 GPT-3 有 1750 亿参数)
- 训练方式:先“自学成才”(预训练),再“针对性辅导”(微调)
2、解码注意力机制
注意力机制 = 让 AI 学会“盯重点”,不再死记硬背,就像你考试时,重点题画圈圈,非重点题轻轻带过 → AI 也在做同样的事!。
为什么 AI 能“理解”一句话?举个例子:“我爱我的猫,因为它很可爱。”
AI 要知道:“它”指的是“猫”,而不是“我”。这靠的是一个叫 注意力机制(Attention) 的“聪明小助手”。
大白话解释 Attention:想象你在读一段话,眼睛会自动聚焦在关键信息上:
-
看到“猫”,你会想起前面的“我爱……”
-
看到“它”,你会回头找“谁”是“它”
` Transformer` 就是这样工作的:
- 它给每个词打分:“这个字重要吗?”
- 重要的词得分高,影响更大;无关的词被忽略
- 这种“动态关注”的能力,就叫
Attention
3、变革里程碑:Transformer 的崛起
2017 年,Google 发布了一篇论文:《Attention Is All You Need》这篇论文说了一句震惊世界的话:“别用 RNN 和 LSTM 了,只需要 Attention 就够了!”
| 模型 | 记忆力 | 速度 | 是否主流 |
|---|---|---|---|
| RNN | 弱(短记忆) | 慢(串行) | 已淘汰 |
| LSTM | 强(可记长信息) | 慢(仍串行) | 被取代,但仍有轻量场景使用 |
| Transformer | 极强(全局注意力) | 快(并行) | 当前主流(GPT/Qwen 基础 |
Transformer 出现后:
- 全部单词可以同时处理(并行计算)
- 能一眼看到句子两端的关系(比如“他把书给了她”中的“他”和“她”)
- 训练快得多,效果好得多
4、走向不同:GPT 与 BERT 的选择
同样是 Transformer,为啥有两个派系?它们都是基于 Transformer,但“学习方式”完全不同:
- GPT 更擅长“造句”(写故事、写邮件、写代码)
- BERT 更擅长“答题”(判断对错、回答问题、情感分析)
| 模型 | 模型类型 | 目标 | 适合任务 |
|---|---|---|---|
| GPT | 自回归(Autoregressive) |
预测下一个词 | 文本生成、聊天、写作 |
| BERT | 双向上下文(Bidirectional) |
根据前后文猜中间词 | 理解、分类、问答 |
为什么现在大家很少提 BERT 了?
BERT是“理解型”模型,适合做后台任务(比如搜索排序、情感分析)GPT风格模型是“生成型”,能直接和人对话,用户体验更强- 2022 年 ·
ChatGPT· 爆火后,行业重心全面转向“生成式 AI”
| 对比维度 | BERT(Google, 2018) | GPT 系列(OpenAI) |
|---|---|---|
| 开发公司 | Google |
OpenAI |
| 模型类型 | 纯理解型(Encoder-only) | 纯生成型(Decoder-only) |
| 训练目标 | 根据前后文猜中间词 | 预测下一个词 |
| 能否生成完整文本? | 不能 (只能填空,无法从头写) | 能 (可写故事、邮件、代码等) |
| 能否做理解任务? | 原生支持 (分类、问答、情感分析等) | 间接支持 (通过 Prompt + 生成答案实现) |
| 适合聊天机器人? | 不适合 (无法持续生成回复) | 非常适合 |
| 用户如何使用它? | 输入完整句子 → 直接输出标签/向量 | 输入提示(Prompt) → 生成后续文本 |
| 类比角色 | 侦探 (分析已有信息,找出真相) | 演员/作家 (即兴表演,创造内容) |
5、GPT 模型家族:从始至今
| 版本 | 时间 | 关键突破 | 一句话总结 |
|---|---|---|---|
| GPT-1 | 2018 | 第一个基于 Transformer 的语言模型 |
“第一个证明:光靠 Transformer 就能学会语言。” |
| GPT-2 | 2019 | 参数翻倍,支持 zero-shot(零样本学习) |
“不用教就会干——AI 开始‘举一反三’。” |
| GPT-3 | 2020 | 1750亿参数,超强泛化能力 |
“参数爆炸,能力突变——AI 第一次让人感到‘可怕’。” |
| GPT-3.5 | 2022 | 优化版本,更便宜、更快 | “从‘聪明但任性’变成‘懂事又贴心’——AI 学会了‘做人’。” |
| GPT-4 | 2023 | 多模态、更强推理、更少幻觉 | “不再是‘语言模型’,而是‘世界模型’的雏形。” |
1)为什么 ChatGPT 一上线就火遍全球?
虽然它用的是 GPT-3.5,但它不是简单地“复制粘贴”答案,而是做了三件大事:
a、 对话式交互(Chat Interface)
不再是输入问题→输出答案,而是像和真人聊天一样:这种体验前所未有!
- 用户:“帮我写一封辞职信。”
- AI:“好的,请告诉我你的职位、公司名称和原因。”
- 用户补充后,
AI输出完整信件。
b、人类反馈强化学习(RLHF)
让真人去评价
AI回答的好坏,然后教 AI “怎么说话更像人”。
- 好的回答得高分,差的被纠正
- 经过多次训练,AI 学会了“礼貌、准确、有逻辑”
场景设定:你想让 AI 帮你写一封 辞职信。
没有 RLHF 的 AI(原始 GPT)可能这样回答:
-
“老板,我不干了。这破公司天天加班,工资还低,老子受够了!明天我就走人。”
-
虽然“表达了辞职”,但语气粗鲁、不专业、容易惹麻烦。
经过 RLHF 训练后的 AI(比如 ChatGPT)会这样回答:
- 尊敬的[领导姓名]: 感谢您在过去一年中给予我的信任与支持。经过慎重考虑,我决定辞去目前在公司担任的[职位]一职,最后工作日预计为[日期]。 这个决定并不轻松,但我希望在未来追求新的职业发展方向。我会全力配合交接工作,确保平稳过渡。 再次感谢您的理解与栽培!
RLHF 是怎么做到的?
- 第一步:收集人类反馈
- 真人看到两个回答:“粗鲁版” vs “礼貌版”
- 他们给“礼貌版”打高分,给“粗鲁版”打低分
- 第二步:训练一个“打分模型”(
Reward Model)- 这个模型学会判断:“什么样的回答更像人、更得体”
- 第三步:用强化学习优化
AIAI不断生成回答 → 打分模型给分 → 高分行为被保留,低分被惩罚- 最终,AI 自动“学会做人”
c、提示工程(Prompt Engineering)
教用户如何“提问”才能得到更好结果: 这种“引导式使用”让用户更容易上手
- 不要说:“写个故事”
- 要说:“写一个关于太空旅行的科幻短篇,主角是机器人,结尾要有反转”
2)GPT-4:一个新的开始
- 在
SAT考试中成绩超过 90% 的考生 - 在编程竞赛中击败大多数人类选手
- 能写剧本、写小说、写代码、做数据分析……
| 功能 | 提升 |
|---|---|
| 多模态 | 能看图、识图、理解图像内容(比如看一张照片说“这是猫在沙发上睡觉”) |
| 推理能力 | 更擅长数学、编程、逻辑推理(能一步步解题) |
| 减少幻觉 | 更少“胡说八道”,回答更可靠 |
| 上下文长度 | 支持超长文本(最长可处理 32,768 个 token) |
| API 接口开放 | 企业可以接入,开发自己的 AI 应用 |
3)大模型的未来在哪?
- AI 成为每个人的“数字大脑”
- 从“工具”变为“伙伴”
- 普通人也能用
AI创造价值
| 时期 | 核心技术 | 代表产品 | 用途 |
|---|---|---|---|
| 2010s | 规则 + 统计模型 | 早期翻译机 | 单一任务 |
| 2018–2022 | Transformer + BERT/GPT |
BERT, GPT-3 | 理解与生成 |
| 2023–至今 | 大模型 + RLHF + 多模态 |
ChatGPT,GPT-4,Qwen |
通用智能助手 |
二、提示学习 —— 教 AI 思考的艺术
会提问的人,才能驾驭 AI。”—— 提示学习不是魔法,而是和 AI 对话的高级技巧。
-
[基础提示] → “请写……(明确要求)”
-
[思维链] → “请一步步推理……”
-
[自洽性] → (开发者:多次调用+投票;用户:“请仔细检查……”)
-
[思维树] → “请列出多个方案并比较优劣……”
| 方法 | 作用 | 大白话解释 | 提示词可用? | 适合谁用? |
|---|---|---|---|---|
| 基础提示 | 明确需求 | 你要啥,我就给你啥 | 是 | 所有人 |
思维链(CoT) |
展示推理过程 | 让我一步一步想清楚 | 是 | 所有人 |
| 自洽性 | 提高答案一致性与可靠性 | 多想想,别前后矛盾 | 否 | 主要是开发者 ,普通用户可用“检查类”提示替代 |
思维树(ToT) |
探索多种方案 | 别只走一条路,看看别的方向 | 是 | 所有人 |
1、什么是提示学习(Prompt Learning)
1)什么是“提示”?
提示 = 你给 AI 的“指令”或“引导语” 就像你教小朋友做题时说:“先看题目,再列公式。”
- 差的提示:“写个故事。”
- 好的提示:“写一个关于太空旅行的科幻短篇,主角是机器人,结尾要有反转,不超过500字。”
2)为什么提示这么重要?
好的提示 = 明确目标 + 给出约束 + 提供上下文
因为大模型不是“全能神”,它是“基于上下文生成内容的机器”。 你给它什么信息,它就根据这些信息“推理+输出”。类比:
- 你去餐厅点菜,只说“来个吃的” → 厨师懵了
- 你说“来份红烧肉,少糖,微辣,配米饭” → 厨师秒懂
3)提示学习的核心思想:
提示学习 = 把模糊需求转化成 AI 能理解的“操作手册”。
举例:请为‘人工智能发展史’制作一份10页的PPT大纲,每页包括标题、要点、建议配图,风格简洁现代。”
| 层级 | 方法 | 说明 |
|---|---|---|
| 基础层 | 直接提问 | 帮我写一封辞职信” |
| 进阶层 | 指令明确化 | 写一封专业、礼貌的辞职信,用于互联网公司产品经理岗位,离职原因是想学习AI,长度200字左右” |
| 高阶层 | 引导思维过程 | 请一步步分析这个问题,先列出可能原因,再评估每个方案的优劣 |
2、思维链(Chain-of-Thought, CoT)
把“黑箱”变成“透明箱”让
AI像人一样“边想边说”,而不是“直接报答案”。
1)为什么 AI 会“跳步”?
比如你问:“如果买3个苹果,每个5元,总共多少钱?”
AI 可能直接答:“15元。”
但你想让它展示思考过程,怎么办?
2)思维链
让 AI 不只是“给出答案”,而是“一步一步地想”。
差提示:
计算:3 × 5 = ?
回答:15
好提示(加思维链):
请一步步思考并解答:3个苹果,每个5元,总共多少钱?
回答:
> 1. 每个苹果价格是5元
> 2. 买了3个苹果
> 3. 总价 = 3 × 5 = 15元
> 4. 答案:15元
3)为什么这有用?
- 提升准确性:避免“胡说八道”
- 便于调试:你能看到哪里错了
- 适合复杂任务:如数学题、编程、推理
4)实际应用案例:让 AI 写代码
差提示:
“写一个函数,判断是否为素数。”
输出:可能直接贴一段代码,但不解释。
好提示(CoT):
“请分步骤写出一个判断素数的
Python函数,并说明每一步的作用。”
🤖 输出:
- 定义函数
is_prime(n)- 如果 n < 2,返回 False(小于2不是素数)
- 从2到√n遍历,检查是否有因子
- 若无因子,返回 True
- 否则返回 False
- 代码如下:
def is_prime(n): if n < 2: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True
3、自洽性(Self-Consistency)
1)为什么 AI 有时前后矛盾?
比如你问:
“中国最大的城市是哪个?”
AI 可能第一次答“北京”,第二次答“上海”。
这叫“幻觉+不一致”。
2)解决方案:自洽性(Self-Consistency)
让 AI 多次推理,选择最一致的答案,就像你在考试前反复检查答案,确保自己不会犯低级错误。。
问题:下列哪项是碳的同位素?A. 氧-16 B. 碳-14 C. 氢-1 D. 氮-14”
普通模式:
AI可能随机选 A 或 B
自洽性模式:
- 让
AI生成5条推理路径:- 路径1:碳的同位素是碳-12、碳-13、碳-14 → 选 B
- 路径2:氧是8号元素,与碳无关 → 排除 A
- 路径3:氢是1号元素 → 排除 C
- 路径4:氮是7号元素 → 排除 D
- 路径5:碳-14 是放射性同位素 → 选 B
- 统计结果:B 出现 4 次,其他各1次
- 最终输出:B. 碳-14
3)适用场景:
- 科学问答
- 数学题
- 法律/医疗咨询(要求高准确率)
4、思维树(Tree-of-Thoughts, ToT)
就像你在做人生规划时,画一张“决策树”——考虑各种选择和后果。
1)当一个问题有多个解法时,怎么办?
比如:“如何用最少的钱买到3个苹果?”
可能方案:
- 找超市打折
- 去批发市场
- 自己种苹果
- 朋友送你
AI不能只选一个,要探索多种可能性。
2)解决方案:思维树(Tree-of-Thoughts)
让
AI像人类一样“分支思考”,尝试不同路径,选择最优解。
问题:“设计一个低成本创业项目,适合大学生。”
ToT 流程:AI 会评估每个路径的可行性、成本、收益,最终推荐:“校园快递代收”作为最佳方案。
根节点:低成本创业项目
├─ 分支1:线上服务
│ ├─ 子分支1.1:代写论文 → 风险高,易被举报
│ └─ 子分支1.2:视频剪辑 → 需技能,但市场大
├─ 分支2:本地服务
│ ├─ 子分支2.1:校园快递代收 → 成本低,需求稳定
│ └─ 子分支2.2:二手书交易 → 需资源,但环保
└─ 分支3:知识付费
└─ 子分支3.1:在线辅导 → 需专业知识,回报高
3)优势:
- 适合开放性问题
- 能找到非显而易见的解决方案
- 提升创造性思维
三、大模型开发基础
所有语言模型的背后,都有一套将文字变成数字的魔法系统,这就是 Embedding(嵌入)
1、通用人工智能的前夜
Embedding是通往AGI的“桥梁”。
什么是“通用人工智能”(AGI = Artificial General Intelligence = 人工通用智能)?
AGI 是指:像人一样思考、学习、适应各种任务的智能体。
目前我们离 AGI 还很远,但已经迈出了重要一步—— 从“规则驱动”到“数据驱动”再到“表示驱动”。
| 阶段 | 方法 | 局限 |
|---|---|---|
| 1. 规则系统 | 人工写规则(如“如果下雨,就带伞”) | 太死板,无法处理新情况 |
| 2. 机器学习 | 用数据训练模型(如识别猫) | 只能做特定任务 |
| 3. 表示学习(Embedding) | 把知识“编码”成向量,支持泛化 | 支持多任务、跨领域 |
2、三个世界”与“图灵测试”
1)「三个世界」 → 理解现实的哲学框架
三个世界相互关联,但又各自独立。人类的特殊之处在于,我们能够将世界一的体验(世界二),转化为世界三的知识,并利用世界三的知识去改造世界一。
- 世界一 是“有形的物质”,是基础。
- 世界二 是“无形的体验”,是主观感受。
- 世界三 是“可传递的知识”,是人类集体智慧的结晶。
a、物理世界(客观世界)
- 是什么? 由所有物理客体和事件组成的世界。
- 包含什么? 物质、能量、一切有机和无机物质。简单说,就是我们能用感官直接接触、测量和观察到的客观实在。
- 例子: 山川河流、你的身体、手机、电脑、光、声音、温度等。
b:心理世界(主观世界)
- 是什么? 由心灵主体及其感知事件组成的世界。
- 包含什么? 所有的心理状态和过程,如感觉、知觉、意识、情绪、欲望、痛苦、快乐、信念、意图等。这是个体的主观体验。
- 例子: 看到红色时产生的“红”的感觉、失恋时的心痛、对未来的期待、正在思考问题的意识流。
c、知识世界(客观知识世界)
- 是什么? 由客观知识组成的世界。
- 包含什么? 思想的内容,这些思想可以被物化(具体化)为各种形式的人造产品和文化产品。它超越了个人的心理状态,成为独立于个体存在的客观存在。
- 例子:
- 语言文字:一本书、一篇论文、一段代码。
- 艺术作品:一幅画、一首歌、一部电影。
- 技术产品:智能手机、计算机、汽车的设计图。
- 抽象概念:科学理论(如相对论)、数学公式、法律条文、社会制度、哲学问题、猜想、反驳等。
d、为什么这对理解 AI 很重要?
AI的强大在于其处理世界三的能力,但其局限也根植于它无法真正进入世界二和世界一的深度
- 当前的
AI(如ChatGPT)主要在世界三中活动:它处理、分析、生成和重组已有的知识和信息(文本、数据)。 - 它能“感知”世界一的信息(通过传感器),但缺乏对世界一的直接、真实的物理体验和交互能力。
- 它能“模仿”世界二的表达(如共情话语),但无法真正拥有世界二的主观体验(如真正的痛苦或喜悦)。
2)图灵测试(Turing Test)
1950年,英国计算机科学家艾伦·图灵(
Alan Turing)发表了一篇具有划时代意义的论文《计算机器与智能》(Computing Machinery and Intelligence),首次系统地探讨了机器是否能思考这一深刻问题。
a、含义
核心规则:如果一台机器能够通过电传设备(如键盘和屏幕)与人类进行对话,而人类无法仅凭对话内容判断出对方是机器还是人,那么这台机器就可以被认为具有“智能”或“会思考”。
简单理解:可以把它想象成一场“角色扮演”游戏:机器扮演人类,人类裁判需要通过聊天来识别谁是真人、谁是机器。如果机器成功伪装,让裁判分不清,它就算“通过”了测试。
b、ChatGPT 通过图灵测试了吗?
- 在“行为表现”上:部分通过(对非专业用户,短对话中可能被骗)。
- 在“智能本质”上:彻底失败(无意识、无理解、无真实意图)。
b、ChatGPT 的真相:“高明的模仿者”
-
为什么它“看似通过”图灵测试?
- 它被喂了万亿级人类对话数据,学会预测“人类接下来会说什么”。
- 例如你问:“失恋了怎么办?” → 它调取数据库中高赞安慰话术,拼凑出“共情”回复。
- 结果:普通人在短对话中容易被骗(尤其情绪脆弱时)。
-
为什么它“根本没通过”本质测试?
人类智能 ChatGPT(当前大模型) 验证案例 理解上下文 仅记住最近几段对话(“上下文窗口”限制) 问:“刚才说的‘它’指什么?” → 常答错 拥有常识 依赖训练数据,缺乏物理世界体验 问:“冰块放进热水会怎样?” → 可能说“融化”(但不懂热力学) 真实意图 没有目标,只是响应输入 说“我想帮你” → 本质是概率生成,无“想”字含义 情感体验 无感受,所有“共情”是预设话术 安慰你时,它甚至不知道“悲伤”是什么感觉
3、计算机的数学表示
1)计算机怎么存储信息?
计算机只能处理 0 和 1,所以一切都要变成数字。
| 阶段 | 方法 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| 1. 早期 | ASCII 扩展 | 字符 → 数值 | 简单、高效 | 只支持单一语言 | 单一语言系统 |
| 2. 全球化 | Unicode + UTF-8 | 全球统一编码 | 支持多语言 | 仅用于存储 | 所有现代系统 |
| 3. 机器学习 | One-hot | 每个词一个独热向量 | 简单直观 | 维度高、无语义 | 小规模任务 |
| 4. 深度学习 | 词嵌入(Embedding) | 词 → 高维稠密向量 | 捕捉语义、高效 | 需要大量数据 | 大模型、推荐、搜索 |
a、从 ASCII 到深度学习
在上世纪 70 年代,计算机刚兴起时,主要用英文。为了表示字符,人们发明了 ASCII 码
-
什么是
ASCII?-
每个字符用 8 位二进制 表示(即 1 字节)
-
只能表示 128 个字符(0~127)
-
包括:英文字母 A-Z、a-z、数字 0-9、标点符号、控制字符
-
- 优点:简单、统一、高效
-
缺点:只能表示英文,没法表示中文、日文等
- 解决方案:ASCII 扩展,为了支持其他语言,各地开发了自己的“扩展编码”:
| 编码 | 地区 | 特点 |
|---|---|---|
| GB2312 | 中国大陆 | 支持简体中文,共 6763 个汉字 |
| Big5 | 台湾地区 | 支持繁体中文,约 13000 个汉字 |
| EUC-JP | 日本 | 支持日文假名和汉字 |
b、Unicode 和 UTF-8:全球通用的字符编码
问题1:为什么需要 Unicode
答案:因为世界上的语言太多了,不能每个国家都搞一套自己的编码。于是,Unicode 应运而生。
问题2:什么是 Unicode?
答案:Unicode 是一个包含全世界所有字符的统一编码标准。
优点:兼容 ASCII,节省空间,支持多语言
缺点:复杂,解析需额外逻辑
c、One-hot 编码(词汇表):机器学习中的第一代表示
问题1:为什么需要 One-hot?
答案:计算机只能处理数字,所以必须把文字转成数值。早期方法:One-hot 编码
问题2: 什么是 One-hot?
答案:把每个词表示为一个长度等于词汇表大小的向量,其中只有一个位置是 1,其余全是 0。
例子:假设词汇表有 5 个词:[“猫”, “狗”, “鱼”, “汽车”, “房子”]
-
“猫” →
[1, 0, 0, 0, 0] -
“狗” →
[0, 1, 0, 0, 0] -
“汽车” →
[0, 0, 0, 1, 0]
类比:就像给每个人发一张 10 万人名单,只有自己名字打勾 → 你想知道谁和你“相似”?根本不可能!
| 问题 | 说明 |
|---|---|
| 维度太高 | 如果词汇表有 10 万个词 → 向量长度就是 10 万!内存吃不消 |
| 稀疏性严重 | 几乎全是 0,浪费计算资源 |
| 没有语义信息 | “猫”和“狗”距离一样远,即使它们都是动物 |
优点:简单直观,容易计算
缺点:维度爆炸 + 无法捕捉语义关系
d、基于深度学习的语言模型:词嵌入(Word Embedding)
问题1:为什么需要新方法?
答案:One-hot 太笨了!我们需要一种能自动学习语义关系的方法。于是,基于深度学习的词嵌入(Word Embedding) 出现了。
问题2:什么是词嵌入?
答案:**将每个词映射到一个高维稠密向量(通常几百维),这个向量可以捕捉词语的语义信息。 **
优点:
- 维度低(如
512维),节省内存 - 向量密集,便于计算
- 相似词在空间中靠近 → 可以做语义搜索、类比推理
例子:
- → “猫”和“狗”距离近 → 它们是同类
- → “猫”和“汽车”距离远 → 不相关
| 词 | 向量(简化版) |
|---|---|
| 猫 | [0.8, 0.2, 0.1] |
| 狗 | [0.7, 0.3, 0.2] |
| 鱼 | [0.1, 0.8, 0.3] |
| 汽车 | [0.9, 0.1, 0.4] |
为什么不能直接看数字大小?:只看某一个维度没意义!要看整体方向!
- “猫”的第一个数是 0.8,“狗”是 0.7 → 很接近
- “猫”和“汽车”第一个数都是 0.8 和 0.9 → 更接近?那为啥说“猫和汽车不相关”?
1)Embedding(嵌入)技术中最核心的数学操作
答案是:用“余弦相似度”(Cosine Similarity)。
a、关键思想:看“方向”,不是看“位置”
Embedding 关心的是:两个向量在高维空间中的“夹角”。
- 夹角小 → 方向一致 → 语义相似
- 夹角大 → 方向不同 → 语义无关
b、如何判断“近”还是“远”?
“在
AI的眼里,世界不是由词语组成的,而是由方向组成的。
‘猫’和‘狗’之所以近,不是因为它们长得像, 而是因为人类在千万次使用中,把它们放在了同一个‘语义方向’上。”
| 方法 | 说明 |
|---|---|
| 用余弦相似度 | 计算两个向量的夹角余弦值 |
| 看数值大小 | > 0.7:很可能相关 0.3~0.7:弱相关 < 0.3:基本无关 |
| 不要信简化例子 | 教学用的低维向量会误导,真实 embedding 是高维的 |
| 语义决定方向 | 相似的事物,在高维空间中“指向同一片区域” |
4、表示学习与嵌入
让机器“理解”语言的秘密武器
1)什么是“表示”?
“表示” = 把现实世界的东西(文字、图像、声音)转换成机器能计算的数字形式。
人类 vs 机器
- 人类看到“猫”,脑子里会浮现:毛茸茸、会叫、宠物、可爱……
- 机器只认识数字。它看到“猫”,必须把它变成一串数字,才能处理。
2)早期方法:One-Hot 编码(为什么不够用?)
One-Hot 只知道“是不是这个词”,不知道“这个词是什么意思”。
1)方法:每个词一个“开关”
假设词汇表有 4 个词:[猫, 狗, 鱼, 汽车]
- “猫” → [1, 0, 0, 0]
- “狗” → [0, 1, 0, 0]
- “汽车” → [0, 0, 0, 1]
2)优点:简单、直观
3) 缺点:没有语义信息!
4) 实验对比:
- “猫” 和 “狗” 的距离 = √[(1-0)² + (0-1)² + …] = √2
- “猫” 和 “汽车” 的距离 = √2
→ 完全一样! 但现实中,“猫”和“狗”明明更像啊!
3)突破:表示学习(Representation Learning)
1)核心思想:不要人工设计表示,让机器自己从数据中“学会”如何表示!
这就像教小孩认字:
- 不是告诉他“A 是第 65 个字母”
- 而是让他在千万次阅读中,自然理解“A”出现在哪些词里、代表什么
2)真实案例:Word2Vec(2013 年)
谷歌提出 Word2Vec,训练模型预测上下文。
训练句子:“我喜欢吃苹果。
模型学到:
- “吃” 周围常出现 “苹果”、“饭”、“面包” → 这些词向量接近
- “我” 周围常出现 “喜欢”、“觉得”、“认为” → 这些词向量接近
结果惊人:
| 类比任务 | 模型输出 |
|---|---|
| 国王 - 男人 + 女人 = ? | 女王 |
| 巴黎 - 法国 + 日本 = ? | 东京 |
3)什么是“嵌入”(Embedding)?
Embedding = 一个低维稠密向量,用来表示某个对象(词、句子、用户、商品等)的“语义特征”。
a、嵌入是表示学习的一种形式
1)大白话解释:
- 表示学习 = 教机器怎么“看懂”世界
- 嵌入 = 其中一种最常用的方法,就像“翻译官”
2)类比:
- 你去外国旅行,需要一个翻译器把中文变成英文
- 在
AI中,“嵌入”就是那个翻译器,把“猫”变成“[0.8, 0.2, 0.1]”这样的向量
b、将高维数据映射到低维空间
目的:把高维稀疏的数据(比如
one-hot编码)转化为低维稠密向量,保留语义信息。
1)什么是“高维数据”?
- 举个例子:一个文档有 10000 个词 → 每个词都是一个维度 → 总共 10000 维
- 这就是“高维数据” → 维度太多,计算慢,内存吃不消
2)什么是“低维空间”?
- 把这 10000 维压缩成 512 维或 128 维
- 保留关键信息,去掉冗余
c、嵌入可以是词嵌入、图像嵌入、图嵌入等”
不管是什么数据,都可以变成一个“向量”来表示其本质特征
三种常见类型:
| 类型 | 说明 | 例子 |
|---|---|---|
| 词嵌入(Word Embedding) | 把词变成向量 | “猫” → [0.8, 0.2, 0.1] |
| 图像嵌入(Image Embedding) | 把图片变成向量 | 一张猫的照片 → [0.7, 0.3, 0.9, …] |
| 图嵌入(Graph Embedding) | 把社交网络、知识图谱变成向量 | “张三”和“李四”是朋友 → 向量接近 |
4)Word Embedding 和 Language Model
- 传统词嵌入(
Word Embedding)- 是静态的 → 一个词一个向量
- 银行”永远是同一个意思(其实是“平均意思”)。
- 现代语言模型(
Language Model)- 是动态的 → 同一个词,上下文不同,向量也不同
- “河边的银行” = 河岸,“存钱的银行” = 金融机构。
传统方法 → Word Embedding → Language Model
↓ ↓ ↓
静态词向量 → 上下文无关 → 上下文相关
5、表示学习怎么学
人类教 AI 的不是答案,而是‘理解的方式’。 —— 表示学习(Representation Learning)正是这一思想的核心。
让机器自己从数据中“学会”如何表示事物,而不是靠人手写规则。
- 不告诉它“猫有什么特征”
- 而是给它看几百万张带标签的图片,让它自己总结规律
- 表示学习不是死记硬背,而是通过观察、比较、总结,自己学会“怎么看世界”。
| 问题 | 答案 |
|---|---|
| 表示学习是什么? | 让机器自动学会如何用数字表示事物 |
| 怎么学? | 通过上下文、对比、重构等方式 |
| 学什么? | 语义、关系、风格、行为模式…… |
| 有什么用? | 搜索、推荐、对话、分类、生成…… |
| 普通人能用吗? | 能!OpenAI、HuggingFace 都提供现成 embedding |
1)上下文预测 -> 看邻居学关系
“经常一起出现的东西,大概率有关系。”
-
“吃 ___” 后面常是“苹果”“饭” → 模型就把“吃”和“苹果”拉近。
-
就像小孩听多了“爸爸开车”,就知道“爸爸”和“车”有关。
2)对比学习 -> 比着学差别
“相似的拉近,不同的推开。”
例子:同一张猫图变个角度,mbedding 要接近;猫图 vs 狗图,embedding 要远离。
像老师说:“这两张是一只猫,这张是狗——你要分清!”
3)自编码 -> 压缩再还原
能还原出来,说明你真懂了。
例子:把整段话压缩成一个短向量,再试着还原原文。还原得越准,说明这个向量抓到了重点。
就像让你用一句话总结电影——能说准,才算看懂。
三、实战 Embedding
1、准备工作
1)python安装
-
安装:
brew install python -
版本:
python3 --version -
路径:
which python3 -
环境:
~/.bash.profile,-
alias python=python3 alias pip=pip3
-
-
pip list:列出当前 Python 环境中已安装的所有第三方包(库)及其版本号
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [/opt/homebrew] - [662]
└─[$] vim ~/.bash.profile [14:53:25]
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [/opt/homebrew] - [663]
└─[$] source ~/.bash.profile [14:54:07]
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [/opt/homebrew] - [664]
└─[$] python3 --version [14:54:14]
Python 3.13.3
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [/opt/homebrew] - [665]
└─[$] pip3 list [14:54:27]
Package Version
------- -------
pip 25.1.1
wheel 0.45.1
2)sentence-transformers python库
sentence-transformers能把任意一段文本(句子、段落、问题、文档)转换成一个固定长度的向量(比如 384 维、768 维),这个向量能“捕捉语义”,使得语义相近的句子在向量空间中距离很近。
- 基于预训练
Transformer模型(如 BERT、RoBERTa、MPNet) - 专门针对“句子对”任务微调(使用对比学习、孪生网络等技术)
- 输出池化后的句向量(不再是 token 级,而是整句级)
- 开箱即用:提供上百个在通用/多语言/特定领域微调好的模型
# 1. 创建一个专属虚拟环境(名字叫 venv,也可叫 myproject)
python3 -m venv venv
# 2. 激活虚拟环境
source venv/bin/activate
# 3. 现在 pip 安装就安全了!
pip3 install sentence-transformers
# 4、 升级 pip(可选但推荐)
pip install --upgrade pip
# 写代码...
python app.py
# 5、退出虚拟环境
deactivate
3)sentence-transformers 是大模型吗
你本地安装的是一个轻量级、免费、开源的“语义编码器”(embedding 模型),不是大语言模型,但它已经足够强大,能支撑搜索、推荐、RAG 等核心应用。它不是用来生成文字的 AI,而是专门把文字变成向量的小模型。
a、安装的是什么?
你运行这行代码时:
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
程序自动从 Hugging Face 下载了一个叫 bge-small-zh-v1.5 的模型。
- 它是由 北京智源研究院(
BAAI) 开发的 - 功能单一:只做一件事——把中文句子变成
512维向量 - 大小:约
100MB(非常小) - 类型:
Embedding模型,是表示学习模型,不是生成式大模型
b、它能聊天 or 写代码吗?
完全不能!这个模型没有生成能力,它只会:
输入:一段文字
输出:一个固定长度的数字列表(向量)
如果你想让它“回答问题”,必须搭配其他组件(比如 RAG + 大模型)。
2、实战-把中文变成向量
from sentence_transformers import SentenceTransformer
# 加载中文 embedding 模型(首次会自动下载,约 100MB)
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
# 输入任意中文
text = "我喜欢吃苹果。"
# 生成 embedding
embedding = model.encode(text)
print("向量长度:", len(embedding)) # 输出:512
print("前5个维度:", embedding[:5])
向量长度: 512
前5个维度: [-0.0111083 0.01596327 0.02920211 0.08485841 -0.03033804]
3、实战-相关文档搜索
目标:给定一个问题,从一堆文档中找出最相关的那篇。
- 先把所有文档都变成
embedding - 用户输入问题:“我想养一只猫,有什么建议?”
- 计算用户问题和每篇文档的相似度
- 返回最接近的一篇
# ====== 相当于 Java 的 import ======
# 导入 SentenceTransformer 类(类似 Java 的 "import com.example.SentenceTransformer;")
# 这个库能将文本转换为语义向量(embedding)
from sentence_transformers import SentenceTransformer
# 导入 NumPy,用于高效数值计算(类似 Java 中用 double[] + MathUtils,但更强大)
import numpy as np
# ====== 初始化 AI 模型(相当于 new 一个预训练模型对象)======
# 加载一个专门针对中文优化的开源 embedding 模型
# 模型名称:'BAAI/bge-small-zh-v1.5'
# - BAAI:北京智源研究院开发
# - small:轻量版(速度快,内存小)
# - zh:支持中文
# - v1.5:版本号
# ⚠️ 首次运行会自动下载模型(约 100MB),之后就离线可用
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
# ====== 定义文档库(相当于 Java 中的 List<String> documents)======
documents = [
"猫是一种可爱的宠物,喜欢抓老鼠。",
"狗是人类最好的朋友,忠诚又聪明。",
"苹果公司发布了新款 iPhone。",
"我昨天在公园散步,看到一只小猫。"
]
# ====== 定义函数:将文本转为向量(相当于 Java 的 public double[] getEmbedding(String text))======
def get_embedding(text):
"""
输入一段中文文本,返回它的语义向量(一个长度为 512 的 float 数组)
内部调用 model.encode(),类似调用一个 AI 推理引擎
"""
return model.encode(text) # 返回类型:numpy.ndarray(可理解为 double[])
# ====== 定义函数:计算两个向量的余弦相似度(相当于 Java 工具方法)======
def cosine_sim(a, b):
"""
计算两个向量 a 和 b 的余弦相似度
公式:cosθ = (a·b) / (||a|| * ||b||)
返回值范围:[-1, 1],越接近 1 表示语义越相似
"""
# np.dot(a, b) → 向量点积(a·b)
# np.linalg.norm(a) → 向量 a 的 L2 范数(即欧几里得长度 ||a||)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# ====== 主逻辑开始 ======
# 1. 【批量编码】把所有文档转成向量(相当于 for 循环调用 getEmbedding)
# 结果:docs_embeddings 是一个列表,每个元素是一个 512 维向量
docs_embeddings = [get_embedding(doc) for doc in documents]
# ↑ 这是 Python 的“列表推导式”,等价于 Java:
# List<double[]> docsEmbeddings = documents.stream()
# .map(this::getEmbedding)
# .collect(Collectors.toList());
# 2. 用户提问(相当于 String query = "...")
query = "我想养一只猫,有什么建议?"
# 3. 把用户问题也转成向量
query_embedding = get_embedding(query)
# 4. 【计算相似度】遍历所有文档向量,计算与问题的相似度
# 结果:scores 是一个 float 列表,每个值表示对应文档的相关性
scores = [cosine_sim(query_embedding, doc_emb) for doc_emb in docs_embeddings]
# 5. 找出相似度最高的文档索引
# np.argmax(scores) → 返回 scores 中最大值的下标(int)
# int(...) → 显式转为 Python int(虽然通常不需要,但更清晰)
best_idx = int(np.argmax(scores))
# 6. 输出结果
print("最相关文档:")
print(documents[best_idx]) # 打印最相关的原始文本
print("相似度:", scores[best_idx]) # 打印相似度分数(比如 0.78)
最相关文档:
猫是一种可爱的宠物,喜欢抓老鼠。
相似度: 0.6237301


