はじめに
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等であっても冒頭のエラーを回避して使用することができます。