【小型LLM比較】プロンプトに忠実に従うのはどれか？

こんばんは。べんと申します。

この一年ほどの間に、パラメータ数が比較的少ない小型LLMが多く出てきました。これらをファインチューニングしたものも合わせて、非常にたくさんのモデルがHuggingface上に公開されています。

ベンチマークテストでの比較はそれぞれ公開されているものもありますが、実際どのくらい使えるの？という疑問に答えるべく、今回は「プロンプトの指示にどれだけ忠実に従うの？」を評価したいと思います。


### 評価対象
日本語を扱うことができる、パラメータ数が10B前後、Huggingface上で公開されている、を満たす下記の3モデル。

- [elyza/Llama-3-ELYZA-JP-8B](https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B)（パラメータ数8B）
- [google/gemma-2-9b-it](https://huggingface.co/google/gemma-2-9b-it)（パラメータ数9B）
- [microsoft/phi-4](https://huggingface.co/microsoft/phi-4)（パラメータ数14B）

### 評価方法
次の3タスクに対するアウトプットを評価。評価項目はそれぞれ以下の通り。

**1. シンプルな指示（文章の要約）に対するアウトプット**
文章を与え、3つのバレットポイントに要約するよう指示。各バレットポイントは50文字以内と指定する。
- バレットポイントの数：ポイントを3つに絞ることができているか？
- 要約の適切さ：重要な情報を正しく抽出できているか？
- 文法の正確さ：文法・意味が適切か？
- 冗長性の排除：不要な表現が含まれていないか？

**2. 情報抽出とJSON形式のアウトプット**
文書を与え、情報を抽出してJSON形式にして出力するよう指示。文章から要約、キーワード、タイトルを生成し、JSONの各要素に格納する。
- JSONの構造遵守：指定されたフォーマットを守っているか？
- 要約の適切性：重要な情報を正しく抽出できているか？
- キーワードの選定：重要な単語がリスト化されているか？
- タイトルの適切性：要点をまとめたタイトルが付与されているか？

**3. Function Calling適正テスト**
ある関数を与えたとき、その関数を呼び出すためのJSONを作成するよう指示。今回は天気を調べるための関数get_weatherをプロンプトとして与える。get_weatherは場所（city）と日付（date）を引数とする。
- JSON構造の正しさ：指定されたフォーマットに完全に従っているか？
- 引数の適切性：例えば、cityに「東京」、dateに適切な日付が入っているか？
- 関数名の正確性：get_weatherという関数名を使っているか？


---

### 1. シンプルな指示（文章の要約）に対するアウトプット

一定の長さの文章を入力し、3つのバレットポイントに要約するよう指示する。各バレットポイントは50文字以内を指定する。

使用する文章は、LLMが学習に使用していないであろう直近のニュース記事を使う。具体的には、2025年2月14日のITmediaの記事[「AIやデジタルモノづくりの実践活用に向けた次世代人材育成センター開設」](https://monoist.itmedia.co.jp/mn/articles/2502/14/news142.html)を入力とする。

| LLM                       | バレットポイントの数 |    要約の適切さ     | 文法の正確さ |   冗長性の排除   |
| ------------------------- | :--------: | :-----------: | :----: | :--------: |
| elyza/Llama-3-ELYZA-JP-8B |     3      |  重要情報をすべて網羅   |  問題なし  | 100文字程度と冗長 |
| google/gemma-2-9b-it      |     3      |  重要情報をすべて網羅   |  問題なし  |     簡潔     |
| microsoft/phi-4           |     3      |    一部情報漏れ     |  問題なし  |     簡潔     |


**elyza/Llama-3-ELYZA-JP-8B**
```
以下は記事の3つのバレットポイントの要約です。

* オートデスクと片柳学園は、2025年2月14日に「オートデスクイノベーションセンター」を日本工学院八王子専門学校内に開設した。同センターは、最新の設計手法とAI教育を連携し、次世代モノづくり人材の育成を目指す。
* オートデスクイノベーションセンターでは、設計、エンジニアリング、製造、ジェネレーティブデザインなどに関する専門的な教育内容を提供し、最先端の技術とアイデアを共有・開発する場として機能する。
* 両者は、戦略的連携に関するMOUに基づき、教育ライセンスの導入支援や教員向けのFusionトレーニングの提供、カリキュラムの共同開発などを段階的に展開し、次世代のモノづくりを担う人材育成の理想的な環境づくりを推進する。

time: 11.10 sec
speed: 22.42 tokens/sec
tokens: 249 tokens
```

バレットポイントの数、要約の適切さ、文法の正確さは問題なし。一方、各バレットポイントの文字数が100文字程度と冗長。

**google/gemma-2-9b-it**
```
* オートデスクと片柳学園が、日本工学院八王子専門学校内に「オートデスクイノベーションセンター」を開設。
* 最新設計手法とAI教育を連携し、次世代モノづくり人材育成を目指す。
* デジタル加工機や3Dプリンタなどを活用し、未来志向のプロジェクトスキルを習得支援。

time: 7.12 sec
speed: 10.39 tokens/sec
tokens: 74 tokens
```

バレットポイントの数、要約の適切さ、文法の正確さ、冗長性の排除、いずれも問題なし。

**microsoft/phi-4**
```
1. オートデスクと片柳学園が「オートデスクイノベーションセンター」を開設。

2. AI教育と最新設計手法を提供し、次世代モノづくり人材を育成。

3. デジタルモノづくりの実践とFusionトレーニングを通じて、学生のスキル向上を支援。

time: 190.78 sec
speed: 0.67 tokens/sec
tokens: 127 tokens
※GPUメモリを20GB程度使い、さらにGPUに乗らなかったパラメータ（約10GB分）をCPUで処理したため時間がかかっている。
```

バレットポイントの数、文法の正確さに問題はない。かなりシンプル。


---


### 2. 情報抽出とJSON形式のアウトプット
文書を与え、情報を抽出してJSON形式にして出力するよう指示。文章から要約、キーワード、タイトルを生成し、JSONの各要素に格納する。

つまり、指定したフォーマットは下記の通り。
```
# フォーマット
{
	"title": "...",
	"summary": "...",
	"keywords": ["...", "..."]
}
```

なお、与える情報は先程と同じITmediaの記事[「AIやデジタルモノづくりの実践活用に向けた次世代人材育成センター開設」](https://monoist.itmedia.co.jp/mn/articles/2502/14/news142.html)を使う。

| LLM                       | JSONの構造遵守    | 要約の適切さ      | キーワードの選定         | タイトルの適切さ      |
| ------------------------- | ------------ | ----------- | ---------------- | ------------- |
| elyza/Llama-3-ELYZA-JP-8B | JSON以外の要素も出力 | 重要情報を網羅     | 主要なキーワードを網羅      | 要点を押さえている     |
| google/gemma-2-9b-it      | 遵守           | 最も詳細かつ適切な要約 | 主要なキーワードを網羅      | 要点を押さえ、情報量も十分 |
| microsoft/phi-4           | 遵守           | 重要情報を網羅     | 主要な情報は含まれるがやや少なめ | やや一般的         |


**elyza/Llama-3-ELYZA-JP-8B**
```
以下は、与えられた文章の要約とJSON形式の出力です。

要約:
Autodeskと片柳学園は、2025年2月14日、「オートデスクイノベーションセンター」を日本工学院八王子専門学校内に開設した。同センターは、最新の設計手法とAI教育を連携・推進する施設で、次世代モノづくり人材の育成を目指す。両者は2024年春に戦略的連携に関する覚書を締結し、設計、エンジニアリング、製造、ジェネレーティブデザインなどに関する教育内容を提供する。

JSON形式:
{
  "title": "Autodeskと片柳学園、オートデスクイノベーションセンターを開設",
  "summary": "Autodeskと片柳学園は、最新の設計手法とAI教育を連携・推進する施設『オートデスクイノベーションセンター』を日本工学院八王子専門学校内に開設した。",
  "keywords": ["Autodesk", "片柳学園", "オートデスクイノベーションセンター", "日本工学院八王子専門学校", "次世代モノづくり人材", "AI教育", "設計手法", "ジェネレーティブデザイン"]

time: 14.71 sec
speed: 21.37 tokens/sec
tokens: 316 tokens
```

JSON形式とその内容に問題はないが、JSON以外の部分にも出力されている。（プロンプトの工夫で解決可能？）

**google/gemma-2-9b-it**
```
```json
{
  "title": "Autodeskと片柳学園、日本工学院八王子専門学校に「オートデスクイノベーションセンター」開設",
  "summary": "Autodeskと片柳学園は、2025年2月5日に日本工学院八王子専門学校内に「オートデスクイノベーションセンター」を開設しました。このセンターは、最新の設計手法とAI教育を連携し、設計・製造分野の未来を担う人材育成を目指しています。デジタル加工機や3Dプリンターなどの設備を活用し、デジタルモノづくりの実践やAI活用、設計・解析のデジタル化・自動化など、未来志向のプロジェクトに取り組むためのスキル習得を支援します。",
  "keywords": ["Autodesk", "片柳学園", "オートデスクイノベーションセンター", "AI教育", "デジタル製造", "次世代モノづくり人材", "設計", "製造", "ジェネレーティブデザイン"]
}
\```

time: 16.76 sec
speed: 12.53 tokens/sec
tokens: 210 tokens
```

形式、内容ともに問題なし。

**microsoft/phi-4**
```
```json
{
  "title": "オートデスクイノベーションセンターの開設について",
  "summary": "Autodesk（オートデスク）と片柳学園は、日本工学院八王子専門学校内に「オートデスクイノベーションセンター」を開設しました。この施設は、最新の設計手法とAI教育を連携させ、次世代モノづくり人材の育成を目指します。両者は2024年春に締結した戦略的連携に基づき、設計、エンジニアリング、製造、ジェネレーティブデザインなどの専門的な教育を提供します。また、デジタル製造プロセスの重要性を考慮し、デジタル加工機や3Dプリンタを活用した実践的な学習を支援します。片柳学園では、テクノロジーカレッジのロボット科や機械設計科を中心に、次世代のモノづくり人材育成を推進します。",
  "keywords": ["オートデスクイノベーションセンター", "次世代モノづくり人材", "AI教育", "デジタル製造"]
}
\```

time: 467.37 sec
speed: 0.90 tokens/sec
tokens: 421 tokens
※GPUメモリを20GB程度使い、さらにGPUに乗らなかったパラメータ（約10GB分）をCPUで処理したため時間がかかっている。
```

形式、内容ともに問題なし。タイトルが一般的過ぎて情報不足、またキーワードがやや乏しい。


---


### 3. Function Calling適正テスト
ある関数を与えたとき、その関数を呼び出すためのJSONを作成するよう指示。今回は天気を調べるための関数get_weatherをプロンプトとして与える。get_weatherは場所（city）と日付（date）を引数とする。

具体的に与えるプロンプトは下記の通り。
```
以下の関数を呼び出すためのJSONを作成してください。

関数: get_weather(city: str, date: str)
出力フォーマット:
{
	"function": "get_weather",
	"arguments": {
		"city": "...",
		"date": "..."
	}
}

質問: "東京の明日の天気を教えて"
```

| LLM                       | JSON構造の正しさ   | 引数の適切さ | 関数名の正確さ |
| ------------------------- | ------------ | ------ | ------- |
| elyza/Llama-3-ELYZA-JP-8B | JSON形式以外にも出力 | 適切     | 適切      |
| google/gemma-2-9b-it      | JSON形式以外にも出力 | 適切     | 適切      |
| microsoft/phi-4           | JSON形式以外にも出力 | 適切     | 適切      |


**elyza/Llama-3-ELYZA-JP-8B**
```
以下は、指定された関数を呼び出すためのJSONです。

{
    "function": "get_weather",
    "arguments": { "city": "東京", "date": "明日" }
}

time: 3.04 sec
speed: 14.79 tokens/sec
tokens: 45 tokens
```

function callingにはJSON形式のみの出力が必要だが、それ以外も出力してしまっている。
なお、「明日」という表現が曖昧だが、日付を取得する機能をもたないので仕方ない。

**google/gemma-2-9b-it**
```
```json
{
    "function": "get_weather",
    "arguments": {
        "city": "東京",
        "date": "明日"
    }
}
\``` 

**解説:**

* `"function"`: 関数名を指定します。
* `"arguments"`: 関数に渡す引数を格納するオブジェクトです。
    * `"city"`:  都市名を指定します。
    * `"date"`:  日付を指定します。ここでは「明日」と指定しています。


time: 9.06 sec
speed: 12.59 tokens/sec
tokens: 114 tokens
```

llama-elyzaと同様。

**microsoft/phi-4**
```
質問に基づいて、東京の明日の天気を取得するためのJSONを作成します。まず、現在の日付を取得し、それに1日を加えて明日の日付を求めます。以下はそのJSONです。

```json
{
    "function": "get_weather",
    "arguments": { "city": "東京", "date": "2023-10-12" }
}
\```

ここで、"2023-10-12"は例として明日の日付を示しています。実際には、プログラムで現在の日付を取得し、1日を加えて正確な日付を設定してください。


time: 259.89 sec
speed: 0.69 tokens/sec
tokens: 179 tokens
※GPUメモリを20GB程度使い、さらにGPUに乗らなかったパラメータ（約10GB分）をCPUで処理したため時間がかかっている。
```

こちらもllama-elyzaと同様。日付を「明日」ではなく、ISO8601形式で出力しようとする努力がみられる。


---

### まとめ

今回の検証では
- 要約・情報抽出はgoogle/gemma-2-9b-it
- JSONへの変換はgoogle/gemma-2-9b-it
- function callingはいずれも適正ありだが、JSONのみの出力にするためプロンプトによる工夫が必要
となりました。

実用性の観点では、google/gemma-2-9b-itが一歩リード、でしょうか。

ただし、各モデルはプロンプトの改善により結果も改善される場合があります。いろいろ試してみると面白いかも？