0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LM StudioのローカルLLM(Gemma 4)をPythonから呼び出して会話してみた

0
Last updated at Posted at 2026-10-31

サマリ

ローカルLLMをPythonから呼び出して、ターミナル上で会話してみました。

背景

前回の記事でローカルLLMを導入してみました。
今後いろいろ活用していく上でPythonから呼び出しておけるようになっていれば
役に立つこともあるだろう(?)ということで、
やってみました。

ゴール

  • PythonからローカルLLMに質問して、返事を受け取れるようにする
  • 役割(システムプロンプト)を付けて、応答を変えてみる
  • 会話を続けられるようにする

対象読者

  • ローカルLLMをチャット以外でも使ってみたい方

前提

必須:LM Studioでモデルを動かせる状態(前回記事の環境)
推奨:Pythonインストール済み

環境

  • OS:Windows 11 Home 25H2
  • GPU:NVIDIA GeForce GTX 1650(VRAM 4GB)
  • LM Studio:0.4.25
  • モデル:Gemma 4 E2B(Q4_K_M)
  • Python:3.10.6
  • エディタ:VS Code

手順

手順1:準備(ライブラリのインストールとサーバ起動)

1-1.Pythonのインストール

まずは大事なPythonについてです。
自分は以前インストール済みだったので、
python --version
にてバージョンだけ確認です。
3.10.6でした。

入っていない場合は、
公式サイトにて、インストーラをダウンロードして実行
または、PowerShellでwingetコマンド(例:winget install Python.Python.3.XX)でインストールできるかと思います。

(参考)VSCodeにPython拡張を入れる

必須ではないのですが、自分はVS Codeを使っており、そこでPython実行しやすいように
VS Codeの拡張機能「Python」を入れておきます。
(最後までやってみて、そこまで使いませんでした(おい)
 役に立つものではあると思うので、好みに応じて導入してください)
以下のメリットがあります。

  • 画面右上の▶ボタンでコード実行可能
  • 入力補完や書き間違いの指摘(波線)が出る

VS Codeを開いて、拡張機能をクリック(Ctrl+Shift+Xでも可)し、
Pythonを打ち込み、インストールをクリックします。

image.png

ガイドが出ますので、「Open Project Folder」をクリックします。
image.png

今回作業用のフォルダを適当に作り、開きます。
(今回はlocal-llm-pythonというフォルダにしました。)

image.png

1-2.ライブラリのインストール

PythonからLM Studioを呼び出すには大きく以下の方法がありそうです(ほかにもあるかもしれません)

1.openaiライブラリを使用
2.LM Studio公式のPython SDK(lmstudio)を使う
3.ライブラリを使わず、HTTPリクエストを直接送る

今回は1.を採用することにしました。
理由は接続先のURLを書き換えるだけ、同じコードのままLM Studio以外にも、ChatGPTや別のローカルLLMツールのOllamaに切り替えられる便利さがあるからです。
(OpenAIのAPIを使う場合はAPIキーと利用料金が必要です)
(なお、名前はOpenAIですが、ChatGPTにつなぐわけではないです)
今後別の利用も想定して、こちらにしました。

参考:

ということで、
pip install openaiをVS Codeのターミナルで実行しました。

・・ら、以下のエラーが出ました。。

image.png

また、通知も同時に出ました。。

image.png

なんかすでにPython入れていたのもあるのか?散らかっていそうです。
通知にも仮想環境を作りたくないか?といわれているので、
そうしようと思います。(従順)

python -m venv .venv
で仮想環境を作成し、
.\.venv\Scripts\Activate.ps1
でアクティベートします。

その後、再度pip install openaiを実行したらうまくいきました!
(画像は一部を切り取っています)

image.png

以後、作成した作業フォルダで、(.venv)となっている状態で作業しています。

1-3.LM Studioでサーバを起動

やっとここまできました。。
まずはLM Studioを起動します。

image.png

画面の上から2番目のアイコンのModel Serverを選択します。

image.png

先ほどいくつか手段があると触れたとおり、LM StudioAPIとOpenAI-compatibleとAnthropic-compatibleもありますね。

さておき、画面上のStatus:StoppedのトグルをONに切り替えます。
これでLM Studioのサーバ機能を起動します。

image.png

+Load Modelをクリックします。

image.png

モデルが出てくるので、前回入れたGemma 4 E2Bを選択します。

ロードが始まります。

image.png

完了しました。

image.png

手順2:1回質問して返事を受け取る

やっと準備が完了しました。

サンプルコードを作成します。
ターミナルで python step2.py を実行(以降の手順もファイル名だけ変えて同様に実行しています)

step2.py
from openai import OpenAI

# LM Studioのサーバに接続する(APIキーはダミーでOK。使用上入力が必須のよう)
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")

# 質問を送る
response = client.chat.completions.create(
    model="google/gemma-4-e2b",
    messages=[
        {"role": "user", "content": "ローカルLLMとは何か、3行で説明してください"}
    ],
)

# 返ってきた回答を表示する
print(response.choices[0].message.content)

LM Studio公式ページ
にもサンプルコードありますが、
今回シンプルかつ日本語用に少しアレンジしました。

数秒待つと、VS Codeのターミナル上に以下の出力がでました。
(おぉ~こういう感じなんですね)

image.png

手順3:役割(システムプロンプト)を付けてみる

では、続いて、AI側に役割をつけてみます。
追加したのは、"role"・・・の部分だけですね。
特に深い意味はないですが、アシスタント的なイメージで執事役にしました。

step3.py
from openai import OpenAI

# LM Studioのサーバに接続する(APIキーはダミーでOK)
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")

# 役割(system)と質問(user)を送る
response = client.chat.completions.create(
    model="google/gemma-4-e2b",
    messages=[
        {"role": "system", "content": "あなたは丁寧な執事です。主人に仕える執事として、品のある言葉遣いで答えてください。"},
        {"role": "user", "content": "ローカルLLMとは何か、3行で説明してください"}
    ],
)

# 返ってきた回答を表示する
print(response.choices[0].message.content)

返ってきました。

image.png

ちゃんと役割設定により応答内容が変わっていることがわかります。
(これが執事なのか?というのはありますが・・(おい))

ということで、少しだけ役割変えてリトライ。

     messages=[
-        {"role": "system", "content": "あなたは丁寧な執事です。主人に仕える執事として、品のある言葉遣いで答えてください。"},
+        {"role": "system", "content": "あなたはIT初心者向けの先生です。専門用語を使わず、小学生にも分かる言葉とたとえで説明してください。"},
         {"role": "user", "content": "ローカルLLMとは何か、3行で説明してください"}
     ],

おお、ちゃんと役割に沿って口調・言葉選びが変わったのがわかります!

image.png

手順4:会話を続けられるようにする

1回の決まった応答だけでは会話感がない・・
ということで、

最後に、会話を続けられるようにしました。
役割は執事のままで、ひたすら入力内容を格納し続けるという力業です。

step4.py
from openai import OpenAI

client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")

# 会話の履歴(最初に役割を入れておく)
messages = [
    {"role": "system", "content": "あなたは丁寧な執事です。主人に仕える執事として、品のある言葉遣いで答えてください。"}
]

print("会話を始めます。終了するには exit と入力してください。")

while True:
    # 自分の発言を入力する
    user_input = input("あなた:")
    if user_input == "exit":
        break

    # 自分の発言を履歴に追加
    messages.append({"role": "user", "content": user_input})

    # 履歴をまるごと送る
    response = client.chat.completions.create(
        model="google/gemma-4-e2b",
        messages=messages,
    )
    reply = response.choices[0].message.content
    print("AI:" + reply)

    # AIの返事も履歴に追加
    messages.append({"role": "assistant", "content": reply})

こんな感じになりました。
(会話ぎこちなさすぎるのはお許しください・・笑)

image.png

ちゃんと記憶を保持したまま会話できていますね。
(逆に履歴に追加していかないと覚えていないんですね)

なお、日本の人口を聞いてみましたが、現時点(2026/10/31)では、約1億2千2百万人なので、
特に調べはせず、学習時点での知識で答えているのかと思います(それはそうか)

結果

無事PythonからローカルLLMの呼び出しおよび会話ができました。
触れてこなかったですが、応答については体感~10秒ぐらいだったので、思ったより遅い感じでした。
(Thinkがオンになっているのか?確認が必要そうです。)

まとめ

これを切り口に今後さらにいろいろ触っていければと思います。(雑

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?