DeepSeekをローカルでollama を使って動かす

# はじめに
ディープラーニングのモデルを軽量化する代表的な圧縮手法として、 Pruning（枝刈り）、Quantize（量子化）、Distillation（蒸留）の３つの手法があります。
話題の DeepSeek-R1 は、671B という巨大なモデルですが、これをDistillation(蒸留)した 1.5b,7b,8b,14b,32b,70b というモデルがあります。

各モデルの推奨スペックサイズは↓参照
https://apxml.com/posts/gpu-requirements-deepseek-r1

蒸留とは既存モデルの入力と出力のペアを元に新たなモデルの学習を行い、既存モデルとよく似たモデルを作成する手法です。

DeepSeek-R1-Distill-Qwen-14B-Japanese
DeepSeek-R1-Distill-Qwen-32B-Japanese

という日本語追加学習モデルをサイバーエージェントが https://huggingface.co/cyberagent で公開してくれていますのでこれらを使っていきます。

ちなみにDeepSeekは巨大な671BのモデルがOpenAIのモデルを使って蒸留して作成され規約違反ではないか？と話題になっていて、
https://openai.com/policies/row-terms-of-use/
の
Use Output to develop models that compete with OpenAI.
に抵触しているのではないか？ということで現在調査が進められています。

ただ OpenAI はインターネット上のデータをページ作成者の許諾なく学習に利用しているけど、AIシステムの学習は著作権侵害ではないとの主張もしているため、これ自体に無理があるのではないか？とも一部では指摘されていたりします。

ちなみに2024年2月8日、中国広州インターネット法院は、『生成AIの出力結果について、AI提供事業者の責任を認めた世界初の裁判例（広州ウルトラマン事件）』というのがあり、生成AIに特化した規制をいち早く施行したのが中国だった。ということも注目しておく必要があります。
https://www.kwm.com/cn/en/insights/latest-thinking/china-s-first-case-on-aigc-output-infringement-ultraman.html

さて、DeepSeekの巨大な671Bのモデルを自宅のPCで動作させるにはリソース不足で無理なので蒸留された軽量モデルを使って動作させてみることにします。

# ollama をインストールする
「Ollama」はllama.cppをバックエンドにしたオープンソースソフトウェア（OSS）です。
https://ollama.com/download
ライセンスはMITです。
https://github.com/ollama/ollama/blob/main/LICENSE

OllamaSetup.exe をダウンロードしてそのままインストールしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255677/73b0ef58-b027-f6c3-d2c9-8d0945f480cf.png)

# ollama のバージョン確認
インストールが完了すると、

```shell-session
>ollama --version
ollama version is 0.5.7
```

でバージョンを確認する。

# ollama のライブラリを確認

https://ollama.com/library

にDeepSeekがあるけど、これは日本語追加学習モデルではないので、サイバーエージェントがhuggingfaceで公開しているものを利用します。

https://huggingface.co/cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese

# ollama でhuggingfaceのモデルをダウンロードして実行する

ollama でダウンロードして実行する方法は

ollama run hf.co/{username}/{repository}

となっています。↓参照

https://huggingface.co/docs/hub/en/ollama

なので、
ollama run hf.co/cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese

で実行できることになります。

```shell-session
>ollama run hf.co/cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese
pulling manifest
Error: pull model manifest: 400: Repository is not GGUF or is not compatible with llama.cpp
```

ってなった。どうやらGGUFというファイルではないのが理由っぽい。

# GGUF形式の日本語追加学習モデルで ollama を実行する
GGUFは、モデルの高速読み込みと保存を目的として特別に設計されたバイナリー形式のようです。

ぐぐってみると以下のGGUF化されたリポジトリがあったので利用させていただく。
https://huggingface.co/grapevine-AI/DeepSeek-R1-Distill-Qwen-32B-Japanese-GGUF

```shell-session
ollama run hf.co/grapevine-AI/DeepSeek-R1-Distill-Qwen-32B-Japanese-GGUF
```

19GB 結構なボリューム。1時間24分

```shell-session
>ollama run hf.co/grapevine-AI/DeepSeek-R1-Distill-Qwen-32B-Japanese-GGUF
pulling manifest
pulling 74615f1adf5c...   0% ▕                                                        ▏  39 MB/ 19 GB  3.9 MB/s   1h24m 
```

途中で
Error: max retries exceeded: EOF
というのが出ても途中までDLした箇所から再実行すれば問題なく継続できます。

ちなみにもう少し小さいモデルだと 14B というのがあります。
https://huggingface.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf
ollama run hf.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf

```shell-session
>ollama run hf.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf
pulling manifest
pulling 9c7382e378d8... 100% ▕████████████████████████████████████████████████████████▏ 9.0 GB
pulling 8aa4c0321ccd... 100% ▕████████████████████████████████████████████████████████▏  493 B
pulling c737442a210a... 100% ▕████████████████████████████████████████████████████████▏  170 B
pulling 6e7b0c17f887... 100% ▕████████████████████████████████████████████████████████▏  193 B
verifying sha256 digest
writing manifest
success
>>> Send a message (/? for help)
```
と、なりました。これで会話が可能です。

# ollama の停止方法
```shell-session
>>> /?
Available Commands:
  /set            Set session variables
  /show           Show model information
  /load <model>   Load a session or model
  /save <model>   Save your current session
  /clear          Clear session context
  /bye            Exit
  /?, /help       Help for a command
  /? shortcuts    Help for keyboard shortcuts

Use """ to begin a multi-line message.
```

とありますので、

```shell-session
>>> /bye
```

と入力すると停止されます。

# ollama を使ってローカルにダウンロードしたDeepSeekモデルと会話してみる

DeepSeekは質問を行うと、その質問がどのような意図があるのか？というのを推論して会話を行うようです。
```
<think>
</think>
```
で囲まれた部分が推論を行っている内容のようです。

```shell-session
>ollama run hf.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf
>>> こんにちは！
<think>
はい、ユーザーからのメッセージを日本語で深く考えてみましょう。まず、「こんにちは！」とあたたかい挨拶が届きましたね。
相手の気持ちに応えるために、自分も同じように親しみやすい雰囲気を作りたいです。

次に、会話の流れを考えます。ユーザーはただ「こんにちは」を送ってきたので、返信にはそれに対する丁寧な対応が必要です。
例えば、「こんにちは！元気ですか？」や「おはようございます」といった挨拶が考えられますが、状況によって適切かどうか確
認します。

また、ユーザーの意図を探る必要があります。単に挨拶だけなのか、その後何か質問や依頼があるのかを想定する必要があります
。もし単なる挨拶なら、「こんにちは！今日も頑張りましょうね」など返信し、会話が続くように促すのも良いでしょう。

さらに、ユーザーの状況を考えると、忙しい時間帯にメッセージを送っている可能性もあります。その場合、簡潔で明るいメッセ
ージが適しているかもしれません。「こんにちは！お疲れ様です。今日はいい天気ですね」といった自然な返信も考えられますね
。

また、ユーザーの言語能力や年齢層も推測します。若い人ならカジュアルな挨拶、「おはよう」などでも良いかもしれませんが、
ビジネス場面ではフォーマルな表現が適切かもしれません。しかし今回は個人的なメッセージなので、それほど堅すぎず、親しみ
やすいトーンを心掛けます。

さらに、会話を長引かせるために質問を入れることも有効です。「今日の天気は良いですか？」などと相手の状況に触れることで
、より深いやり取りが可能になります。ただし、ユーザーの返信パターンを見極める必要があります。すぐに返してくれるかどう
か、時間帯によって適切な質問を選ぶことも重要です。

最後に、全体的なバランスを確認します。挨拶と会話のバランスが取れているか、冗長にならないよう短くてわかりやすいメッセ
ージを心掛けます。ユーザーの反応次第でさらに深める余地も残しておきますね。
</think>

こんにちは！
今日も元気に頑張りましょう。最近何か新しいことやっていますか？
例えば趣味や仕事関連の話でもいいので、ぜひ教えてください😊

（※会話を長引くため「最近の出来事」を質問し、次回のトピックを用意）
>>>
```
# DeepSeekと関西弁で会話してみる
まいど！って聞いたら、なんと　『今日はおっちゃんもバリバリ元気です✨』って返してきた！！！:joy:

```shell-session
>>> まいど！
<think>
ユーザーが突然「まいど！」と返信してきた。これはどういう意味だろう？

まず、「まいど」はカジュアルな表現で、ビジネスシーンでは適切ではないかもしれない。でも日本語の中には、特に若い世代や
特定のコミュニティ（例：ネット上のサブカルチャー）でよく使われる言葉だ。

ユーザーが前回の挨拶に対して「まいど」と返した理由を考える：
- 意図的にカジュアルな雰囲気を作りたい
- 過去の会話から、ユーザーとの親しさを示したい
- たまたまそのフレーズを選んだだけかもしれない

次に、どのような反応が適切か検討：
1. カジュアルに対応する場合：「まいど！今日はどうでした？」とリラックスした返信。
2. フォーマルにするなら：「おはようございます。昨日の作業も順調に進みました」

ただし、前回でカジュアルな質問（「最近何か新しいことやってますか？」）を投げかけているため、ユーザーが意図的にリラッ
クスしたトーンを求めている可能性が高い。

また、「まいど」を使うことで会話のテンポを下げ、より自然に進める必要がある。前回の質問に回答してもらうためにも、適切
な返答が必要だ。
</think>

まいど！
今日はおっちゃんもバリバリ元気です✨

最近は「AIと戯れる」のが趣味で…特にこのチャットボット開発には没頭中です。
ユーザー様のユーモアセンスにも負けないように、今日も全力で反応しますので（笑）

何か面白い話や困ったことなどがあれば、遠慮せずにぶつけてくださいませ。
例えば「最近ハマっている小ネタ」や「仕事で悩んだらどうしよう…」など、お待ちしてます！

（※カジュアルなリズムを維持しつつ、次の返答の種まきとして具体例を提示）

>>> 
```

こんな感じです。