日本語のローカルLLM（文章生成AI）をWindowsで動かす

# はじめに
LLM[^1]は検索エンジンや翻訳ツールのように多くの人達にとって欠かせないサービスになりつつあります。
ところが、ChatGPT、Gemini、ClaudeなどのLLMの代表的なサービスの多くはSaaSとして提供されており、セキュリティ上の懸念から機密性の高い情報をLLMにかけることができないという問題があります。
そのため、LLMを十分に活用しきれていないという組織が多いと思います。特に、機密性が高い情報を扱う組織では、LLMを扱える業務が非常に限られているという状況になっているはずです。

# ローカルLLMとは？
ローカルLLMとは、ノートパソコンやデスクトップパソコンでLLMを動かすというものです。
通常、LLMはその頭脳ともいえるモデルファイルのサイズが非常に大きく、高性能GPUや大容量メモリを搭載した専用サーバで動かす必要があります。
そのようなサーバを個人で用意することが難しく、これがLLMをSaaSとして利用するしかないという理由の一つになっています。

しかし、技術の進展により、モデルファイルのサイズが小さい、いわゆる軽量LLMが出てき始めました。
さらに、量子化[^2]というモデル内のデータのビット数を減らすことでモデル自身を小型化する方法も登場し、一般的なノートパソコンでもLLMを動かせるようになりました。

実際、MacではLLMを比較的簡単に動かせるようになっており、その方法や精度が幾つかのブログで紹介されています。

https://note.com/erukiti/n/n58a8180ea9fb
https://soysoftware.sakura.ne.jp/archives/3903

MacでLLMを動かせるのであれば理論上はWindowsでも可能ですが、Macと違いハイエンドなモデルがWindowsでは少ない、またCPU・GPUのアーキテクチャがMacに搭載されているAppleシリコンとは違うなどの理由から、WindowsでLLMを動かしたという日本語記事はほとんど見かけません（2024年7月時点）。

# 量子化したLLM（日本語対応）をWindowsで動かす
WindowsでLLMを動かしたという日本語記事はほとんど見かけませんと書きましたが、日本語に対応した軽量LLMを量子化したものが幾つか公開され始めています。
現時点での代表的なものとしては、Elyza社の公開した[Llama-3-ELYZA-JP-8B-GGUF](https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF)が挙げられるでしょう。
これは[Llama-3](https://ai.meta.com/blog/meta-llama-3/)というMeta社が公開したLLMをElyza社が日本語に対応させ、さらにGGUFで量子化したものです。詳細はElyza社の[こちらのブログ記事](https://note.com/elyza/n/n360b6084fdbd)をご覧ください。

早速、Llama-3-ELYZA-JP-8B-GGUFをWindowsで動かしてみます。
準備として、まずPythonをインストールする必要があります。Pythonのインストール方法は公式サイトをはじめ様々なサイトで紹介されているので割愛します。
次に、モデルファイルをダウンロードします。[Hugging Faceのページ](https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main)からダウンロードできます。ログインしなくてもダウンロードは可能です。
最後に、[llama-cpp-python](https://github.com/abetlen/llama-cpp-python)というPythonモジュールをインストールします。今回はソースコードからではなくpre-built wheelを使ってインストールします。

```
$ pip install llama-cpp-python \
  --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
```

無事にインストールされれば、下記のようなメッセージが出力されます。
もし、cmake関連のエラーが出れば、[こちらの記事](https://qiita.com/suzukiyukizi/items/0f2b9c5eea212ed9266c)を参考にしてください。

```
Successfully built llama-cpp-python
Installing collected packages: typing-extensions, numpy, MarkupSafe, diskcache, jinja2, llama-cpp-python
Successfully installed MarkupSafe-2.1.5 diskcache-5.6.3 jinja2-3.1.4 llama-cpp-python-0.2.84 numpy-2.0.1 typing-extensions-4.12.2
```

準備が終わったので、プログラムを動かします。
ソースコードは次のようになります。なお、生成AIにかける文章は生成AIで作った架空のニュース記事です[^3]。

``` main.py
from llama_cpp import Llama

llm = Llama(
    model_path="models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
    chat_format="llama-3",
    n_ctx=1024,
)

response = llm.create_chat_completion(
    messages=[
        {
            "role": "system",
            "content": "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。",
        },
        {
            "role": "user",
            "content": "以下の文章を要約してください。\
            # 文章\
            昨日、北海道の富良野市で新種の植物「ブルームライト」が発見されたと、地元の植物学者チームが発表した。この新種は、夜間に淡い青色の光を放つことから、その名が付けられた。\
            発見者の一人である佐藤健二博士（42）は、「ブルームライトは非常に珍しい特性を持っており、夜間に自ら発光する植物は極めて稀です。この光は、特定の昆虫を引き寄せるためのものであると考えられます」とコメントした。\
            ブルームライトは、富良野市の山間部で偶然発見された。発見当時、植物は群生しており、満月の夜に青い光が一帯を幻想的に照らしていたという。地元住民は、この現象を「青い夢の夜」と呼び、古くから語り継いできた伝説と関連付けている。\
            今回の発見により、富良野市は新たな観光資源として期待を寄せている。市長の山田修一氏（58）は、「ブルームライトの発見は、私たちの町にとって大きな喜びです。今後、この植物を保護しつつ、観光振興に役立てたい」と述べた。\
            ブルームライトの詳細な生態や発光のメカニズムについては、今後の研究で明らかにされる予定であり、国内外の科学者たちの関心を集めている。",
        },
    ],
    max_tokens=1024,
)

print(response["choices"][0]["message"]["content"])
```

上記の出力結果は次のようになります。
文章を要約してくださいという指示だったのですが、満点といってもいいぐらいの結果になっていると思います。しかも、これが20~30秒程度で返ってきます。
Windowsで動く程度の軽量LLM（量子化版）でここまでのクオリティの結果になるのは予想外です。LLMの技術の進化の速さに驚かされます。

```
$ python main.py
llama_model_loader: loaded meta data with 22 key-value pairs and 291 tensors from models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
（中略）
以下は文章の要約です。

北海道富良野市で新種の植物「ブルームライト」が発見され、地元の植物学者チームが発表した。ブルームライトは夜間に淡い青色の光を放つ珍しい特性を持つ植物で、特定の昆虫を引き寄せるために自ら発光するものと考えられる。偶然発見された群生地は「青い夢の夜」と呼ばれる伝説と関連付けられ、富良野市は新たな観光資源として期待を寄せている。
```

さらに、要約だけでなく翻訳のタスクもやらせてみます。プロンプト内の「以下の文章を要約してください。」という文言を「以下の文章を英語に翻訳してください。」に変えるだけです。
出力結果は次のようになります。
学校のテストならほぼ満点をもらえるような出来になっています。すごい。

```
$ python main.py
llama_model_loader: loaded meta data with 22 key-value pairs and 291 tensors from models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
（中略）
Here is the translation of the article:

# Article

A new species of plant "Blooming Light" was discovered in Furano City, Hokkaido, and local botanists announced the finding. This newly discovered species emits a faint blue light at night, which is the origin of its name.
Dr. Kenji Sato, one of the discoverers (42), commented, "Blooming Light has very rare characteristics and emits light at night, which is extremely rare. This light is believed to attract specific insects."
Blooming Light was accidentally discovered in Furano City's mountainous area. At the time of discovery, the plant was in clusters and was illuminated by the moonlight, creating a fantastical atmosphere. Local residents have long referred to this phenomenon as "Blue Dream Night" and have linked it to an ancient legend.
The discovery is expected to bring new tourist attractions to Furano City. Furano City Mayor, Shuichi Yamada (58), said, "The discovery of Blooming Light is a great joy for our town. We will protect this plant while utilizing it for tourism promotion."
The detailed ecology and mechanism of Blooming Light's bioluminescence are expected to be revealed in future research, garnering interest from scientists both domestically and internationally.
```

**元の文章**
>昨日、北海道の富良野市で新種の植物「ブルームライト」が発見されたと、地元の植物学者チームが発表した。この新種は、夜間に淡い青色の光を放つことから、その名が付けられた。
発見者の一人である佐藤健二博士（42）は、「ブルームライトは非常に珍しい特性を持っており、夜間に自ら発光する植物は極めて稀です。この光は、特定の昆虫を引き寄せるためのものであると考えられます」とコメントした。
ブルームライトは、富良野市の山間部で偶然発見された。発見当時、植物は群生しており、満月の夜に青い光が一帯を幻想的に照らしていたという。地元住民は、この現象を「青い夢の夜」と呼び、古くから語り継いできた伝説と関連付けている。
今回の発見により、富良野市は新たな観光資源として期待を寄せている。市長の山田修一氏（58）は、「ブルームライトの発見は、私たちの町にとって大きな喜びです。今後、この植物を保護しつつ、観光振興に役立てたい」と述べた。
ブルームライトの詳細な生態や発光のメカニズムについては、今後の研究で明らかにされる予定であり、国内外の科学者たちの関心を集めている。

**要約した文章**
>北海道富良野市で新種の植物「ブルームライト」が発見され、地元の植物学者チームが発表した。ブルームライトは夜間に淡い青色の光を放つ珍しい特性を持つ植物で、特定の昆虫を引き寄せるために自ら発光するものと考えられる。偶然発見された群生地は「青い夢の夜」と呼ばれる伝説と関連付けられ、富良野市は新たな観光資源として期待を寄せている。

**英語に翻訳した文章**
>A new species of plant "Blooming Light" was discovered in Furano City, Hokkaido, and local botanists announced the finding. This newly discovered species emits a faint blue light at night, which is the origin of its name.
Dr. Kenji Sato, one of the discoverers (42), commented, "Blooming Light has very rare characteristics and emits light at night, which is extremely rare. This light is believed to attract specific insects."
Blooming Light was accidentally discovered in Furano City's mountainous area. At the time of discovery, the plant was in clusters and was illuminated by the moonlight, creating a fantastical atmosphere. Local residents have long referred to this phenomenon as "Blue Dream Night" and have linked it to an ancient legend.
The discovery is expected to bring new tourist attractions to Furano City. Furano City Mayor, Shuichi Yamada (58), said, "The discovery of Blooming Light is a great joy for our town. We will protect this plant while utilizing it for tourism promotion."
The detailed ecology and mechanism of Blooming Light's bioluminescence are expected to be revealed in future research, garnering interest from scientists both domestically and internationally.

# さいごに
日本語のローカルLLMをWindowsで動かしたところ、応答速度もあまり気にならないレベルで、要約、翻訳ともに品質の高い結果が返ってくることが分かりました。
本記事には載せていませんが、キャッチコピー作成やメール作成など他のタスクでも十分に満足する結果を得ることができました。
データを外部に送信しないので、セキュリティ面の心配をする必要がありません。
ぜひ、皆さんも試してみてください。

[^1]: 本記事では「LLM」という言葉を「文章生成AI」と同義と見なす
[^2]: 量子化に関する技術的詳細は[こちらのブログ記事](https://www.brainpad.co.jp/doors/contents/01_tech_2023-09-01-153003/)を参照のこと
[^3]: 本物のニュース記事を使いたかったのですが、著作権の理由から生成AIで作った架空のニュース記事を利用しました