Cohere Command R/R+ トークナイザの日本語効率を調べてみた

## はじめに

Cohere社の大規模言語モデル Cohere Command R が Oracle Cloud Infrastructure(OCI)の Generative(生成)AI サービスでも利用可能になったので、トークナイザの日本語効率について調べてみました。OCI Generative AI のオンデマンドの場合は、課金単位がキャラクタ数なのでトークン効率のような裏で起きていることは利用料金には直接関係ありません（なんだかよくわからないトークンで課金されるよりも目に見える文字数での課金の方がわかりやすい気がしますね～）。直接お財布に影響がなくても、効率が良ければ日本語文字列の出力速度の面で有利なのは確かなのでちょっと気になっていました。さらに、OCIには専用AIクラスタという他のテナント（アカウント）と共有されない環境を利用することもできます。その場合は効率が良い程、つまり、計算資源への負荷が少ない程、より多くのリクエストをさばけると期待できそうですよね。
ちょっとした文字列であれば Hugging Face の [The Tokenizer Playground](https://huggingface.co/spaces/Xenova/the-tokenizer-playground) で簡単に確かめてみることができるのですが、「吾輩は猫である、名前はまだない」にだけスペシャルチューニングされていたりするといけないので、ある程度まとまったテキストで確かめたいと思って Cohere の API を使って検証してみました。

## 検証方法

検証には、以下のPythonスクリプト`Cohere_Token_Count_by_API.py`を使用しました。
このプログラムを実行するためには、Cohere APIのキーが必要です。キーは、[Cohereのダッシュボード](https://dashboard.cohere.com/api-keys)で取得できます（Sing Upが必要ですが、トライアルキーでも大丈夫です）。
このプログラムと同じディレクトリに、`.env` というファイルを作成して、API キーを記述してください。また、ライブラリとして、pdfminer.six と dotenv そして、cohere を使いますのでこれらも pip でインストールしておいてください。

```:ターミナル
pip install pdfminer.six
pip install python-dotenv
pip install cohere
```

```.env
COHERE_API_KEY=your_api_key
```

```python: Cohere_Token_Count_by_API.py
import cohere
from pdfminer.high_level import extract_text
import os
import sys
from dotenv import load_dotenv, find_dotenv

MODEL = "command-r"

def main(pdf_path):
    text = extract_text(pdf_path)
    _ = load_dotenv(find_dotenv())
    co = cohere.Client(api_key=os.getenv("COHERE_API_KEY"))
    response = co.tokenize(text=text, model=MODEL) 
    print(f"Characters: {len(text)}")
    print(f"Words: {len(text.split())}")  
    print(f"Tokens: {len(response.tokens)}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python Cohere_Token_Count_by_API.py <pdf_path>")
    else:
        main(sys.argv[1])
```

このスクリプトは、指定されたPDFファイルからテキストを抽出し、Cohere社の tokenize API endpoint を使用してトークン化を行います。そして、文字数、単語数、トークン数を出力します。 Cohere の Token と Tokenize の API の詳細については、[Cohere のドキュメント](https://docs.cohere.com/docs/tokens-and-tokenizers)に詳しく記載されています。

## 検証データ

英文の検証データとして、arxive.orgからダウンロードしたみんな大好き "[Attention Is All You Need](https://arxiv.org/abs/1706.03762)" の[PDF](https://arxiv.org/pdf/1706.03762)ファイルを使用しました。日本語の検証データには、”冴えない彼女の育て方”全巻とか日本文化を色濃く反映して語彙も豊富で文化的意義も大きなデータを使いたかったのですが、テキストデータを入手できそうもないので、無難なところで[日本オラクルの有価証券報告書（第38期）](https://www.oracle.com/jp/a/ocom/docs/jp-investor-relations/fy23-yuho-jp.pdf)を使用しました。

## 検証結果

### 英文データ（Attention Is All You Need）

```Cohere Tokens/output.txt
Characters: 39675
Words: 5868
Tokens: 10974
```

### 日本語データ（日本オラクルの有価証券報告書（第38期））

```Cohere Tokens/output_jp.txt
Characters: 112176
Words: 8572
Tokens: 76248
```

## えっと、あとがきです

英文データでは、39675文字、5868単語が10974トークンに変換されました。一方、日本語データでは、112176文字が76248トークンに変換されました。

これまで、**商用の LLM のトークナイザは日本語１文字を１トークン程度に変換するものが多いのですが、 Cohere Command R は、日本語１文字を 0.68 トークン程度に変換することができています**ので、Cohere 社の多言語を重視する姿勢の成果が出ているようですね。ちなみに、Command R+ についても検証してみましたが全く同じ結果となりました。この 0.68 トークン/文字は逆数を取ると 1.47 文字/トークンですので Command R+ の最大入力プロンプトサイズの 128k は、1 文字/トークンのモデルの 128k x 1.47 = 188k トークンに相当しますので、日本語を使用する上では、コンテキストサイズが 200k のモデルと遜色ないと言えるかもしれませんね。
今回は、Command R/R+ のトークナイザの日本語効率を確かめてみました。OCI Generative AI サービスの Cohere Command R/R+ Chat API のお試し記事 [OCI Generative AI で Cohere Command R/R+ の Chat API を試してみる](https://qiita.com/yuji-arakawa/items/597c4bd9f3d5b4212b51)も書いていますのでよかったら読んでみてください。では！

https://qiita.com/yuji-arakawa/items/597c4bd9f3d5b4212b51

**終わりだよ～(o・∇・o)**

## おまけ
他にもいろいろ記事を書いていますので良かったらお立ち寄りください。

https://qiita.com/yuji-arakawa/items/28f30a5434ba429f3f16

https://qiita.com/yuji-arakawa/items/8d065ae3df536f5cd559

https://qiita.com/yuji-arakawa/items/fd4fd0c026ecfa664d97

https://qiita.com/yuji-arakawa/items/1a8cfeff8f81ba808389

https://qiita.com/yuji-arakawa/items/654d936ca616334286b0

https://qiita.com/yuji-arakawa/items/1a8cfeff8f81ba808389

https://qiita.com/yuji-arakawa/items/9cd485debd5b0d18aca2

https://qiita.com/yuji-arakawa/items/042937eaf16fa00cf491

https://qiita.com/yuji-arakawa/items/05e3455572d3b09a53dc

https://qiita.com/yuji-arakawa/items/6d0299c505315bc3cdb0

https://qiita.com/yuji-arakawa/items/597c4bd9f3d5b4212b51

https://aws.amazon.com/jp/blogs/news/leveraging-pinecone-on-aws-marketplace-as-a-knowledge-base-for-amazon-bedrock/