在当前人工智能迅猛发展的时代,大型语言模型(Large Language Models, LLM)已经深刻地改变了人机交互的模式。从简单的问答到复杂的代码生成,LLM 展现出了令人惊叹的"理解"能力。然而,计算机底层的运行机制决定了它只能处理数字、向量和矩阵。它是如何看懂中文、英文乃至各种编程语言的?
本文将剥开大模型神秘的外衣,以零基础的视角,深入浅出地讲解文本从输入到被模型理解的全过程。我们将重点探讨两个核心概念:分词(Tokenization) 与 词嵌入(Embedding) ,并结合实际代码演示如何通过数学计算来衡量语义的相似度。
一、 认知转换:机器眼中的世界
在深入技术细节之前,我们需要建立一个基础认知:大语言模型的本质是一个极其复杂的数学函数。 神经网络无法直接处理像"A"、"中"或"Hello"这样的字符序列。如果想让模型处理文本,我们必须建立一套将自然语言映射到数学空间的规则。整个语言模型处理文本的标准工作流可以概括为以下几个步骤:
- Prompt(文本输入) :人类以自然语言输入问题或指令。
- Tokenizer(编码器) :将连续的文本切割成离散的符号,并转换为数字 ID。
- Embedding(向量化) :将离散的数字 ID 映射为高维度的连续向量,赋予其数学语义。
- LLM(Transformer 网络) :根据输入的向量,通过注意力机制(Attention)计算并预测下一个最优解的向量。
- 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 之间浮动的实数。在这个多维空间里,语义相近的文本,它们的坐标位置也会非常接近。 这样,机器就获得了"理解语义"的数学基础。
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=1nAi2 ∑i=1nBi2 ∑i=1nAiBi
其中, A 和 B 分别代表两个文本的向量, 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 的神秘感,更能帮助我们在未来的技术浪潮中,不再仅仅做一个旁观的使用者,而是成为真正掌握规律的创造者。