LM StudioでDeepSeek-R1をOpenAI互換のAPIサーバーにする手順【ローカルAI】
ご家庭のWindows PC(ローカル)上で大規模言語AIを動かすならLM Studio。
最近話題のDeepSeek-R1を例に、OpenAI互換のAPIサーバーとしてローカルで動かすための手順を紹介する。
これによって、Pythonなどのプログラムからアクセスできるようになる。
Contents
どの程度互換性があるか?
とりあえずPythonでは、openAIのAPI(ver 1.x)で稼働しているコードから、アクセス先のURLやAPIキー、model名を差し替えるだけで基本的には動かせる。
ただ、DeepSeek-R1の回答に合わせて<think>タグの削除なりの処理が必要。
LM StudioでDeepSeek-R1(蒸留モデルなど)を使えるようにする
まずはLM StudioでDeepSeek-R1の蒸留モデルをローカルで使えるようにする。これはWindowsでもできる。
開発者タブでサーバーを起動する
LM Studioを起動し、緑の「開発者」タブを表示する
モデル読み込み
上部からAPIサーバーで動作させるモデルを読み込む。
このようにREADYと表示される。
まだこの時点ではモデルを読み込んだだけで、サーバーは起動していない。
APIサーバーの設定
「Settings」を押す
APIサーバーの目的に応じて適当に設定する。
今回は「LAN内の他のマシンからアクセスできるAPIサーバー」にするので、CORSとローカルネットワークでサービングなどをオンにしている。
Server Port(APIサーバーのポート番号)は問題なければ1234のままで。
APIサーバーの起動
Settingsボタンの左のスイッチを入れればサーバーが起動する。
起動後の画面は以下のような感じ。
Pythonでの使用例
Pythonコードでのサンプル。openAIのPythonライブラリ(ver 1.x)に対応しているので使いやすい。以下のエンドポイントが使える。
GET /v1/models
POST /v1/chat/completions
POST /v1/embeddings
POST /v1/completions
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キーの設定
APIサーバーのアドレスは次の通り。
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円還元キャンペーンキャッシュバックで初期工事費も実質無料!