LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn

工具介绍

  • tiktoken:OpenAI开发的专业"分词器"

  • torch:Facebook开发的强力计算引擎,相当于超级计算器

理解词嵌入:给词语画"肖像"

  • 传统方法:给每个词一个编号(就像学生学号)

  • 词嵌入:给每个词画一幅多维画像(就像用颜色、形状、纹理描述一幅画),但是计算机理解不了这样的描述,所以我们转成多维向量来描述每个词

 例如:

"国王" → [0.8, -0.2, 0.5]

"王后" → [0.7, -0.1, 0.6]

"苹果" → [0.1, 0.9, -0.3]

计算机通过计算向量相似度(如余弦相似度)就可以知道“国王”与“王后”关系更密切,与“苹果”没什么关系!

文本分词:把文章切成"词块"

(LLM对于长文本的识别能力限制,所以要切块)

第一步:读取文本

with open("sample.txt", "r", encoding="utf-8") as f:raw_text = f.read()

第二步:分词器切分文本

举例:“Hello world.”

# 简单切分:按空格切割
["Hello,", " ", "world."]
import re
# 专业切分:同时处理标点符号
text = "Hello, world. Is this-- a test?"
result = re.split(r'([,.?_!"()\']|--|\s)', text)
#正则表达式 r'([,.?_!"()\']|--|\s)' 匹配以下任意一种情况:
#单字符标点符号:,.?_!"()'
#双连字符 --
#空白字符 \s
#括号 () 将整个模式捕获为一个分组,确保 re.split 保留分隔符。
#空字符串 '' 出现在连续分隔符或字符串末尾时,表示相邻分隔符之间的空匹配。切割结果:['Hello', ',', 'world', '.', 'Is', 'this', '--', 'a', 'test', '?']

第三步:清理切割结果

# 清除空白碎片
result = [item.strip() for item in result if item.strip()]
#对于单个字符串,可使用strip()方法移除首尾空白

通过这种处理,计算机从"看到一堆字母"变成"理解词语之间的关系"。

将词元转换为词元IDs 

举例解释这样做的目的:

        老师记不住所有学生名字 → 用学号点名

        计算机记不住所有词语 → 用数字ID处理文本

优势:

  1. 计算机处理数字比处理文本快得多

  2. 数字形式更适合数学计算(比如词嵌入)

  3. 统一格式方便存储和传输

第一步:收集所有词(去重)

all_words = sorted(list(set(preprocessed)))  # 用集合去重,列表装好所有词,sorted排序
vocab_size = len(all_words)

第二步:创建词语↔ID的映射表

# 像单词表一样:单词 → 序号
vocab = {"!":0, '"':1, "'":2, ... "He":50} # 同时也需要序号 → 单词的反向映射
int_to_str = {0:"!", 1:'"', 2:"'", ... 50:"He"}

举例:一个词对应一个特殊的ID,方便查找

词语ID词语ID
!0HAD46
"1Had47
'2Hang48
(3......

创建分词器

#基础版分词器
class SimpleTokenizerV1:def __init__(self, vocab):self.str_to_int = vocab  # 词语→IDself.int_to_str = {i:s for s,i in vocab.items()}  # ID→词语def encode(self, text):  # 文本 → 数字# 1. 分割文本为词语# 2. 清理空白# 3. 查表转换为IDreturn [self.str_to_int[s] for s in preprocessed]def decode(self, ids):  # 数字 → 文本# 1. ID转回词语# 2. 拼接成句子# 3. 修复标点空格return text

使用举例:

text = """"It's the last he painted, you know," Mrs. Gisburn said."""
ids = SimpleTokenizerV1.encode(text) 
# [1, 58, 2, 872, 1013, 615, 541, 763, 5, 1155, 608, ...]decoded = SimpleTokenizerV1.decode(ids)
# ""It's the last he painted, you know," Mrs. Gisburn said."""

处理特殊词元

(遇到某个新词没有在词汇表中)

举例:

text = "Hello, do you like tea?"
# 报错:KeyError: 'Hello'(Hello不在词汇表中)

解决方案:添加特殊词元

all_tokens.extend(["<|endoftext|>", "<|unk|>"])
特殊词元作用
<|unk|>
未知词语
<|endoftext|>
文本结束标记
<|bos|>
文本开始标记
<|pad|>填充对齐
#升级版分词器
class SimpleTokenizerV2:def __init__(self, vocab):self.str_to_int = vocab  # 词语→IDself.int_to_str = {i:s for s,i in vocab.items()}  # ID→词语def encode(self, text):# 遇到不认识的词就用<|unk|>代替preprocessed = [item if item in self.str_to_int else "<|unk|>" for item in preprocessed]return [self.str_to_int[s] for s in preprocessed]#def encode(self, text):  # 文本 → 数字# 1. 分割文本为词语# 2. 清理空白# 3. 查表转换为ID#return [self.str_to_int[s] for s in preprocessed]def decode(self, ids):  # 数字 → 文本# 1. ID转回词语# 2. 拼接成句子# 3. 修复标点空格return text
#特殊词元的使用
text1 = "Hello, do you like tea?"
text2 = "In the sunlit terraces of the palace."# 用<|endoftext|>连接两段文本
text = text1 + " <|endoftext|> " + text2ids = tokenizer.encode(text)
# [1160, 5, 362, ... 1159, 57, 1013, ... 1160, 7]tokenizer.decode(ids)
# "Hello, do you like tea? <|endoftext|> In the sunlit terraces of the palace."
# 注意:Hello和palace被标记为<|unk|>

过程总结:

  • 用户输入 → 转换为ID → 模型处理 → 生成回复ID → 转换回文本

小思考:为什么GPT模型不需要[PAD][UNK]

GPT使用更先进的字节对编码(BPE),总能将词语拆分成已知子词

GPT用同一个<|endoftext|>标记表示结束和填充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS 5.0】开发实战:从UI到Native全解析

一、环境搭建与项目创建 ​​跨平台安装​​ DevEco Studio支持Windows/macOS系统&#xff0c;安装包集成HarmonyOS SDK、Node.js和OHPM工具链。 Windows&#xff1a;双击.exe选择非中文路径macOS&#xff1a;拖拽.app至Applications目录验证&#xff1a;通过Help > Diagnos…

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…

华为OD最新机试真题-食堂供餐-OD统一考试(B卷)

题目描述 某公司员工食堂以盒饭方式供餐。 为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快,现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出 多少价盒饭才能满足要求。 输入描述 第1行…

【笔记】MSYS2 的 MINGW64 环境 全面工具链

#工作记录 MSYS2 的 MINGW64 环境&#xff08;mingw64.exe&#xff09;&#xff0c;下面是为该环境准备的最全工具链安装命令&#xff08;包括 C/C、Python、pip/wheel、GTK3/GTK4、PyGObject、Cairo、SDL2 等&#xff09;。 这一环境适用于构建原生 64 位 Windows 应用程序。…

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…

【react+antd+vite】优雅的引入svg和阿里巴巴图标

1.安装相关包 由于是vite项目&#xff0c;要安装插件来帮助svg文件引入进来&#xff0c;否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

UI框架-通知组件

UI框架-通知组件 介绍 一个基于 Vue 3 的轻量级通知组件库&#xff0c;提供了丰富的消息通知功能。支持多种通知类型、自定义样式、进度条显示等特性。 特性 &#x1f3a8; 支持多种通知类型&#xff1a;信息、成功、警告、错误⏳ 支持进度条显示&#x1f504; 支持加载中状…

WordZero:让Markdown与Word文档自由转换的Golang利器

在日常工作中&#xff0c;我们经常需要在Markdown和Word文档之间进行转换。Markdown方便编写和版本控制&#xff0c;而Word文档更适合正式的商务环境。作为一名Golang开发者&#xff0c;我开发了WordZero这个库&#xff0c;专门解决这个痛点。 项目背景 GitHub仓库&#xff1…

计算机网络面试汇总(完整版)

基础 1.说下计算机网络体系结构 计算机网络体系结构&#xff0c;一般有三种&#xff1a;OSI 七层模型、TCP/IP 四层模型、五层结构。 简单说&#xff0c;OSI是一个理论上的网络通信模型&#xff0c;TCP/IP是实际上的网络通信模型&#xff0c;五层结构就是为了介绍网络原理而折…

动端React表格组件:支持合并

前言 在移动端开发中&#xff0c;表格组件是一个常见但复杂的需求。相比PC端&#xff0c;移动端表格面临着屏幕空间有限、交互方式不同、性能要求更高等挑战。本文将详细介绍如何从零开始构建一个功能完整的移动端React表格组件&#xff0c;包含固定列、智能单元格合并、排序等…

广告系统中后链路数据为什么要使用流批一体技术?流批一体技术是什么?

在大规模广告系统的后链路(离线和实时特征计算、模型训练与上线、效果监控等)中,往往既有对海量历史数据的批量计算需求(离线特征、离线模型训练、报表汇总),又有对在线请求的低延迟实时计算需求(实时特征、在线打分、实时监控/告警)。传统将二者割裂、用 Lambda 架构…

6.10 - 常用 SQL 语句以及知识点

MySQL 技术 SQL 是结构化查询语言&#xff0c;他是关系型数据库的通用语言 SQL 可以分为分为以下三个类别 DDL (data definition languages) 语句 数据定义语言&#xff0c;定义了 不同的数据库、表、索引等数据库对象的定义。常用的的语句关键字包括 **create、drop、alter …

OpenCV CUDA 模块光流计算------稀疏光流算法类SparsePyrLKOpticalFlow

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV CUDA 模块中实现的稀疏光流算法类&#xff0c;基于 Lucas-Kanade 方法&#xff0c;并支持图像金字塔结构。适用于特征点跟踪任务&#xf…

免费工具-微软Bing Video Creator

目录 引言 一、揭秘Bing Video Creator 二、轻松上手&#xff1a;三步玩转Bing Video Creator 2.1 获取与访问&#xff1a; 2.2 创作流程&#xff1a; 2.3 提示词撰写技巧——释放AI的想象力&#xff1a; 三、核心特性详解&#xff1a;灵活满足多样化需求 3.1 双重使用模…

MySQL技术内幕1:内容介绍+MySQL编译使用介绍

文章目录 1.整体内容介绍2.下载编译流程2.1 安装编译工具和依赖库2.2 下载编译 3.配置MySQL3.1 数据库初始化3.2 编辑配置文件3.3 启动停止MySQL3.4 登录并修改密码 1.整体内容介绍 MySQL技术系列文章将从MySQL下载编译&#xff0c;使用到MySQL各组件使用原理源码分析&#xf…

MySQL 事务详解

MySQL 事务详解 一、事务是什么&#xff1f;为什么需要事务&#xff1f; 二、事务的四大特性&#xff08;ACID&#xff09;举例说明&#xff1a;转账操作 三、MySQL 中事务的支持四、事务分类&#xff1a;隐式 vs 显式1. 隐式事务&#xff08;自动提交&#xff09;2. 显式事务&…

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…

利用coze工作流制作一个自动生成PPT的智能体

在Coze平台中&#xff0c;通过工作流实现PPT自动化生成是一个高效且灵活的解决方案&#xff0c;尤其适合需要快速产出标准化演示文稿的场景。以下是基于Coze工作流制作PPT的核心逻辑与操作建议&#xff1a; 理论流程 一、核心流程设计 需求输入与解析 用户输入&#xff1a;主…

vue3 按钮级别权限控制

在Vue 3中实现按钮级别的权限控制&#xff0c;可以通过多种方式实现。这里我将介绍几种常见的方法&#xff1a; 方法1&#xff1a;使用Vue 3的Composition API 在Vue 3中&#xff0c;你可以使用Composition API来创建一个可复用的逻辑来处理权限控制。 创建权限控制逻辑 首…

spa首屏加载慢怎样解决

SPA&#xff08;Single Page Application&#xff0c;单页应用&#xff09;首屏加载慢是一个常见问题&#xff0c;主要原因通常是首次加载需要拉取体积较大的 JavaScript 文件、样式表、初始化数据等。以下是一些常见的 优化策略&#xff0c;可以帮助你 提升首屏加载速度&#…