4020 words
20 minutes
ローカルLLM実践入門

基本情報#

価格:2530円(本体2300円) 発行・発売日:2024年12月23日
◆自宅のパソコンで「CharGPT」のようなチャットAIサービスを動かす方法がわかります!
◆最初はGUIの操作だけで動かす方法を紹介するので、ローカルLLMがはじめてでも安心!
◆ローカルLLMをPythonのプログラムに組み込む方法がわかります!
◆ローカルLLMが生成した文章を「ずんだもん」に読み上げさせる方法がわかります!
◆ローカルLLMを快適に動かすためのパソコンを自作できます!
 「ChatGPT」のようなチャットAIサービスを手元のパソコンで動かす環境が整いつつあります。チャットAIサービスの頭脳とも呼ぶべき「LLM」(大規模言語モデル)が多数、公開されるようになったからです。本書では、これら公開されているLLMを手元のパソコンで動かし、活用する方法を解説しています。
 活用の手段として、本書では主にPythonのプログラムを利用しています。そう聞くと「Pythonのプログラマー向けか?」と思われるかもしれません。ご安心ください。本書はPythonを使ったことのない人でもローカルLLMを活用できるよう、Pythonの実行環境の導入方法なども含めて丁寧に解説しています。
 一つだけ注意点があります。現状は高性能なパソコンでなければ、ローカルLLMを快適には動かせないことです。特に高性能なグラフィックス機能を搭載しないパソコンでは、処理が終わるのに数十分も待たされたり、正しく動作しなかったりします。
 本書は7つの章で構成しています。第1章でローカルLLMの概要を解説した後、第2章以降で、実際に手元のパソコンでローカルLLMを動かす方法を解説しています。本書の解説とおりに手を動かしながら読み進めることで、ローカルLLMの動く仕組みと基本的な使い方、さらには活用法までを理解できる構成になっています。
【目次】
第1章 ローカルLLM[大規模言語モデル]の概要
 「LLM」には「クラウド型」と「ローカル型」があることを解説し、「ローカル型」のLLMである「ローカルLLM」を手元のパソコンで動かすのに必要なソフトウエアを紹介しています。
第2章 ローカルLLMをサクッと使える ChatGPT風ツール「Jan」
 ローカルLLMを動かすためのソフトウエアとして「Jan」を紹介します。インストールから設定、利用まで、すべてGUIの操作だけで済むので、ローカルLLMがはじめてでも簡単に動かすことができます。
第3章 ローカルLLMを活用できる コマンドラインツール「Ollama」
 ローカルLLMを動かすのに、コマンドラインを利用するソフトウエアとして「Ollama」を紹介します。基本的な使い方だけでなく、「LLMサーバー」として使う方法と、Pythonのプログラムに組み込んで使う方法も簡単に紹介しています。
第4章 ローカルLLMを活用(その1) 画像の内容を説明
 第4章から第6章は、主にローカルLLMをPythonのプログラムに組み込んで活用する方法を紹介します。第4章では、画像を読み込んで説明文を生成できる「マルチモーダル対応のLLM」を使う方法を紹介します。
第5章 ローカルLLMを活用(その2) コードの作成を支援
 米Microsoftの「Visual Studio Code」などのテキストエディタにローカルLLMを組み込み、コードの作成を支援してもらう方法を解説します。実際に解説とおりに試すと、生成したコードを修正しなくても正常に動作することがわかります。
第6章 ローカルLLMを活用(その3) LLM の回答を読み上げる
 ローカルLLMと音声読み上げライブラリ「「VOICEVOX CORE」を組み合わせ、ローカルLLMが生成した文章を、人気の読み上げキャラクターである「ずんだもん」の声で読み上げる方法を解説します。
第7章 ローカルLLMが快適に使える 最適なパソコンを自作しよう
 ローカルLLMが快適に動かせるパソコンのスペックと、お勧めのPCパーツを紹介します。パソコンの自作がはじめてでも、PCパーツの選び方や購入先などがわかります。
 なお、本書は第3章を除き、以下の日経BPが発行する専門誌の掲載記事を加筆修正する形で掲載しています。
第1章 日経ソフトウエア 2024年9月号 特集1
第2章 日経ソフトウエア 2024年9月号 特集1
第4章 日経ソフトウエア 2024年9月号 特集1
第5章 日経ソフトウエア 2025年1月号 特集1
第6章 日経ソフトウエア 2025年1月号 特集1
第7章 日経PC21 2024年12月号 特集

はじめに#

  • OpenAI が ChatGPT を公開したのは2022年11月のこと
  • 生成AI:会話、ストーリー、画像、動画、音楽などの新しいコンテンツやアイデアを生み出すことのできる AI の一種
  • LLM(大規模言語モデル):文書を生成するAIの中核となる技術
  • GoogleやMetaが高性能なLLMモデルを公開し始めたのでローカル環境で高性能なLLMを利用することができるようになった

✅ GoogleやMetaが自社LLMを公開した理由まとめ#

目的説明
技術の普及研究・教育・技術開発の加速。オープンなAI開発を促進。
ブランド強化技術力のアピールや人材獲得。業界内での存在感を示す。
利用データ取得実利用によるフィードバックでモデルを改善。偏りやバグの発見も可能。
エコシステム構築他社に使わせて囲い込み。自社クラウドやプラットフォームの利用促進。
コスト削減開発リソースを分散し、他者の改良を取り込むことで効率的に改善。
社会的責任透明性の確保や規制対応。オープンにすることで責任あるAI開発を推進。

第1章 ローカルLLM[大規模言語モデル]の概要#

 「LLM」には「クラウド型」と「ローカル型」があることを解説し、「ローカル型」のLLMである「ローカルLLM」を手元のパソコンで動かすのに必要なソフトウエアを紹介しています。

  • ローカルLLMの一種

    • MicrosoftCopilot
    • Apple Intelligence
      • 情報漏洩の心配もなし
      • 従量課金の心配もなし
  • Pythonライブラリを利用すればWebUIも簡単に実装可能

    • Chainlit
    • Streamlit
  • AIチャットボットも構築可能

    • Transforms
    • Langchain
  • ローカルLLMのカスタマイズ

    • RAG
    • ファインチューニング

1.2 ローカルLLMに必要なファイル#

  • 必要なファイルは2つ
    • LLMファイル
      • インターネット上にある膨大なデータを学習したモデルファイル
      • ChatGPTのようなクラウド型のAIはクローズド型
      • インターネット公開されているものはオープン型のLLMファイル
        • HuggingFaceのModelsのウェブページから入手可能
        • https://huggingface.co/models
          • ファイルはGB単位で、一般的にサイズが大きいほど高性能なLLM
          • 日本語に強いLLMがあったり色々
        • LLM選択のポイント
        • まとめ
          • パラメータ数と量子化のビット数が多いほど高性能なLLMだが、代わりにファイルサイズも巨大になるので、動かすには高性能なパソコンを用意しなければならない
          • 性能の低いパソコンをでLLMを動かしたいのであれば、パラメータ数と量子化ビット数が少ないLLMを選ぶ
        • LLM選定の3つのポイントはファイル名に含まれている
          • ELYZA-japanese-Llama-2-7b-q4_0.gguf
          • 7b:70億パラメータを示す billion
          • q4:量子化ビット数は4bitを示す、qはquantization(量子化)の略
          • gguf:ファイル形式
    • LLMプラットフォームのソフトウェア
      • LLM実行環境と呼ばれるもの
      • 例)
        • Jan
        • Ollama
        • llama.cpp
        • Text-generation-webui
        • Backyard AI
        • LM Studio
        • NVIDIA ChatRTX
        • AI Toolkit for VS Code
      • これらのソフトでダウンロードしたLLMファイルを動かすことが可能

第2章 ローカルLLMをサクッと使える ChatGPT風ツール「Jan」#

 ローカルLLMを動かすためのソフトウエアとして「Jan」を紹介します。インストールから設定、利用まで、すべてGUIの操作だけで済むので、ローカルLLMがはじめてでも簡単に動かすことができます。

2.1 ChatGPT風ツール「Jan」を導入する#

  • Jan: ローカル環境で大規模言語モデル(LLM)を簡単に実行できるオープンソースのプラットフォーム

    • 👋のマークのLLMプラットフォーム
    • たぶん、Janは人名でよく使われる名称で親しみを込めて命名されたのでは?という説
  • ここからインストール

  • 開くといろんなLLMモデルが表示されるが、タグがついていないのが、現在のマシンで推奨されるモデル

  • Llama 3.2 1B Instruct Q8

    • 8bit量子化
    • 10億パラメータ

2.2 Llama 3.2 とのチャットAIを試す#

  • 前提
    • Fugakuはスペック不足でインストールできなかったので、Llamaで試す
  • Jan起動
  • 適当なChatを実施する
  • 左下のサーバーボタンを選択し、StartServerでサーバ起動
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:1337/v1", api_key="dummy")
completion = client.chat.completions.create(
# model="Fugaku-LLM-13B-instruct-Q4_0.gguf",
# model="meta-llama/Llama-3.2-1B",
model="llama3.2:1b",
messages=[
{"role": "system",
"content": "あなたは親切なアシスタントです。"},
{"role": "user",
"content": "プログラミング言語を二つに分類すると、何と何になりますか?"}
])
print(completion.choices[0].message.content)
  • tempelatureの値を0に設定すると毎回ほぼ同じ解答になる
    • ばらつきを示す
    • 0.7がばらんすの取れた値とされている
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:1337/v1", api_key="dummy")
completion = client.chat.completions.create(
temperature=0,
# model="Fugaku-LLM-13B-instruct-Q4_0.gguf",
# model="meta-llama/Llama-3.2-1B",
model="llama3.2:1b",
messages=[
{"role": "system",
"content": "あなたは親切なアシスタントです。"},
{"role": "user",
"content": "プログラミング言語を二つに分類すると、何と何になりますか?"}
])
print(completion.choices[0].message.content)
  • 別PCからアクセス可能にするために、Server起動時に127.0.0.1のループバックアドレスではなく、0.0.0.0を指定する

Pythonダウンロードと設定#

Terminal window
brew install python@3
python3 -m venv ~/mypy
source ~/mypy/bin/activate
pip3 install openai
deactivate

2.5 チャットAIのWebサイトを構築#

  • PythonのOSSWebUIライブラリの「Chainlit」を使ってWebサイト構築

    • Vscodeをインストール
    • pip install chainlit
  • 以下実行

from openai import AsyncOpenAI
import chainlit as cl
client = AsyncOpenAI(base_url="http://127.0.0.1:1337/v1", api_key="dummy")
@cl.on_message
async def on_message(input):
completion = await client.chat.completions.create(
# model="Fugaku-LLM-13B-instruct-Q4_0.gguf",
model="llama3.2:1b",
messages=[
{"role": "system",
"content": "あなたは親切なアシスタントです。"},
{"role": "user",
"content": input.content}])
await cl.Message(content=completion.choices[0].message.content).send()
  • 返答が少しずつ表示されるように改修
from openai import AsyncOpenAI
import chainlit as cl
client = AsyncOpenAI(base_url="http://127.0.0.1:1337/v1", api_key="dummy")
@cl.on_chat_start # チャット開始時に実行される関数
def start_chat():
# ユーザーセッションの変数"history"を設定する
cl.user_session.set("history",
[{"role": "system", # "history"の初期値
"content": "あなたは親切なアシスタントです。"}])
@cl.on_message # ユーザーが質問文を送信したときに実行される関数
async def main(input): # ユーザーの質問文は引数inputに格納される
message = cl.Message(content="") # メッセージを作成
await message.send() # メッセージを送信
# ユーザーセッションの変数"history"を取得
history = cl.user_session.get("history")
# "history"にユーザーの質問文を追加
history.append({"role": "user", "content": input.content})
# LLMに変数"history"の内容を送る
stream = await client.chat.completions.create(
# model="Fugaku-LLM-13B-instruct-Q4_0.gguf",
model="llama3.2:1b",
messages=history,
stream=True) # ストリーミングをオンにする
# LLMの返答を1トークンずつ表示
async for part in stream:
token = part.choices[0].delta.content
if token != "":
await message.stream_token(token)
# "history"にLLMの返答を追加
history.append({"role": "assistant", "content": message.content})
await message.update()

休題#

  • ローカルLMMを手軽に試すには?
    • ローカルLMMのスマホアプリ
        • PocketPal
        • PricateLLM
        • LLM Farm

第3章 ローカルLLMを活用できる コマンドラインツール「Ollama」#

 ローカルLLMを動かすのに、コマンドラインを利用するソフトウエアとして「Ollama」を紹介します。基本的な使い方だけでなく、「LLMサーバー」として使う方法と、Pythonのプログラムに組み込んで使う方法も簡単に紹介しています。

3.1 Ollamaの概要#

  • OllamaはJanと同じく、LLMプラットフォームで、ローカル環境でLLMを実行するためのOSSの1つ
    • データが外部に送信されない
    • オフラインでも実行可能
    • 大規模言語モデルの推論を高速に実行するためのOSSライブラリである「llama.cpp」を実行基盤としている
    • そのため、llama.cppで実行できる、「GGUF」形式のファイルをサポートしている
      • 「.safetensors」や「.pth」などのモデルファイル形式には対応していない

3.2 Ollamaのインストール#

  • Windowsの場合

  • Macの場合

    • homebrewでインストール可能
    • brew install --cask ollama
    • 以下のコマンドを追加実行すると最新化できる
      • brew upgrade --cask ollama
      • pkill ollama
      • open -a Ollama
      • ollama --version

3.3 Ollamaの使い方#

  • ollama pullコマンドでモデル(LLMファイル)をダウンロードできる
    • ダウンロード済みのモデルをアップデートするときにも使う
  • ollama runコマンドを実行することで動作させる
Terminal window
# モデル名を指定してダウンロード
ollama pull llama3.2
# ダウンロード済みのモデル自一項
ollama run llama2.3
# 正常に実行完了すると >>> で入力受付になるので対話形式で動かしてみる
# 対話形式で実行中に /? でヘルプ表示をすることも可能
# /bye で実行中のollama runコマンドを終了できる
# /load <model> でモデルを切り替えることができる
  • 量子化でサイズを小さくしているモデルについての説明

3.4 Ollamaを深く知ろう#

  • 発展的な使い方

    • Ollamaのローカルサーバーにリクエストを送信する
    • PythonのプログラムからOllamaを実行する
  • 1)Ollaamaのローカルサーバーにリクエスト送信

    • Ollamaを起動している間はローカルサーバー(JanのLLMサーバと同じ)が立ち上がっている
    • ollama serve
    • すでに立ち上がっていたらエラーが返る
      • Error: listen tcp 127.0.0.1:11434: bind: address already in use
Terminal window
# HTTP送信
curl http://localhost:11434/api/generate -d '{"model": "llama3.2", "prompt": "こんにちは"}'
# デフォルトだとStream形式で表示される
# Streamオフ
curl http://localhost:11434/api/generate -d '{"model": "llama3.2", "prompt": "こんにちは","stream": false}'
  • PythonのプログラムからOllamaを実行する

  • Ollamaインストール

  • pip install ollama

from ollama import Client
import json
client = Client()
response = client.chat(
model="llama3.2", messages=[{"role": "user", "content": "こんにちは"}]
)
response = response.model_dump()
print(json.dumps(response, indent=2, ensure_ascii=False))

休題: Llamaのポート番号について#

  • 11434 は、LlamaのLeetであると言われている
  • Leetとは:類似の文字や読みの同じ文字を別の文字に置き換えて表現すること
    • 有名なところだと toやforを、2や4に置き換えて表現するもの

第4章 ローカルLLMを活用(その1) 画像の内容を説明#

 第4章から第6章は、主にローカルLLMをPythonのプログラムに組み込んで活用する方法を紹介します。第4章では、画像を読み込んで説明文を生成できる「マルチモーダル対応のLLM」を使う方法を紹介します。

4.1 画像を読み込んで説明する#

LLMの中には文章だけではなく、画像も解釈できるものがある いわゆる「マルチモーダル」に対応するLLM

  • 例えば)

    • llava-llama-3-8b-v1_1-ggufがそれに当たる
  • 画像読み込んで処理させる説明は省略

第5章 ローカルLLMを活用(その2) コードの作成を支援#

 米Microsoftの「Visual Studio Code」などのテキストエディタにローカルLLMを組み込み、コードの作成を支援してもらう方法を解説します。実際に解説とおりに試すと、生成したコードを修正しなくても正常に動作することがわかります。

5.1 VSCodeの拡張機能「Continue」#

  • ContinueはVSCodeにAI支援を追加する拡張機能

  • 流れ

    • VS Codeインストール:割愛
    • OllamaとGemma2 2Bを導入
      • Googleが公開している「Gemma 2 2B」とGemma 2 2Bにコード生成させるためのソフトウェアである「Ollama」を導入
      • ollama pull gemma2:2b
      • ollama run gemma2:2b
    • Python導入:割愛
    • Continueを導入
      • http://localhost:11434/にアクセスしてOllama is running と表示されるかどうかを確認
      • VSCodeのプラグイン検索:Continue

5.2 MacOSとLinuxで使えるZedエディタ#

  • Zed: AI支援機能付きのエディタ

5.3 コマンドプロンプトで使える「Aider」#

コマンドプロンプトで対話しながら、LLMにプログラムの作成を依頼できるPythonで作られたツール

第6章 ローカルLLMを活用(その3) LLM の回答を読み上げる#

 ローカルLLMと音声読み上げライブラリ「「VOICEVOX CORE」を組み合わせ、ローカルLLMが生成した文章を、人気の読み上げキャラクターである「ずんだもん」の声で読み上げる方法を解説します。

第7章 ローカルLLMが快適に使える 最適なパソコンを自作しよう#

 ローカルLLMが快適に動かせるパソコンのスペックと、お勧めのPCパーツを紹介します。パソコンの自作がはじめてでも、PCパーツの選び方や購入先などがわかります。

  • LLM動作環境の自作PC構成例について
ローカルLLM実践入門
https://tutttuwi.github.io/posts/2025-04_ローカルllm実践入門/
Author
Tomoaki Tsutsui
Published at
2025-04-17
License
CC BY-NC-SA 4.0