おっさんゲーマーどっとねっと

「黒い砂漠」をはじめ、PCゲームやゲーマー向けの情報をお届けするブログです。記事には商品やサービスのPRを含みます。

LM StudioでDeepSeek-R1をOpenAI互換のAPIサーバーにする手順【ローカルAI】

   

ご家庭のWindows PC(ローカル)上で大規模言語AIを動かすならLM Studio。

最近話題のDeepSeek-R1を例に、OpenAI互換のAPIサーバーとしてローカルで動かすための手順を紹介する。

これによって、Pythonなどのプログラムからアクセスできるようになる。

どの程度互換性があるか?

とりあえずPythonでは、openAIのAPI(ver 1.x)で稼働しているコードから、アクセス先のURLやAPIキー、model名を差し替えるだけで基本的には動かせる。

ただ、DeepSeek-R1の回答に合わせて<think>タグの削除なりの処理が必要。

LM StudioでDeepSeek-R1(蒸留モデルなど)を使えるようにする

まずはLM StudioでDeepSeek-R1の蒸留モデルをローカルで使えるようにする。これはWindowsでもできる。

開発者タブでサーバーを起動する

Pasted-116

LM Studioを起動し、緑の「開発者」タブを表示する

モデル読み込み

Pasted-117

上部からAPIサーバーで動作させるモデルを読み込む。

Pasted-119

このようにREADYと表示される。

まだこの時点ではモデルを読み込んだだけで、サーバーは起動していない。

APIサーバーの設定

Pasted-120

「Settings」を押す

Pasted-122

APIサーバーの目的に応じて適当に設定する。

今回は「LAN内の他のマシンからアクセスできるAPIサーバー」にするので、CORSとローカルネットワークでサービングなどをオンにしている。

Server Port(APIサーバーのポート番号)は問題なければ1234のままで。

APIサーバーの起動

Pasted-123

Settingsボタンの左のスイッチを入れればサーバーが起動する。

起動後の画面は以下のような感じ。

Pasted-128

Pythonでの使用例

Pasted-129

Pythonコードでのサンプル。openAIのPythonライブラリ(ver 1.x)に対応しているので使いやすい。以下のエンドポイントが使える。

GET /v1/models
POST /v1/chat/completions
POST /v1/embeddings
POST /v1/completions

OpenAI Compatibility API | LM Studio Docs

 

pip install openai

Pythonでopenaiのライブラリをインストールしておく。

動作確認用サンプルコード

openAI API ver 1.60.2で動作を確認。

from openai import OpenAI
import re

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

completion = client.chat.completions.create(
  model="deepseek-r1-distill-qwen-14b-japanese@q4_k_m",
  messages=[
    {"role": "system", "content": "「です・ます」調ではなく、「~である」調で回答してください。"},
    {"role": "user", "content": "富士山の特徴は?"}
  ],
  temperature=0.7,
)

message_content = completion.choices[0].message.content

# <think>~</think>部分を正規表現で削除
cleaned_content = re.sub(r"<think>.*?</think>", "", message_content, flags=re.DOTALL)

print(cleaned_content.strip())

 

出力結果

富士山は以下の特徴を持つ日本最大の活火山である。
1. **標高3776メートル(2019年測量)**:日本の最高峰として地理的要衝に位置する。
2. **文化財としての地位**:UNESCO世界遺産「富士山-信仰と芸術の景観」の核となる存在である。
3. **活火山であること**:過去の噴火記録(1707年大正大噴火)により地殻活動の継続性が確認される。
4. **神聖な象徴**:富士五郎伝説や御岳信仰など、霊的な意義を含む「聖なる山」として崇敬されている。

これらの属性から、地理的・文化的両面において日本の象徴として機能する存在である。
富士山は以下の特徴を持つ日本最大の活火山である。
1. **標高3776メートル(2019年測量)**:日本の最高峰として地理的要衝に位置する。
2. **文化財としての地位**:UNESCO世界遺産「富士山-信仰と芸術の景観」の核となる存在である。
3. **活火山であること**:過去の噴火記録(1707年大正大噴火)により地殻活動の継続性が確認される。
4. **神聖な象徴**:富士五郎伝説や御岳信仰など、霊的な意義を含む「聖なる山」として崇敬されている。

これらの属性から、地理的・文化的両面において日本の象徴として機能する存在である。

APIサーバーURLとAPIキーの設定

Pasted-126APIサーバーのアドレスは次の通り。

APIキーはlm-studioとしているが、内容は文字が入っていれば何でもいいようで、abcでも通る。

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

モデルの指定

利用するモデルに合わせてmodelを指定する。

model="deepseek-r1-distill-qwen-14b-japanese@q4_k_m",

ポイント:<think>~</think>はAIの思考部分なので最終表示から省く

DeepSeek-R1は、<think>タグで、どのように考えたかを最初に吐き出しつつ、その後に実際の回答を出力するのが特徴。

<think>
まず、ユーザーが求めているのは「です・ます」調ではなく「~である」調での回答です。質問は「富士山の特徴は?」なので、適切な情報を整理する必要があります。

富士山の主な特徴として、活火山であること、標高が3776メートル(2019年の測量結果)であること、日本一の高い山である点を挙げるのが一般的です。また、富士五郎伝説や文化財との関連も特徴と言えます。

次に、「~である」調にするためには、各項目を「~である」と言い換える必要があります。例えば、「活火山である」「標高3776メートルの山である」などです。

さらに、自然景観や文化的な側面にも触れるとより深い回答になります。ただし、ユーザーが求めているのは簡潔さなので、必要以上の情報を詰め込みすぎないように注意します。

最後に、回答全体を確認して、「~である」調が適切で、富士山の特徴を網羅しているかチェックします。
</think>

富士山は以下の特徴を持つ日本最大の活火山である。
1. **標高3776メートル(2019年測量)**:日本の最高峰として地理的要衝に位置する。
2. **文化財としての地位**:UNESCO世界遺産「富士山-信仰と芸術の景観」の核となる存在である。
3. **活火山であること**:過去の噴火記録(1707年大正大噴火)により地殻活動の継続性が確認される。
4. **神聖な象徴**:富士五郎伝説や御岳信仰など、霊的な意義を含む「聖なる山」として崇敬されている。

これらの属性から、地理的・文化的両面において日本の象徴として機能する存在である。
富士山は以下の特徴を持つ日本最大の活火山である。
1. **標高3776メートル(2019年測量)**:日本の最高峰として地理的要衝に位置する。
2. **文化財としての地位**:UNESCO世界遺産「富士山-信仰と芸術の景観」の核となる存在である。
3. **活火山であること**:過去の噴火記録(1707年大正大噴火)により地殻活動の継続性が確認される。
4. **神聖な象徴**:富士五郎伝説や御岳信仰など、霊的な意義を含む「聖なる山」として崇敬されている。

これらの属性から、地理的・文化的両面において日本の象徴として機能する存在である。

ただ、最終結果としては</think>の部分は要らないことが多いはず。

そこで、サンプルコードでは、受け取ったメッセージ(message_content)から<think>~</think>の思考部分を省いたもの(cleaned_content)を表示している。

message_content = completion.choices[0].message.content 

# <think>~</think>部分を正規表現で削除
cleaned_content = re.sub(r"<think>.*?</think>", "", message_content, flags=re.DOTALL)

OpenAIのAPIを利用するコードをDeepSeek-R1に乗り換える場合には、このひと手間だけ加える必要があるだろう。

チャットボットなどでは逆に<think>の部分を活かして「胸の内」みたいに表示させても面白いかも。

 


記事の内容は執筆、更新日時時点の情報であり、現在は異なっている場合があります。
記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

【今日のおすすめ】

エネチェンジで電気代を比較!激安電気会社が見つかる!

【auひかり】最大10Gbpsの超高速通信!最大126,000円還元キャンペーンキャッシュバックで初期工事費も実質無料!

ひきこもりニートでも稼いでゲームに課金出来る時代

 - 大規模言語モデル(LLM) ,