AIに敬語を使うとトークン消費は増えるのか、試しに測ってみた
はじめに
Claude や Copilot を毎日使っていて、ふと「自分は結構丁寧な言葉遣いでプロンプトを書いているけど、これって地味にトークンを食っているのでは」と気になったので、実際にどれくらい差が出るのか手元で試してみました。
大がかりな検証ではなく、Amazon Bedrock 経由で Claude にいくつかのフレーズを投げてトークン数を比べてみた、という程度の話です。とはいえ調べてみると、単純な「丁寧語だからトークンが増える」以上に、漢字表記の効率の良さや、プロンプトの伝わりやすさ(精度)にも関わる話だと分かったので、その辺りも含めてまとめておきます。
きっかけ
社内でAI Agentを触っていると、「AI相手でも敬語を使うべきか、タメ口でいいのか」と考えることがよくあります。なんとなくAIとのやり取りにも敬語を使っていましたが(AIの気を損ねたらなんか適当なレスポンスが返ってきそうという変な先入観があり)、それが精度やトークン効率に影響するかどうか確かめたくなったのがきっかけです。
厳密な効果測定というよりは、個人の興味からの検証だと思って読んでいただければと思います。
試したこと
Amazon Bedrock 経由で Claude 3 Sonnet / Claude 3.5 Sonnet に、同じ意図で「敬語バージョン」と「簡潔バージョン」のプロンプトをいくつか投げて、それぞれの usage.input_tokens / output_tokens を比較しました。
比較したパターン例
敬語スタイル
ユーザー: 「申し訳ございませんが、先月の請求額について教えていただけますでしょうか」
Agent: 「承知いたしました。先月の請求額をお調べいたします」
簡潔スタイル
ユーザー: 「先月の請求額を教えて」
Agent: 「先月の請求額を確認します」
測定に使ったコード
import boto3
import json
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
def measure_token_usage(prompt: str, style: str):
"""トークン使用量を測定する簡単なヘルパー"""
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.7
})
response = bedrock.invoke_model(
modelId='anthropic.claude-3-sonnet-20240229-v1:0',
body=body
)
response_body = json.loads(response['body'].read())
return {
'style': style,
'input_tokens': response_body['usage']['input_tokens'],
'output_tokens': response_body['usage']['output_tokens'],
'total_tokens': response_body['usage']['input_tokens'] +
response_body['usage']['output_tokens'],
'prompt': prompt
}
polite_prompt = "大変恐縮ですが、AWSのコスト最適化についてご教示いただけますでしょうか。"
casual_prompt = "AWSのコスト最適化を教えて。"
polite_result = measure_token_usage(polite_prompt, 'polite')
casual_result = measure_token_usage(casual_prompt, 'casual')
print(f"敬語: {polite_result['total_tokens']} tokens")
print(f"簡潔: {casual_result['total_tokens']} tokens")
いくつかのフレーズペアで試した範囲では、敬語表現の方が総じてトークン数が多くなる傾向が見られました。
単語レベルで見るとより分かりやすい
文単位より、単語・フレーズ単位で比べると差がはっきりします。Anthropic のトークナイザーでいくつかの言い換えペアを比較してみました。
from anthropic import Anthropic
client = Anthropic()
examples = [
("教えてください", "教えて"),
("ありがとうございます", "ありがとう"),
("申し訳ございません", "ごめん"),
("いたします", "します"),
("よろしくお願いいたします", "よろしく"),
]
for polite, casual in examples:
polite_tokens = client.count_tokens(polite)
casual_tokens = client.count_tokens(casual)
print(f"{polite} ({polite_tokens}t) → {casual} ({casual_tokens}t) "
f"[{(polite_tokens - casual_tokens) / polite_tokens * 100:.1f}%削減]")
手元での出力例
教えてください (5t) → 教えて (3t) [40.0%削減]
ありがとうございます (8t) → ありがとう (4t) [50.0%削減]
申し訳ございません (7t) → ごめん (2t) [71.4%削減]
いたします (4t) → します (3t) [25.0%削減]
よろしくお願いいたします (10t) → よろしく (3t) [70.0%削減]
クッション言葉(「恐れ入りますが」「大変恐縮ですが」など)や、謙譲語・尊敬語の活用部分(「いただけますでしょうか」など)は、意味を伝える上では必須ではないことが多く、その分そのままトークン増加につながっている、というのが体感としても実際のカウントとしても一致していました。
なぜ敬語はトークンが増え、漢字はむしろ効率的なのか
ここは今回調べていて興味深かった点です。
敬語表現がトークンを増やす理由は単純で、同じ意味を伝えるのに文字数・形態素の数が増えるからです。「した」を「いたしました」に、「ください」を「いただけますでしょうか」にするだけで、内容は変わらないままトークンだけ増えます。特に婉曲的なクッション言葉は、意味的な情報量をほとんど追加しないままトークンを消費します。
一方で漢字表記は、ひらがなだけで書くよりもトークン効率が良くなることが多いです。多くのトークナイザーは頻出する語彙をまとめて1トークンとして扱うため、意味のまとまりを持つ漢字の熟語は、同じ内容をひらがなで冗長に書き下すよりもコンパクトになりやすい傾向があります。
つまり、「敬語かどうか」と「漢字を使うかどうか」は独立した軸で、敬語を削るとトークンは減りやすい一方、漢字を減らして仮名書きにすると逆にトークンが増えやすい、という点は分けて考える必要があります。
トークンだけでなく、プロンプトの精度にも関係する
コストの話とは別に、地味に見落とされがちなのが精度への影響です。
漢字表記は同音異義語の曖昧さを減らす効果があります。例えば「きかん」とひらがなだけで書くと、期間・機関・器官・気管などどの意味か分かりませんが、漢字で書けばそれだけで曖昧さが解消されます。これはトークン効率だけでなく、意図を正確に伝える上でもプラスに働きます。
逆に、過度に婉曲的な敬語表現は「〜していただけると助かるのですが」のような遠回しな言い回しを伴いやすく(ここまで丁寧にプロンプトする場面はないかもですが)、指示の意図がぼやけて誤読につながるリスクがあります。丁寧さを保ちつつも、指示自体は簡潔かつ具体的に書く方が、コストと精度の両方の観点でバランスが良いと言えそうです。
実装アイデア:System Promptでの言い回し調整
上記を踏まえて、Agent側の応答を簡潔にする System Prompt の例を作ってみました。あくまで一つのアイデアであり、実際のプロダクトでの効果を検証したものではありません。
OPTIMIZED_SYSTEM_PROMPT = """あなたは効率的なカスタマーサポートAIです。
# 応答ルール
1. 簡潔で明確な日本語を使用(過度な敬語は避ける)
2. 「です・ます」調は使うが、冗長な敬語表現は避ける
3. 「いたします」→「します」、「ございます」→「あります」に置換
4. クッション言葉(恐れ入りますが、等)は省略
# 良い例
❌ 大変恐れ入りますが、お客様のアカウント情報を確認させていただけますでしょうか。
⭕ アカウント情報を確認します。
❌ 誠に申し訳ございませんが、その機能は現在ご利用いただけません。
⭕ その機能は現在利用できません。
"""
ユーザー入力側についても、簡単な置換処理で冗長な敬語表現を削る、というアプローチが考えられます。
import re
def simplify_user_input(text: str) -> str:
"""ユーザー入力の冗長な敬語表現を簡略化する(アイデア段階のサンプル)"""
replacements = {
r'いただけますでしょうか': 'もらえますか',
r'教えていただけますか': '教えて',
r'よろしくお願いいたします': 'よろしく',
r'ありがとうございます': 'ありがとう',
r'申し訳ございません': 'すみません',
r'恐れ入りますが、?': '',
r'大変恐縮ですが、?': '',
r'お手数ですが、?': '',
}
simplified = text
for pattern, replacement in replacements.items():
simplified = re.sub(pattern, replacement, simplified)
return simplified.strip()
original = "大変恐れ入りますが、請求額を教えていただけますでしょうか。よろしくお願いいたします。"
simplified = simplify_user_input(original)
print(f"Original: {original} ({len(original)} chars)")
print(f"Simplified: {simplified} ({len(simplified)} chars)")
# Original: 大変恐れ入りますが、請求額を教えていただけますでしょうか。よろしくお願いいたします。 (44 chars)
# Simplified: 請求額を教えてもらえますか。よろしく。 (20 chars)
簡略化しすぎには注意が必要
トークン効率を突き詰めすぎると、逆に問題が起きそうなケースもあります。
# ❌ 過度な簡略化の例(意図が不明瞭)
"前の話の続きで、それどうなった?"
# ⭕ 適度な詳細性を保持
"先ほど相談した返金処理の件、進捗はどうなっていますか?"
文脈を大きく省略すると、AI側が意図を汲み取れずに聞き返し(clarification)が発生し、結果的にやり取り全体のトークンがかえって増える、ということは直感的にも起こりやすそうです。ここは実際に定量化できていない部分なので、あくまで注意点として挙げるにとどめます。
法的・契約関連のやり取りなど、表現の正確さや丁寧さそのものが重要な文脈では、無理にトークン削減を優先すべきではない、という点も付け加えておきます。
LEGAL_CONTEXT_PROMPT = """
契約条件や法的事項に関する問い合わせの場合は、
適切な敬語表現を使用してください。
"""
文脈に応じてスタイルを変える、というアイデア
実際に運用するなら、一律に「簡潔にする」のではなく、文脈の重要度に応じて丁寧さのレベルを切り替える設計が現実的だと思います。以下はそのラフなイメージです。
class ConversationStyleManager:
"""会話スタイルを文脈に応じて動的に制御するアイデア例"""
STYLE_CONFIG = {
'casual_support': {
'description': '一般的な問い合わせ',
'formality_level': 1, # 1-5スケール
'token_priority': 'high'
},
'business_inquiry': {
'description': '商談・提案関連',
'formality_level': 3,
'token_priority': 'medium'
},
'legal_compliance': {
'description': '法務・コンプライアンス',
'formality_level': 5,
'token_priority': 'low'
}
}
def get_system_prompt(self, context_type: str) -> str:
config = self.STYLE_CONFIG.get(context_type, self.STYLE_CONFIG['casual_support'])
if config['formality_level'] <= 2:
return OPTIMIZED_SYSTEM_PROMPT
elif config['formality_level'] <= 3:
return BALANCED_SYSTEM_PROMPT
else:
return FORMAL_SYSTEM_PROMPT
参考:料金換算のイメージ(あくまで概算)
実際の削減額はトラフィック量や会話の内容次第で大きく変わるので断定はできませんが、感覚をつかむための概算だけ置いておきます。仮に Claude 3 Sonnet の Bedrock 料金で、上で見たようなフレーズ単位のトークン削減率(3〜7割程度)がリクエスト全体にもある程度反映されると仮定すると、リクエスト数の多いサービスほど、地味に無視できないコスト差になり得る、という程度のことは言えそうです。ただしこれはあくまで単純化した試算であり、実際の会話全体でこの比率がそのまま当てはまるかは別途検証が必要です(料金体系による)。
まとめ
- 敬語表現(特にクッション言葉や謙譲語・尊敬語の活用部分)は、同じ意味の簡潔な表現に比べてトークン数が増えやすい
- 一方で漢字表記自体は、ひらがな書きよりもトークン効率が良くなることが多く、「敬語かどうか」と「漢字を使うか」は別軸で考えた方がよい
- 漢字は同音異義語の曖昧さを減らす効果もあり、精度の面でもプラスに働きうる
- 逆に過度に婉曲的な敬語表現は指示の意図をぼかし、精度面でわずかにマイナスに働くリスクがある
- 文脈によっては丁寧さや詳細さを削るべきではないケースもあり、一律の最適化は禁物
今回は個人的な興味からの小さな検証なので、大規模な実データでの効果測定や、英語・中国語など他言語での傾向の違いは、機会があれば別途試してみたいと思っています。
それでもあえて敬語を使うメリットはあるか
ここまでの話だけ見ると、「AI相手には敬語を使わない方が得」という結論になりそうですが、トークン効率とは別の軸で敬語を選ぶ合理性もあると思うので、最後に触れておきます。
一つは、出力の文体をそのまま使いたい場面です。多くのモデルは入力の文体に引きずられて出力の丁寧さも揃える傾向があるため、ビジネスメールの下書きや対外的な文章を作らせたい場合は、最初から敬語でプロンプトを書いた方が、出力を後から丁寧語に直す手間が省けます。タメ口で聞いてラフな文面を都度書き直すなら、そちらの手間の方がトークン代より高くつくこともあります。
もう一つは、AIとの日常的なやり取りが自分自身の言葉遣いの習慣に影響するという、技術とは別の観点です。普段からAI相手にも丁寧な言葉を使うことで、人間相手の言葉遣いが荒れにくくなるという指摘もあり、特に子どもが使う場面などではこちらを重視する家庭や教育現場もあります。この場合の「メリット」はトークン効率とのトレードオフとして、コストを払ってでも得たい価値だと言えます。
なお、「丁寧に頼んだ方がAIも協力的で質の良い応答を返す」という説もよく語られますが、これは実証がはっきりしているわけではなさそうなので、確立した事実としては扱わない方がよさそうです。
つまり、トークン効率・処理速度だけを見れば敬語に積極的なメリットはありませんが、コストを許容してでも敬語を選ぶ合理性や状況はある、というのが実際のところだと思います。(まだまだ検証が必要かもしれません)