ほぼ下記を参考にさせていただき構築。ちょっと素人向け情報を補足。
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で数十秒かかった
結果
ヤマハのバイクは、性能、デザイン、機能性のどれをとっても非常に優れています。近くをツーリングするには、以下の点を考慮して選ぶと良いでしょう。
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()