低スペックなマシンでLlama-3-ELYZA-JP-8BをDifyで動かす 

# はじめに
低スペックなローカルマシンで最近出たLlama-3-ELYZA-JP-8Bを動かしてRAGを作ってみました。
（他の記事をいろいろ参考にしています。まとめて参考文献としてリンクを下に置いています）

# 構築概要

- マシンの準備
    - Azure VM (Standard B4ms :4 vcpu 数、16 GiB メモリ)
    - Docker周りの準備
    - Git周りの準備
- Difyの準備
- Ollamaの準備
- モデルの準備
    - Llama-3-ELYZA-JP-8B-GGUF（cpuマシンで使うので量子化されているもの）
- DifyでRAGの構築

以下手順を説明していきます。

# マシンの準備
今回はAzureのVMのStandard B4ms（4 vcpu 数、16 GiB メモリ）で実施しました。
VMを準備したら、アップデートして、Gitを入れて、Docker周りのセットアップ。

```bash
sudo apt update

# Git
sudo apt install -y git

# Docker
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

# Docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```


# Difyの準備

まずはクローンしてくる。

```bash
git clone https://github.com/langgenius/dify.git
cd dify/docker
```

そのあとローカルのOllama（後述）が見えるようにdify/dockerにあるdocker-compose.yamlに追記する。
具体的には以下の+行を追記。

```yaml:dify/docker/docker-compose.yaml
     networks:
       - ssrf_proxy_network
       - default
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
```

そうしたらDifyを起動させる。ホームディレクトリに戻る。

```bash
sudo docker-compose up -d
cd
```

Difyが見えるように、Azure側のVMのネットワーク設定で80ポートの受信ルールを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/c8e6a200-ba19-257a-ab58-25fa1e92de1f.png)


# Ollamaの準備

Ollama用のdocker-compose.yamlを作る。

```bash
touch docker-compose.yaml
```
中身に以下を記載する

```yaml:docker-compose.yaml
version: "3.8"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./volumes/ollama:/root/.ollama
    restart: always
```

Ollamaを起動させる

```bash
sudo docker-compose up -d
```

# モデル（Llama-3-ELYZA-JP-8B）の準備

Hugging FaceからLlama-3-ELYZA-JP-8B-q4_k_m.ggufをダウンロードする。

```bash
wget https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/resolve/main/Llama-3-ELYZA-JP-8B-q4_k_m.gguf

```
Modelfileを作る

```bash
touch Modelfile
```

中身は以下を記述する。

```:Modelfile
FROM ./Llama-3-ELYZA-JP-8B-q4_k_m.gguf
TEMPLATE """{{ if .System }}
system


{{ .System }}
{{ end }}{{ if .Prompt }}
user


{{ .Prompt }}
{{ end }}
assistant


{{ .Response }}
"""
PARAMETER stop "
"
PARAMETER stop "
"
PARAMETER stop "
"
PARAMETER stop "<|reserved_special_token"
```

OllamaのコンテナにモデルとModelfileをコピーをする。

```bash
sudo docker cp Modelfile ollama:/Modelfile
sudo docker cp Llama-3-ELYZA-JP-8B-q4_k_m.gguf ollama:/Llama-3-ELYZA-JP-8B-q4_k_m.gguf
```

モデルを作成して、実行する。

```bash
sudo docker exec -it ollama ollama create elyza:8b-instruct -f Modelfile
sudo docker exec -it ollama  ollama run elyza:8b-instruct
```

# DifyでRAGの構築

ブラウザにVMのIPアドレスを入れるとDifyのログイン画面に行くので、初期設定をする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/31eea59e-7df2-9352-8c4e-d7d2aaee544a.png)

設定からモデルプロバイダーに行って、Ollamaを選び先ほど起ち上げたelyzaの8Bモデルを指定する。

Model NameとBase URLの指定は以下。

Model Name：elyza:8b-instruct
Base URL：http://host.docker.internal:11434

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/896f82a2-3fe2-057e-274d-8e04fb97fe23.png)

それで保存をする。あとはChatBotを構築し、RAGさせたいドキュメントをアップロードする。

ここでは、経済産業省のバイオエコノミー戦略の本文を投入してみる。
https://www8.cao.go.jp/cstp/bio/bio_economy.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/1c97194a-0e00-9d16-e07e-c336a27d5ac2.png)

ナレッジからドキュメントを追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/a0b913d4-787d-ce7a-472c-6735fbed34ff.png)

ChatBotからナレッジを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/0d1d81c1-9d8c-30dd-d217-98bfcc4dbd2a.png)

元ドキュメントのp47あたりの内容を聞いてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/1e0297eb-4a36-b0f8-b8a5-0f47570a51c4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983698/1aaad247-5e28-287f-e09a-1772eb5d6a36.png)

という感じで一応RAGとして動かせた。
上記はデフォルトの経済的な方法でのナレッジ作成をしましたが、別途埋め込みモデルなどの指定してナレッジを作る場合については[こちらの記事](https://qiita.com/bari8/items/3c49345706ebd1a7cbf3)をご参考にしてください。

それではこの辺で。


# 参考文献
- [OSS版DifyをAzureの仮想マシンで構築デビュー (zenn.dev)](https://zenn.dev/o_ken_surprise/articles/13db80833213d1)
- [Dify + Llama 3 で遊んでみる (1) (zenn.dev)](https://zenn.dev/derwind/articles/dwd-llm-dify01)
- [Ollama で Elyza-7B を試す｜npaka (note.com)](https://note.com/npaka/n/ndadbae6c6be5)
- [Ollama x Dify で Local LLM App を構築 #ollama - Qiita](https://qiita.com/hmkc1220/items/74dc83a1e258a752375b)
- [よーしパパ、Ollama で Llama-3-ELYZA-JP-8B 動かしちゃうぞー](https://qiita.com/s3kzk/items/3cebb8d306fb46cabe9f)