计算机不像人类那样理解词语和句子。它们处理的是数字。因此,让机器处理语言的首要障碍是将文本转换为模型可以实际操作的数字形式。这个过程包含两个主要步骤:将文本分解为易于处理的小块,称作分词;然后将这些分词表示为数字列表,称作嵌入。将文本分解为分词假设你有一个句子:“LLMs learn language patterns.”LLM通常不会一下子处理整个句子,甚至不是逐词处理,而是将文本分解成更小的单位,称作分词。一个分词可能是一个完整的词、一个词的一部分(子词),甚至只是标点符号。将文本分解为分词的过程称为分词处理。特定文本如何分词,取决于所使用的分词器,它通常与LLM本身一同选择和训练。考虑以下示例:"Large Language Models" 可能会变成 ["Large", " Language", " Models"] (三个分词)"tokenization" 可能会变成 ["token", "ization"] (两个分词,捕获词根和后缀)"isn't" 可能会变成 ["is", "n't"] (两个分词)" U.S.A." 可能会变成 [" U", ".", "S", ".", "A", "."] (六个分词,包括空格和标点)下面是一个句子如何进行分词的简单图示:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [color="#868e96"]; subgraph cluster_sentence { label = "输入文本"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; node [shape=plaintext]; sentence [label="LLMs learn language patterns."]; } subgraph cluster_tokens { label = "分词"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; t1 [label="LLMs", fillcolor="#a5d8ff"]; t2 [label=" learn", fillcolor="#a5d8ff"]; t3 [label=" language", fillcolor="#a5d8ff"]; t4 [label=" patterns", fillcolor="#a5d8ff"]; t5 [label=".", fillcolor="#a5d8ff"]; } sentence -> t1 [style=invis]; // Use invis edge for positioning if needed {rank=same; sentence; t1} // Keep sentence and first token aligned t1 -> t2 [style=invis]; t2 -> t3 [style=invis]; t3 -> t4 [style=invis]; t4 -> t5 [style=invis]; }一个句子被分解成单个的分词。请注意,空格有时也可以是分词的一部分(例如“ learn”)。为什么要使用子词?将文本分词为子词有助于模型处理不熟悉的词语或变体。如果模型知道“token”和“ization”,即使它在训练期间没有经常看到“tokenization”这个词,它也可能理解。这也有助于控制唯一分词的总量(即词汇表),使其易于管理。一旦分词完成,模型词汇表中的每个唯一分词都会被分配一个特定的整数ID。“LLMs” -> 5842“ learn” -> 3410“ language” -> 1 linguagem“ patterns” -> 11394“.” -> 13因此,我们的句子在数字上变成了一串ID:[5842, 3410, 1 linguagem, 11394, 13]。从分词到嵌入:捕捉含义这些整数ID告诉模型它正在识别哪个分词,但它们本身并没有捕捉到分词之间的含义或关联。ID 3410(“ learn”)与ID 1 linguagem(“ language”)之间并没有内在关联,即使它们经常一同出现。这就是嵌入的作用。嵌入是一个由数字组成的密集列表,也称为向量,它表示一个分词。每个分词不再是单一的ID,而是被映射到一个可能有数百或数千个维度(数字)的向量。分词ID: 5842 (“LLMs”) -> 嵌入向量: [0.12, -0.45, 0.67, ..., -0.09] (例如,768个数字长)分词ID: 3410 (“ learn”) -> 嵌入向量: [-0.23, 0.01, 0.88, ..., 0.51]分词ID: 1 linguagem (“ language”) -> 嵌入向量: [-0.10, 0.15, 0.91, ..., 0.44]这些嵌入向量不是手动分配的;它们是模型在大量的训练过程中学到的。模型会调整这些向量中的值,使得在相似语境中使用的分词最终具有相似的嵌入向量。可以将此视为在高维空间中为每个分词分配坐标。含义相似或用法相似的分词(如“dog”和“puppy”,或“run”和“ran”)将在这个空间中拥有“靠近”彼此的向量。相反,不相关的分词(如“car”和“banana”)的向量将相距很远。虽然我们无法轻易地可视化数百或数千个维度,但可以想象一个简化的二维空间:{"layout": {"xaxis": {"title": "维度 1", "zeroline": false, "range": [-1.5, 1.5]}, "yaxis": {"title": "维度 2", "zeroline": false, "range": [-1.5, 1.5]}, "title": "简化的二维嵌入空间", "showlegend": false, "margin": {"l": 40, "r": 20, "t": 40, "b": 40}, "width": 500, "height": 400}, "data": [{"x": [-0.8, 0.9, -0.7, 0.8], "y": [0.7, 0.8, -0.6, -0.7], "mode": "markers+text", "text": ["国王", "女王", "男人", "女人"], "textposition": "top right", "marker": {"color": ["#4263eb", "#7048e8", "#1c7ed6", "#ae3ec9"], "size": 10}, "type": "scatter"}]}在这个简化的二维空间中,含义相关的词语(如“国王”和“女王”,或“男人”和“女人”)可能比不相关的词语位置更接近。实际的嵌入存在于更高的维度中。这种向量表示比简单的ID要丰富得多。它能捕捉到LLM通过大量文本数据训练所学到的语义关联、语法作用和上下文的细微差异。总结:输入文本被分解为分词(词、子词、标点符号)。每个分词都被映射到一个唯一的整数ID。每个分词ID都与一个习得的数字向量(称为嵌入)相关联。这些嵌入捕捉了含义和关联,它们是LLM核心部分实际处理的数字输入。这种从文本到有含义的数字向量(嵌入)的转换是使LLM“理解”和处理语言的必要第一步。接下来的章节将考察模型如何使用这些嵌入来执行预测下一个词等任务。