使用Tiktoken进行文本分割:优化大语言模型的输入

引言

在处理大语言模型时,因其对输入的token数量有限制,文本分割成为一个至关重要的任务。为了确保生成的文本块不会超过模型的token限制,我们需要使用与模型相同的tokenizer来计数和分割文本。在本文中,我们将探讨如何使用Tiktoken和其他工具来实现有效的文本分割。

主要内容

1. Tiktoken介绍

Tiktoken是由OpenAI创建的一个快速BPE(Byte Pair Encoding)tokenizer,能够准确估计OpenAI模型使用的tokens数量。它通过指定字符进行分割,并借助CharacterTextSplitter与RecursiveCharacterTextSplitter等工具实现分割。

2. 分割文本的方法

CharacterTextSplitter

可以使用Tiktoken的from_tiktoken_encoder方法进行分割,但要注意,这种方法可能会生成比预期更大的块。

from langchain_text_splitters import CharacterTextSplitter

text_splitter = CharacterTextSplitter.from_tiktoken_encoder
### 如何在离线模式下使用 TikToken TikToken 是 OpenAI 提供的一个高效分词工具库,主要用于处理文本数据并将其转化为 token 形式以便于模型理解。然而,在某些情况下可能无法联网访问其默认的远程资源文件 `cl100k_base.tiktoken`。为了支持离线环境下的正常运行,可以通过手动下载该文件并调整代码逻辑来加载本地版本。 #### 下载必要资源 首先需要从指定链接获取编码表文件,并保存到本地路径中: ```bash wget https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken -O cl100k_base.tiktoken ``` 此命令会将所需的 `.tiktoken` 文件存储至当前目录[^1]。 #### 修改读取函数以适应离线场景 通过自定义 `read_file()` 函数可以实现对本地缓存的支持。以下是经过改进后的实现方案: ```python import os import hashlib def read_file(): # 定义原始Blob地址用于生成唯一标识符 blobpath = "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken" # 创建SHA-1哈希值作为缓存键名 cache_key = hashlib.sha1(blobpath.encode()).hexdigest() # 设置缓存根目录位置 (可根据实际需求更改) cache_dir = "./temp_cache" if not os.path.exists(cache_dir): # 如果不存在则创建对应文件夹 os.makedirs(cache_dir) # 组合完整目标路径 cache_path = os.path.join(cache_dir, cache_key) try: # 尝试打开已存在的本地副本 with open(cache_path, "rb") as f: data = f.read() except FileNotFoundError: raise Exception(f"The required file {cache_path} does not exist. Please ensure it has been downloaded correctly.") return data ``` 上述脚本片段展示了如何构建一个健壮的数据检索机制[^3]。它优先尝试定位预置好的二进制资料;如果未能成功,则抛出异常提示用户完成初始化步骤。 #### 实际应用中的调用示例 当一切准备就绪之后,就可以像平常一样导入 tiktoken 并利用这些配置来进行进一步操作了: ```python import tiktoken encoding = tiktoken.Encoding(name="cl100k_base", pat_str=None, mergeable_ranks=read_file(), special_tokens={}) text = "This is an example sentence." tokens = encoding.encode(text) print(tokens) decoded_text = encoding.decode(tokens) print(decoded_text) ``` 这里我们显式传递由前面定义的方法返回的结果给 Encoding 构造器参数列表里的 `mergeable_ranks` 字段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值