揭秘大语言模型的底层逻辑:从文本分词到高维向量的计算之旅

在当前人工智能迅猛发展的时代,大型语言模型(Large Language Models, LLM)已经深刻地改变了人机交互的模式。从简单的问答到复杂的代码生成,LLM 展现出了令人惊叹的"理解"能力。然而,计算机底层的运行机制决定了它只能处理数字、向量和矩阵。它是如何看懂中文、英文乃至各种编程语言的?

本文将剥开大模型神秘的外衣,以零基础的视角,深入浅出地讲解文本从输入到被模型理解的全过程。我们将重点探讨两个核心概念:分词(Tokenization)词嵌入(Embedding) ,并结合实际代码演示如何通过数学计算来衡量语义的相似度。

一、 认知转换:机器眼中的世界

在深入技术细节之前,我们需要建立一个基础认知:大语言模型的本质是一个极其复杂的数学函数。 神经网络无法直接处理像"A"、"中"或"Hello"这样的字符序列。如果想让模型处理文本,我们必须建立一套将自然语言映射到数学空间的规则。整个语言模型处理文本的标准工作流可以概括为以下几个步骤:

  1. Prompt(文本输入) :人类以自然语言输入问题或指令。
  2. Tokenizer(编码器) :将连续的文本切割成离散的符号,并转换为数字 ID。
  3. Embedding(向量化) :将离散的数字 ID 映射为高维度的连续向量,赋予其数学语义。
  4. LLM(Transformer 网络) :根据输入的向量,通过注意力机制(Attention)计算并预测下一个最优解的向量。
  5. Decoder(解码器) :将模型输出的向量/数字 ID 重新转换为人类可读的文本。

接下来,我们将逐一拆解这套流程中最关键的前端处理部分。

二、 Tokenization(分词):语言模型消化的最小单位

1. 为什么必须分词?

人类阅读是基于字或词的,而机器处理文本如果以单个字母为单位,效率会极低,且难以捕捉词汇组合的含义;如果以整个句子为单位,由于句子的组合是无穷无尽的,模型根本无法建立足够大的词表。因此,我们需要一种折中的方案------分词。

分词是将文本切分成一系列的片段(Token)。Token 是大模型计价和工作的最小单位。 根据主流大模型的统计规律:

  • 1 个英文字符大约对应 0.3 个 Token(一个英文单词通常被切分成 1-2 个 Token)。
  • 1 个中文字符大约对应 0.6 个 Token(由于汉字的复杂性,有时一个汉字会占用多个 Token)。

模型在推理时,本质上就是"根据上一个 Token,预测下一个 Token",逐步生成完整的长文本。

2. BPE 算法与 cl100k_base 编码

现代大模型(如 GPT 系列)通常采用 BPE(Byte Pair Encoding,字节对编码)算法。BPE 并不是简单地按空格或标点符号切分,而是通过统计大规模语料库中字符组合的出现频率,将高频组合合并为一个 Token。

cl100k_base 是目前非常经典且广泛使用的一种编码规则。它决定了具体的文本到底该如何被映射。

3. 代码实践:文本的编码与解码

以下是一个基于 JavaScript 的分词演示程序。我们使用了 js-tiktoken 库来模拟 cl100k_base 的分词过程。

JavaScript

arduino 复制代码
import { getEncoding } from 'js-tiktoken'

// 1. 初始化编码器
// 我们选择 GPT 官方广泛使用的编码器规则 cl100k_base
const enc = getEncoding('cl100k_base');

// 2. 准备一段混合了中英文的文本
const text = 'Hello Tiktoken!你好,世界!'

// 3. 编码 (Encode):将人类文本转换为机器可读的 Token 数组
const tokens = enc.encode(text);

// 此时如果打印 tokens,你会看到一个由纯数字组成的数组(即 Token ID)
// 例如: [ 9906, 12345, ... ]
console.log("Token IDs:", tokens, "Total Tokens:", tokens.length);

// 4. 解码 (Decode):将模型输出的 Token ID 还原为人类文本
const decodeText = enc.decode(tokens)
console.log("Decoded Text:", decodeText);

原理解析:

在这个代码块中,encode 方法的作用查阅了一本庞大的字典。它将输入文本切分后,在字典中找到对应的编号(ID)。对于模型来说,它看到的不再是"Hello",而是一个特定的整数(例如 9906)。由于这是一个不可逆向解析的独立编号,此时的 Token ID 依然缺乏语义信息,它们仅仅是字典里的索引。

三、 Embedding(嵌入/向量化):从符号到语义的跨越

1. 突破离散符号的局限

经过 Tokenization 后,我们得到了一串数字 ID(如 ID: 215 和 ID: 100)。但在数学上,215 并不代表它的含义比 100 丰富,它们只是毫无关联的离散符号。如果直接将这些 ID 喂给神经网络,模型无法知道"国王"和"皇帝"是相近的词,也无法理解"苹果"作为水果和作为手机品牌时的差异。

这就是 Embedding(文本嵌入) 发挥作用的地方。

2. 什么是高维向量化?

Embedding 的核心思想是将每个 Token 或者整段文本,映射到一个极其高维的连续数学空间中(通常数百到数千维,例如 1024 维)。

你可以将向量理解为一个多维坐标。每一维都在衡量文本的某种"特征"(尽管这些特征是机器自我学习得出的,人类很难用确切的语言描述每一维代表什么,比如第 1 维可能代表时态,第 2 维代表情感色彩,第 3 维代表物理属性等等)。

经过向量化后,文本变成了一组在 −1-1 −1 到 11 1 之间浮动的实数。在这个多维空间里,语义相近的文本,它们的坐标位置也会非常接近。 这样,机器就获得了"理解语义"的数学基础。

3. 代码实践:调用 Embedding 接口

下面这段代码展示了如何使用 API 将文本转换为 1024 维的向量。

JavaScript

javascript 复制代码
import OpenAI from 'openai'
import dotenv from 'dotenv'

dotenv.config()

// 初始化客户端,这里使用了兼容 OpenAI 接口标准的阿里百炼(DashScope)服务
const client = new OpenAI({
  apiKey: process.env.DASHSCOPE_API_KEY,
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1'
})

// 定义获取文本嵌入向量的异步函数
async function getEmbedding(text) {
  const res = await client.embeddings.create({
    model: 'text-embedding-v4', // 指定使用的 Embedding 模型
    input: text,                // 输入的自然语言文本
    dimensions: 1024,           // 指定输出向量的维度大小
  });
  // 返回包含 1024 个浮点数的数组
  return res.data[0].embedding;
}

原理解析:

当传入一段文本时,底层的大模型不仅会切分 Token,还会结合上下文语境(Context),为这段文本生成一个独特的 1024 维数组。即使两个句子的字面完全不同,只要它们表达的意思一样,生成的数组数据也会极度相似。这从根本上解决了传统字符串匹配(如正则表达式)无法处理"语义等价"的问题。

四、 余弦相似度计算:量化语义的距离

获取了文本的高维向量后,我们如何用数学方法来衡量两段文本的"意思"到底有多像?在机器学习中,最常用的几何方法是 余弦相似度(Cosine Similarity)

1. 数学原理

在多维空间中,每个向量都可以看作是从原点出发的一条射线。余弦相似度并不关心这两条射线的绝对长度(即文本的长短),而是关心它们方向上的夹角。

夹角越小(余弦值越接近 1),说明两个向量指向同一个语义方向,文本意思越相近;夹角越大(甚至完全相反,余弦值为 -1),说明语义毫无关联或截然相反。

计算公式如下:

Cosine Similarity= A⋅B∥A∥∥B∥ = ∑i=1n AiBi ∑i=1n Ai2 ∑i=1n Bi2 \text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} Cosine Similarity=∥A∥∥B∥A⋅B=∑i=1nAi2 ∑i=1nBi2 ∑i=1nAiBi

其中, A\mathbf{A} A 和 B\mathbf{B} B 分别代表两个文本的向量, nn n 为向量的维度(在我们的例子中为 1024)。

2. 代码实践:计算相似度并进行对比

我们将上述公式转换为纯 JavaScript 代码,并测试三组不同语义的文本。

JavaScript

ini 复制代码
// 余弦相似度计算函数
function cosineSimilarity(vecA, vecB) {
  let dot = 0, magA = 0, magB = 0;
  // 遍历每一个维度,累加点积和各自的模长平方
  for (let i = 0; i < vecA.length; i++) {
    dot += vecA[i] * vecB[i];
    magA += vecA[i] ** 2;
    magB += vecB[i] ** 2;
  }
  // 计算最终的余弦值
  return dot / (Math.sqrt(magA) * Math.sqrt(magB));
}

async function run() {
  // 准备三段测试文本
  // text1 和 text2 字面完全不同(中英文交杂 vs 纯中文),但语义高度一致
  const text1 = 'Andrej Karpathy LLM Tokenization 分词管理'
  const text2 = '卡帕西讲解大模型BPE字词分词';
  // text3 与前两者毫无关联
  const text3 = "今天天气晴朗,适合出门散步"
  
  // 1. 获取高维向量
  const vec1 = await getEmbedding(text1);
  const vec2 = await getEmbedding(text2);
  const vec3 = await getEmbedding(text3);
  
  // 2. 比较语义相似度
  const similarity1_2 = cosineSimilarity(vec1, vec2);
  const similarity1_3 = cosineSimilarity(vec1, vec3);
  
  console.log("Text1 与 Text2 的相似度 (语义相近):", similarity1_2); 
  // 预期结果:非常接近 1 (例如 0.85 左右)
  
  console.log("Text1 与 Text3 的相似度 (语义无关):", similarity1_3);
  // 预期结果:非常低 (例如 0.1 左右甚至更低)
}

run();

深度分析:

上述实验有力地证明了,现代大模型已经突破了"字面匹配"的限制。Andrej Karpathy 是一位著名的人工智能专家(前 Tesla AI 总监,OpenAI 早期创始成员,曾发布过长达 3 小时的经典大模型入门教程)。text1 用英文提到了他的名字、LLM 和 Tokenization;text2 用中文的音译"卡帕西"、大模型和 BPE 分词表达了完全一致的核心概念。

通过 Embedding 向量化,计算机能够在 1024 维的数学空间中发现它们紧密重合的坐标。这种技术正是如今各类搜索引擎、智能客服、文档问答(RAG 架构)能够精准理解用户意图的核心基石。

五、 大语言模型学习路径与生态延伸

理解了底层的 Token 和 Embedding 机制后,我们也就推开了一扇通往 LLM 世界的大门。在宏观层面上,大模型的技术体系是由多种先进思想交织而成的。

1. 核心架构:Transformer 与 Attention 机制

前文提到的编码器和解码器,都建立在一个伟大的架构之上------由 Google 在 2017 年提出的 Transformer 模型。Transformer 彻底抛弃了以往串行处理文本的模式,引入了 注意力机制(Attention Mechanism) 。它让模型在处理某一个 Token 时,能够同时"环顾四周",评估上下文中其他所有 Token 对当前词的重要性。正是这种全局视野,赋予了大模型处理长文本的强大能力。在此基础上,通过海量数据预训练和后期微调(Fine-tuning),模型最终具备了逻辑推理能力。

2. 理论与工具的学习体系

为了系统掌握这些技术,业内有许多顶级的学习资源:

  • 吴恩达(Andrew Ng)的体系课:如《AI For Everyone》和《Generative AI For Everyone》,是理解 AI 产业价值的最佳入门。
  • Andrej Karpathy 的深度讲解:如"3小时大模型入门教程",能够帮助开发者从零手搓一个微型网络,透彻理解其本质。

在掌握理论后,更重要的是实践:

  • AI 提效工具:熟练利用辅助编程工具(如各种 AI 代码补全工具)实现"Vibe Coding"(在心流状态下借助 AI 极速完成项目)。
  • RAG 与个人知识库:结合本文讲解的 Embedding 技术,利用 Google 的 NotebookLM 或在 Obsidian 这类第二大脑笔记软件中构建私人知识问答系统。
  • Agent 开发:从单纯的调用 API,进阶到开发能够自主拆解任务、利用工具解决现实问题的智能体。

结语

从人类敲击键盘输入的一句问候,到计算机屏幕上输出的智能长文,这背后是一场宏大的"跨维"计算旅程。分词(Tokenization)将混沌的语言结构化为离散的零件;嵌入(Embedding)将离散的零件升华为充满语义的高维坐标;而余弦相似度等数学工具,则丈量了思想的距离。

理解这些底层逻辑,不仅能打破我们对 AI 的神秘感,更能帮助我们在未来的技术浪潮中,不再仅仅做一个旁观的使用者,而是成为真正掌握规律的创造者。

相关推荐
moMo1 小时前
AI工程化 03:给模型喂上下文
人工智能
天平10 小时前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
火山引擎开发者社区10 小时前
没有长期记忆,Agent 谈何持续进化?一图看懂火山 Mem0:解锁 Agent 持续学习与进化之路
人工智能
冬奇Lab13 小时前
Workflow 系列(06):安全——跨步骤注入传播与四层防御
人工智能·工作流引擎
冬奇Lab14 小时前
每日一个开源项目(第149篇):RAG-Anything - 把图片、表格、公式当成一等公民的多模态 RAG 框架
人工智能·开源
米小虾14 小时前
AI Agent 安全实战指南:当智能体开始"不听话",开发者该如何应对?
人工智能·安全·agent
IT_陈寒15 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端