当前位置: 首页 > article >正文

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|>标记表示结束和填充

相关文章:

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

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...