AKARI Tech Blog

燈株式会社のエンジニア・開発メンバーによる技術ブログです

ローカルLLMはポケモンのタイプ相性を理解できるか?|初心者におすすめなLLMモデルを比較

こんばんは!Tech blogの時間がやってまいりました。 DX Solution 事業本部 Dev の許が担当いたします。

GPT-5が発表されて1ヶ月。皆様使っておりますでしょうか。 開発者及び利用者として使っている立場からすると、

「うおおおGPT-5最強!さすが最先端のAI!」

「なんか思ったほどではないな……ナンバリングにするほどか?」

を行ったり来たりしているのですが、全体としては今後GPT-5シリーズにシフトしていくのかなと考えています。

そんな従来のAIと比べて賢くなったGPT-5ですが、意外にも「4oのほうが良かった!」との声が多くあり。 「ChatGPTで再び4oのモデルを選択できるようにする」といった対応をOpenAIが取ったことが話題となりました。

4oがこんなに好かれていただなんて想定外だったな、アルトマン……!

まあ4oの時点でもかなり賢くはなっていましたし、普段使いでGPT-5の賢さを必要とする場面ってそこまで多くないかもしれませんね。 一定程度賢くなったらあとは話し相手として応答が快適な方が選ばれるのでしょうか。

AIにもコミュニケーション力が求められる時代ですね。

賢さが必要とされる分野って?

ではLLMの賢さがまだ足りないとされる分野で、かつ高度な数学の問題でない、一般の人々にも受けやすい分野って何が残っているのでしょうか。

それがゲームの分野だったりします。ゲームを遊ぶためには

  • マルチモーダルな状態の理解
  • 長期のコンテキストの理解(弊ブログでも過去に取り扱った記事あり
  • 複雑なパズルを解く能力
  • 高速な反射神経

など、LLMにとって比較的高度な能力を必要としており、知識問題のベンチマークで人間を超えて久しい今でも、現代のゲームで人間を超えるにはまだ時間がかかりそうです。

実際にベンチマークスコアとして、ポケモンをクリアするのにかかった時間で言うと、o3からGPT-5で2〜3倍早くなるなど、まだまだ劇的な改善が行われている分野です。

現在もGPT_Plays_Pokemonという題名でTwitch配信中。レッド戦を平均レベル50台のパーティと回復アイテムでゴリ押す姿はまるで人間のよう。

ポケモンってそんなに難しいの?

ポケモンというゲーム自体は子供から大人まで遊べるゲームですが、実はゲームの基幹となるタイプ相性が他のゲームと比較しても複雑になっています。

まずタイプとして18通りあり、かつ攻撃側と防御側で異なるため、実に182=324通りのタイプ相性が存在します。

これを覚えるためにはおなじみのタイプ相性表の他、

www.pokemon.co.jp

矢印で表した関係図や、

複合タイプまで考えた円環型の図などもありますが、どの図を見ても相性表としては有数の複雑さとなっています。

複合タイプの表。出典

ではこれをAIは理解できるのか。 上述のGPT-5がポケモンを遊んでいる姿を見る限り、最新のモデルは問題なくタイプ相性を理解できているようです。

では、現代のPCに乗るようなサイズのローカルLLMモデルではどうか?

どうやら最近はローカルLLMが発展しているみたいですし、意外と行けるのでは? そう考えて実際に試したのが本記事となっています。お付き合い頂ければ幸いです。

エントリーモデル紹介

早速ですが今回の企画にエントリーするLLMモデルを紹介します。

  1. Gemma 3 27B 3bit量子化

  2. Qwen3 14B 4bit 量子化

  3. gpt-oss 20B (4bit量子化

の3種類となります。 普段使いのPCに乗るようなミドルサイズのLLMでは、Gemma、Qwen、gpt-ossの話題をよく見かけるイメージです。 各シリーズから16GBのPCに乗るくらいのものを選出しました。

Gemma 3 といえば4月時点の汎用ローカルLLMとして安定した性能、 Qwen3 といえば強力な推論機能、 gpt-ossといえば最近8月にOpenAIが公開した最新モデル。

どれも性能に期待ができそうですね。

ローカルLLMとしては他にも、

  • 大型サイズとかで有名なDeepSeek
  • 小型サイズならPhi
  • 昔からあるLlamaやMistral

などがありますが、2025年9月時点の日本語LLMはGemma、Qwen、gpt-ossのどれかを選んでいれば間違いはない、というのが個人的な所感です。

モデル性能でバトル!

そもそもタイプ相性ってわかるの?

それでは実際に動かしていきましょう。 (参考に、筆者の使用マシンはM2 Mac 2022年モデル、メモリは少し余裕を持たせて24GB。)

質問は、ウツボットの弱点を聞いてみましょうか。

ポケモンにおいて、くさとどくの2タイプを持つポケモンの弱点は何タイプ?」

Gemma 3 27B 3bit量子化

ポケモンにおいて、くさとどくの2タイプを持つポケモンの弱点は以下の通りです。

炎: くさタイプに強く、どくタイプにも通常ダメージを与えられます。
飛行: くさタイプに強く、どくタイプにも通常ダメージを与えられます。
とび: どくタイプに強く、くさタイプにも通常ダメージを与えられます。
むし: くさタイプに強く、どくタイプにも通常ダメージを与えられます。
これらの4つのタイプは、くさとどくのポケモンの弱点となります。特に、炎タイプの技を繰り出すポケモンは効果的な攻撃が期待できます。

ただし、ポケモンの個体によって技の構成や特性が異なるため、必ずしもすべての弱点に対して同じように効果的とは限りません。

不正解

途中までは合っていますが、「とび」タイプという謎のタイプがあります。

またなぜかむしタイプがどくタイプに等倍です。初代ポケモンの「こうかはばつぐん」とも異なりますね。

Qwen3 14B 4bit 量子化

思考過程

Okay, so the user is asking about Pokémon types that are both Grass and Poison. They want to know what types these dual-type Pokémon are weak against. Let me think through this step by step.

First, I need to recall the type effectiveness chart for Pokémon. Each type has specific weaknesses and resistances. Grass-type Pokémon are usually weak against Fire, Ice, Flying, and Bug types. Poison-type Pokémon are typically weak against Ground and Psychic types.

But since the question is about dual-type Pokémon (Grass/Poison), their weaknesses would be a combination of both types. However, I should check if there are any overlaps or specific rules for dual-type weaknesses.

Wait, when a Pokémon has two types, its weaknesses are determined by combining the weaknesses of both types. But sometimes there might be overlaps where a weakness is counted only once even if both types have it. For example, if both Grass and Poison are weak to Ground, then the dual-type would be weak to Ground once, not twice.

So breaking it down:

Grass weaknesses: Fire, Ice, Flying, Bug.
Poison weaknesses: Ground, Psychic.

So combining them, the Grass/Poison type would be weak to Fire, Ice, Flying, Bug, Ground, Psychic. But I should check if any of these are duplicates. Fire, Ice, Flying, Bug from Grass; Ground and Psychic from Poison. No overlaps here. So total of six weaknesses.

But wait, sometimes in dual types, there's a case where a type is weak to the same type from both sides. For example, if Grass/Poison were weak to Fire from Grass and also something else... but in this case, they don't overlap.

So the answer would be that Grass/Poison types are weak to Fire, Ice, Flying, Bug, Ground, and Psychic types. Each of these would deal double damage.

But let me verify this with an example. Take a known Grass/Poison type Pokémon, like Gloom or Bellossom. Checking their weaknesses... For example, Gloom is Grass/Poison. Its weaknesses should be Fire, Ice, Flying, Bug, Ground, Psychic. Yes, that seems right.

Another example: Stunfisk is Grass/Poison (in some generations). Its weaknesses would be those same types. So the answer is correct.

I think that's all. The user might also be interested in knowing resistances, but the question specifically asks about weaknesses. So I'll focus on that.

ポケモンにおいて、**くさ(草)タイプとどく(毒)タイプの両方を持つポケモン**(例:グロウム、ベルロッサなど)の**弱点タイプ**は以下の通りです。

---

### **弱点になるタイプ(ダメージが2倍)**
1. **ほのお(火)**  
   - 草タイプの弱点です。  
2. **こおり(氷)**  
   - 草タイプの弱点です。  
3. **ひこう(飛行)**  
   - 草タイプの弱点です。  
4. **むし(虫)**  
   - 草タイプの弱点です。  
5. **つち(地面)**  
   - 毒タイプの弱点です。  
6. **サイコ(精神)**  
   - 毒タイプの弱点です。  

※ 両方のタイプから弱点が重複しているケースは**ありません**(草と毒で同じ弱点がないため)。

---

### **補足**
- 他のタイプ(例:かくしん、かなしばなど)に対しては**無効**または**ダメージが半分**になるなど、特性による違いがあります(ポケモンごとに異なるため、詳細は個別確認が必要)。
- **例**:草タイプの弱点(ほのお、こおり、ひこう、むし)と毒タイプの弱点(つち、サイコ)を**組み合わせた結果**です。

---

このように、「くさ+どく」タイプのポケモンは、**6種類のタイプに対して弱点**を持っています。攻撃を選ぶ際には注意しましょう!

不正解

バラバラに弱点を列挙してしまいましたね。抵抗が計算されていません。

マルチリンガルなQwen3君も、ポケモンの知識は不十分なようです。

gpt-oss 20B (4bit量子化

思考過程

Need answer: grass/poison has weaknesses to fire, flying, psychic, ice. Also resistances and immunities? But question: "弱点は何タイプ?" So list weaknesses.

ポケモンで「くさ」と「どく」の2タイプを持つ(=草・毒タイプ)ポケモンの弱点は以下の4タイプです。

| 弱点 | 効果倍率 |
|------|----------|
| **ひこうタイプ**(Flying) | 4× |
| **エスパータイプ**(Psychic) | 4× |
| **こおりタイプ**(Ice) | 4× |
| **ほのおタイプ**(Fire) | 2× |

> *くさとどくはそれぞれ弱点として「ひこう」「エスパー」「こおり」「ほのお」を共有するため、両方のタイプを合わせると「ひこう」「エスパー」「こおり」の3タイプが 4 倍、ほのおは 2 倍のダメージになります。*

(抵抗・無効は別途ありますが、質問では「弱点」だけに絞っています。)

不正解

おしい!弱点の数は合っていますが、倍率が違います。くさタイプがエスパー弱点になったり、毒タイプがひこうとこおり弱点になっています。

4倍弱点3つはタイプとして弱すぎる。

タイプ相性表をプロンプトに入れよう!

やはりLLM本体の知識だけで解くのは難しそうです。 しかし諦めるのはまだ早い。LLMであればプロンプトに知識を与えることができます。

そもそも、人間だってタイプ相性表を完全に覚えているわけではなく、忘れている部分があります。 タイプ相性表を参照すれば解ける、と言う状態であれば十分でしょう。 ということで、タイプ相性表をプロンプトに入れて、常に参照できる状態にしましょう。

ちなみに小技ですが、json形式など構造化された状態でLLMに渡してやることで、LLMがより理解しやすい状態になるという技も使っておきます。

{
  "ノーマル": {
    "効果抜群": [],
    "効果いまひとつ": ["いわ", "はがね"],
    "効果なし": ["ゴースト"]
  },

使用プロンプト(攻撃側タイプ中心に構造化)

以下はポケモンのタイプ相性表です、攻撃側の技のタイプが下記の時、相性がどうなるかを書き表しています。

{
  "ノーマル": {
    "効果抜群": [],
    "効果いまひとつ": ["いわ", "はがね"],
    "効果なし": ["ゴースト"]
  },
  "ほのお": {
    "効果抜群": ["くさ", "こおり", "むし", "はがね"],
    "効果いまひとつ": ["ほのお", "みず", "いわ", "ドラゴン"],
    "効果なし": []
  },
  "みず": {
    "効果抜群": ["ほのお", "じめん", "いわ"],
    "効果いまひとつ": ["みず", "くさ", "ドラゴン"],
    "効果なし": []
  },
  "でんき": {
    "効果抜群": ["みず", "ひこう"],
    "効果いまひとつ": ["でんき", "くさ", "ドラゴン"],
    "効果なし": ["じめん"]
  },
  "くさ": {
    "効果抜群": ["みず", "じめん", "いわ"],
    "効果いまひとつ": ["ほのお", "くさ", "どく", "ひこう", "むし", "ドラゴン", "はがね"],
    "効果なし": []
  },
  "こおり": {
    "効果抜群": ["くさ", "じめん", "ひこう", "ドラゴン"],
    "効果いまひとつ": ["ほのお", "みず", "こおり", "はがね"],
    "効果なし": []
  },
  "かくとう": {
    "効果抜群": ["ノーマル", "こおり", "いわ", "あく", "はがね"],
    "効果いまひとつ": ["どく", "ひこう", "エスパー", "むし", "フェアリー"],
    "効果なし": ["ゴースト"]
  },
  "どく": {
    "効果抜群": ["くさ", "フェアリー"],
    "効果いまひとつ": ["どく", "じめん", "いわ", "ゴースト"],
    "効果なし": ["はがね"]
  },
  "じめん": {
    "効果抜群": ["ほのお", "でんき", "どく", "いわ", "はがね"],
    "効果いまひとつ": ["くさ", "むし"],
    "効果なし": ["ひこう"]
  },
  "ひこう": {
    "効果抜群": ["くさ", "かくとう", "むし"],
    "効果いまひとつ": ["でんき", "いわ", "はがね"],
    "効果なし": []
  },
  "エスパー": {
    "効果抜群": ["かくとう", "どく"],
    "効果いまひとつ": ["エスパー", "はがね"],
    "効果なし": ["あく"]
  },
  "むし": {
    "効果抜群": ["くさ", "エスパー", "あく"],
    "効果いまひとつ": ["ほのお", "かくとう", "どく", "ひこう", "ゴースト", "はがね", "フェアリー"],
    "効果なし": []
  },
  "いわ": {
    "効果抜群": ["ほのお", "こおり", "ひこう", "むし"],
    "効果いまひとつ": ["かくとう", "じめん", "はがね"],
    "効果なし": []
  },
  "ゴースト": {
    "効果抜群": ["エスパー", "ゴースト"],
    "効果いまひとつ": ["あく"],
    "効果なし": ["ノーマル"]
  },
  "ドラゴン": {
    "効果抜群": ["ドラゴン"],
    "効果いまひとつ": ["はがね"],
    "効果なし": ["フェアリー"]
  },
  "あく": {
    "効果抜群": ["エスパー", "ゴースト"],
    "効果いまひとつ": ["かくとう", "あく", "フェアリー"],
    "効果なし": []
  },
  "はがね": {
    "効果抜群": ["こおり", "いわ", "フェアリー"],
    "効果いまひとつ": ["ほのお", "みず", "でんき", "はがね"],
    "効果なし": []
  },
  "フェアリー": {
    "効果抜群": ["かくとう", "ドラゴン", "あく"],
    "効果いまひとつ": ["ほのお", "どく", "はがね"],
    "効果なし": []
  }
}


効果抜群だと2倍、
効果いまひとつだと0.5倍、
効果なしだと0倍、
それ以外は1倍になります。

複数のタイプを持つポケモンに攻撃する場合、2つのタイプの相性を掛け算してください。

では、くさとどくの2タイプを持つポケモンに対しては、何タイプの技がばつぐんになる?

Gemma 3 27B 3bit量子化

くさとどくのポケモンへの攻撃について、それぞれの相性を考慮して弱点を計算します。

くさタイプ:

効果抜群: みず、じめん、いわ
効果いまひとつ: ほのお、くさ、どく、ひこう、むし、ドラゴン、はがね
効果なし: なし
どくタイプ:

効果抜群: くさ、フェアリー
効果いまひとつ: どく、じめん、いわ、ゴースト
効果なし: はがね
相性の掛け算:

それぞれのタイプごとに、攻撃側の弱点となるタイプを考えます。

みず: くさとどくの両方に効果抜群なので、2倍のダメージを与えられます。
じめん: くさとどくの両方に効果抜群なので、2倍のダメージを与えられます。
いわ: くさとどくの両方に効果抜群なので、2倍のダメージを与えられます。
フェアリー: どくタイプに効果抜群なので、1.5倍のダメージを与えられます。
ひこう: くさタイプに効果抜群なので、1.5倍のダメージを与えられます。
ほのお: くさタイプに効果いまひとつなので、0.5倍のダメージを与えられます。
ドラゴン: くさタイプに効果いまひとつなので、0.5倍のダメージを与えられます。
はがね: どくタイプに効果なしなので、ダメージを与えられません。
ゴースト: どくタイプに効果いまひとつなので、0.5倍のダメージを与えられます。
エスパー: くさとどくの両方に効果なしなので、ダメージを与えられません。
むし: くさとどくの両方に効果いまひとつなので、0.5倍のダメージを与えられます。
でんき: くさとどくの両方に効果いまひとつなので、0.5倍のダメージを与えられます。
かくとう: くさとどくの両方に効果なしなので、ダメージを与えられません。
あく: くさとどくの両方に効果なしなので、ダメージを与えられません。
弱点:

最も効果を発揮できるのは、みず、じめん、いわのタイプです。
次いでフェアリーやひこうが良いでしょう。

特に注意すべきは、ゴーストタイプの攻撃で効果がないことと、はがねタイプの攻撃で効果がないことです。

不正解

全然ダメですね。他のタイプの相性表が混ざってしまっています。 タイプ相性を理解できていなさそうです。

Qwen3 14B 4bit 量子化

思考過程

Need damage multiplier. Attack types: 飛行+格闘. Defense types: ゴースト + ノーマル. Compute each type interaction.

First, check attack type vs defense types. For multi-type defender, multiply effects of each defense type.

We need mapping: from attack type to weaknesses/resistances. Provided table shows for each defender type, what they are weak/ resist. But we need attack vs defense: For given attack type, check if defender has weakness/resistance.

So for each defender type:

Ghost: weaknesses ["ノーマル","かくとう","どく","むし"]; resistances ["あく","ゴースト"].

Normal: weaknesses ["ゴースト"]; resistances ["かくとう"].

So for attacker type Flying (ひこう): vs Ghost: check if Flying is weak to? Ghost's weaknesses list includes types that are strong against Ghost. So we need to see if Flying is in Ghost's weaknesses. Ghost weaknesses: ノーマル, かくとう, どく, むし. Flying not there => no weakness. Check resistances: Ghost resists あく, ゴースト. Flying not there => no resistance. So multiplier 1.

vs Normal: Normal weaknesses: ゴースト; resistances: かくとう. Flying not there => no effect, multiplier 1.

So Flying vs Ghost+Normal defender: total multiplier 1*1=1.

Now Fighting (かくとう) vs Ghost: Ghost weaknesses include かくとう => weakness, so multiplier 2. Fighting vs Normal: Normal resistances include かくとう => resistance 0.5.

Total for Fighting type: 2 * 0.5 =1.

Now combine attack types: For each defender type, we need to multiply both attack type multipliers? Actually when an attack has two types (Flying+Fighting), the damage multiplier is product of multipliers from each type against defender's types. Usually you compute effectiveness per attacking type vs each defending type, then multiply all.

So we need to compute overall multiplier: For defender Ghost+Normal, compute effect of Flying vs each type then Fighting vs each type? Wait we do: For each attacking type, multiply effect against each defending type. Then multiply results of two attacking types.

Let's compute:

For Flying: vs Ghost 1, vs Normal 1 => product 1.
For Fighting: vs Ghost 2, vs Normal 0.5 => product 1.

Then overall multiplier = 1 * 1 = 1.

Thus damage is 1x.

草とどくの2タイプを持つポケモンに対して、以下のタイプが弱点(効果2倍)になります。

ほのお(火)

草タイプに対して2倍、どくタイプに対して1倍 → 総合効果 2×。
こおり(氷)

草タイプに対して2倍、どくタイプに対して1倍 → 総合効果 2×。
ひこう(飛行)

草タイプに対して2倍、どくタイプに対して1倍 → 総合効果 2×。
エスパー(サイキク)

草タイプに対して1倍、どくタイプに対して2倍 → 総合効果 2×。
答え:

草とどくタイプのポケモンに対して弱点となるのは、**ほのお(火)、こおり(氷)、ひこう(飛行)、エスパー(サイキク)**の4つのタイプです。

正解

お見事!さすが推論モデルということもあり、タイプ相性を理解できているようです。 回答に7分半程度かかったことを除けば、ポケモン世界に連れて行っても問題なさそうです。

gpt-oss 20B (4bit量子化

思考過程

We need to find which attack types have effect superior (2x) against both grass and poison? Actually "ばつぐん" means super effective. For dual type, multiplier is product of each type's effectiveness. We need types where product >=2? Actually "ばつぐん" means 2x overall. If one is 0.5 and other 4? Not present. So need types that are effective against both: for grass, super effective types list: water, ground, rock. For poison, super effective: grass, fairy. Intersection none. But maybe if one is 2 and other 1 gives 2. So need types that are super effective against at least one type, and neutral against the other? For grass: water (2x) vs poison 1 => overall 2. So types that are super effective on grass but neutral to poison. Check water: against poison? water vs poison is 1 (none). So overall 2. Similarly ground: super against grass, neutral to poison? ground vs poison is 1. So overall 2. Rock: super against grass, neutral to poison? rock vs poison is 1. So overall 2. Also types that are super effective on poison but neutral to grass: grass vs grass? no. fairy vs poison is 2, fairy vs grass? fairy vs grass is 1. So overall 2.

Also types that are super effective on both? none.

Thus answer: 水, 土 (ground), 岩 (rock), 草? Wait grass vs poison? no. Fairy.

Thus list: 水, 土, 岩, フェアリー. Also くさ? no.

Return Japanese.

「くさ/どく」の2タイプを持つポケモンに対して、相性が **ばつぐん**(2倍)になる技は次の4タイプです。

| 技のタイプ | くさへの効果 | どくへの効果 | 合計倍率 |
|------------|--------------|--------------|----------|
| 水(みず) | 2 倍 (くさに効果抜群) | 1 倍 (どくに効果なし・普通) | **2 倍** |
| 土(じめん) | 2 倍 (くさに効果抜群) | 1 倍 (どくに効果なし・普通) | **2 倍** |
| 岩(いわ) | 2 倍 (くさに効果抜群) | 1 倍 (どくに効果なし・普通) | **2 倍** |
| フェアリー(フェアリー) | 1 倍 (くさに効果なし・普通) | 2 倍 (どくに効果抜群) | **2 倍** |

したがって、くさ/どくのポケモンに対して「ばつぐん」になる技は **水・土・岩・フェアリー** の4タイプです。

不正解

むむっ!攻撃側タイプを読み間違えていますね。 毒が岩に効いているのも妙です。 タイプ相性はまだLLMに難しかったか……。

ということで、最新作「Pokémon LEGENDS Z-A」にもっていくLLMモデルはQwen3で決まり!推論が遅いのはご愛嬌!

じゃあ最新作の情報でも見て終わりにしましょうか!

最新作……第6世代‥‥カラマネロ……ひっくりかえす‥‥反転……ん……?

さかさバトル

チャレンジモード

ポケモンには相性が反転する「さかさバトル」というものが存在します。 普段こうかばつぐんの技が、こうかいまひとつになるという、非常に頭がこんがらがるルールとなっています。 LLMが文章を学習されて作られている以上、ポケモンの知識を知れば知るほど、通常のタイプ相性との違いに混乱するわけです。 第6世代が初出のバトルシステムとなっています。

さらに、ポケモンにはフライングプレスという、「ひこう」と「かくとう」の2つのタイプを併せ持つ攻撃技があります。 これまた第6世代が初出で、ルチャブルの技として有名。ということでこれを攻撃技にします。

これをノーマル/ゴーストタイプのポケモンにぶつけます(ヒスイゾロアークによるレジェンズ要素)。

ばつぐん、等倍、いまひとつがバランスよく理解できないと回答できない質問となっています。

また、先程のgpt-ossの回答結果を見て、「タイプ相性の与え方が悪かったのでは?」との考えに至り、下記のように防御側タイプを中心にプロンプトを構築してみることに。

{
"ノーマル": {
"弱点": ["ゴースト"],
"抵抗": ["かくとう"]
},

さてそんなさかさバトルでの各陣営の答えはどうなる……!

使用プロンプト(防御側タイプ中心に構造化)

以下はポケモンのさかさバトルでのタイプ相性表です、防御側のタイプが下記の時、相性がどうなるかを書き表しています。

{
"ノーマル": {
"弱点": ["ゴースト"],
"抵抗": ["かくとう"]
},
"ほのお": {
"弱点": ["ほのお", "くさ", "こおり", "むし", "はがね", "フェアリー"],
"抵抗": ["みず", "じめん", "いわ"]
},
"みず": {
"弱点": ["ほのお", "みず", "こおり", "はがね"],
"抵抗": ["でんき", "くさ"]
},
"でんき": {
"弱点": ["でんき", "ひこう", "はがね"],
"抵抗": ["じめん"]
},
"くさ": {
"弱点": ["みず", "でんき", "くさ", "じめん"],
"抵抗": ["ほのお", "こおり", "どく", "ひこう", "むし"]
},
"こおり": {
"弱点": ["こおり"],
"抵抗": ["ほのお", "かくとう", "いわ", "はがね"]
},
"かくとう": {
"弱点": ["むし", "いわ", "あく"],
"抵抗": ["ひこう", "エスパー", "フェアリー"]
},
"どく": {
"弱点": ["くさ", "かくとう", "どく", "むし", "フェアリー"],
"抵抗": ["じめん", "エスパー"]
},
"じめん": {
"弱点": ["ほのお", "どく", "いわ"],
"抵抗": ["くさ", "みず", "こおり"]
},
"ひこう": {
"弱点": [“くさ”, "かくとう", "むし”,”じめん”],
"抵抗": [“でんき”,”こおり”,”いわ"]
},
"エスパー": {
"弱点": ["エスパー", “かくとう”],
"抵抗": [“むし”,”ゴースト", "あく"],
},
"むし": {
"弱点": ["くさ", “かくとう”, “じめん”],
"抵抗": ["ほのお", "ひこう", "いわ"]
},
"いわ": {
"弱点": ["ほのお", "ひこう", “どく”,”ノーマル”],
"抵抗": ["みず", "くさ", "かくとう", "じめん", "はがね"]
},
"ゴースト": {
"弱点": ["ノーマル”,”かくとう”,”どく”,”むし”],
"抵抗": [“あく”, “ゴースト”]
},
"ドラゴン": {
"弱点": [“ほのお”,”みず”,”くさ”,”でんき”],
"抵抗": ["こおり", "フェアリー”,”ドラゴン”]
},
"あく": {
"弱点": ["ゴースト", "あく”,”エスパー”],
"抵抗": ["かくとう", "フェアリー”,”むし”]
},
"はがね": {
"弱点": ["はがね", "フェアリー”,”ノーマル”, “くさ”, ”こおり”, ”どく”, “ひこう”, “エスパー”, “むし”, “いわ”, “ドラゴン”],
"抵抗": ["ほのお", “かくとう”, "じめん"]
},
"フェアリー": {
"弱点": ["ドラゴン", "あく”,”むし”,”かくとう”],
"抵抗": ["どく", "はがね"]
}
}

弱点だと2倍、
抵抗だと0.5倍、
無効だと0倍、
それ以外は1倍になります。

複数のタイプを持つポケモンに攻撃する場合、2つのタイプの相性を掛け算してください。
掛け算して2倍以上になる場合、弱点のタイプとして扱ってください。

では、逆さバトルにおいて、ひこうとかくとうの2タイプを持つ攻撃て、ゴーストとノーマルの2タイプを持つポケモンに攻撃すると、ダメージは何倍??

Gemma 3 27B 3bit量子化

ひこうとかくとうのポケモンがゴーストとノーマルのポケモンに攻撃する場合、それぞれの相性を計算し掛け合わせます。

ひこう vs ゴースト:

ゴーストはエスパーとあくに強いですが、ひこうの攻撃は通常通り(1倍)です。
ひこう vs ノーマル:

ノーマルはゴーストに強いですが、ひこうの攻撃は通常通り(1倍)です。
かくとう vs ゴースト:

ゴーストはエスパーとあくに強いですが、かくとうの攻撃は通常通り(1さん倍)です。
かくとう vs ノーマル:

ノーマルはゴーストに強いですが、かくとうの攻撃は通常通り(1倍)です。
したがって、ひこうとかくとうのポケモンがゴーストとノーマルのポケモンに攻撃した場合、ダメージは1倍となります。

不正解

倍率は合っていますが、かくとうでの弱点と抵抗の扱いを間違えています。 やはり推論モデルでないと理解出来なさそうです。

Qwen3 14B 4bit 量子化

思考過程

Okay, let's try to figure out the damage multiplier here. So, the attacker has two types: 飛行 (Fighting) and かくとう (Bug). Wait, no, wait. Wait the user said "ひこうとかくとうの2タイプを持つ攻撃て" – so that's 飛行 (Fighting?) Wait no, wait. The Japanese terms: ひこう is "Flying" and かくとう is "Fighting". Oh right, because the user wrote "ひこうとかくとう" – so Flying and Fighting types. The attacker is using a move that's both Flying and Fighting? Or the attacking Pokémon has those two types. Wait, the question says "複数のタイプを持つポケモンに攻撃する場合" – so when attacking a Pokémon with multiple types, you multiply the type effectiveness for each of the attacker's types against each of the defender's types.

Wait, but the user is asking: when attacking a Pokémon with Ghost and Normal types (防御側のタイプがゴーストとノーマル), with an attack that has 飛行 (Flying) and かくとう (Fighting) types.

So, the attacker's move has two types: Flying and Fighting. The defender is Ghost and Normal.

So, for each of the attacker's types (Flying and Fighting), check their effectiveness against each of the defender's types (Ghost and Normal). Then multiply all those factors together.

Let me start by checking each combination:

First, Flying type attack against Ghost: Looking at the type chart. For Ghost's weaknesses and resistances.

From the table, Ghost has "弱点": ["ノーマル”,”かくとう”,”どく”,”むし”] and "抵抗": ["あく”, “ゴースト”]. Wait, the user's table might have some typos with quotes and symbols. Let me check again.

Looking at the original data:

"ゴースト": {
"弱点": ["ノーマル”, ”かくとう”,”どく”,”むし”],
"抵抗": [“あく”, “ゴースト”]
}

So Ghost's weaknesses are Normal, Fighting, Poison, Bug. Resistances are Dark and Ghost.

So when Flying type is used against Ghost: What's the effectiveness? Let me look at the attacker's type (Flying) against defender's type Ghost.

Looking up in the table for Flying:

Wait, no. Each type has their own weaknesses and resistances. Wait, but how to find the effectiveness of an attack type against a defense type.

For example, if the attacker's type is A and defender's type is B, then check in the table for B's weaknesses and resistances against A.

Wait, maybe I need to look up each defender type (Ghost and Normal) and see how they are affected by the attacker's types (Flying and Fighting).

Let me structure it:

For each of the attacker's types (Flying, Fighting), check how effective they are against each of the defender's types (Ghost, Normal). Then multiply all those factors.

So:

Flying type against Ghost: Looking at the Ghost's weaknesses and resistances. The attacker is using Flying against Ghost.
Looking for Fly vs Ghost: In the table, under the defender's type (Ghost), check if Flying is in their Weakness or Resistance.

Looking at Ghost's weaknesses: ["ノーマル”, ”かくとう”,”どく”,”むし”], so Normal, Fighting, Poison, Bug.

Ghost's resistances: ["あく”, “ゴースト”] which are Dark and Ghost.

So, if the attacker's type is Flying against Ghost: Since Flying isn't listed in Ghost's weaknesses or resistances. Wait, but maybe I need to check the reverse: For each defender type (Ghost), what is their effectiveness against the attacker's types. Wait, maybe I should check for each defender type B, how does each attacker's type A affect it.

Alternatively, perhaps the way to look up is:

For a move of type X attacking a Pokémon with type Y, check if X is in Y's weaknesses (then 2x), or resistances (0.5x), or none (1x). Also, if Y is a type that the move X is immune to, but here only immunity (0x) would apply if Y is a type that X's moves are not effective against.

But in the given table, for each defense type Y, the weaknesses and resistances are listed. So:

For example, if Y is Ghost, then looking at the "弱点" and "抵抗" for Y. So:

If attacker's type is X, then check if X is in Ghost's weaknesses (then 2x), or resistances (0.5x). If neither, then 1x.

But in the given table for Ghost:

弱点: ["ノーマル”, ”かくとう”,”どく”,”むし”] → so if attacker's type is Normal, Fighting, Poison, or Bug against Ghost, then it's 2x.

抵抗: ["あく”, “ゴースト”] → if attacker's type is Dark or Ghost against Ghost, then 0.5x.

Other types (like Flying) would be 1x.

Similarly for Normal type: looking at Y=Normal's weaknesses and resistances. From the original table:

"ノーマル": {
"弱点": ["ゴースト"],
"抵抗": ["かくとう"]
}

So for Normal type (as defender), if attacker's type is Ghost, it's 2x. If attacker's type is Fighting (かくとう), then it's 0.5x.

Other types are 1x.

So going back to the problem:

Attacker has two types: Flying and Fighting. Defender is Ghost and Normal.

So for each attacker's type, check effectiveness against each defender's type:

First combination: Flying vs Ghost.

Ghost's weaknesses are Normal, Fighting, Poison, Bug. So Flying is not in weak, nor resistances (Ghost's resist are Dark and Ghost). Therefore, effectiveness against Ghost is 1x.

Second combination: Flying vs Normal.

Normal's weaknesses are Ghost (so if attacker is Ghost, it's 2x). But here attacker is Flying. Looking at Normal's weaknesses: ["ゴースト"], so only Ghost weakens. Resistances are ["かくとう"] → Fighting (Fighting is かくとう). So if attacker's type is Flying against Normal: since Flying is not in weaknesses nor resistances, so effectiveness is 1x.

Third combination: Fighting vs Ghost.

Ghost's weaknesses include Fighting (as listed above). So attacker type is Fighting against Ghost: 2x.

Fourth combination: Fighting vs Normal.

Normal's resistances include Fighting (かくとう). So attacker type is Fighting against Normal: 0.5x.

So now, the overall damage multiplier would be:

For each of the attacker's types (Flying and Fighting), multiply by their effectiveness against each defender's type (Ghost and Normal). So total multiplier is:

(Flying vs Ghost) * (Flying vs Normal) * (Fighting vs Ghost) * (Fighting vs Normal)

Which is:

(1x) * (1x) * (2x) * (0.5x)

Calculating that:

(11) = 1; (20.5)=1 → total is 1 * 1 = 1? Wait that can't be right.

Wait no, wait. Because the attacker has two types (Flying and Fighting) against defender's two types (Ghost and Normal). So the formula is:

For each attacker type, calculate effectiveness against each defender type. Then multiply all those together.

But the correct formula is: total damage multiplier = product of (attacker_type1_effectiveness_against_defender_type1) * (attacker_type1_effectiveness_against_defender_type2) * (attacker_type2_effectiveness_against_defender_type1) * (attacker_type2_effectiveness_against_defender_type2)

So in this case:

The attacker is using both Flying and Fighting types. Each of these types has their own effect against each defender's type (Ghost and Normal). So the calculation would be:

Flying vs Ghost = 1

Flying vs Normal = 1

Fighting vs Ghost = 2

Fighting vs Normal = 0.5

Multiply all four together: 1 * 1 * 2 * 0.5 = (1 * 1) * (2 * 0.5) = 1 * 1 = 1x?

Wait that seems like the damage would be 1x. But wait, is there a different way to calculate it?

Alternatively, maybe when the defender has two types, you need to check for each attacker's type against each of the defender's types and then take the minimum or something else?

Wait no, according to the initial instruction: 「複数のタイプを持つポケモンに攻撃する場合、2つのタイプの相性を掛け算してください。」 So when attacking a Pokémon with multiple types, multiply the effectiveness of each attacker's type against each defender's type.

Wait but that would be attacker_type1_effectiveness_defender_type1 * attacker_type1_effectiveness_defender_type2 * attacker_type2_effectiveness_defender_type1 * attacker_type2_effectiveness_defender_type2 ?

But that seems to be combining all four factors. However, maybe the correct way is for each attacker's type, check against each defender's type and combine those. For example, if the attacker has two types (A and B) and defender has two types (X and Y), then the damage multiplier is:

(A vs X) * (A vs Y) * (B vs X) * (B vs Y). Because each of the attacker's types is used against both defender's types.

But that seems like the way it's done. So for example, if a move has two types (A and B), and the defender is X and Y, then each of A's effectiveness against X and Y, multiplied by B's effectiveness against X and Y.

So following that logic:

For each attacker type (Flying, Fighting):

Check their effectiveness against each defender type (Ghost, Normal), multiply them.

So for Flying against Ghost and Normal: 1 * 1 = 1

For Fighting against Ghost and Normal: 2 * 0.5 = 1

Then multiply those two results together: 1 * 1 = 1x damage.

But that would mean no change. However, I think there might be a misunderstanding here.

Wait another approach: In standard type effectiveness (not reversed), when an attack has multiple types, the damage is calculated as the product of each type's effectiveness against the defender (each attacker type's effectiveness multiplied for each defender type). But here, in this problem, the table is given for defense side types. For example, if defender has two types, then each attacker type's effectiveness is checked against both of them.

But wait in normal Pokémon battle rules, if a move has two types (like Water and Fire), then each of those types' effectiveness is checked against the defender's types, and the damage multiplier is the product of all those checks. For example, if attacker has Water/Fire against a Water/Flying defender: each type is checked against both defender's types.

So, in this problem, same logic applies. Let me confirm with the example:

Attacker types: Flying and Fighting.

Defender's types: Ghost and Normal.

So for each attacker type, we calculate effectiveness against both defender's types:

For Flying:

Against Ghost: 1x (since Ghost isn't weak or resistant to Flying)
Against Normal: 1x (Normal isn't weak or resistant to Flying)
So Flying contributes 1 * 1 = 1.

For Fighting:

Against Ghost: Weakness (Ghost is weak to Fighting), so 2x.
Against Normal: Resistance (Normal resists Fighting, since in the table "ノーマル" has resistance ["かくとう"], which is Fighting. So attacker's Fighting against Normal defense: 0.5x.
So Fighting contributes 2 * 0.5 = 1.

Now multiply both: 1 (from Flying) * 1 (from Fighting) = 1x total damage.

But that seems odd. However, according to the calculation, it would be 1x. But maybe I made a mistake here.

Wait let's check again:

First, for each attacker type (Flying and Fighting) against each defender type (Ghost and Normal):

Flying vs Ghost: 1x.

Flying vs Normal: 1x.

Fighting vs Ghost: attacker type is Fighting against defender's Ghost type. According to the table for Ghost, weaknesses are Normal, Fighting, Poison, Bug → so attacker's type is Fighting (かくとう) which is in Ghost's weaknesses. So 2x.

Fighting vs Normal: defender is Normal, attacker type is Fighting (かくとう). From the table for Normal's resistances: ["かくとう"] → so attacker type is Fighting against Normal defense: 0.5x.

So multiplying these four factors:

1 * 1 (Flying against both) multiplied by 2 * 0.5 (Fighting against both):

So total is (11) * (20.5) = 1 * 1 = 1x.

But the user also mentioned that if the product is 2 or higher, treat it as weakness. Here it's exactly 1x.

But wait, is there another way this could be calculated? Like, for each defender's type, check against all attacker types. For example:

Defender has Ghost and Normal.

For each of the defenders' types (Ghost, Normal), calculate effectiveness against attacker's types (Flying and Fighting). Then take the minimum of those? Or multiply?

Wait no, standard type effectiveness is that if a move has multiple types, each of them is checked against the defender's type(s), and the damage multiplier is the product. So, for example:

If a move is Flying/Fighting against Ghost/Normal defender:

The damage multiplier would be (Flying vs Ghost) * (Flying vs Normal) * (Fighting vs Ghost) * (Fighting vs Normal). Which is 112*0.5 = 1. So total damage multiplier is 1x.

But in that case, there's no change. But maybe I'm misunderstanding the structure of the tables.

Wait let me go back to the original question's instruction:

弱点だと2倍、抵抗だと0.5倍、無効だと0倍、それ以外は1倍になります。

複数のタイプを持つポケモンに攻撃する場合、2つのタイプの相性を掛け算してください。

So when attacking a Pokémon with multiple types, multiply the two type effects.

Wait maybe I misinterpreted "2つのタイプの相性を掛け算" as the attacker's two types against the defender's two types, but perhaps it's that for each attacker type (if there are multiple), multiply their effectiveness against the defender's types.

Wait but in this case, attacker has two types (Flying and Fighting), defender has two types (Ghost and Normal). The question says, "複数のタイプを持つポケモンに攻撃する場合、2つのタイプの相性を掛け算してください。" So maybe it's that when attacking a Pokémon with multiple types (here defender has two), we need to calculate the product of each attacker type's effectiveness against each defender's type.

Wait but that's what I did before. So the calculation is (1 * 1) * (2 * 0.5) = 1.

But perhaps there's a mistake in how I applied the effectiveness for Fighting against Ghost and Normal?

Let me check again.

For defender's Ghost type:

If attacker uses Fighting (かくとう), then according to the table for Ghost's weaknesses: ["ノーマル”, ”かくとう”,”どく”,”むし”] → Fighting is in weaknesses, so 2x.
For defender's Normal type:

Attacker uses Fighting (かくとう). According to the table for Normal: "抵抗": ["かくとう"] → so Fighting is a resistance, meaning attacker's type is resistant to Normal. So effectiveness is 0.5x.
Yes, that seems correct.

So then the calculation would be:

(Flying vs Ghost) is 1x, (Flying vs Normal) is 1x → product of Flying against both defender types: 1*1=1.

(Fighting vs Ghost) is 2x, (Fighting vs Normal) is 0.5x → product of Fighting against both defender types: 2*0.5=1.

Total overall damage multiplier is (product of attacker's types against defender's types) → 1 * 1 = 1x.

So the answer would be no change in damage, 1x. But that feels odd because Fighting is strong against Ghost (2x), but weak against Normal (0.5x). So combined, those two factors cancel each other out.

Is that correct according to the rules given?

Yes, because each attacker's type is checked against all defender types. So with two attacker types and two defender types, multiply all four factors.

So 112*0.5 = 1x damage multiplier.

逆さバトルにおいて、**飛行(ひこう)**と**戦闘(かくとう)**の2タイプを持つ攻撃が、**ゴースト**と**ノーマル**の2タイプを持つ防御ポケモンに与えるダメージ倍率は以下の通りです:

---

### **ステップバイステップの計算**
1. **攻撃タイプの効果性を防御タイプごとに確認**  
   - **飛行(ひこう)**の攻撃:
     - ゴーストに対して: 飛行は「弱点」「抵抗」「無効」に該当しない → **1倍**
     - ノーマルに対して: 飛行は「弱点」「抵抗」に該当しない → **1倍**
   - **戦闘(かくとう)**の攻撃:
     - ゴーストに対して: 戦闘はゴーストの**弱点(2倍)**
     - ノーマルに対して: 戦闘はノーマルの**抵抗(0.5倍)**

2. **すべての効果性を掛ける**  
   $$
   (飛行対ゴースト) \times (飛行対ノーマル) \times (戦闘対ゴースト) \times (戦闘対ノーマル)
   $$
   $$
   = 1 \times 1 \times 2 \times 0.5 = 1
   $$

---

### **最終的なダメージ倍率**
**1倍(変化なし)**

---
この計算結果は、攻撃タイプの効果が**対ゴーストでは2倍**、**対ノーマルでは0.5倍**になるため、両者を掛け合わせて**中和**された結果です。

正解

長時間の試行の末見事に正解。しかし8.99 tok/secとかなり遅め。また、非常に長時間の推論をしていて、回答が出てくるまでに7分半かかっています。 病的なまでにミスを潰すことで相対的に小さなモデルサイズでも正解できていますが、普段使いするには速度が少し気になるところ。

gpt-oss 20B (4bit量子化

思考過程

Need damage multiplier. Attack types: 飛行+格闘. Defense types: ゴースト + ノーマル. Compute each type interaction.

First, check attack type vs defense types. For multi-type defender, multiply effects of each defense type.

We need mapping: from attack type to weaknesses/resistances. Provided table shows for each defender type, what they are weak/ resist. But we need attack vs defense: For given attack type, check if defender has weakness/resistance.

So for each defender type:

Ghost: weaknesses ["ノーマル","かくとう","どく","むし"]; resistances ["あく","ゴースト"].

Normal: weaknesses ["ゴースト"]; resistances ["かくとう"].

So for attacker type Flying (ひこう): vs Ghost: check if Flying is weak to? Ghost's weaknesses list includes types that are strong against Ghost. So we need to see if Flying is in Ghost's weaknesses. Ghost weaknesses: ノーマル, かくとう, どく, むし. Flying not there => no weakness. Check resistances: Ghost resists あく, ゴースト. Flying not there => no resistance. So multiplier 1.

vs Normal: Normal weaknesses: ゴースト; resistances: かくとう. Flying not there => no effect, multiplier 1.

So Flying vs Ghost+Normal defender: total multiplier 1*1=1.

Now Fighting (かくとう) vs Ghost: Ghost weaknesses include かくとう => weakness, so multiplier 2. Fighting vs Normal: Normal resistances include かくとう => resistance 0.5.

Total for Fighting type: 2 * 0.5 =1.

Now combine attack types: For each defender type, we need to multiply both attack type multipliers? Actually when an attack has two types (Flying+Fighting), the damage multiplier is product of multipliers from each type against defender's types. Usually you compute effectiveness per attacking type vs each defending type, then multiply all.

So we need to compute overall multiplier: For defender Ghost+Normal, compute effect of Flying vs each type then Fighting vs each type? Wait we do: For each attacking type, multiply effect against each defending type. Then multiply results of two attacking types.

Let's compute:

For Flying: vs Ghost 1, vs Normal 1 => product 1.
For Fighting: vs Ghost 2, vs Normal 0.5 => product 1.

Then overall multiplier = 1 * 1 = 1.

Thus damage is 1x.

**ダメージ倍率は 1倍です。**

**計算の流れ**

| 攻撃タイプ | 対象1(ゴースト) | 対象2(ノーマル) | 乗算結果 |
|------------|-------------------|-------------------|-----------|
| **ひこう** | 1×(弱点・抵抗なし) | 1×(弱点・抵抗なし) | **1** |
| **かくとう** | 2×(ゴーストが弱点) | 0.5×(ノーマルが抵抗) | **1** |

- ひこう vs ゴースト:弱点・抵抗リストに該当なし → 1  
- ひこう vs ノーマル:弱点・抵抗リストに該当なし → 1  
- かくとう vs ゴースト:ゴーストの弱点に「かくとう」含む → 2  
- かくとう vs ノーマル:ノーマルの抵抗に「かくとう」含む → 0.5  

攻撃側が2タイプなので、上記それぞれの乗算結果をさらに掛け合わせると  
\(1 \times 1 = 1\) となります。  

したがって、**ひこう+かくとうタイプの攻撃はゴースト+ノーマルタイプのポケモンに対して1倍のダメージ**を与えます。

さすがだぞ!タイプの相性をバッチリ理解しているんだな!

正解

タイプ相性を防御側で与えることで、完璧な回答を返してくれるようになりました。 速度も26.41 tok/secと素早く、6秒後から試行を開始し、約33秒後には回答が完成しているという。ChatGPTと使用感がほぼ変わらない。

gpt-oss君、キミにきめた!

まとめ

16GBのメモリに乗るサイズのモデルということで、最新モデルのgpt-ossに有利なルールでしたが、それでもなおgpt-ossの性能の高さに驚かされる結果となりました。 一昔前のChatGPTがローカルで動く感覚。実はこっそり歴史問題とかも聞いていたのですが、想像以上に答えられて驚いていました。

一方でQwen3の推論能力の高さも捨てがたいですね。時間がかかっても良い場合はQwen3でもいいかもしれません。 ポケットモンスター「汎用性のgpt-oss / 推論力のQwen3」といったところでしょうか。Gemma 3のマイナーチェンジ版も待たれます。

ロトム図鑑に16GB以上のVRAMがついたGPUか、16GB以上のユニファイドメモリが搭載されていれば、gpt-ossをインストールすることでタイプ相性を教えてくれるようになります。 これでポケモン初心者も安心して旅に出ることができますね。

俺はこいつ(gpt-oss)と旅に出る(ジピティ!)。

We’re Hiring!

燈では、最新技術で遊ぶのが好きなAIエンジニアを募集しています! 興味がある方は、ぜひカジュアル面談でお話しましょう!

akariinc.co.jp