前端大模型入门(三):编码(Tokenizer)和嵌入(Embedding)解析 - llm的输入

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文介绍了大规模语言模型(LLM)中的两个核心概念:Tokenizer和Embedding。Tokenizer将文本转换为模型可处理的数字ID,而Embedding则将这些ID转化为能捕捉语义关系的稠密向量。文章通过具体示例和代码展示了两者的实现方法,帮助读者理解其基本原理和应用场景。

 LLM的核心是通过对语言进行建模来生成自然语言输出或理解输入,两个重要的概念在其中发挥关键作用:TokenizerEmbedding。本篇文章将对这两个概念进行入门级介绍,并提供了针对前端的js示例代码,帮助读者理解它们的基本原理/作用和如何使用。

1. 什么是Tokenizer?

Tokenizer 是一种将自然语言文本转化为模型可以处理的数字表示的工具。自然语言是由词、子词或字符组成的,而模型无法直接处理这些符号,它们只能处理数字。因此,Tokenizer的主要任务就是将文本转换为一系列数字。

1.1 Tokenizer的工作原理

Tokenizer通过查表的方式,将每个单词、子词或者字符映射为一个唯一的整数ID。这些整数ID作为模型的输入,帮助模型将语言处理为结构化的形式。

以句子“我喜欢学习”为例,一个简单的Tokenizer可能将其分解为每个汉字,并为每个汉字分配一个唯一的整数ID,如下:

  • “我” -> 1
  • “喜欢” -> 2, 3
  • “学习” -> 4, 5

在实际应用中,很多语言模型使用更复杂的分词方式,如子词分割。子词分割允许模型将罕见词分割为多个子词单元,从而提升泛化能力。例如,常见的子词分割方法包括BPE(Byte Pair Encoding)WordPiece,这些方法可以将长词拆分为更小的、频率更高的子词,增强模型处理罕见词汇的能力。

1.2 Tokenizer的种类

  • 词级别(Word-level)Tokenizer:将每个词作为一个Token。适用于语言如英文等分隔明确的文本,但对于中文等无空格分隔的语言不太适合。
  • 子词级别(Subword-level)Tokenizer:基于统计方法,将文本分割为高频子词单元。BPE和WordPiece是常见的子词分割算法。
  • 字符级别(Character-level)Tokenizer:将每个字符视为一个Token。这种方法适用于字符构成较复杂的语言(如中文),但会导致较长的序列输入。

1.3 为什么需要Tokenizer?

  • 将文本转化为数字:语言模型需要处理的是数字而不是文本。Tokenizer将文本符号转换为数字ID,是进入模型的第一步。
  • 词汇管理:通过分词,Tokenizer建立了一个词汇表,其中每个词或子词都对应一个唯一的ID。这让模型可以在推理时迅速查找词的表示。
  • 提升模型的泛化能力:通过分词,特别是子词分词,模型能够处理罕见词和新词,因为它可以将新词拆解为更小的子词单元,避免出现完全未知的词。

1.4 Tokenizer 示例代码

       其实python相关的库比较多,这里就用一个0依赖的js库来测试,自己也可以子串匹配实现。

npm install @lenml/tokenizers

image.gif

import { fromPreTrained } from "@lenml/tokenizer-llama3";
const tokenizer = fromPreTrained();
const tokens = tokenizer.apply_chat_template(
  [
    {
      role: "system",
      content: "你是一个有趣的ai助手",
    },
    {
      role: "user",
      content: "好好,请问怎么去月球?",
    },
  ]
) as number[];
// 转化成token的数组
console.log(tokens);
const chat_content = tokenizer.decode(tokens);
// 还原了的数据
console.log(chat_content);

image.gif

2. 什么是Embedding?

Embedding 是将Tokenizer生成的整数ID转化为稠密的向量表示的过程。与Tokenizer将文本转换为离散的整数ID不同,Embedding生成的是连续的实数值向量,这些向量能够捕捉词之间的语义关系。

2.1 Embedding的工作原理

在Embedding阶段,语言模型通过查表的方式,将每个整数ID映射到一个高维向量空间中的向量。这个向量通常是一个固定维度的向量(例如,300维、512维或768维),用来表示单词或子词的语义特征。

例如,经过Tokenizer处理的文本“我喜欢学习”可能会生成整数ID序列 [1, 2, 3, 4, 5]。在Embedding阶段,这些ID会被转换为稠密向量表示,如:

  • “我” -> [0.25, -0.34, 0.15, ...]
  • “喜欢” -> [0.12, 0.57, -0.22, ...], [0.11, -0.09, 0.31, ...]
  • “学习” -> [0.33, -0.44, 0.19, ...], [0.09, 0.23, -0.41, ...]

这些向量并不是随机生成的,它们是在模型的训练过程中被学习得到的。Embedding向量的维度固定,但向量的数值根据模型对词语上下文的理解不断更新和优化,最终形成一个语义丰富的向量表示。

2.2 Embedding的种类

  • 词向量(Word Embedding):如Word2Vec、GloVe等方法,通过静态词向量将词语映射到向量空间中。这些方法的Embedding是静态的,即同一个词在不同上下文中具有相同的向量。
  • 上下文相关的Embedding:如BERT、GPT等方法生成的Embedding,是基于上下文的动态向量。同一个词在不同的上下文中可能有不同的向量表示,从而更加精准地捕捉语言中的多义性和语境变化。

2.3 为什么需要Embedding?

  • 捕捉词之间的语义关系:通过Embedding,模型可以将语义相似的词表示为相近的向量。例如,“猫”和“狗”的向量在空间中可能非常接近,而“猫”和“车”的向量则会相距较远。
  • 连续性表示:与离散的整数ID不同,Embedding向量是连续的。这使得模型能够更好地进行计算和优化,因为连续的数值表示可以更容易进行梯度计算和模型学习。
  • 语义压缩:Embedding将高维的语言信息压缩到一个固定的向量空间中,这样模型就可以高效地处理输入并捕捉到其中的重要语义特征。

2.4 使用 TensorFlow.js实现一个嵌入层

接下来,我们用 TensorFlow.js 来实现一个简单的Embedding层。

首先安装 TensorFlow.js:

npm install @tensorflow/tfjs

image.gif

然后我们创建一个简单的Embedding层,将Token IDs转换为对应的Embedding向量。

const tf = require('@tensorflow/tfjs');
// 假设词汇表大小为10000,嵌入维度为300
const vocabSize = 10000;
const embeddingDim = 300;
// 创建一个Embedding层
const embeddingLayer = tf.layers.embedding({inputDim: vocabSize, outputDim: embeddingDim});
// 输入是之前Tokenizer的Token IDs
const tokenIds = tf.tensor([[1045, 2293, 4083]]);  // Batch size为1,三个Token
// 使用Embedding层将Token IDs转化为Embedding向量
const embeddings = embeddingLayer.apply(tokenIds);
embeddings.print();  // 输出Embedding结果

image.gif

在这个示例中,我们定义了一个词汇表大小为10000、嵌入维度为300的Embedding层。tokenIds代表之前从Tokenizer生成的Token ID序列,经过Embedding层后,生成对应的300维度的稠密向量。

注意下tfjs在浏览器和nodejs的时候不同的backend性能和表现有点差异,但基本可用,详细接口参考TensorFlow.js API

另外有时候进行向量化比较吃资源,或者需要处理大量文本和超高向量时,可使用各个AI平台提供的接口,一般叫做嵌入/向量化/句向量等

3. Tokenizer和Embedding的关系

在LLM中,TokenizerEmbedding是文本处理的两个连续步骤:

  1. Tokenizer负责将文本分割为Token,并将这些Token映射为离散的整数ID。
  2. Embedding则将这些整数ID进一步转化为稠密的向量表示,以便模型能够进行深度学习和优化。

它们的关系可以简单总结为:Tokenizer将语言中的离散符号表示成模型可以识别的离散ID,而Embedding则将这些离散ID转化为连续的向量,以便捕捉词之间的语义关系。

4. 总结

在大规模语言模型(LLM)中,TokenizerEmbedding是两个基础且关键的步骤。Tokenizer通过分词和映射,将文本转化为模型可以处理的数字序列。而Embedding则将这些数字序列进一步转化为语义丰富的向量表示。这两个步骤共同构成了LLM处理自然语言输入的基础,为模型的语义理解和生成提供了强大的支持。

对于初学者来说,理解Tokenizer和Embedding的作用及其背后的原理,将为深入学习LLM及其应用打下坚实的基础。

看了这么多,作为前端的你,还不赶紧npm install一下然后测试测试? ps: tfjs有cdn版本,简单测试可以直接用url引入,可能比安装更简单就是要等待


相关文章
|
11天前
|
机器学习/深度学习 安全 大数据
揭秘!企业级大模型如何安全高效私有化部署?全面解析最佳实践,助你打造智能业务新引擎!
【10月更文挑战第24天】本文详细探讨了企业级大模型私有化部署的最佳实践,涵盖数据隐私与安全、定制化配置、部署流程、性能优化及安全措施。通过私有化部署,企业能够完全控制数据,确保敏感信息的安全,同时根据自身需求进行优化,提升计算性能和处理效率。示例代码展示了如何利用Python和TensorFlow进行文本分类任务的模型训练。
42 6
|
16天前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
2天前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
21 4
|
11天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
44 1
|
11天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
20 1
|
16天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
15天前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
16天前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
16天前
|
前端开发 JavaScript API
2025年前端框架是该选vue还是react?有了大模型-例如通义灵码辅助编码,就不用纠结了!vue用的多选react,react用的多选vue
本文比较了Vue和React两大前端框架,从状态管理、数据流、依赖注入、组件管理等方面进行了详细对比。当前版本和下载量数据显示React更为流行,但Vue在国内用户量增长迅速。Vue 3通过组合式API提供了更灵活的状态管理和组件逻辑复用,适合中小型项目;React则更适合大型项目和复杂交互逻辑。文章还给出了选型建议,强调了多框架学习的重要性,认为技术问题已不再是选型的关键,熟悉各框架的最佳实践更为重要。
|
21天前
|
JSON 前端开发 JavaScript
前端模块打包器的深度解析
【10月更文挑战第13天】前端模块打包器的深度解析

推荐镜像

更多