Meta Llama 3 文本编码为 token

Meta Llama 3 文本编码为 token

flyfish

tiktoken 是一个用于 OpenAI 模型的快速 BPE 分词器,这里用在Meta Llama 3上。主要功能包括将文本编码为token,以及将token解码回文本。这个过程通常使用BPE(Byte Pair Encoding)算法或其他类似的子词分割方法。

参考网址

https://github.com/openai/tiktoken
https://github.com/karpathy/minbpe

什么是BPE(Byte Pair Encoding)?
BPE(Byte Pair Encoding)是一种用于文本分词的子词(subword)分割算法。它通过逐步合并最常见的字符或字符序列来减少词汇表的大小,从而能够更高效地处理和表示文本数据。

BPE在tiktoken中的应用

简单的应用

import tiktoken# 获取GPT-2编码器
enc = tiktoken.get_encoding("gpt2")# 示例文本
text = "This is an example text."# 将文本编码为tokens
tokens = enc.encode(text)
print(f"Encoded tokens: {tokens}")# 将tokens解码为原文本
decoded_text = enc.decode(tokens)
print(f"Decoded text: {decoded_text}")

Meta Llama 3的使用方式 - load_tiktoken_bpe函数

在tiktoken库中,BPE用于将文本编码成模型可以处理的tokens。load_tiktoken_bpe函数会加载BPE编码的词汇表和规则,以便将文本分解成子词单位。

代码示例

import os
from logging import getLogger
from pathlib import Path
from typing import (AbstractSet,cast,Collection,Dict,Iterator,List,Literal,Sequence,TypedDict,Union,
)import tiktoken
from tiktoken.load import load_tiktoken_bpelogger = getLogger(__name__)Role = Literal["system", "user", "assistant"]class Message(TypedDict):role: Rolecontent: strDialog = Sequence[Message]class Tokenizer:"""Tokenizing and encoding/decoding text using the Tiktoken tokenizer."""special_tokens: Dict[str, int]num_reserved_special_tokens = 256pat_str = r"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+"  # noqa: E501def __init__(self, model_path: str):"""Initializes the Tokenizer with a Tiktoken model.Args:model_path (str): The path to the Tiktoken model file."""assert os.path.isfile(model_path), model_pathmergeable_ranks = load_tiktoken_bpe(model_path)num_base_tokens = len(mergeable_ranks)special_tokens = ["<|begin_of_text|>","<|end_of_text|>","<|reserved_special_token_0|>","<|reserved_special_token_1|>","<|reserved_special_token_2|>","<|reserved_special_token_3|>","<|start_header_id|>","<|end_header_id|>","<|reserved_special_token_4|>","<|eot_id|>",  # end of turn] + [f"<|reserved_special_token_{i}|>"for i in range(5, self.num_reserved_special_tokens - 5)]self.special_tokens = {token: num_base_tokens + i for i, token in enumerate(special_tokens)}self.model = tiktoken.Encoding(name=Path(model_path).name,pat_str=self.pat_str,mergeable_ranks=mergeable_ranks,special_tokens=self.special_tokens,)logger.info(f"Reloaded tiktoken model from {model_path}")self.n_words: int = self.model.n_vocab# BOS / EOS token IDsself.bos_id: int = self.special_tokens["<|begin_of_text|>"]self.eos_id: int = self.special_tokens["<|end_of_text|>"]self.pad_id: int = -1self.stop_tokens = {self.special_tokens["<|end_of_text|>"],self.special_tokens["<|eot_id|>"],}logger.info(f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id}")def encode(self,s: str,*,bos: bool,eos: bool,allowed_special: Union[Literal["all"], AbstractSet[str]] = set(),disallowed_special: Union[Literal["all"], Collection[str]] = (),) -> List[int]:assert type(s) is strTIKTOKEN_MAX_ENCODE_CHARS = 400_000MAX_NO_WHITESPACES_CHARS = 25_000substrs = (substrfor i in range(0, len(s), TIKTOKEN_MAX_ENCODE_CHARS)for substr in self._split_whitespaces_or_nonwhitespaces(s[i : i + TIKTOKEN_MAX_ENCODE_CHARS], MAX_NO_WHITESPACES_CHARS))t: List[int] = []for substr in substrs:t.extend(self.model.encode(substr,allowed_special=allowed_special,disallowed_special=disallowed_special,))if bos:t.insert(0, self.bos_id)if eos:t.append(self.eos_id)return tdef decode(self, t: Sequence[int]) -> str:return self.model.decode(cast(List[int], t))@staticmethoddef _split_whitespaces_or_nonwhitespaces(s: str, max_consecutive_slice_len: int) -> Iterator[str]:current_slice_len = 0current_slice_is_space = s[0].isspace() if len(s) > 0 else Falseslice_start = 0for i in range(len(s)):is_now_space = s[i].isspace()if current_slice_is_space ^ is_now_space:current_slice_len = 1current_slice_is_space = is_now_spaceelse:current_slice_len += 1if current_slice_len > max_consecutive_slice_len:yield s[slice_start:i]slice_start = icurrent_slice_len = 1yield s[slice_start:]model_path = "Meta-Llama-3-8B-Instruct/tokenizer.model"
tokenizer = Tokenizer(model_path)print(tokenizer.encode( "This is a test sentence.", bos=True,eos=True))print(tokenizer.decode( [128000, 2028, 374, 264, 1296, 11914, 13, 128001]))输出[128000, 2028, 374, 264, 1296, 11914, 13, 128001]
<|begin_of_text|>This is a test sentence.<|end_of_text|>

再测试一个

print(tokenizer.encode( "This is Ji'nan in the winter", bos=True,eos=True))
print(tokenizer.decode( [128000, 2028, 374, 55551, 6, 19285, 304, 279, 12688, 128001]))

输出

[128000, 2028, 374, 55551, 6, 19285, 304, 279, 12688, 128001]
<|begin_of_text|>This is Ji'nan in the winter<|end_of_text|>

在这个例子中,load_tiktoken_bpe函数加载了一个预训练的BPE词汇表和规则,然后使用这些规则将输入的文本分割成tokens。之后,这些tokens可以被解码回原文本。

扩展

import tiktoken
cl100k_base = tiktoken.get_encoding("cl100k_base")# In production, load the arguments directly instead of accessing private attributes
# See openai_public.py for examples of arguments for specific encodings
enc = tiktoken.Encoding(# If you're changing the set of special tokens, make sure to use a different name# It should be clear from the name what behaviour to expect.name="cl100k_im",pat_str=cl100k_base._pat_str,mergeable_ranks=cl100k_base._mergeable_ranks,special_tokens={**cl100k_base._special_tokens,"<|im_start|>": 100264,"<|im_end|>": 100265,}
)print(enc)#<Encoding 'cl100k_im'>

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

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

相关文章

分账能为电商平台带来哪些便捷?

随着电子商务快速发展&#xff0c;电商平台已经从小型往大型迈进&#xff0c;以往旧模式显然不可适用。随着规模的日益扩大&#xff0c;对于高效商户关系管理、提高财务对账效率和满足复杂结算智能化、合规化的需求日益凸显。如何处理好以上问题&#xff0c;就需要一套专业有效…

解决 iOS 端小程序「saveVideoToPhotosAlbum:fail invalid video」问题

场景复现&#xff1a; const url https://mobvoi-digitalhuman-video-public.weta365.com/1788148372310446080.mp4uni.downloadFile({url,success: (res) > {uni.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: (res) > {console.log("res > &…

搜维尔科技:SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉,结合力反馈和振动触觉反馈,使其成为市场上第一款具有手掌反馈的无线触觉手套

SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉&#xff0c;结合力反馈和振动触觉反馈&#xff0c;使其成为市场上第一款具有手掌反馈的无线触觉手套。 搜维尔科技&#xff1a;SenseGlove Nova2使用主动接触反馈来模拟手掌的感觉&#xff0c;结合力反馈和振动触觉反馈&…

数学题目系列(一)|丑数|各位和|埃氏筛|欧拉筛

一.丑数 链接&#xff1a;丑数 分析&#xff1a; 丑数只有2&#xff0c;3&#xff0c;5这三个质因数&#xff0c;num 2a 3b 5c也就是一个丑数是由若干个2&#xff0c;3&#xff0c;5组成&#xff0c;那么丑数除以这若干个数字最后一定变为1 代码 class Solution {publi…

NocoDB开源的智能表格详解-腾讯文档本地替代品

文章目录 一、介绍二、docker-compose部署三、登录NocoDB四、NocoDB手册1. 创建项目2. 收集统计表2.1 添加字段2.2 编辑字段2.3 字段类型2.4 发布表格 3.创建表单3.1 创建表单3.2 分享表单3.3 填写检测单 4.创建看板5.创建画廊 一、介绍 可作为腾讯文档的本地电子表格替代品&a…

C# BindingSource 未完

数据绑定导航事件数据验证自定义示例示例总结 在 C#中&#xff0c; BindingSource 是一个非常有用的控件&#xff0c;它提供了数据绑定的基础设施。 BindingSource 允许开发者将数据源&#xff08;如数据库、集合、对象等&#xff09;与用户界面控件&#xff08;如文本框、下…

DNN模型介绍

前言&#xff1a;最近在给小朋友做一个项目&#xff0c;通过图片识别动物&#xff1b;发现训练后显示最佳模型是DNN模型&#xff0c;因此在此记录一下搜索内容&#xff1a; DNN&#xff0c;全称Deep Neural Networks&#xff0c;即深度神经网络&#xff0c;是一种深度学习模型。…

汽车网络安全技术的深入分析

一、引言 在当今时代,汽车行业正经历着前所未有的变革与发展。随着科技的飞速进步,汽车越来越智能化、网络化,成为了人们生活中不可或缺的一部分。然而,这种高度的数字化和网络化在为人们带来便捷和创新体验的同时,也引发了一系列严峻的网络安全挑战。汽车不再仅仅是一个简…

5G+北斗智能手持终端在哪些行业中发挥作用

在当今科技融合发展的浪潮中&#xff0c;5G北斗智能手持终端正逐步成为驱动各行各业智能化升级的关键力量。这一融合创新技术不仅重塑了传统的通信与定位方式&#xff0c;而且在多个核心领域展现了其变革性的应用价值。 5G北斗智能手持终端因其独特的技术组合&#xff0c;在多个…

File类操作文件方法详解及其简单应用

一、File 类介绍 Java 中的 File 类是 java.io 包的一部分&#xff0c;它提供了操作文件和目录的能力。File 类可以用来表示文件系统中的文件或目录。 二、路径 在讲File用法之前咱们先介绍一下路径是什么&#xff1f; 在计算机中&#xff0c;路径&#xff08;Path&#xff0…

爬山算法:一种模拟自然界寻优过程的启发式搜索算法

爬山算法&#xff1a;一种模拟自然界寻优过程的启发式搜索算法 爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种模拟自然界寻优过程的启发式搜索算法。它通过模拟生物体在自然环境中寻找食物或栖息地的过程&#xff0c;来寻找问题的最优解。爬山算法在解决优化…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

【MySQL】数据库入门基础

文章目录 一、数据库的概念1. 什么是数据库2. 主流数据库3. mysql和mysqld的区别 二、MySQL基本使用1. 安装MySQL服务器在 CentOS 上安装 MySQL 服务器在 Ubuntu 上安装 MySQL 服务器验证安装 2. 服务器管理启动服务器查看服务器连接服务器停止服务器重启服务器 3. 服务器&…

麒麟操作系统rpm ivh安装rpm包卡死问题分析

夜间变更开发反应,rpm -ivh 安装包命令夯死,无执行结果,也无报错 排查 : 1、top 查看无进程占用较高进程存在,整体运行平稳 2、df -h 查看磁盘并未占满 3、其他服务器复现该命令正常执行 4、ps -ef|grep rpm 查看安装命令仍在运行中 5、查看log日志,均正常并无不良日志…

UE Editor API 整理

UE Editor API 整理 过一下 https://github.com/20tab/UnrealEnginePython/blob/master/docs/&#xff0c;熟悉一下编辑器 API&#xff0c;方便后续编辑器脚本开发 后续的目标是所有编辑器操作应该都可以脚本化&#xff08;自动化&#xff09;&#xff0c;这样把 GPT 接进 UE…

了解Kubernetes-RKE2的PKI以及证书存放位置

一、什么是PKI&#xff1f; 简称&#xff1a;证书基础设施。 可以方便理解为当你的集群有Server,Client架构&#xff0c;那么为了安全加密之间的通信&#xff0c;则需要使用证书进行交互&#xff0c;那么利用PKI架构可以安全加密组件之间的通信。 二、Kubernetes的PKI架构什…

HLA高层体系结构1.0.0版本

名&#xff1a;高层体系结构&#xff08;High Level Architecture&#xff0c;HLA&#xff09; 高层体系结构&#xff08;High Level Architecture&#xff0c;HLA&#xff09;是从体系结构上建立这样一个框架&#xff0c;它能尽量涵盖M&S领域中所涉及的各种不同类型的仿真…

Python3 笔记:字符串的 find()、rfind()、index()、rindex()

1、find() 方法检测字符串中是否包含子字符串 str &#xff0c;如果指定 beg&#xff08;开始&#xff09; 和 end&#xff08;结束&#xff09; 范围&#xff0c;则检查是否包含在指定范围内&#xff0c;如果指定范围内如果包含指定索引值&#xff0c;返回的是索引值在字符串中…

解决splice改变原数组的BUG!

项目场景&#xff1a; 项目中难免遇到需要删除改变数组的方法&#xff0c;去重&#xff0c;删除不要的数据等 问题描述&#xff1a; 但是splice方法会删除掉数据改变原数组&#xff0c;返回的是改变之后的数组&#xff0c;即使你是赋值的还是会影响到原数组的数据 GoodsInfo…

oracle trim 函数很慢,加trim以后执行超慢,执行计划求解

RT,该字段未建立索引&#xff0c;以下贴出SQL,及执行计划&#xff0c;不加trim走hash join&#xff0c;求解释&#xff01; ----------------------语句如下&#xff0c;标红的字段加trim() EXPLAIN PLAN FOR select a.楼盘id, a.监测明细id, a.报告日期, a.广告位名称, …