はじめに
Baidu が公開している ERNIE-4.5-21B-A3B-Thinkingは、長文読解や複雑な推論に強いとされる大規模言語モデルです。
今回はその性能を試すために、「嘘つきと真実を言う人」パズルを与えてみました。条件は「毎日ちょうど1人だけが真実を述べる」というものです。
実験
3人版パズルを実行
puzzle_3 = """三人 A/B/C がいて、毎日必ず一人だけが真実を述べ、残りは嘘をつく。
A:「Bは嘘をついた」
B:「Cは嘘をついた」
C:「AとBは両方嘘だ」
今日真実を述べたのは誰?"""
prompt = build_prompt(puzzle_3)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
_ = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.2,
top_p=0.9,
do_sample=True,
streamer=streamer
)
出力結果
{
"answer": "B",
"steps_bulleted": [
"Aが真だと矛盾",
"Bが真だとAは嘘、Cは嘘で一貫",
"Cが真だと矛盾"
],
"self_check": "Only one truth-teller holds when B is true; other cases contradict."
}
4人版パズルを実行
puzzle_4 = """四人 A/B/C/D がいて、毎日必ず一人だけが真実を述べ、残りは嘘をつく。
A:「Bは嘘つき」
B:「Cは嘘つき」
C:「Dは嘘つき」
D:「Aは嘘つき」
今日真実を述べたのは誰?"""
prompt = build_prompt(puzzle_4)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
_ = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.2,
top_p=0.9,
do_sample=True,
streamer=streamer
)
出力結果
{
"answer": "C",
"steps_bulleted": [
"Aが真だとCも真になり矛盾",
"Bが真だとDも真になり矛盾",
"Cが真だとDは嘘になり一貫",
"Dが真だと他と矛盾"
],
"self_check": "Only case C yields exactly one truth-teller; consistent."
}
実験からわかったこと
・ケースごとに仮定→検証→矛盾チェック→結論 という流れが自然に出る。
・出力をJSON形式に指定すると記事や教材にそのまま使いやすい。
・人数が増えても矛盾なく推論を進められ、スケールしても安定している。
ERNIE-4.5-21B のおすすめ用途
1. 教育・教材づくり
・数学パズルや論理パズルを ステップごとに解説付きで自動生成できる。
・授業や演習問題の「解答例」として活用可能。
2. 契約書・ルール文書の矛盾チェック
・「この条件とこの条件は矛盾していないか?」を自動で検証。
・長文コンテキスト(128Kトークン)対応なので、複数ページの規約や法律文書も一度に処理できる。
3. 読解・要約タスク
・論文や技術資料を 要点抽出して整理。
・「この前提から論理的に導かれる結論は?」という問いに強い。
4. 推理・ゲーム系アプリ
・謎解きゲームの解説AIとして組み込むと、プレイヤーに「ヒント」や「解答プロセス」を提示できる。
・ナイツ&ナヴズやゼブラパズルのような定番ロジックゲームを、AIが解説付きで進めてくれる。
5. 研究・分析サポート
・研究論文や調査レポートを読み込み、因果関係や論理展開の妥当性を検証する補助ツールに。
・「仮説→検証→反例確認」という形で思考を整理するのに便利。
手順
必要なライブラリをインストール
!pip install -U "transformers>=4.54.0" accelerate torch --index-url https://download.pytorch.org/whl/cu121
!pip install -U sentencepiece
モデルをロード
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
import torch
model_id = "baidu/ERNIE-4.5-21B-A3B-Thinking"
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16, # bfloat16推奨
device_map="auto" # GPU自動割り当て
)
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
プロンプト生成関数
論理パズルに使うテンプレート関数を定義します。
JSON形式で答えを返すように指定すると記事化・分析が楽になります。
def build_prompt(puzzle_text):
system = (
"You are an expert puzzle solver. Solve step-by-step, verify, "
"then output a concise final answer as JSON with keys: "
"answer, steps_bulleted, self_check."
)
user = f"""[TASK]
{puzzle_text}
[REQUIREMENTS]
1) Think step-by-step to deduce facts.
2) Do not skip steps. Keep track of constraints.
3) After solving, run a brief self-consistency check.
4) Finally, output:
{{"answer": "...", "steps_bulleted": ["...","..."], "self_check": "OK or issues"}}
"""
return f"<|system|>\n{system}\n<|user|>\n{user}\n<|assistant|>\n"
3人版パズルを実行
puzzle_3 = """三人 A/B/C がいて、毎日必ず一人だけが真実を述べ、残りは嘘をつく。
A:「Bは嘘をついた」
B:「Cは嘘をついた」
C:「AとBは両方嘘だ」
今日真実を述べたのは誰?"""
prompt = build_prompt(puzzle_3)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
_ = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.2,
top_p=0.9,
do_sample=True,
streamer=streamer
)
4人版パズルを実行
puzzle_4 = """四人 A/B/C/D がいて、毎日必ず一人だけが真実を述べ、残りは嘘をつく。
A:「Bは嘘つき」
B:「Cは嘘つき」
C:「Dは嘘つき」
D:「Aは嘘つき」
今日真実を述べたのは誰?"""
prompt = build_prompt(puzzle_4)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
_ = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.2,
top_p=0.9,
do_sample=True,
streamer=streamer
)
まとめ
ERNIE-4.5-21B-A3B-Thinking に 3人版(答え:B) と 4人版(答え:C) の論理パズルを解かせたところ、どちらも矛盾なく推論して正しい答えにたどり着きました。Colabで簡単に再現でき、答えは JSON 形式で返ってくるので記事や教材にもそのまま使えます。
このモデルは、
・論理パズルや数学問題の練習
・規約や契約書の矛盾チェック
・長文の読解や要約
・推理ゲームや教育アプリへの応用
といった使い方に向いていると感じました。
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。