【環境構築】ローカル環境でLLMワークフローを構築(Dify×Ollama)

# 背景
- 業務でDifyの話が出たので、ローカルでDifyを触ってみようと思って試したかったが、なぜかGeminiの無料枠がDifyで使えなかった
- どうせならローカルでLLMサーバー作ったろ！って思った
- で、やってみると意外に簡単にできたので記事にしてみた

# 目的
- ローカルでのLLMサーバーを構築
- Dify(ローカル)でローカルLLMサーバーを呼び出し


# 対象者
- 完全にローカルに閉じた環境でLLMを使ったワークフローを構築してみたい人
- 無料でLLM込みのDifyのワークフローの作成を試しに作ってみたい人


# 環境
- Windows 11
    - CPU：13th Gen Intel(R) Core(TM) i7-13620H(10コア)
    - GPU：NVIDIA GeForce RTX 4060 Laptop GPU(専用GPUメモリ(VRAMとも呼ばれている) : 8GB)
    - 動作したモデル：[deepseek-r1:8b](https://ollama.com/library/deepseek-r1:8b)
    - 動作したモデル：[gemma3:4b](https://ollama.com/library/gemma3:4b)


<br>

- また、本記事では触れていないが、以下のスペックでも動作確認済み
- 暇があったら追記するかも

<br>

- Windows 11
    - AMD Ryzen 5 3500X 6-Core Processor(6コア)
    - NVIDIA GeForce GTX 1660 SUPER (専用GPUメモリ：6GB)
    - 動作したモデル：[gemma3:4b](https://ollama.com/library/gemma3:4b)

# 利用ツール
- Git(2.49.0.windows.1)
- Docker(4.41.2)
- Ollama(0.9.0)
   - ローカルLLM構築用のOSS
   - CUIベースなので、GUIが使いたい人はLM StadioとかJanとか使ってください
- Dify(v1.4.2)

# 事前準備


- gitのインストール

https://qiita.com/takeru-hirai/items/4fbe6593d42f9a844b1c

- dockerのインストール

https://qiita.com/zembutsu/items/a98f6f25ef47c04893b3


# 作業内容
- 先に両方(OllamaとDify)の環境構築を書いているが、こんがらがる人は以下の読み方がおすすめ
    - Ollamaの環境構築
    - OllamaでのローカルLLMサーバー起動
    - Difyの環境構築
    - Difyでのローカルワークフローの作成

## Ollamaの環境構築
- 以下のサイトでOSに合ったインストーラーをダウンロード

https://ollama.com/download/windows

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/8a5659bb-7453-4983-9708-c5eb136439a1.png)

- ダウンロードしたインストーラーを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/a7a85118-1c41-47d5-9ebc-a4d51db3ed2b.png)

- インストールを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/835095fc-ebdc-4748-9d97-a92158caa891.png)

- 画面右下に以下のような表示が出るのでクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/6c8723ba-d2b1-4e3a-87bc-91ea86e3400c.png)

- 以下のようにコマンドプロンプトが起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/74e54031-e26d-4949-87b7-fdedd2820b49.png)

 - 試しに、以下のようにコマンドを打ってみる
```terminal:コマンドプロンプト
PS C:\Windows\System32> ollama help
```

- Ollamaで使えるコマンドの説明をしてくれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/010c71b1-2e58-4ead-82e7-d3e55bcf94cf.png)


- 以上

- ちなみに、OSSなのでGitHubに公開されています。困ったときは見てみてください(※日本語翻訳推奨)

https://github.com/ollama/ollama

## Difyの環境構築
- コマンド プロンプトを起動(Ollamaのインストール時のコマンドプロンプトでも可)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/323035fc-24c4-421f-832b-0f1921f6777f.png)
- Difyのローカル環境はOllamaと異なりgitコマンドでインストール
- Githubのリンクは以下。コマンド自体は後述しているので手順上は参照不要

https://github.com/langgenius/dify

- 以下のコマンドをコマンドプロンプトで実行

```terminal:コマンドプロンプト
C:\Users\[User]\dev\git-app> git clone https://github.com/langgenius/dify.git
```

- 次に、ディレクトリを移動
```terminal:コマンドプロンプト
C:\Users\[User]\dev\git-app> cd dify\docker
```

- Dify用のDockerコンテナを起動(※先にDocker Desktopを起動しておいてください)
```terminal:コマンドプロンプト
C:\Users\[User]\dev\git-app\dify\docker>docker compose up -d
```

- Dockerでこんな感じにコンテナが立ち上がってたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/d4fafd3e-a1f2-4cbe-a178-0370b1fbd05d.png)

- 以下のパスで、ローカルのDifyにアクセス

http://localhost/install

- ログインのための情報を入力してセットアップを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/97b96f4d-7ac7-45e5-be93-5cd9faabd52f.png)

- 問題なければログイン画面に遷移するので、先ほど入力した情報を再度入力してログイン

![スクリーンショット 2025-06-15 175514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/efd961b2-a893-4640-b032-d6b1fc744bc0.png)

- ログインできればこんな感じの画面になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/acc1588d-05fd-4458-bfe9-26a46d164b09.png)


- 以上

## OllamaでのローカルLLM起動
- Ollamaをインストールしただけでは、モデルが入っていないのでそちらもダウンロードする必要あり
- Ollamaの公式ページで、いろんなモデルが公開されている

https://ollama.com/search

### 選択の観点
- 基本的に、マシンスペック(特に専用GPU)を見た上で、それに適したモデルを選ぶのがよい
- LLMの目安であるモデルサイズは｢xxB(Billionなので10億単位)｣という表記であらわされている
- 以下、Geminiに雑に聞いてみた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/41834107-cd3a-476b-9e8e-c5a1598a33ff.png)

- 私の場合は、個人的に気になっていたDeepSeekの8Bを選択
- 逆に、DeepSeekのほかの低いバージョン(7Bや1.5B)を選ぶと途端に中国語になるので、ほかのモデルを選んだほうがいいかも(モデルの大きさを減らすために一番初めに言語を削っているから？？？)

### LLMをサーバーとして起動
- LLMを起動するコマンドを実行した際、ローカルにない場合は自動でダウンロードしてくれるので、モデルのダウンロードを意識する必要がない

- ほしいモデルのページ右上のコピーボタンをクリック![スクリーンショット 2025-06-15 174523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/a1cfb638-50bd-42c2-a645-05c2f449d989.png)

https://ollama.com/library/deepseek-r1:8b

- コマンドプロンプトにペーストして実行
```terminal:コマンドプロンプト
C:\Users\[User]\dev\>ollama run deepseek-r1:8b
```

- 指定したモデルに対して指示が可能になるので、試しに何か言ってみる
```
> ollama run deepseek-r1:8b
>>> こんにちは！
Thinking...
あ、初対面の挨拶か。ユーザーが日本語で「こんにちは」って送ってきたんだな。今日は何の特別事情もないだろうけど、ただ気
軽にお互いに認識したかっただけかもしれない。

この挨拶はとてもシンプルだから、ユーザーが今どんなことをしているのかあまり分かっていない可能性が高いね。仕事終わりに
リラックスしたい人？ 学生で家にいる人？ それとも海外在住の日本人？

返信も優しく気さくな感じがいいかも。「こんにちは」と同じくらい気軽なトーンで返そう。挨拶を忘れないように「お会いでき
て嬉しいです」って入れて、もしもっと話をしたければオープンに誘導するよ。

日本語しか使ってないけど、多分日本語話者だろうね。でも海外から来た可能性もあるから、「日本語で話す」とはっきり伝えな
いと困る。「わからないことがあれば気軽に聞いてください」と言ったら、日本語以外の質問も受け付けることを示せるし、親し
みやすくなるかな。
...done thinking.

こんにちは！ 😊
お会いできてとても嬉しいです。今日は何についてお手伝いしたいですか？
何か質問があれば、いつでも気軽にどうぞ！

>>> Send a message (/? for help)
```
- これでローカルのLLMサーバーの起動が完了
- セッションを終了したい場合は「/bye」と入力してEnter

## Difyでの作業


### LLM選択
- Difyの画面右上のプロフィールアイコン経由で設定ボタンを選択

![スクリーンショット 2025-06-15 180932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/1cb00447-67b0-4771-8438-f7a617a34ad8.png)

- モデルプロバイダーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/40ecd37c-818b-4709-adf2-b94ab005871e.png)

- Ollamaを検索し、インストールを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/aee50703-f1bb-42d0-96a7-c4c2ae0012fe.png)

- DL自体に結構時間がかかる。進捗はここから確認できる

![スクリーンショット 2025-06-15 182234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/12c8c848-d1b8-4f76-8948-2da722c5d734.png)

- 以下のようにOllamaが表示されればインストール完了

![スクリーンショット 2025-06-15 182350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/f6587bbc-d5e3-49ef-9114-4df4d0c0dd76.png)

- もう一度、モデルプロバイダーの画面に戻り、Ollamaの「モデルを追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/c06cef9f-70c1-4631-ab8d-7b7f9b70f64c.png)

- 以下の内容を入力

|  項目名  | 入力内容　|  説明 | 
| ---- | ---- | ---- | 
|  Model Type  |  LLM  | モデルを利用する種別。テキストとLLMがあるらしいがよくわからないので無難にLLMを選択|
|  Model Name  |  deepseek-r1:8b  | モデル名を入力。**自分の選択したモデル**をここでは入力すること |
| Base URL | ```http://host.docker.internal:11434``` | Difyがdockerコンテナ内からホストマシンのエンドポイントにアクセスするために「host.docker.internal」という記述が必要。「11434」はollamaのポート番号 | 

- 上記で未記載のものはデフォルトのままで保存をクリック~~個人利用なので、細かい内容を調べるのが面倒だった~~


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/3e9d431a-14b5-47fd-b078-b5bfe9d5c5d5.png)

- 成功すれば、以下のように利用可能なモデルとして追加される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/dddef22b-28b5-4a8d-a6ce-fde0d904638a.png)

- 最後に、システムモデル設定で先ほど追加できたモデルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/c2bd821c-0afc-4658-aaa6-db80a08c37ca.png)

- [システムモデルがまだ完全に設定されておらず～～～]という表記がなくなれば完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/9e68d070-1e7b-45ff-872a-831ba675411a.png)



### アプリ作成
- 最初の画面（スタジオ)で「最初から作成」を選択

![スクリーンショット 2025-06-15 184557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/6c504e5e-7521-41dd-836a-d8731c8150cd.png)

- 簡単に作って動作確認をしたいだけなので、チャットボットを選択し、アプリ名を入力して作成するをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/b1b3d244-cf62-4226-a3d1-ba9e742ff930.png)

- こんな感じの画面に遷移する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/b986a3aa-f6f2-4609-aa10-08b6491acd01.png)

- 一応Difyの機能が適用されていることの確認用にプロンプトと変数だけ入れておく(本題ではないので割愛)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/f0aa305e-e267-41b9-a7ff-36953c321bc5.png)

- 試しに、右側のプレビュー画面で何かメッセージを送ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/27a4b18f-4218-4423-a2c3-e7cc449d4254.png)

- なんかよくわからん回答をしてきたが、まあ大丈夫だろう。。。
> ちなみに、後で試してみるとgemma3:4bの方が早くて良い回答をしてくれた。。。もっと複雑な依頼をしたときには変わるのかもしれない。。。

### アプリ公開
- とは言いつつもローカルなのでパブリックに公開されることはない
- 画面右上の「公開する」を選択し、その中の「更新を公開(?)」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/9e0657e8-635c-4b55-b795-ab9dd31e1bfb.png)

- 公開済みのステータスになった後、同じ場所にある「アプリを実行」を選択
![スクリーンショット 2025-06-15 190218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/72d876d3-3e82-44ce-93c1-41f9445fdac9.png)

- ローカルに閉じたチャットボットの完成！！

![スクリーンショット 2025-06-15 190408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984667/b75d7e74-083f-48ae-963a-a3d3873060f6.png)




# 最後に

- これで(電気代以外は)完全無料でLLMを利用したローコードツールの開発ができます
- 業務で利用する場合は話が変わってくるかもしれませんが、実例があるだけで偉い方の承認は通りやすいと思うので、導入したい方はぜひ個人でやってみましょう！

<br>

- また、Difyについては、詳しい人がいろいろやってくれていると思うので、複雑なワークフローを作りたい方はそちらを検索してください！

# 参考元

https://qiita.com/Tadataka_Takahashi/items/ba832511bd4fd5cd46f1

https://qiita.com/pyon_kiti_jp/items/0652a81333591ddd28ee