17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルLLMで翻訳してトークン節約できるのか?ダメでした😭

17
Posted at

GeminiやChatGPTなどのいわゆるチャットAIは
英語での問い合わせと日本語での問い合わせで消費するトークン数に
2~3倍くらいの差があると言われています。

じゃあローカルで翻訳してから問い合わせすれば消費トークン抑えられるのでは
ということで試してみようと思います。

TL;DR

  • 日本語→英語→LLM→英語→日本語の構成でトークン削減を試した
  • トークンはほぼ減らず、処理時間が致命的に増えた
  • チャット用途では やらなくていい
  • 現代のAIには通用しない定説だった
  • トークンをケチるために、電気代とVRAMを消費することになる

👀観点

  • トークン数
    当たり前ですがここが一番気になるところ
  • 処理時間
    いくら節約できたとしても待機時間長すぎるなら勘弁してほしい
    翻訳を経由する分、一定許容はします
  • 翻訳の正確さ
    翻訳を複数回挟むので、多少仕方ないとは思いますが
    何言ってるのかわからないレベルにはならないことを期待

全体的な留意点として
毎回同じ回答を得られるわけではない
なんとなく傾向がみられる程度の結果しか得られない
またローカルLLMはマシンスペックに依存するところもある

マシンスペック

個人利用しているゲーミングPC(そんなにゲームしてませんが…)
そもそもAIを動かすことに特化しているものではないです。

  • CPU: Ryzen 7 9800X3D
  • RAM: 32GB
  • GPU: GeForce RTX 4070
  • OS: Windows 11
  • Ollama: 0.15.4

🛠️ツール

今回使用するツールやモデルをまとめます。

ollama

言わずと知れたやつです。ローカルLLMをとりあえず作るならこれ入れておけばいいですね
今回はこれくらいで十分なので、これを採用します。

インストール方法は省略

Qwen3:4b

軽量かつ翻訳も結構得意ということで採用

gpt-oss3:20b

こちらの方が、より正確な翻訳ができるそうなのでこちらも試します。
ただ速度面はQwen3に劣ると想定(そんなことはなかった)

gemini-3-flash

ここに問い合わせしてトークン数の比較をしてみます。
かるく調べた感じですが、比較的日本語が苦手みたいです。

Proのほうが、より差がみられるかもしれませんが、とりあえずflashで

⚖️比較対象

このあたりのトークン数を比較します

項番 日→英 英→日 備考
1 使用しない 使用しない 素直にGeminiに日本語で問い合わせ
2 Qwen3 使用しない Qwen3で英語に翻訳して問い合わせ
Geminiに日本語で回答してもらう
3 gpt-oss 使用しない gpt-ossで英語に翻訳して問い合わせ
Geminiに日本語で回答してもらう
4 Qwen3 Qwen3 Qwen3で英語に翻訳して問い合わせ
英語で回答を受け取ってQwen3で翻訳
5 gpt-oss gpt-oss gpt-ossで英語に翻訳して問い合わせ
英語で回答を受け取ってgpt-ossで翻訳

検証

Gemini直接問い合わせ

コード
gemini.py
from google import genai
from google.genai import types
import time


def gemini(contents):
    GOOGLE_API_KEY = "[APIキーを書いてね!ほんとはダメだよ!]"
    client = genai.Client(api_key=GOOGLE_API_KEY)

    response = client.models.generate_content(
        model="gemini-3-flash-preview",
        config=types.GenerateContentConfig(
                system_instruction="Don't use markdown"),
        contents=contents
    )
    return response


start = time.perf_counter()
response = gemini("Pythonで辞書型とリスト型の違いを、初心者にも分かるように簡潔に説明してください。")

print(response.text)
print(f"入力トークン数: {response.usage_metadata.prompt_token_count}")
print(f"思考プロセス消費: {response.usage_metadata.thoughts_token_count}")
print(f"出力トークン数: {response.usage_metadata.candidates_token_count}")
print(f"合計トークン数: {response.usage_metadata.total_token_count}")


end = time.perf_counter() #計測終了
print('処理時間{:.2f}秒'.format((end-start)))

※ 個人検証ということで面倒なのでAPIキーを直接書いてますが、本来あり得ない行為です

1回目 2回目 3回目 平均
入力トークン数 28 28 28 28
思考プロセス消費 484 602 469 518
出力トークン数 248 243 220 237
合計トークン数 760 873 717 783
処理時間(秒) 6.39 8.37 7.36 7.37
回答の一つ
Pythonのリスト型と辞書型の違いを、身近なものに例えて説明します。

1. リスト型(List)
特徴:データを順番に並べて管理します。
例え:出席番号順に並んだ生徒の名簿や、買い物リスト。
取り出し方:先頭から何番目かという番号(インデックス)で指定します。
記号:角括弧 [ ] を使います。
使い時:データの順番が重要なときや、同じ種類のものをまとめて扱いたいときに使います。

2. 辞書型(Dictionary)
特徴:データに名前(キー)をつけて、ペアで管理します。
例え:国語辞典(言葉と意味)や、電話帳(名前と電話番号)。
取り出し方:設定した「名前(キー)」で中身を指定します。
記号:波括弧 { } を使います。
使い時:データにラベルを貼って、中身を分かりやすく管理したいときに使います。

まとめ
・番号で管理するのが「リスト」
・名前(ラベル)で管理するのが「辞書」

と覚えると分かりやすいです。

Qwen3で英語翻訳

コード
Qwen和英
import ollama
import time
from google import genai
from google.genai import types

def gemini(contents):
    GOOGLE_API_KEY = "[APIキーを書いてね!ほんとはダメだよ!]"
    client = genai.Client(api_key=GOOGLE_API_KEY)

    response = client.models.generate_content(
        model="gemini-3-flash-preview",
        config=types.GenerateContentConfig(
                # 返事は日本語にするように指示追加
                system_instruction="Don't use markdown.Please answer in Japanese"),
        contents=contents
    )
    return response

start = time.perf_counter()
transEn = ollama.chat(
    model="qwen3:4b",
    messages=[
        #和英翻訳だけしてねって指示
        {"role": "system", "content": "Please only translate the Japanese text sent to you into English."},
        {"role": "user", "content": "Pythonで辞書型とリスト型の違いを、初心者にも分かるように簡潔に説明してください。"}
    ],
    # Qwen3余計なことしがちなので、翻訳だけするようにオプション付与
    options={
        "temperature": 0.0,
    },
)
response = gemini(transEn["message"]["content"])

print(transEn["message"]["content"])
print(response.text)
print(f"入力トークン数: {response.usage_metadata.prompt_token_count}")
print(f"思考プロセス消費: {response.usage_metadata.thoughts_token_count}")
print(f"出力トークン数: {response.usage_metadata.candidates_token_count}")
print(f"合計トークン数: {response.usage_metadata.total_token_count}")

end = time.perf_counter() #計測終了
print('{:.2f}秒'.format((end-start)))

1回目 2回目 3回目 平均
入力トークン数 33 33 33 33
思考プロセス消費 544 786 558 629
出力トークン数 223 246 244 237
合計トークン数 800 1065 835 882
処理時間(秒) 34.51 36.45 37.73 36.23
Qwen3が出力した和英翻訳
Please explain the difference between dictionary and list types in Python in a simple and concise way that even beginners can understand.
回答の一つ
Pythonのリストと辞書の違いを、初心者の方にも分かりやすく簡潔に説明します。

1. リスト(List)
リストは「番号がついた引き出し」のようなものです。
データが順番に並んでおり、0番、1番、2番というように「番号」を使って中身を取り出します。
(例)[りんご, バナナ, みかん]
使い道:データの順番が重要なときや、同じ種類のものをまとめて並べたいときに使います。

2. 辞書(Dictionary)
辞書は「ラベル(名前)がついた引き出し」のようなものです。
「名前(キー)」と「中身(値)」がセットになっていて、番号ではなく「名前」を指定して中身を取り出します。
(例){名前: 田中, 年齢: 25}
使い道:データに意味を持たせたいときや、特定のキーワードで中身を検索したいときに使います。

まとめ
・順番で管理したいなら「リスト」
・名前(ラベル)で管理したいなら「辞書」

と覚えておけば間違いありません。

gpt-ossで英語翻訳

※ モデルをgpt-oss:20bに置き換えるだけなのでコードは省略

1回目 2回目 3回目 平均
入力トークン数 33 33 33 33
思考プロセス消費 655 620 457 577
出力トークン数 220 274 204 232
合計トークン数 908 927 694 930
処理時間(秒) 14.85 16.07 21.37 17.43
gpt-ossが出力した和英翻訳
Please explain the difference between dictionary type and list type in Python in a concise way that beginners can understand.
回答の一つ
Pythonの「リスト」と「辞書」の違いを簡潔に説明します。

■リスト(list)
データを一列に並べて管理する形式です。
書き方: [データ1, データ2, データ3]
中身の取り出し方: 「0番目、1番目」といった「番号」で指定します。
イメージ: 出席番号順の名簿や、買い物リストのように順番が大切なものに適しています。

■辞書(dict)
「名前(キー)」と「中身(値)」をセットにして管理する形式です。
書き方: {名前: 佐藤, 年齢: 25}
中身の取り出し方: 番号ではなく、「名前」や「年齢」といった「特定のキーワード」で指定します。
イメージ: 連絡先リストや国語辞典のように、特定のラベルで中身を検索したいものに適しています。

まとめると、
順番で中身を探すのが「リスト」、
名前で中身を探すのが「辞書」です。

Qwen3で日本語翻訳追加

コード
Qwen英和

import ollama
import time
from google import genai
from google.genai import types

def gemini(contents):
    GOOGLE_API_KEY = "[APIキーを書いてね!ほんとはダメだよ!]"
    client = genai.Client(api_key=GOOGLE_API_KEY)

    response = client.models.generate_content(
        model="gemini-3-flash-preview",
        config=types.GenerateContentConfig(
                system_instruction="Don't use markdown."),
        contents=contents
    )
    return response

start = time.perf_counter()
transEn = ollama.chat(
    model="qwen3:4b",
    messages=[
        {"role": "system", "content": "Please only translate the Japanese text sent to you into English."},
        {"role": "user", "content": "Pythonで辞書型とリスト型の違いを、初心者にも分かるように簡潔に説明してください。"}
    ],
    options={
        "temperature": 0.0,
    },
)
response = gemini(transEn["message"]["content"])

transJp = ollama.chat(
    model="qwen3:4b",
    messages=[
        {"role": "system", "content": "Please only translate the English text sent to you into Japanese."},
        {"role": "user", "content": response.text }
    ],
    options={
        "temperature": 0.0,
    },
)

print(transEn["message"]["content"])
print(transJp["message"]["content"])

# print(response.text)
print(f"入力トークン数: {response.usage_metadata.prompt_token_count}")
print(f"思考プロセス消費: {response.usage_metadata.thoughts_token_count}")
print(f"出力トークン数: {response.usage_metadata.candidates_token_count}")
print(f"合計トークン数: {response.usage_metadata.total_token_count}")

end = time.perf_counter() #計測終了
print('{:.2f}秒'.format((end-start)))


1回目 2回目 3回目 平均
入力トークン数 29 31 31 30
思考プロセス消費 693 540 722 651
出力トークン数 263 378 335 325
合計トークン数 985 949 1088 1007
処理時間(秒) 116.82 96.69 110.54 108.01

終わってます…💦
処理時間がチャットAIとして耐えられるレベルじゃない
そのうえトークン数が改善されたかというと、全然そんなことない

Qwen3が出力した和英翻訳
Please explain the difference between dictionary and list types in Python in a concise way that even beginners can understand.
回答の一つ
リストは数字が付いた買い物リストのように考えられます。そのリスト内の各項目は0から始まる特定の位置を持っています。順序が重要であるアイテムのコレクションがある場合にリストを使用します。リスト内で何かを検索する際は、その位置番号によって見つかります。

リストの例: colors = [red, blue, green]

辞書は現実の辞書や電話の連絡先リストのように考えられます。辞書はキーと値のペアで情報を保存します。項目を検索する際には、数値ではなく一意のラベル(キー)を使用して情報(値)を取得します。データに特定の説明を関連付ける場合に辞書を使用します。

辞書の例: person = {name: Alice, age: 25}

主な違い:

1. アクセス方法: リストでは0, 1, 2などの数値を使用して項目を検索します。辞書では名前や年齢などの説明的なキーを使用します。

2. 構文: リストは[ ]を使用し、辞書は{ }とキーと値を区切るためのコロン(:)を使用します。

3. 目的: 項目が単純な順列である場合にリストを使用します。データをラベル化して後の検索が容易になる場合に辞書を使用します。

Geminiが英語で返すから情報に有意性がある!
とかあればよかったのですが、そんなこともなく日本語で返してきたものと同程度
そのうえで、翻訳を挟んでいるので若干読みにくい

(そもそも有意性に差が出るような質問でもないですけどね…w)

gpt-ossで日本語翻訳追加

※ モデルをgpt-oss:20bに置き換えるだけなのでコードは省略

1回目 2回目 3回目 平均
入力トークン数 29 29 29 29
思考プロセス消費 661 536 691 629
出力トークン数 187 266 226 226
合計トークン数 877 831 946 884
処理時間(秒) 62.45 67.53 64.23 64.73

Qwenより多少マシですが、1分以上かかるのはやはりネックですね…

gpt-ossが出力した和英翻訳
Please explain the difference between dictionary type and list type in Python in a concise way that beginners can understand.
回答の一つ
リストは順序付けられたアイテムのコレクションです。要素は位置に基づいてアクセスし、0から始まります。順序が重要になる単純な買い物リストのようなものです。例えば、名前のリストがある場合、最初の名前はインデックス0にあり、2番目はインデックス1にあります。リストは角括弧を使って作成します。例: `[apple, banana, cherry]`。

辞書はキーと値からなるペアのコレクションです。アイテムを見つけるために番号を使う代わりに、キーと呼ばれるユニークなラベルを使用します。これは、単語の定義を調べるために実際の辞書を使うようなもの、または電話番号を探すために名前を検索する連絡先リストのようなものです。辞書は波括弧を使って作成します。例: `{name: John, age: 30}`。

主な違いはデータの検索方法です。特定の順序でアイテムを保持し、位置番号で検索したい場合はリストを使用します。データに特定の名前やラベルを付けて、後で迅速に検索できるようにしたい場合は辞書を使用します。

翻訳自体は間違ってない気がしますが、改行がないせいか読みにくいです。

考察

なぜこのような結果になったか考えてみました。

問い合わせ内容が貧弱

Pythonで辞書型とリスト型の違いを、初心者にも分かるように簡潔に説明してください。

とりあえずこれでいいやって感じで決めましたが
英語と日本語で明らかな差が出るような回答を期待できない質問でした
もう少し文章量に差が出るような質問なら結果は変わっていたかもしれません

クラウドAIの進化
GeminiやOpenAIのトークナイザーが進化しています

昔のAI: 語彙数が少なく、日本語の複雑な漢字や熟語をカバーしきれませんでした。
1つの熟語を「1文字=1トークン」や「1文字=数バイト」でして処理していた
結果として、英語に比べてトークン数が膨れ上がっていました。

Gemini 1.5以降: 語彙数が25.6万種類という非常に巨大な規模になっている。
これにより、日本語の頻出単語や熟語が「1つのトークン」として丸ごと登録されている

昔は「辞書型」という文字列を「辞・書・型」の3トークンだったが
現在は「辞書型」で1トークンというイメージになっている

昔:[辞][書][型]3トークン
今:[辞書型]1トークン

2~3倍トークンを消費するという定説はもはや過去の情報だったということでした…😭
もう少し調査します!!!

入出力にこだわっても意味ない
入出力を英語にして消費トークンを抑えようとしても
思考プロセスが一番トークン消費する
ここは制御しようがない。
仮にできたとしてもAIに「馬鹿になれ」って言ってるようなもんでしょうw

所感

日→英→問い合わせ→返答→英→日
と非常に多くのステップを踏むので、チャットAIとして利用する場合
待ちきれないくらいには、処理時間がかかる

Claude Codeなどのエージェント型AIのような
投げたら放置、回答は後で確認する
みたいな使い方をするうえで、少しでもコストを抑える
っていう目的なら効果をごくわずかに発揮するかもしれない

ただその場合は、速度よりも正確性のほうが大事になるので
Qwen3よりもgpt-ossを利用するほうが節約になる気がしました。

これはそのうち試してみる価値はある…のか?

期待とはだいぶ違いましたが
期待通りにいかないことを知れたので満足でした。

17
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?