ローカルLLMを使ってみよう ~性能評価と構築手順の整理~

こんにちは。
生成AIの重要技術のひとつであるLLM(大規模言語モデル:Large Language Models)は幅広い分野で活用されています。
ですが業務で活用するとなると、クラウド上のLLMでは情報セキュリティの懸念がありますよね。
できれば自社のオンプレミス環境で動作するローカルLLMを構築できないだろうか?と検討されている経営者や技術スタッフの方も多いのではないでしょうか。
そんなみなさまの参考になればと、この記事では、LLMをローカルで動かすための環境構築手順、実際に行った検証タスク、そしてその結果と考察について、実用的な情報を交えながらレポートします。
実際に手を動かす際の参考として、ぜひご覧ください。

1. 検証の目的

今回の検証では、以下の2点を主な目的として進めました。

  • ローカルLLM環境の構築手順の整理
    今回の手順を元に、実際に導入を検討される方がスムーズに試行できるよう、セットアップ方法を明確に記載しました。
  • タスク実行性能と精度の評価
    複数のLLMモデルをローカル環境で動作させ、タスク実行時のスピードや出力の統制がどの程度できるかを比較しました。

※ 検証実施日:2025/01/10

2. 実行環境

検証は以下のスペックのPCにて行いました。

  • OS: Windows 11
  • メモリ: 32GB(CPU)
  • ディスク: 512GB

3. 使用したLLMモデルとセットアップ手順

今回は、ollama というツールを利用し、以下の2種類のLLMモデルで検証を実施しました。

  • gemma2:2b
  • elyza-jp-8b

※ ollamaは、ローカル環境でLLM推論を実現できる便利なフレームワークです。

【LLMモデル1】gemma2:2b

セットアップ手順

  1. ターミナルを開き、以下のコマンドでモデルを導入します。
    $ ollama pull gemma2:2b
  2. 詳細は、Hugging Face / gemma-2-2bページをご参照ください。


【LLMモデル2】elyza-jp-8b

セットアップ手順

  1. まず、下記のHugging Face / Llama-3-ELYZA-JP-8B-GGUFページから、バイナリファイル Llama-3-ELYZA-JP-8Bq4_k_m.gguf を入手します。

  2. 次に、以下の内容で Modelfile を作成し、バイナリファイルと同じフォルダに配置します。
    FROM ./Llama-3-ELYZA-JP-8B-q4_k_m.gguf
    TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
    
    {{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}
    <|start_header_id|>user<|end_header_id|>
    
    {{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
    
    {{ .Response }}<|eot_id|>"""
    PARAMETER stop "<|start_header_id|>"
    PARAMETER stop "<|end_header_id|>"
    PARAMETER stop "<|eot_id|>"
    PARAMETER stop "<|reserved_special_token"
    
  3. 最後に、以下のコマンドを実行してモデルを作成します。
    $ ollama create elyza:jp8b -f Modelfile

※ 上記の「Modelfile」内は、改行や引用のズレがないよう正確な範囲でコードが表示されるよう補正していま
す。

4. 実行性能を検証するためのタスク

今回の検証では、保険会社において顧客から多くの問い合わせが寄せられたことを想定し、その仮想の問い合わせ文章に対して、各モデルに分類タスクを実行させました。
以下のプロンプト(指示文)を使って、問い合わせ文章を各カテゴリに分類するよう求めています。
使用したプロンプト

以下の問い合わせ文をそれぞれ、「保険金額の確認」「保険金額の計算の確かさの確認」
「保険金額の明細」「支払日の確認」「支払い状況の確認」「その他」
に分類してください。
返却する値は text:問い合わせ文、category:分類名 の形式でJSONで回答してください。
プログラムで処理するため、JSON以外のテキストは含めないでください。

通知された金額と満期保険金の口座に入金された金額が違うのはなぜか
振り込まれたお金が満期保険金で間違えないか確認したい
振り込まれた満期保険金額が予定より少額なのはなぜか
満期保険金の支払日を確認したい。
保険証券が出てきたが、状況を確認したい。

5. 検証結果と考察

5-1. 出力の精度と形式について

全体として、gemma2:2b は高速かつ、プロンプトに忠実な出力が得られるのに対し、elyza-jp-8b は出力の形式がバラつく傾向が見受けられました。
たとえば、elyza-jp-8bの場合、出力にJSON形式の前に余分な説明文が付与されるケースがありました。

【注意点】余分な説明が出力に混じると、そのまま利用する際にプログラムでJSONをパースする際のエラーや不具合につながる可能性があるため、出力結果の整形や後処理が必要になることが考えられます。

5-2. スピード比較
モデル 実行時間
・gemma2:2b 65秒(1文章あたり13秒)
・elyza-jp-8b 158秒(1文章あたり31.6秒)

gemma2:2bの方が、elyza-jp-8bに比べ約2.43倍高速であることが確認されました。

5-3. 精度(出力の統一性)比較

gemma2:2b のアウトプット例

  • gemma2:2bの場合、コードブロック内に正確なJSONが出力され、プログラムでの解析が容易でした。
    {
      "background": "顧客が満期保険金の受け取り明細の送付依頼を希望している",
      "abstract": "顧客が満期保険金の受け取り明細を郵送してほしい旨の問い合わせです。",
      "class": "保険に関する質問分類",
      "keyword": [
        "満期保険金",
        "受け取り明細",
        "送付依頼"
      ],
      "agent": "",
      "todo": "顧客の個人情報を確認し、満期保険金の受け取り明細を郵送する手順に従って対応。"
    }
    

elyza-jp-8b のアウトプット例

  • 一部出力では、下記のようにJSONの前に余分な説明文(例:"Here is the organized JSON:")が付与されるケースが確認されました。
    Here is the organized JSON:
    
    {
      "background": "",
      "abstract": "満期保険金の受け取り明細を郵送してほしい",
      "class": "保険に関する質問分類",
      "keyword": ["満期保険金", "受け取り明細", "郵送"],
      "agent": "",
      "todo": "確認する"
    }
    
5-4. 総評:各モデルの長所・短所

gemma2:2b の評価

  • 長所:
    • 高速なレスポンス(1テキストあたり約13秒)で、実用的な利用がしやすい。
    • 出力形式が一貫しており、JSON形式の出力が正確なため、プログラムでの解析や自動処理に適している。
  • 短所:
    • 現状では特に大きな欠点は見受けられませんが、今後の大規模タスクへの適用や運用時の安定性については、さらなる検証が必要となる可能性があります。

elyza-jp-8b の評価

  • 長所:
    • 応答内容に柔軟性があり、場合によってはより詳細な文脈情報を含む出力が得られる可能性がある。
  • 短所:
    • 出力に余分な説明文が混入するため、JSONの自動解析時に追加の後処理が必要となる。
    • 1文章あたりの実行時間が約31.6秒と、gemma2:2bに比べてかなり遅く、実用面でのパフォーマンスに課題があります。

6. 今後の展望とまとめ

今回の検証で得られた知見は、ローカル環境でLLMを活用する際の有用なヒントとなりました。たとえば、オンプレミス環境での運用は、情報の機密性を高め、レスポンス速度の向上やカスタマイズの柔軟性といったメリットがあります。一方で、出力のばらつきや後処理の手間といった課題も明らかになりました。
これらの結果を踏まえ、今後は各モデルの特性に応じた運用方法の最適化や、出力結果の自動整形などの対策を検討していく予定です。クラウド利用に対して不安を感じる方や、自社環境での安全な運用を模索している方にとって、今回の検証結果が一助となれば幸いです。

参考リンク

おわりに

今回の記事では、オンプレミス環境でのLLM活用の可能性とその課題について、実際の検証結果をもとにご紹介しました。クラウド利用に対して不安を感じている方や、自社環境での安全な運用を検討している方にとって、少しでも参考になれば幸いです。
引き続き、実践的な技術検証の情報をお届けしていきますので、どうぞご期待ください。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする