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

tiktoken学习

1.tiktoken是OpenAI编写的进行高效分词操作的库文件。

2.操作过程:

enc = tiktoken.get_encoding("gpt2")
train_ids = enc.encode_ordinary(train_data)
val_ids = enc.encode_ordinary(val_data)

以这段代码为例,get_encoding是创建了一个Encoding对象,结构如下:

{"name": "gpt2",    #Encoding的名称"pat_str": r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""",  #分词正则表达式"mergeable_ranks": {b"!": 0, b"\"": 1, ...},  # 50,000+ 条目  #存储预加载的分词表"special_tokens": {"<|endoftext|>": 50256},   #特殊分词"explicit_n_vocab": 50257  #增加的特殊分词
}

encode_ordinary是利用BPE合并来对输入的train_data进行编码。

BPE合并:利用预加载的mergeable_ranks字典,通过最大前缀匹配查找最大字词映射对train_data编码。

while current_byte in mergeable_ranks:find next byte that forms existing tokenmerge if found in ranks

3.为什么说tiktoken高效?

使用高性能语言Rust实现

避免Python解释器开销;直接操作字节数组,避免Python对象的创建开销;并行处理。

基于Trie树的高效查找

struct TrieNode {children: HashMap<u8, TrieNode>,token_id: Option<u32>,  // 匹配成功时返回 token ID
}

优化:Aho-Corasick 自动机,可以通过增加失败指针fail来避免每次失败从头遍历。就相当于这条路走不通,但是不会从头走,而是会走附近的分岔路看看有没有可以走的。

BPE合并的增量处理

fn encode_bytes(bytes: &[u8], trie: &Trie) -> Vec<u32> {let mut tokens = Vec::new();let mut start = 0;while start < bytes.len() {let (end, token_id) = trie.longest_match(&bytes[start..]);tokens.push(token_id);start += end;}tokens
}

单次遍历:在扫描过程中同时完成匹配和合并

贪心最长匹配:总是选择可能的最长token

预加载mergeable_ranks

不需要实时建立,提高效率

http://www.lryc.cn/news/2393485.html

相关文章:

  • 鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程
  • 历年厦门大学计算机保研上机真题
  • 【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
  • IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)
  • Replacing iptables with eBPF in Kubernetes with Cilium
  • 推荐系统排序指标:MRR、MAP和NDCG
  • 数学建模之最短路径问题
  • 测试概念 和 bug
  • zynq 级联多个ssd方案设计(ECAM BUG修改)
  • brep2seq 论文笔记
  • 【运维实战】Linux 中设置 sudo ,8个有用的 sudoers 配置!
  • Ad Hoc
  • 江科大SPI串行外设接口hal库实现
  • [网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)
  • 【ArcGIS Pro微课1000例】0071:将无人机照片生成航线、轨迹点、坐标高程、方位角
  • Ubuntu Zabbix 钉钉报警
  • threejs顶点UV坐标、纹理贴图
  • STM32 RTC实时时钟\BKP备份寄存器\时间戳
  • springcloud---gateway
  • Axure设计案例——科技感立体柱状图
  • app获取相册权限是否意味着所有相片都可随时读取?
  • 2025年05月29日Github流行趋势
  • 第十一节:第一部分:正则表达式:应用案例、爬取信息、搜索替换
  • 跟我学c++中级篇——动态库的资源处理
  • 新能源集群划分+电压调节!基于分布式能源集群划分的电压调节策略!
  • 端午安康 | 以匠心,致长远
  • 漫画Android:事件分发的过程是怎样的?
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)解题报告 | 珂学家
  • 什么是MCP技术,跟http技术有什么区别
  • 如何用ChatGPT提升学术长文质量