2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルLLM構築を(真似して)やってみた

Last updated at Posted at 2025-01-08

ほぼ下記を参考にさせていただき構築。ちょっと素人向け情報を補足。
https://qiita.com/kansou/items/58aff8b89ee999306141

一時間もかからず構築できます。

Python3.11系をインストールしておく。

Windowsなら
https://www.python.org/downloads/windows/

https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe

本記事の内容は3.13系でも動いたが、3.13はGIL仕様が変わっており、LLM関係のライブラリが未対応のものが多い模様。Embedding等やっていく場合3.13だと躓く可能性がある。

Microsoft C++ Build Toolsのインストール(llama-cpp-pythonのコンパイルに必要)

依存パッケージのインストール

pip install cmake scikit-build-core wheel

「llama-cpp-python」のインストール(ビルドします)

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

LLMモデルllamaをダウンロード
https://huggingface.co/mmnga/Llama-3-ELYZA-JP-8B-gguf/tree/main
Llama-3-ELYZA-JP-8B-q4_k_m.gguf
をダウンロードして、pyファイルと同じフォルダにmodelsフォルダを作り配置。

LocalLLM.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": "ヤマハのバイクが欲しいです。近くをツーリングしようと考えていますがどれが良いですか?",
        },
    ],
    max_tokens=1024,
)

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

実行

python LocalLLM.py

※Corei5 Gen8で数十秒かかった

cpu_localllm.png

結果

ヤマハのバイクは、性能、デザイン、機能性のどれをとっても非常に優れています。近くをツーリングするには、以下の点を考慮して選ぶと良いでしょう。

1.排気量: ツーリングには、250ccから400ccの排気量が適しています。小排気量は燃費が良く、維持費も安いです。400cc以上はパワーがありますが、高速道路を中心に走る方が向いています。
2.エンジンタイプ: ツーリングには、水冷エンジンが向いています。水冷エンジンは、空冷エンジンに比べて高回転域でのパワーが向上し、高速走行や長距離走行に 適しています。
3.車体のサイズ: ツーリングには、車体のサイズが小さい方が、取り回しや駐車がしやすいです。小排気量のバイクは、車体のサイズが小さい傾向にあります。     
4.足つき性: ツーリングには、足つき性が良く、低いシート高のバイクが向いています。低いシート高は、足つき性が良く、長距離走行や高速走行に適しています。 

以上の点を考慮して、ヤマハのバイクを選ぶと良いでしょう。

おお、ナイス

(追記)
ユーザー入力可能にして、リアルタイムで応答を出すように改造。

LocalLLM.py
import sys
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,
)

# 初期設定のシステムメッセージ
system_message = {
    "role": "system",
    "content": "あなたはバイクに詳しいショップ販売員です。特に指示が無い場合は、常に日本語で回答してください。",
}

def main():
    # 標準入力からユーザー入力を取得
    user_input = input("ユーザー: ")

    # ユーザーの入力をメッセージに追加
    messages = [
        system_message,
        {
            "role": "user",
            "content": user_input,
        },
    ]

    # LLM による応答のリアルタイム生成
    response_stream = llm.create_chat_completion(
        messages=messages,
        max_tokens=1024,
        stream=True,  # ストリーミングモードを有効化
    )

    # 応答内容をリアルタイムで出力
    print("応答: ", end="", flush=True)
    for chunk in response_stream:
        # トークンを取り出してリアルタイム表示
        token = chunk["choices"][0]["delta"].get("content", "")
        print(token, end="", flush=True)
    print()  # 応答終了後に改行

if __name__ == "__main__":
    main()
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?