【SLM:小規模言語モデルとは】生成AIの今後のトレンドは小型化？

## SLM:小規模言語モデルとは？

生成AIと言えばLLM (Large Language Model, 大規模言語モデル)ですが、近年提唱されるようになった概念として**SLM** (**Small Language Model, 小規模言語モデル**)があります。

SLMはその名前の通り、LLMよりも比較的小さなパラメータ数のモデルに対する総称です。

厳密な定義はありませんが、以下のような特徴のある言語モデルをSLMと呼んでいることが多いようです。

- 知識の深さと幅：LLMほどの専門的知識はありませんが、**一般常識や日常会話ができる程度の知識**があります。専門性の高い文章を扱う場合は、RAG等やファインチューニングを使って追加の情報を与えるような運用が想定されています。

- 学習の容易性：モデルが小さいため**ファインチューニングをしやすい**ことが特徴として挙げられます。LLMのような汎用性は必要無いものの、特定の知識が必要なドメインでの活躍が想定されます。

- エッジデバイス：パラメータ数が小さいため、**LLMよりも小規模な計算リソースで使用**出来ます。スマートフォンなどエッジデバイスで処理させることで、セキュリティを担保した上で生成AIを使えるのが強みとなります。

:::note info
SLMは小規模なLLMで、必要な能力だけに特化させて使う
:::

### SLMの現在：活用はまだまだ？
今後、生成AIが様々な分野で活用されるに伴い、LLMでは対応出来ない分野でSLMが活用されると予測されていますが、**SLM**という言葉自体はそれほど広がっていないように思えます。

SLMに近い概念は昔からありましたが、Microsoftの開発したSLM、**Phi-3**が登場してからSLMという言葉が注目を集めるようになったかと思います。(と言うか、Microsoftが積極的に提唱している印象を受けます。)

https://azure.microsoft.com/en-us/blog/introducing-phi-3-redefining-whats-possible-with-slms/

しかし、現在はSLMを具体的な形で活用した事例は少なく、まだまだ活用方法が模索されている段階です。

また、似た概念として**Local LLM**(ローカル環境で動作する、比較的小規模なLLM)があります。
そのため、SLMに当てはまる言語モデルでも、Local LLMと呼ばれていることの方が多いかもしれません。

### SLMの持つ可能性
一方で、SLMに代表される小型の生成AIに注目が集まっていることは確かです。

例えば、Sakana AIという企業は専門性に特化した小型のLLM(≒ SLM)を結合し、一つの"群体"として扱うことで、今までのLLMよりも柔軟かつ専門的な課題解決ができる手法を開発しています。

https://sakana.ai/

Sakana AI以外にも多数の企業が小型のLLMの活用に注力しており、今後更に一般的な概念になると予想されています。

## SLMを使ってみよう！【Phi-3】
では、実際にSLMをローカルの環境で動かしてみたいと思います！今回使用した環境は以下の通りです。

- OS: macOS Sonoma 14.6.1
- CPU: Apple M3
- メモリ: 16GB

また、今回はローカルでLLMを動作させることのできるOllamaというツールを使用しました。

https://ollama.com/

実行するモデルはMicrosoftの開発した`Phi-3`というモデルで、現状SLMと言ったらこのモデルが最も有名です(2024年12月現在)。

### インストール&セットアップ

OllamaはHomebrewでのインストールができるので、以下のコマンドでmacにインストールします。
```bash
brew install ollama 
```

きちんとインストール出来ているか`--version`で確認してみます。

```bash
ollama --version
Warning: could not connect to a running Ollama instance
Warning: client version is 0.4.6
```

インストール自体は出来ているようですが、`could not connect to a running Ollama instance`という警告が表示されていますね。

インストールログをよく見てみると、以下のような記載が。

```bash
To start ollama now and restart at login:
  brew services start ollama
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/ollama/bin/ollama serve
```

初期設定として、`brew services start ollama`を実行しなければならなかったようです。

コマンドの実行完了後、再度`ollama --version`を実行し、警告が表示されなくなったことを確認できました。

```bash
ollama --version
ollama version is 0.4.6
```

### モデルの実行

それでは、実際に**Phi-3**を実行してみます。

初回はモデルのダウンロードが挟まるので、完了するまでしばらく待ちます。

```bash
ollama run phi3
```

ちなみに、ここでダウンロードされるのは実際には**Phi-3 Mini**というモデルで、Phi-3の中では最も小さいモデルです。

https://github.com/ollama/ollama/blob/main/README.md#model-library

ダウンロードが完了するとモデルが起動し、コマンドライン上で対話が可能になります。

試しに"hello!"と入力してみます。
```bash
>>> hello!
Hello there! How can I help you today?
```

体感、生成が始まるまで5秒以上、生成完了まで10~20秒ほどかかったような気がします。

PC上では他のアプリケーションも多数動作していたので一概には言えませんが、macbook airで動作させるには少し重いかな？という印象です。

日本語も試してみます。
```
>>> 日本語はわかりますか？
はい、日本語が理解しています。あなたのご質問にお答えしますね。何をお知りにしませんか？
```

お手本のような文法ミスですね笑

そのままでは、日本語の対応力はそこまで高く無さそうです。また、日本語では更に生成に時間がかかったような気がします。

### 使ってみた所感
Phi-3はスマートフォンでも実行できるとのことですが、実際はmacbookでの実用に耐えうるレベルかと言うと怪しく、実行速度には不安が残ります。

ただ、これだけ軽量のモデルにしては生成される文章も(英語なら)比較的精度が良く、**Jetson Nano**のような小型でGPUを搭載したエッジデバイスなら十分にその能力を発揮できると思います。

## Llama3.2 & Gemma2との比較
Ollamaで使える他の小規模な言語モデルとして、Meta製のLlamda3.2と、Google製のGemma2があります。

Llamda3.2とGemma2はSLMであると公言しているわけでは無いですが、SLMとしての条件を満たしていると言えるため、Phi-3と比較してみようと思います。

今回は厳密な比較をできる環境は無いため、私のローカルPCで軽く触ってみた所感に留めます。

| 名前 | パラメータ数 | モデルサイズ | 公開日時 | 
| ---- | ---- |  ---- |  ---- |
| Phi-3 Mini | 3.8B | 2.3GB | 2024/4/23 |
| Llama 3.2 | 3B | 2.0GB | 2024/9/26 | 
| Gemma 2 | 2B | 1.6GB | 2024/6/27 |

モデルサイズはPhi-3が最も大きく、次点でLlama 3.2、最も小さいのはGemma 2となっています。

※Llama3.2やGemma2は他のサイズのモデルもありましたが、最もPhi-3 Miniに近いものを選びました。

比較に用いるプロンプトは2種類です。

1. 9.11と9.9の比較(英語)
    - 1つ目はLLMが良く間違えることで有名な、**9.11**と**9.9**のどちらが大きいか、という問題です。
    - 正解はもちろん9.9ですが、LLMによっては"11"と"9"のみを比較し、9.11の方が大きいと答えてしまいます。
        ```bash
        Which one is higher: 9.11 or 9.9?
        ```

2. 日本語での質問
    - 2つ目は単に日本語が使えるかを問う問題です。
        ```bash
        日本語はわかりますか？
        ```

### Phi-3の結果

それでは、Phi-3の結果から見ていきましょう。

まず、数字の問題の結果です。正しく9.9の方が大きいと答えられています。

なぜそうなるのかを具体的に説明していることが特徴ですが、私の環境では全て生成するのに1~2分かかった気がします。

```bash
>>> Which one is higher: 9.11 or 9.9?

The number 9.9 is higher than 9.11 when comparing decimal values of equal whole numbers (the '9's in this case). In 
a comparison from left to right, the first digit after the decimal point that differs between the two numbers 
determines which one is greater; since both are followed by '1', we compare the next digits—here it’th second digit. 
The number 9.9 has a '0' in this place value (implied), while 9.11 has a '1'. Since '0' < '1', that means any number 
with '.9' at its tail will always be greater than one with '.1' appended to it, assuming the whole numbers are 
identical or lesser as they both are in this case (9). Therefore, 9.9 is higher than 9.11.
```

日本語の対応能力は微妙と言ったところ。

あまり期待は出来ませんね。

```bash
>>> 日本語はわかりますか？
はい、日本語が理解しています。あなたのご質問にお答えしますね。何をお知りにしませんか？
```

### Llama3.2

Llama3.2はしっかり数字の問題に引っかかっています。

ただし3Bモデルはスマートフォン等で動かすことも視野に入れているようで、回答が短いのは評価出来ます。

生成速度はPhi-3とあまり変わりませんでした。

```bash
>>> Which one is higher: 9.11 or 9.9?
The number 9.11 is higher than 9.9.
```

日本語は...文法的には問題無さそうです。

Llama3.2的には自信が無さそうですが、Phi-3よりは良い性能が出ていそうです。

```bash
>>> 日本語はわかりますか？
日本語自体を理解することはできませんが、日常会話や簡単な質問に対応できるレベルまで英語で日本語を説明したり表現を示すことができます。
```

### Gemma2

最後にGemma2ですが、こちらは回答も簡潔かつ9.9のほうが大きいと正しく答えています。

何より他の2つのモデルと比較して、パラメータ数が小さいだけあって生成が非常に早いです。Chat GPTをAPIで叩いているときと同じくらいの感覚で使うことが出来ます。

(ただ"You're right to think about the tenth place! (10位を考えるのは正しい！)"なんて唐突に言い出したり、全体的にフランクな印象を受けます。)

```bash
>>> Which one is higher: 9.11 or 9.9?
You're right to think about the tenth place!  

**9.9 is higher than 9.11.** 
```

日本語も理解できます！と自信がある印象。そのあとすぐに英語で話し始めていますが、ここも日本語で出力して欲しかったですね。

```bash
>>> 日本語わかりますか？
はい、日本語を理解できます！😊  

How can I help you today?  (or "What do you want to talk about?")  😄 
```


### 総評

公開された時期がGemma2 > Llama3.2 > Phi-3の順で新しいので、使ってみた性能は順当に新しいものの方が良かった気がします。

また、Gemma2とLlama3.2の出力が非常に簡潔なのに対し、Phi-3は比較的長めです。

Phi-3はあくまでもLLMの小型化(SLM)であり、通常のLLMと同じような知識量や使い勝手を持っていることを目標としているような印象を受けます。

一方で、Gemma2の3BモデルやLlama3.2の2Bモデルは、スマートフォンなど計算リソースが非常に限られた環境で動作させる(Local LLM)ことを目標としているため、このような挙動にしていると考えられます。

Phi-3は更に新しいモデルとしてPhi-3.5が公開されているため、機会があればしっかりと環境を整えた上で、モデルの評価を行ってみたいです。

## Flutterで使ってみた
このままだと実用時のイメージが沸かないので、簡単にFlutterアプリケーション実装してみました。(今回Phi-3自体はmacbookで動かしているので、あまりFlutter実装する意味は無いですが...)

パッケージは以下のものを使います。

https://pub.dev/packages/ollama

ollamaを先程のコマンドで起動すると、`localhost:11434`からアクセスできるようになります。

```bash
ollama run phi3
```

あとは以下のようにパッケージを初期化することで、Ollamaサーバーとの通信が可能になります。

```dart
import 'package:ollama/ollama.dart';

final ollama = Ollama(baseUrl: Uri.parse('http://localhost:11434/'));
```

実際に簡易的なUIで実装してみたものがコチラ↓

![画面収録 2024-12-01 21.24.12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655545/b7066c9e-518c-9d79-26dc-528cf9491d83.gif)

しっかりと質問には答えられているものの、、いや、、遅いですね、、、

## おわりに
今回は小規模言語モデル(SLM)についてその概要をまとめ、実際に手元で動作させて使ってみました。

感想としては、**専門性や特定のドメインに特化した小規模なLLM**というコンセプトには可能性を感じるものの、現状はその能力を発揮できる場所が無いのでは？というのが率直な感想です。

今後、更に軽量なモデルや、特定の領域に特化したモデルが開発されて初めて真価を発揮すると思うので、今後もSLMの動向は注意深く追っていきたいと思います！

## 参考

https://news.microsoft.com/ja-jp/2024/04/24/240424-the-phi-3-small-language-models-with-big-potential/

https://note.com/startupli/n/n35c97d7ac7e4

https://zenn.dev/tanny/articles/705682d88e254e