AIはWebオタクだから、プロンプトは「Webにありふれた言い回し」が効く ― Adam's Lawを実装イメージで読み解く
Adam's Law:LLMの性能を最大化する鍵は、プロンプトの「難易度」ではなく、Web上での「出現頻度」にあるとする法則
はじめに:プロンプトで使う「言い回し」
「同じ内容を聞いているだけなのに、言い回しを変えたら急に生成AI(LLM)の回答の精度が上がった/下がった」
LLMを触っていると、こういう「プロンプトの言い換えで挙動が変わる」現象にしょっちゅう出会います。2026年4月の論文「Adam's Law: Textual Frequency Law on Large Language Models」は、この現象を「頻度」という観点から整理しなおしたものです。
この記事では、数式抜きで、
- 「頻度が高い言い回しを選ぶ」とは具体的にどういうことか
- それをどう実装したり、プロンプト設計に落としたりできるのか
を、疑似コードの処理フローで整理していきます。
Textual Frequency Law(TFL)を疑似コードで書いてみる
論文の一番コアな主張は、こうです。
「同じ意味のパラフレーズ候補が複数あるなら、事前学習データ中でより「頻繁に現れる」言い回しを選ぼう」
これを疑似コードで書くと:
# 同じ意味の言い回し候補のリスト
candidates = [
"Could you please explain ...?",
"Please provide an explanation of ...",
"Explain ...",
...
]
# 文の「出現頻度ベースのスコア」を評価する関数
# 注意:ここでは「スコアが小さいほど高頻度」という設計にしておく(後述)
function sentence_freq_score(sentence):
return estimated_frequency_score(sentence) # 小さい = よく出てくる
# 一番「よく出てきそうな」文を選ぶ(スコアが最小のもの)
best_prompt = argmin(candidates, key=sentence_freq_score)
# その best_prompt を LLM に投げる
answer = LLM(best_prompt)
やっていることはこれだけです。
「意味は同じだけど言い方が違う文」を並べて、その中で一番「よく見かけそう」なやつを選んでいるイメージです。
※ 実装上は、文の頻度スコアを「単語頻度の逆数の幾何平均」で計算しているため、スコアが小さいほど高頻度な文になります。この向き(小さい=高頻度)だけ注意しておけばOKです。
文レベル頻度をどうやって近似するか
問題は sentence_freq_score() をどう実装するかです。
論文では、「文全体の頻度」を、「中に含まれる単語(+フレーズ)の頻度」から近似しています。
イメージ的にはこんな処理です。
# 単語の頻度を返す
# 論文の実装では NLTK の Brown コーパスなどを使って基準頻度を作っている
function word_freq(word):
return lookup_frequency_from_corpus(word) # 大きい = よく出る単語
# 文の頻度スコアを近似する
# ここでは「小さいスコア = 高頻度の文」として扱う
function sentence_freq_score(sentence):
tokens = tokenize_and_clean(sentence) # ["happy", "to", "help", "you"] など
freqs = []
for token in tokens:
f = word_freq(token) # 各単語の頻度(大きいほどよく出る)
freqs.append(f)
# 実装では「頻度の逆数の幾何平均」を取っている
# イメージとしては「頻度が高い単語が多いほど、スコアが小さくなる」
score = geometric_mean_of_inverse(freqs)
return score # 小さいほど高頻度の文
実際の論文のコードでは、さらに細かい工夫が入っていますが、ざっくりとしたイメージとしては、
「頻度の高い単語やフレーズが多く含まれている文ほど、スコアが小さくなる → 高頻度な文とみなす」
という考え方になっています。
さらに攻める:TFD(Textual Frequency Distillation)
word_freq() の精度は、どのコーパスを元に頻度を作るかで変わります。
論文の実装では、まず NLTK の Brown コーパスから単語頻度を作り、それをベースラインとしています。これはニュース・書籍などの英語を含んだ、クラシックな100万語規模のコーパスです。
そのうえで、
- Brown コーパス由来の頻度(ベースライン)
- 対象LLMにストーリー補完をさせて、その生成文から推定した頻度
この2つを組み合わせて、より「そのLLMらしい頻度」に近づける仕掛けを入れています。これが Textual Frequency Distillation(TFD) です。
LLMに自由に続きを書かせることで、そのモデルが内部的に持っている「自然な文の並び」や「よく使う語彙の組み合わせ」を統計的に抽出するイメージです。
処理フローのイメージはこうです。
# 1. ベースコーパス(例:Brown コーパス)から単語頻度テーブルを作る
base_freq = build_frequency_table_from_brown()
# 2. 対象 LLM にストーリー補完をさせて、追加のコーパスを生成する
generated_texts = []
for prompt in seed_prompts:
generated = LLM_story_completion(prompt)
generated_texts.append(generated)
generated_freq = build_frequency_table(generated_texts)
# 3. 2つの頻度テーブルをマージして「蒸留された頻度」を作る
# 実装では、共通語の頻度比の中央値でスケーリング調整してから合成している
distilled_freq = merge_with_scaling(base_freq, generated_freq)
# 4. 以後の sentence_freq_score() / word_freq() では distilled_freq を参照する
ここでの merge_with_scaling は、単純に足し合わせるのではなく、
- 2つの頻度分布のスケールを中央値ベースで合わせてから
- 積(あるいは重み付き合成)で統合
するといった、やや凝った実装になっています。
「対象LLMが実際に出しそうなテキスト」をもう一度読ませて、その分布を頻度推定に反映させるイメージです。実装コストはそれなりに高いので、論文でもこれはオプション扱いとなっていますが、やるとさらに安定して精度が上がることが示されています。
CTFT(Curriculum Textual Frequency Training):学習順序を変える
次はファインチューニング側の話です。
通常、ファインチューニング用のデータはシャッフルして食わせますが、Adam's Law では、文の頻度スコア順に並べ替えるというカリキュラム学習的なアイデアを提案しています。これが Curriculum Textual Frequency Training(CTFT) です。
処理フローのイメージはこうです。
# 学習データのリスト(文 or 入力)
train_data = load_dataset()
# 各サンプルに「頻度スコア」を付与(小さい = 高頻度)
for sample in train_data:
sample.freq_score = sentence_freq_score(sample.text)
# 方向性としては、低頻度→高頻度の順番で学習させるカリキュラムになるようソート
# 実装では、低頻度側/高頻度側を一度分けてからマージ・再ソートする
sorted_data = sort_for_curriculum(train_data, key=lambda s: s.freq_score)
# その順番のままエポックを回す
for epoch in range(num_epochs):
for sample in sorted_data:
loss = model.train_step(sample)
実装を見ると、
- 低頻度寄りのデータと高頻度寄りのデータを別々にスコアリングし
- それらを結合してから、最終的に「高頻度サンプルが後ろに来る」ような順序に整える
という、やや凝った二段階ソートになっています。ただ、方向性としては
「より珍しい(低頻度な)表現もきちんと学びつつ、最後はよく出る(高頻度な)表現で締めて安定させる」
というカリキュラムになっています。最後に高頻度の表現で「おさらい」することでモデルのパラメータを安定させるイメージです。機械翻訳の実験では、「高頻度データのみ」よりも「高頻度 + CTFT」の方が、BLEU/chrFなどでさらに良いスコアを出しています。
難易度とは別の軸としての頻度
TFL の議論でよく誤解されるのが、
「簡単な文章(平易な文章)だから性能が上がっているのでは?」
という点です。
論文では、文の難易度を複数の指標(例:構文木の深さ、依存距離など)で測り、頻度との相関を確認しています。その結果、
- 文の難易度(complexity)
- 文の頻度スコア(frequency)
の間の相関はかなり弱く、「難易度が低い=頻度が高い」わけではないことが示されています。
エンジニア向けにざっくり書き換えると:
# 高頻度な文
"happy to help you"
→ 短い&簡単で、頻度も高い
# やや難しいが頻度が高い文
"In this tutorial, we will walk through the process of ..."
→ 構文としては長めだが、チュートリアル記事で頻出
# 短くても低頻度な文
"delighted to elucidate"
→ 文としては短くても、ほとんど出てこない言い回し
「簡単さ」と「頻度」は別の軸であり、TFLが効いているのは頻度の方だ、というのがこの論文のポイントです。
実験結果の読み方(数値はざっくり)
詳細な数値は論文を見てもらうとして、重要なのはパターンです。
- 複数のLLM(GPT系、LLaMA系、DeepSeek系など)で
- 数学推論・翻訳・常識推論・ツール呼び出しという異なるタスクに対して
- 「低頻度→高頻度の言い換え」による一貫した性能改善が見られる
というところです。
特に興味深いのは、
- 低頻度表現で既に正解していたサンプルは、高頻度表現に変えてもほぼそのまま正解
- 一方で、低頻度では誤答だったサンプルは、高頻度に変えるとかなりの割合で正答にひっくり返る
という、「悪いほうだけを削って、良いほうは維持している」ような挙動が見られている点です。
これは、プロンプトを頻度ベースでチューニングする価値をかなり強く示す結果になっています。
実務への落とし込み:実装とプロンプト設計のヒント
技術的なポイントを、実務で使える形に落としてみます。
1. プロンプト自動書き換えのパイプライン例
たとえば、「社内でよく使う定型プロンプトを自動で高頻度文体に寄せる」ツールを作るなら、処理の流れはこうなります。
# 1. ユーザーが英文でプロンプトを書く
user_prompt = input()
# 2. LLMに同じ意味のパラフレーズを複数出させる
candidates = LLM_paraphrase(user_prompt, n=10)
# 3. 各候補の頻度スコアを計算(小さいほど高頻度)
scored = []
for cand in candidates:
score = sentence_freq_score(cand) # word_freq は Brown + 生成テキストで蒸留
scored.append((cand, score))
# 4. スコア最小の候補を「推奨プロンプト」として提示
best_prompt, best_score = argmin(scored, key=lambda x: x[1])
print("Original:", user_prompt)
print("Suggested high-frequency prompt:", best_prompt)
2. 人間のプロンプト設計に活かすなら
よりライトに使うなら、「Web検索でヒットしそうな言い方かどうか」を自分の中の経験則として持っておくだけでも効果があります。
- 変に凝った語彙を避ける
- 専門用語は使いつつ、周辺のつなぎ・接続詞・依頼表現はありふれた言い回しに寄せる
- 「論文のAbstractにそのまま貼れそうな文章」より、「技術ブログの冒頭にありそうな文章」をベースにする
これだけで、TFLの恩恵をかなり受けられます。
おわりに:一番「よく見かけそうな」言い回しを選ぶ
Adam's Law / Textual Frequency Law をまとめると、
- やっていることは「同じ意味なら、一番『よく見かけそうな』言い回しを選ぶ」こと
- 文レベルの頻度は「中の単語(やフレーズ)の頻度」から近似できる
- その頻度は、プロンプト選択にも、学習データの並び替え(カリキュラム学習)にも使える
- 「簡単かどうか」ではなく「どれだけ頻繁に出てくるか」が効いている
- 実務では「パラフレーズ生成 → 頻度スコアリング → ベストを選ぶ」というパイプラインや、「Webでありふれた言い回しを意識する」という経験則として活用できる
という話です。
モデルの事前学習データがWebを中心とした大量のテキストであることから、「LLMはWebオタクとして育っている」と考えると、この法則はかなり自然に見えてきます。― Webオタクと話すときはWebオタクの言い回しで話すと話が通じやすい
プロンプトを設計するときも、「学会での発表原稿」ではなく「技術ブログの記事」を書く感覚で表現を選んでみましょう。
参考文献・記事
-
arXiv:2604.02176 Hongyuan Luke, Yanru Pei, Peiyao Li ほか 「Adam's Law: Textual Frequency Law on Large Language Models」 (2026)
https://arxiv.org/abs/2604.02176
Discussion