tiktoken原理以及如何离线环境使用

本文介绍了tiktoken,一种由OpenAI开发的用于快速token切分的工具,尤其适用于GPT等大模型的输入处理。文章详细讲解了如何使用cl100k_base编码,以及在国内因网络限制导致的本地缓存解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tiktoken原理介绍

tiktoken是OpenAI开发的开源的快速token切分器。

首先我们需要了解的是GPT等大模型,并不是直接将字符串输入大模型,第一步需要做的就是token切分编码。

比如给定一个文本字符串,输入'tiktoken is great!',采用切分编码’cl100k_base’,拆解后的文本字符串为["t", "ik", "token", " is", " great", "!"]。token编码表示为[83, 1609, 5963, 374, 2294,0]

代码如下

import tiktoken
input = "tiktoken is great!"
enc = tiktoken.get_encoding("cl100k_base")
enc_output =  enc.encode(input)
print("输入文字:"+str(input))
print("编码后的token:"+str(enc_output))
for token in enc_output:
    print("将token:"+str(token)+" 变成文本:"+str(enc.decode_single_token_bytes(token)))

文本切分编码是十分有用的,因为GPT都是以token的形式来阅读文本的。了解文本中的token数量,可以告诉你字符串是否太长而超出了模型处理能力。

cl100k_base 网络访问不到

由于cl100k_base是tiktoken中一种编码方式。gpt-4,
gpt-3.5-turbo,text-embedding-ada-002都采用这种切分编码方式。

国内在调用cl100k_base编码的时候,由于某些原因网络访问不到,需要自行下载,然后在本地缓存读取。

报错如下:

Exception type: <class ‘requests.exceptions.ConnectionError’>
Exception value: HTTPSConnectionPool(host=‘openaipublic.blob.core.windows.net’, port=443): Max retries exceeded with url: /encodings/cl100k_base.tiktoken (Caused by NameResolutionError(“<urllib3.connection.HTTPSConnection object at 0x7fdf29eef1f0>: Failed to resolve ‘openaipublic.blob.core.windows.net’ ([Errno -3] Temporary failure in name resolution)”))

分析主要源代码,如何在本地读取呢?

分析源码可以得知,通过读取环境变量中的TIKTOKEN_CACHE_DIR变量,计算hash值(需将cl100k_base.tiktoken文件重命名为hash值),最后在本地缓存文件夹中读取。

源码如下:

def read_file_cached(blobpath: str, expected_hash: Optional[str] = None) -> bytes:
    user_specified_cache = True
    if "TIKTOKEN_CACHE_DIR" in os.environ:
        cache_dir = os.environ["TIKTOKEN_CACHE_DIR"]
    elif "DATA_GYM_CACHE_DIR" in os.environ:
        cache_dir = os.environ["DATA_GYM_CACHE_DIR"]
    else:
        cache_dir = os.path.join(tempfile.gettempdir(), "data-gym-cache")
        user_specified_cache = False

    if cache_dir == "":
        # disable caching
        return read_file(blobpath)

    cache_key = hashlib.sha1(blobpath.encode()).hexdigest()

    cache_path = os.path.join(cache_dir, cache_key)
    if os.path.exists(cache_path):
        with open(cache_path, "rb") as f:
            data = f.read()
        if expected_hash is None or check_hash(data, expected_hash):
            return data

1.获取blobpath变量(在有网的服务器上获取),这个blobpath变量存放了cl100k_base.tiktoken的url地址。

import tiktoken_ext.openai_public
import inspect

print(dir(tiktoken_ext.openai_public))
# The encoder we want is cl100k_base, we see this as a possible function

print(inspect.getsource(tiktoken_ext.openai_public.cl100k_base))
# The URL should be in the 'load_tiktoken_bpe function call'

我的blobpath变量为:https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken

2.点击cl100k_base.tiktoken下载。(在有网的服务器上下载)

3.获取cache_key变量,并将cl100k_base.tiktoken重命名为cache_key变量

import hashlib

# 我的blobpath是https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken
blobpath = "your_blob_url_here"  
cache_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(cache_key)
#输出:9b5ad71b2ce5302211f9c61530b329a4922fc6a4

我将cl100k_base.tiktoken重命名为9b5ad71b2ce5302211f9c61530b329a4922fc6a4

到此为止,文件和变量都拿到了。下面我将阐述如何修改代码,引入缓存库。

1.代码中增加如下代码,自行设置tiktoken_cache_dir,并将tiktoken文件放到tiktoken_cache_dir位置。

import os
import tiktoken

#我这里tiktoken_cache_dir是'/home/workspace'
tiktoken_cache_dir = "path_to_folder_containing_tiktoken_file"
os.environ["TIKTOKEN_CACHE_DIR"] = tiktoken_cache_dir

#将改名后的cl100k_base.tiktoken文件放到'/home/workspace'位置
assert os.path.exists(os.path.join(tiktoken_cache_dir, cache_key)) 

2.运行encoding

encoding = tiktoken.get_encoding("cl100k_base")
encoding.encode("Hello, world")

3.最后有什么不明白的可以参考read_file_cached(blobpath: str, expected_hash: Optional[str] = None)这个函数的源码,debug是太难找了。。建议pycharm通过Search Everyting搜索即可查看定位源码。

### 如何在离线模式下使用 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` 字段。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值