大语言模型基础:Token、Embedding、Transformer、KV Cache 与 RAG

1. 整体知识框架

理解大语言模型,可以先记住两条主线:

LLM 生成主线

text 复制代码
文字
 ↓
Tokenizer
 ↓
Token
 ↓
Token ID
 ↓
Embedding Table
 ↓
每个 Token 一个初始高维向量
 ↓
加入位置信息
 ↓
多层 Transformer
 ↓
每个 Token 得到上下文化 Hidden State
 ↓
取当前最后位置的 Hidden State
 ↓
LM Head
 ↓
Vocabulary Logits
 ↓
选择下一个 Token
 ↓
KV Cache + Decode
 ↓
继续预测下一个 Token
 ↓
最终回答

RAG 检索主线

text 复制代码
文档
 ↓
Chunk 切分
 ↓
Embedding Model
 ↓
每个 Chunk 一个高维语义向量
 ↓
Vector Database

用户问题
 ↓
Embedding Model
 ↓
Query Vector
 ↓
Cosine Similarity / Euclidean Distance / Dot Product
 ↓
Top-K
 ↓
找到最相关的 Chunks
 ↓
用户问题 + 检索结果
 ↓
LLM
 ↓
最终回答

2. Token 是什么?

大语言模型并不是直接以"汉字"或者"英文单词"为单位处理文本,而是先通过 Tokenizer(分词器) 将文本切分成一个个 Token。

Token 可以理解为:

模型处理文本的基本离散单位。

一个 Token 可能是:

  • 一个汉字
  • 多个汉字组成的片段
  • 一个英文单词
  • 一个英文单词的一部分
  • 标点符号
  • 空格
  • 其他字符片段

例如:

text 复制代码
原始文本:

我爱人工智能

经过 Tokenizer 后可能得到:

["我", "爱", "人工", "智能"]

也可能使用其他切分方式。

具体如何切分取决于模型使用的 Tokenizer 和 Vocabulary。

所以:

Token ≠ 汉字

Token ≠ 单词

Token 是 Tokenizer 根据自己的词表和规则切出来的文本单位。


3. Token 和 Token ID

Tokenizer 不仅负责切分文本,还会根据自己的 Vocabulary(词表),将每个 Token 转换成一个整数编号。

这个整数就是:

Token ID

例如假设:

text 复制代码
"我"   → Token ID 1024
"爱猫" → Token ID 5837

那么:

text 复制代码
"我爱猫"
   ↓
Tokenizer
   ↓
["我", "爱猫"]
   ↓
[1024, 5837]

其中:

text 复制代码
1024
5837

就是两个 Token ID。

可以把 Vocabulary 理解成一张巨大的映射表:

Token Token ID
"我" 1024
"你" 2048
"猫" 8921
"hello" 15339
... ...

4. 同一个 Token 的 Token ID 一样吗?

同一个 Tokenizer 和 Vocabulary 中:

同一个 Token 对应固定的 Token ID。

例如:

text 复制代码
"猫" → 8921

只要使用的是同一个 Vocabulary,那么 "猫" 对应的 ID 就不会一会儿是 8921,一会儿变成 1234

但是:

不同模型 / 不同 Tokenizer 之间,同一个文本片段的 Token ID 不一定相同。

例如:

text 复制代码
模型 A:

"hello" → 15339


模型 B:

"hello" → 8821

甚至两个模型的 Tokenizer 可能连切分结果都不一样。

例如:

text 复制代码
ChatGPT

一个 Tokenizer 可能切成:

text 复制代码
["Chat", "GPT"]

另一个可能切成:

text 复制代码
["Chat", "G", "PT"]

因此:

Token ID 本身没有语义,它本质上只是 Token 在 Vocabulary 中的索引编号。


5. Token ID 如何变成高维向量?

神经网络不能直接通过:

text 复制代码
5837

这样的编号理解语义。

所以 LLM 内部有一张很大的参数矩阵:

Embedding Table(嵌入矩阵)

Token ID 可以理解成这张表的行索引。

例如:

text 复制代码
Token ID = 5837
       ↓
Embedding Table
       ↓
找到第 5837 行
       ↓
[0.12, -0.53, 0.87, 0.21, ...]

于是:

一个 Token ID → 一个初始高维向量。

假设:

text 复制代码
"我爱猫"

被切成:

text 复制代码
["我", "爱猫"]

对应:

text 复制代码
[1024, 5837]

然后查 Embedding Table:

text 复制代码
1024
 ↓
X1 = [0.21, -0.53, 0.87, ...]


5837
 ↓
X2 = [0.72, 0.11, -0.36, ...]

所以:

text 复制代码
2 个 Token
 ↓
2 个 Token ID
 ↓
2 个初始高维向量

如果模型隐藏维度是 4096,那么每个 Token 会得到一个 4096 维向量。


6. Token Embedding 和上下文化向量不是一回事

这是非常重要的区别。

Token ID 通过 Embedding Table 得到的是:

初始 Token Embedding

例如:

text 复制代码
"猫"
 ↓
Token ID:8921
 ↓
Embedding Table
 ↓
[0.12, -0.51, 0.83, ...]

对于同一个模型,这个初始 Embedding 是模型参数的一部分。

但是考虑:

text 复制代码
我喜欢猫

机器猫是一部动画

他是一个夜猫子

虽然其中可能出现相同的 "猫" Token,但上下文完全不同。

所以经过 Transformer 后,这个位置对应的向量会根据上下文发生变化:

text 复制代码
Token ID
 ↓
Embedding Table
 ↓
初始 Token Embedding
 ↓
Transformer
 ↓
结合上下文
 ↓
Contextualized Hidden State
上下文化隐藏向量

因此可以理解为:

Embedding Table 给 Token 一个初始表示;Transformer 再根据上下文不断加工这个表示。


7. 为什么要经过多层 Transformer?

得到初始 Token Embedding 后,模型还没有充分理解 Token 之间的关系。

例如:

text 复制代码
小明没有去上班,因为他生病了。

模型不仅需要处理:

text 复制代码
小明
上班
生病

还需要结合上下文理解:

text 复制代码
"他"
 ↓
指的是
 ↓
"小明"

以及:

text 复制代码
为什么没去上班?
 ↓
因为生病

Transformer 中的 Self-Attention 等机制允许不同位置之间进行信息交互。

因此:

text 复制代码
初始 Token Embedding
       ↓
Transformer Layer 1
       ↓
第一层上下文表示
       ↓
Transformer Layer 2
       ↓
进一步融合和变换
       ↓
Transformer Layer 3
       ↓
...
       ↓
Transformer Layer N
       ↓
最终上下文化表示

假设有三个 Token:

text 复制代码
Token 1
Token 2
Token 3

经过第一层:

text 复制代码
H1¹
H2¹
H3¹

第二层:

text 复制代码
H1²
H2²
H3²

一直到第 N 层:

text 复制代码
H1ᴺ
H2ᴺ
H3ᴺ

可以粗略理解:

每经过一层 Transformer,每个 Token 的表示都会进一步融合上下文并进行特征变换,多层堆叠使模型能够形成越来越复杂的表示。

但不能机械地认为:

text 复制代码
Layer 1 = 识字
Layer 2 = 语法
Layer 3 = 推理

真实模型内部并没有这样严格的人工分工。


8. 大语言模型如何预测下一个 Token?

假设输入:

text 复制代码
我爱猫

为了方便说明,假设 Tokenizer 将其切成:

text 复制代码
["我", "爱猫"]

完整过程:

text 复制代码
文字:"我爱猫"
      ↓
Tokenizer
      ↓
["我", "爱猫"]
      ↓
Token ID
[1024, 5837]
      ↓
Embedding Table
      ↓
两个初始高维向量
      ↓
加入位置信息
      ↓
Transformer Layer 1
      ↓
Transformer Layer 2
      ↓
...
      ↓
Transformer Layer N
      ↓
得到两个最终 Hidden States

H1ᴺ
H2ᴺ
      ↓
取当前最后位置 H2ᴺ
      ↓
LM Head
      ↓
整个 Vocabulary 的 Logits
      ↓
Softmax / Sampling 等
      ↓
选择下一个 Token ID
      ↓
Tokenizer Decode
      ↓
例如:"很"

模型实际上会对整个 Vocabulary 中的 Token 计算分数。

例如简化成:

候选 Token 概率
"我" 1%
"你" 1%
"猫" 3%
"很" 70%
"可爱" 15%
"漂亮" 6%
<EOS> 4%

那么模型可能选择:

text 复制代码
"很"

作为下一个 Token。


9. 为什么使用最后一个位置的 Hidden State?

Decoder-only LLM 是自回归模型。

假设当前已经有:

text 复制代码
我 爱猫

现在模型要解决的问题其实是:

text 复制代码
我 爱猫 [???]

在因果注意力机制下,当前最后位置的 Hidden State 已经融合了它能够看到的前面上下文。

所以:

text 复制代码
最后位置 Hidden State
       ↓
LM Head
       ↓
Vocabulary Logits
       ↓
选择下一个 Token

需要注意:

不是把最后一个 Hidden State 再重新交给整个大模型。

Transformer 本身就是大模型主体的一部分。

正确理解是:

text 复制代码
Transformer
 ↓
最后位置 Hidden State
 ↓
LM Head
 ↓
下一个 Token

10. 生成一个 Token 后会发生什么?

假设:

text 复制代码
我爱猫

模型预测:

text 复制代码

那么逻辑上下一次模型面对的序列就是:

text 复制代码
我爱猫很

然后预测:

text 复制代码
可爱

于是:

text 复制代码
我爱猫很可爱

再预测:

text 复制代码

得到:

text 复制代码
我爱猫很可爱。

继续预测,直到:

  • 生成 <EOS> 等结束 Token
  • 达到最大输出长度
  • 命中停止序列
  • 或触发其他停止条件

因此生成过程可以理解为:

text 复制代码
Prompt
 ↓
预测 Token 1
 ↓
Prompt + Token 1
 ↓
预测 Token 2
 ↓
Prompt + Token 1 + Token 2
 ↓
预测 Token 3
 ↓
...

这就是:

Autoregressive Generation(自回归生成)

即:

模型根据之前已经存在和已经生成的 Token,不断预测下一个 Token。


11. 每生成一个 Token,都要把前面的全部重新计算吗?

从逻辑上看:

每次预测都基于全部历史上下文。

但工程实现上:

通常不会把所有历史 Token 从头完整计算一遍。

否则会产生大量重复计算。

这就引出了:

KV Cache


12. Prefill 和 Decode

LLM 推理通常可以分成两个重要阶段:

  1. Prefill
  2. Decode

12.1 Prefill

假设用户输入:

text 复制代码
我爱猫

模型首先:

text 复制代码
Prompt
 ↓
Tokenizer
 ↓
所有 Input Tokens
 ↓
Embedding
 ↓
多层 Transformer
 ↓
一次处理整个 Prompt
 ↓
建立各 Transformer Layer 的 KV Cache
 ↓
得到下一个 Token 的预测

这个阶段叫:

Prefill

特点:

主要处理用户已经提供的大量输入 Token,可以利用 GPU 做较强的并行计算。


12.2 Decode

假设模型预测出的第一个输出 Token 是:

text 复制代码

接下来不需要把:

text 复制代码
我爱猫

从头完整计算一遍。

而是:

text 复制代码
新 Token:"很"
       ↓
Embedding
       ↓
进入 Transformer
       ↓
读取历史 KV Cache
       ↓
计算当前新 Token
       ↓
把当前 Token 的 K/V 加入 Cache
       ↓
预测下一个 Token:"可爱"

然后:

text 复制代码
新 Token:"可爱"
       ↓
读取已有 KV Cache
       ↓
继续计算
       ↓
预测:"。"

这个阶段叫:

Decode

所以:

text 复制代码
Prompt
 ↓
Prefill
 ↓
建立 KV Cache
 ↓
预测第一个输出 Token
 ↓
Decode
 ↓
Token 1
 ↓
Token 2
 ↓
Token 3
 ↓
...
 ↓
回答结束

13. KV Cache 是什么?

Transformer Attention 中会涉及:

text 复制代码
Q = Query
K = Key
V = Value

历史 Token 的 K 和 V 已经计算过。

如果生成每一个新 Token 时都重新计算所有历史 Token 的 K/V,会造成大量重复计算。

因此可以把历史 Token 的 K/V 保存起来:

text 复制代码
历史 Token
 ↓
计算 K、V
 ↓
保存
 ↓
KV Cache

生成新的 Token 时:

text 复制代码
新 Token
 ↓
计算当前 Token
 ↓
读取历史 KV Cache
 ↓
Attention
 ↓
得到新的 Hidden State
 ↓
预测下一个 Token

而且:

Transformer 的每一层都有对应的 K/V Cache。

因此 KV Cache 大小与很多因素有关,例如:

  • 模型层数
  • 上下文长度
  • Batch Size
  • 并发请求数量
  • K/V Head 数量
  • 数据精度

所以在 LLM 推理部署中:

text 复制代码
Context Length 增大
       ↓
KV Cache 增大
       ↓
显存占用增加
       ↓
可能影响 Batch / 并发
       ↓
影响吞吐量

因此 KV Cache 是 vLLM、TensorRT-LLM 等推理框架中的重要优化对象。


14. 完整 LLM 推理流程

text 复制代码
                        大语言模型 LLM

用户输入文字
     ↓
Tokenizer
     ↓
多个 Token
     ↓
多个 Token ID
     ↓
Embedding Table
     ↓
每个 Token 一个初始高维向量
     ↓
加入位置信息
     ↓
Transformer Layer 1
     ↓
Transformer Layer 2
     ↓
...
     ↓
Transformer Layer N
     ↓
每个位置得到上下文化 Hidden State
     ↓
取当前最后位置 Hidden State
     ↓
LM Head
     ↓
整个 Vocabulary 的 Logits
     ↓
Softmax / Sampling 等
     ↓
选择下一个 Token ID
     ↓
Decode 成文字
     ↓
新 Token 加入当前序列
     ↓
利用 KV Cache
     ↓
Decode 下一个 Token
     ↓
不断循环
     ↓
最终回答

15. RAG 是什么?

RAG 全称:

Retrieval-Augmented Generation

中文:

检索增强生成

核心思想是:

先从外部知识库中检索与用户问题相关的资料,再把这些资料作为上下文交给 LLM 回答。

例如用户问:

text 复制代码
我们公司的年假制度是什么?

LLM 本身可能不知道公司的内部规定。

RAG 可以先:

text 复制代码
用户问题
 ↓
知识库检索
 ↓
找到公司年假制度文档
 ↓
把相关内容交给 LLM
 ↓
LLM 根据资料回答

16. RAG 中的 Embedding 是什么?

这里特别容易和 LLM 内部的 Token Embedding 混淆。

LLM 内部:

text 复制代码
Token ID
 ↓
Embedding Table
 ↓
每个 Token 一个初始向量

而 RAG 的目标通常是:

使用一个高维向量表示一句话、一个 Query 或一个 Chunk 的整体语义。

例如:

text 复制代码
猫是一种非常常见的家庭宠物。

经过 Embedding Model:

text 复制代码
一段文字
 ↓
Tokenizer
 ↓
多个 Token
 ↓
Embedding Model
 ↓
内部处理多个 Token
 ↓
Pooling / 特定输出方式
 ↓
整段文本的一个高维向量

例如:

text 复制代码
[0.17, -0.81, 0.34, ..., 0.52]

这个向量可以作为整段文本的语义表示,用于检索。


17. RAG 为什么要进行 Chunk 切分?

假设有一份:

text 复制代码
100 页 PDF

一般不会直接让整份 PDF 只对应一个向量。

而是先切成:

text 复制代码
原始文档
 ↓
Chunk 1
Chunk 2
Chunk 3
Chunk 4
...

然后:

text 复制代码
Chunk 1 → Embedding → Vector 1
Chunk 2 → Embedding → Vector 2
Chunk 3 → Embedding → Vector 3
...

再存入:

Vector Database(向量数据库)

这样用户提问时,就可以找到最相关的几个局部文本片段,而不是把整份文档全部塞给 LLM。


18. RAG 的完整流程

文档入库阶段

text 复制代码
原始文档
 ↓
解析文本
 ↓
Chunk 切分
 ↓
Chunk 1
Chunk 2
Chunk 3
...
 ↓
Embedding Model
 ↓
Vector 1
Vector 2
Vector 3
...
 ↓
Vector Database

用户查询阶段

text 复制代码
用户问题
 ↓
Embedding Model
 ↓
Query Vector
 ↓
和 Vector Database 中的 Chunk Vector 比较
 ↓
Similarity / Distance Search
 ↓
Top-K
 ↓
找到最相关的几个 Chunks
 ↓
用户问题 + 检索到的 Chunks
 ↓
LLM
 ↓
最终回答

通常 Query 和文档 Chunk 应使用同一套或相互兼容的 Embedding Model,使它们处于可比较的向量空间。


19. RAG 怎么知道两个文本语义相似?

假设:

text 复制代码
用户问题:
家养猫有什么特点?

Embedding:

text 复制代码
用户问题
 ↓
Embedding Model
 ↓
Query Vector

知识库中有:

text 复制代码
Chunk A:
猫是一种常见的家庭宠物。

Chunk B:
飞机依靠机翼产生升力。

Chunk C:
数据库可以用于保存结构化数据。

它们也分别有:

text 复制代码
Vector A
Vector B
Vector C

现在需要解决:

Query Vector 到底和哪个 Chunk Vector 最相似?

这就需要使用向量之间的:

Similarity / Distance Metric(相似度 / 距离度量)

常见方法包括:

  1. Cosine Similarity
  2. Euclidean Distance
  3. Dot Product

20. Cosine Similarity(余弦相似度)

Cosine Similarity 主要关注:

两个向量的方向是否相似。

公式:

cos⁡θ=A⋅B∥A∥∥B∥ \cos\theta = \frac{A \cdot B} {\|A\|\|B\|} cosθ=∥A∥∥B∥A⋅B

其中:

text 复制代码
A、B = 两个向量
θ    = 两个向量之间的夹角

如果:

text 复制代码
θ = 0°
cosθ = 1

表示完全同方向。

如果:

text 复制代码
θ = 90°
cosθ = 0

表示正交。

如果:

text 复制代码
θ = 180°
cosθ = -1

表示完全反方向。

在很多 Embedding 场景下:

Cosine Similarity 越高,通常表示两个文本的语义越接近。

例如:

text 复制代码
用户:
家养猫有什么特点?

Chunk:
猫是一种常见的家庭宠物。

假设:

text 复制代码
Cosine Similarity = 0.91

说明两个向量方向非常接近,因此这个 Chunk 很可能与用户问题相关。


21. Euclidean Distance(欧氏距离)

Euclidean Distance 又叫:

L2 Distance

它衡量的是:

两个向量对应的点在高维空间中的实际距离。

二维情况下:

A=(a1,a2) A=(a_1,a_2) A=(a1,a2)

B=(b1,b2) B=(b_1,b_2) B=(b1,b2)

那么:

d(A,B)=(a1−b1)2+(a2−b2)2 d(A,B)= \sqrt{ (a_1-b_1)^2+ (a_2-b_2)^2 } d(A,B)=(a1−b1)2+(a2−b2)2

三维:

d(A,B)=(a1−b1)2+(a2−b2)2+(a3−b3)2 d(A,B)= \sqrt{ (a_1-b_1)^2+ (a_2-b_2)^2+ (a_3-b_3)^2 } d(A,B)=(a1−b1)2+(a2−b2)2+(a3−b3)2

如果是 1024 维向量,道理完全相同,只不过计算 1024 个维度。


22. 欧氏距离在 RAG 中是干什么的?

如果一个 Embedding Model 学到的向量空间具有这样的性质:

text 复制代码
语义越相似
 ↓
向量在空间中的位置越接近

那么就可以使用欧氏距离进行语义检索。

例如:

text 复制代码
Query Vector = A

Chunk 1 Vector = B
Chunk 2 Vector = C

计算:

text 复制代码
Distance(A, B) = 0.3

Distance(A, C) = 8.7

那么:

text 复制代码
A 和 B 距离很近
→ Chunk 1 更可能和用户问题语义相关

A 和 C 距离很远
→ Chunk 2 相关性可能较低

因此:

Euclidean Distance 也可以用于 RAG / Vector Search 中寻找语义接近的文本。

判断方式:

text 复制代码
距离越小
→ 向量越接近
→ 通常语义越相似

距离越大
→ 向量越远
→ 通常语义差异越大

23. Cosine Similarity 和 Euclidean Distance 的区别

假设:

text 复制代码
A = (1,1)

B = (10,10)

两个向量指向完全相同的方向。

所以:

text 复制代码
Cosine Similarity = 1

但是欧氏距离:

d(A,B)=(10−1)2+(10−1)2=162≈12.73 d(A,B)=\sqrt{(10-1)^2+(10-1)^2}=\sqrt{162}\approx12.73 d(A,B)=(10−1)2+(10−1)2 =162 ≈12.73

说明它们在空间中的实际位置相隔较远。

所以可以形象地理解:

text 复制代码
Cosine Similarity:

"你们两个朝的方向像不像?"


Euclidean Distance:

"你们两个站的位置离得近不近?"

24. 两者都是为了语义检索吗?

在 RAG / Vector Search 场景中:

是的,两者都可以用于寻找语义相似的文本。

但是它们衡量相似性的方式不同。

方法 衡量什么 越相似时
Cosine Similarity 向量方向是否接近 值越大
Euclidean Distance 向量空间位置是否接近 距离越小
Dot Product 向量方向和长度的综合关系 通常值越大

所以 RAG 可以是:

text 复制代码
Query Vector
 ↓
和所有 Chunk Vector 比较
 ↓
┌──────────────────────────────┐
│ Cosine Similarity            │
│ 或 Euclidean Distance        │
│ 或 Dot Product               │
└──────────────────────────────┘
 ↓
排序
 ↓
Top-K
 ↓
最相关 Chunks

具体选择哪一种,需要根据:

  • Embedding Model 的训练方式
  • 模型官方推荐
  • Vector Database 配置

来决定。


25. Cosine 和 Euclidean 有什么关系?

如果两个向量都进行了 L2 Normalization(归一化)

text 复制代码
||A|| = 1
||B|| = 1

那么:

∥A−B∥2=2−2cos⁡θ \|A-B\|^2 = 2 - 2\cos\theta ∥A−B∥2=2−2cosθ

这意味着对于单位向量:

text 复制代码
Cosine Similarity 越大
        ⇕
Euclidean Distance 越小

因此在向量已经归一化的情况下,两种方法得到的排序可能完全一致或非常接近。


26. 三种"向量"不要混淆

这是整个知识体系中非常重要的一点。

26.1 Token Embedding

text 复制代码
Token ID
 ↓
Embedding Table
 ↓
一个初始高维向量

主要作用:

把离散 Token ID 转换成神经网络可以计算的连续向量。


26.2 Transformer Hidden State

text 复制代码
Token Embedding
 ↓
多层 Transformer
 ↓
结合上下文
 ↓
Contextualized Hidden State

主要作用:

表示 Token 在当前上下文中的信息。

同一个 Token 在不同句子中的 Hidden State 可以不同。


26.3 RAG Text Embedding

text 复制代码
一句话 / Query / Chunk
 ↓
Embedding Model
 ↓
一个高维向量

主要作用:

表示整段文本的语义,用于语义搜索、向量检索等。


27. Token 为什么也是 AI 的计费单位?

大模型的计算量与 Token 数量高度相关,因此很多 LLM API 按 Token 计费。

主要分成:

Input Tokens

发送给模型处理的内容,例如:

text 复制代码
System Prompt
用户 Prompt
历史对话
RAG 检索结果
工具调用结果
...

都可能计入 Input Tokens。

Output Tokens

模型生成出来的 Token:

text 复制代码
Token 1
Token 2
Token 3
...

属于 Output Tokens。

因此:

text 复制代码
Total Tokens
=
Input Tokens
+
Output Tokens

例如:

text 复制代码
Input Tokens  = 1000
Output Tokens = 500

Total Tokens  = 1500

28. Input 和 Output 通常分开计价

虽然:

text 复制代码
Total Tokens
=
Input Tokens + Output Tokens

但是很多 API 并不是:

text 复制代码
1500 × 一个统一价格

而是:

text 复制代码
Input Tokens × Input Price
+
Output Tokens × Output Price
=
最终费用

例如假设:

text 复制代码
Input:
$2 / 1M Tokens

Output:
$8 / 1M Tokens

如果:

text 复制代码
Input  = 1M Tokens
Output = 1M Tokens

那么:

text 复制代码
输入费用 = $2

输出费用 = $8

总费用 = $10

实际 API 还可能存在:

text 复制代码
Cached Input Tokens

等其他计费类别。


29. 为什么 Output Token 往往更贵?

输入阶段主要是:

text 复制代码
大量 Input Tokens
 ↓
Prefill
 ↓
GPU 可以高度并行处理

而输出阶段:

text 复制代码
Token 1
 ↓
Token 2
 ↓
Token 3
 ↓
Token 4
 ↓
...

因为:

text 复制代码
必须先得到 Token N
       ↓
才能确定下一轮输入
       ↓
再预测 Token N+1

因此 Decode 具有明显的自回归串行特征。

所以很多模型:

Output Token 的 API 单价会高于 Input Token。


30. 多轮聊天为什么越来越消耗 Token?

假设第一轮:

text 复制代码
用户输入:1000 Tokens
AI 输出:1000 Tokens

第二轮用户只新输入:

text 复制代码
100 Tokens

但是模型为了理解上下文,系统可能还需要把之前相关对话一起作为输入:

text 复制代码
之前用户:1000
之前 AI:1000
本轮用户:100
----------------
Input ≈ 2100 Tokens

如果模型再回答:

text 复制代码
Output = 1000 Tokens

那么这一轮可能产生:

text 复制代码
Input  ≈ 2100
Output ≈ 1000

Total ≈ 3100 Tokens

而不是:

text 复制代码
100 + 1000 = 1100

因此:

对话越长、Prompt 越大、RAG 检索内容越多、Agent 工具结果越多,Token 消耗通常越大。

实际系统还可能使用:

Prompt Caching / Cached Input

降低重复上下文的成本。


31. "买了 100 万 Token"是什么意思?

需要看具体平台的定义。

标准模型 API 一般会明确区分:

text 复制代码
Input Tokens
Output Tokens
Cached Input Tokens
...

但是某些第三方平台所谓:

text 复制代码
购买 1000 万 Token

可能实际上是平台自己的:

text 复制代码
Credits
积分
Token 额度

例如可能规定:

text 复制代码
普通模型 ×1
高级模型 ×10

Input ×1
Output ×4

因此:

第三方平台所说的"1000 万 Token",不一定代表可以真实输入 + 输出 1000 万个模型 Token。

必须查看具体平台的计费规则。


32. LLM 与 RAG 的关系

可以把两者放到一起理解。

text 复制代码
                       用户问题
                          │
              ┌───────────┴───────────┐
              │                       │
              ↓                       ↓
            RAG                      LLM
              │                       │
       Embedding Model           Tokenizer
              │                       │
        Query Vector               Token ID
              │                       │
       Vector Database        Token Embedding
              │                       │
       Similarity Search       Transformer
              │                       │
           Top-K             Hidden States
              │                       │
       相关知识 Chunks                 │
              │                       │
              └──────→ Prompt ────────┘
                          ↓
                         LLM
                          ↓
                       LM Head
                          ↓
                    下一个 Token
                          ↓
                       KV Cache
                          ↓
                        Decode
                          ↓
                     不断循环生成
                          ↓
                       最终回答

需要注意:

RAG 负责"找资料",LLM 负责"理解上下文并生成答案"。


33. 核心概念速记表

概念 核心含义
Tokenizer 将文本切分并编码为 Token ID
Token 模型处理文本的基本离散单位
Token ID Token 在 Vocabulary 中对应的整数编号
Vocabulary Token 与 Token ID 的映射词表
Embedding 将离散信息转换成连续高维向量
Embedding Table 根据 Token ID 查找初始 Token 向量的参数矩阵
Token Embedding 一个 Token 的初始高维表示
Transformer 通过 Attention 等机制融合上下文并进行多层特征变换
Hidden State Token 经过 Transformer 后得到的上下文化表示
LM Head 将 Hidden State 映射到 Vocabulary 的 Logits
Logits 模型对 Vocabulary 中各 Token 给出的原始分数
Autoregressive 根据已有 Token 不断预测下一个 Token
Prefill 一次处理 Prompt,并建立后续生成需要的状态
Decode 生成阶段逐 Token 预测
KV Cache 缓存历史 Token 各 Transformer 层的 K/V
Text Embedding 用一个高维向量表示 Query / Chunk 等整段文本
Vector Database 存储和检索高维向量
Cosine Similarity 比较两个向量方向是否接近
Euclidean Distance 比较两个向量在空间中的实际距离
Dot Product 通过点积衡量向量关系,可用于向量检索
Top-K 取相关性最高的 K 个检索结果
RAG 先检索外部知识,再让 LLM 基于知识生成答案
Input Tokens 输入给模型处理的 Token
Output Tokens 模型生成的 Token
Total Tokens Input Tokens + Output Tokens

34. 一句话理解 Token

Token 是 Tokenizer 对文本切分后得到的基本处理单位;每个 Token 在 Vocabulary 中对应一个 Token ID。


35. 一句话理解 Embedding

Embedding 就是把离散的 Token、文本等信息转换成神经网络可以计算和比较的高维连续向量。


36. 一句话理解 Transformer

Transformer 通过多层 Attention 和神经网络计算,让每个 Token 的初始向量不断融合上下文信息,最终形成上下文化的 Hidden State。


37. 一句话理解 LLM 生成

LLM 将文字转换成 Token ID 和向量,经过多层 Transformer 得到 Hidden State,再利用最后位置的 Hidden State 预测下一个 Token,并通过 KV Cache 高效地逐 Token 循环生成,直到回答结束。


38. 一句话理解 RAG

RAG 将文档 Chunk 和用户问题通过 Embedding Model 转换成语义向量,再使用 Cosine Similarity、Euclidean Distance、Dot Product 等方法检索最相关的 Chunk,最后把检索到的知识交给 LLM 生成答案。


39. 一句话区分 Cosine 和 Euclidean

Cosine Similarity 看两个向量"朝的方向像不像";Euclidean Distance 看两个向量"在空间中的位置离得近不近"。二者都可以用于 RAG 的语义向量检索。


40. 最终知识链路

LLM

text 复制代码
文字
 ↓
Tokenizer
 ↓
Token
 ↓
Token ID
 ↓
Embedding Table
 ↓
Token Embedding
 ↓
多层 Transformer
 ↓
Contextualized Hidden States
 ↓
最后位置 Hidden State
 ↓
LM Head
 ↓
Vocabulary Logits
 ↓
选择下一个 Token
 ↓
KV Cache
 ↓
Decode
 ↓
继续预测
 ↓
最终回答

RAG

text 复制代码
文档
 ↓
Chunk
 ↓
Embedding Model
 ↓
Text Embedding
 ↓
Vector Database
        ↑
        │
用户问题
 ↓
Embedding Model
 ↓
Query Embedding
 ↓
Cosine Similarity
或 Euclidean Distance
或 Dot Product
 ↓
Top-K Chunks
 ↓
用户问题 + 检索结果
 ↓
LLM
 ↓
最终答案

41. 最终总结

整个大语言模型和 RAG 的基础逻辑可以浓缩成:

text 复制代码
                    AI 处理文字的核心

                         文字
                          ↓
                       Token
                          ↓
                      Token ID
                          ↓
                       向量化
                          ↓
              ┌───────────┴───────────┐
              ↓                       ↓
             LLM                     RAG
              ↓                       ↓
      Transformer 计算          Embedding Model
              ↓                       ↓
       理解上下文关系             语义向量
              ↓                       ↓
      预测下一个 Token           Vector Search
              ↓                       ↓
        不断循环生成              找相关知识
              │                       │
              └──────────┬────────────┘
                         ↓
                      最终回答

最重要的是理解这几个转换:

text 复制代码
文字
→ Token
→ Token ID
→ 高维向量

在 LLM 中:

text 复制代码
高维向量
→ Transformer
→ 上下文化 Hidden State
→ LM Head
→ 下一个 Token
→ 循环生成

在 RAG 中:

text 复制代码
文本
→ Embedding Model
→ 整段文本的语义向量
→ Vector Database
→ 相似度 / 距离检索
→ Top-K
→ LLM

因此可以把两者概括为:

LLM 的核心任务是根据上下文不断预测下一个 Token;RAG 的核心任务是在 LLM 生成之前,通过向量语义检索给模型找到更相关、更可靠的外部知识。


💬 如果本文对你有帮助,欢迎点赞 + 收藏 + 分享

📌 更多 AI 工程实践内容,欢迎关注「YoanAILab」

相关推荐
像风一样自由202034 分钟前
19.Milvus数据分片扩展与高并发设计
postgresql·大模型·milvus·rag·智能体
Dawson Zhu2 天前
AI Agent 基础架构解析:从 LLM 到 ReAct 循环与 Harness 工程的工程化路径
人工智能·语言模型·架构·aigc·agi
Feynman’s boom2 天前
PDF解析文字提取后RAG仍然检索不准
python·pdf解析·rag
ShallWeL2 天前
RAG 命中后的引用格式与拒答规则
agent·知识库·rag·智能体
咖啡星人k2 天前
2026 GraphRAG 知识图谱:给大模型装上“关系地图“,多跳问题不再答非所问(MonkeyCode 免费上手)
人工智能·机器学习·语言模型·自然语言处理·知识图谱
JAI科研2 天前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
淬炼之火2 天前
笔记:Visually-Guided Policy Optimization for Multimodal Reasoning
人工智能·笔记·算法·机器学习·语言模型·自然语言处理
咖啡星人k2 天前
2026 AI Agent 智能体:ReAct 让 AI 边想边做、把大任务拆成小步骤(MonkeyCode 实战)
人工智能·深度学习·机器学习·语言模型·自然语言处理