🦖

オフラインでtiktokenを使用する

2024/07/16に公開

はじめに

LangChainやChromaDBなどを会社のプロキシ環境下やオフライン環境でなどで使おうとすると、以下のようなSSLエラーが発生することがあります。

requests.exceptions.SSLError: HTTPSConnectionPool(host='openaipublic.blob.core.windows.net', port=443): Max retries exceeded with url: /encodings/cl100k_base.tiktoken (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1112)'))

これは、内部的にtiktokenを使用する際の通信が原因です。オフライン環境やプロキシ環境下で許可されていない場合、エラーが発生します。

このような場合、必要なファイルを事前にダウンロードし、ローカルキャッシュとして設定することでエラーを回避することができます。

本記事はStackOverflowのこちらの内容を参考に記載しています。

エンコーダーのBlob URLからファイルのダウンロード

エンコーディング(テキストをトークンに変更するときのルールのようなもの)に使用されるファイルをダウンロードします。
主な種類は以下です。

モデル エンコーディング
gpt-3.5-turbo ~ gpt-4-turbo with vision cl100k_base
gpt-4o o200k_base

こちらのファイルから該当するエンコーディングのファイルのダウンロード先を確認します。
ここではcl100k_baseのファイルをダウンロードします。

https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken

上記のURLにアクセスするとcl100k_base.tiktokenファイルがダウンロードされます。

ファイル名の変更

ダウンロードしたファイル名をリンクのパスのハッシュ値に変更する必要があります。
以下のコードを実行すると9b5ad71b2ce5302211f9c61530b329a4922fc6a4が得られるため、この文字列にファイル名を変更します。

import hashlib

blobpath = "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken"
cache_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(cache_key)

tiktokenキャッシュの設定

TIKTOKEN_CACHE_DIRの環境変数に上記のファイルを置いたディレクトリを指定します。

import os

os.environ["TIKTOKEN_CACHE_DIR"] = <上記ファイルを置いたディレクトリ>

tiktokenの使用

import tiktoken

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

これで、tiktokenをオフラインで使用できるようになります。

また、TIKTOKEN_CACHE_DIRを設定しておくことでtiktokenを内部的に使用するChromaDB等であっても冒頭のエラーを回避して使用することができます。

Discussion