Dify+Firecrawlでお手軽にパーソナルRAGを構築

# はじめに
Open SourceのLLMアプリ開発プラットフォームを活用して、自分のオリジナルRAG環境を構築してみることとする
自身のWindows端末上のPodman DesktopにContainer版のDifyをデプロイし、合わせてFirecrawlもデプロイして、WEBクローリングでRAGのナレッジを収集する
また、自身が所属しているプロジェクトはRedmineを使ってタスク管理を行ってノウハウを集約しているため、Redmineチケットの内容もRAGのナレッジに登録してみる

# 環境情報
- OS: Windows 11 Pro 23H2
- RAM: 16.0GB
- SSD: 256GB
- Podman Desktop: v1.11.1
- Podman: v5.1.1

# Difyのインストール(Dify関連コンテナの起動)
## Difyのデプロイ

Githubの[Github Dify](https://github.com/langgenius/dify) のリポジトリをクローンする
```
PS C:\WINDOWS\system32> git clone https://github.com/langgenius/dify.git
```
次に、ローカルで起動するために.envファイルを用意します
```
# ディレクトリに移動
PS C:\WINDOWS\system32> cd dify

# サンプルの環境変数をコピー
PS C:\WINDOWS\system32> cp ./docker/.env.example ./docker/.env
```

DifyのListen Portを変更したかったため `.env`の以下部分を編集
```
.env

...
EXPOSE_NGINX_PORT=80 -> EXPOSE_NGINX_PORT=11080
EXPOSE_NGINX_SSL_PORT=443 -> EXPOSE_NGINX_SSL_PORT=11443
...
```

podman machine上でpodman-composeコマンドを利用するので、Windows PowerShell(管理者)にてWSLでpodman-machine-defaultに接続する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```

`docker-compose `を`podman-compose`に読み替えて実行したところ、以下エラーで失敗
```
[user@hostname ~]$ podman-compose up -d
podman-compose version: 1.1.0
['podman', '--version', '']
using podman version: 5.1.1
Traceback (most recent call last):
  File "/usr/bin/podman-compose", line 33, in <module>
    sys.exit(load_entry_point('podman-compose==1.0.6', 'console_scripts', 'podman-compose')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/podman_compose.py", line 2940, in main
    podman_compose.run()
  File "/usr/lib/python3.11/site-packages/podman_compose.py", line 1420, in run
    self._parse_compose_file()
  File "/usr/lib/python3.11/site-packages/podman_compose.py", line 1567, in _parse_compose_file
    raise RuntimeError(f"missing networks: {missing_nets_str}")
RuntimeError: missing networks: default
```
[issue](https://github.com/langgenius/dify/issues/4773) を参考に`docker-compose.yaml`を一部修正
```
docker-compose.yaml
...
networks:
  # create a network between sandbox, api and ssrf_proxy, and can not access outside.
  ssrf_proxy_network:
    driver: bridge
    internal: true
  milvus:
    driver: bridge
  opensearch-net:
    driver: bridge
    internal: true
  default:  <- 追加
    driver: bridge <- 追加
```
`podman-compose`を再実行。エラーで失敗したときは`podman-compose down`で念のためコンテナを削除してから再実行してみる
```
[user@hostname ~]$ podman-compose down
[user@hostname ~]$ podman-compose up -d
```
次はdocker_db_1コンテナが起動/停止を繰り返す事象
以下コマンドでログ確認したところ、同じメッセージが出続けている
```
[user@hostname ~]$ podman logs docker_db_1
...
fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
```
[Dify on WSL2の起動時にpostgresがエラーを出力する](https://qiita.com/Saaaam/items/111bf720f35d6261a29d) を参考に`docker-compose.yaml`を編集
postgresql用のデータ領域として`volume`を作成して、そちらを利用するように書き換える
```
...
  # The postgres database.
  db:
    image: postgres:15-alpine
    restart: always
    environment:
      PGUSER: ${PGUSER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456}
      POSTGRES_DB: ${POSTGRES_DB:-dify}
      PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata}
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data -> db_data:/var/lib/postgresql/data
...
volumes:
  oradata:
  db_data: <- 追加
```
再度`podman-compose`を実行
```
[user@hostname ~]$ podman-compose up -d
```

コンテナのステータスを確認する
```
[user@hostname ~]$ podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED             STATUS
      PORTS                                                  NAMES
cf78ff1321ad  docker.io/langgenius/dify-web:0.6.13                           About a minute ago  Up About a minute            3000/tcp                                               docker_web_1
1050c5515fec  docker.io/library/postgres:15-alpine     postgres              About a minute ago  Up About a minute (healthy)  5432/tcp                                               docker_db_1
d792d2821884  docker.io/library/redis:6-alpine         redis-server --re...  About a minute ago  Up About a minute (healthy)  6379/tcp                                               docker_redis_1
ed29715b3809  docker.io/langgenius/dify-sandbox:0.2.1                        About a minute ago  Up About a minute                                                                   docker_sandbox_1
3d1ec8fb577f  docker.io/ubuntu/squid:latest                                  About a minute ago  Up About a minute            3128/tcp                                               docker_ssrf_proxy_1
faf6e1e7c36b  docker.io/langgenius/dify-api:0.6.13                           About a minute ago  Up About a minute            5001/tcp                                               docker_api_1
1b32ebb48a5e  docker.io/langgenius/dify-api:0.6.13                           About a minute ago  Up About a minute            5001/tcp                                               docker_worker_1
1007d6723ea1  docker.io/library/nginx:latest                                 About a minute ago  Up About a minute            0.0.0.0:11080->80/tcp, 0.0.0.0:11443->443/tcp, 80/tcp  docker_nginx_1
```

`.env`ファイルで`COMPOSE_PROFILES=${VECTOR_STORE:-weaviate}`にて`COMPOSE_PROFILE`環境変数にてベクターDBを設定し、`docker-compose.yaml`内の`profile`にてデプロイするベクターDBのコンテナを選択している
なぜか`COMPOSE_PROFILES`環境変数が効かずに、`weaviate`コンテナがデプロイされないので、`podman-compose`実行時に`profile`を指定して実行した
```
podman-compose -f docker-compose.yaml --profile weaviate up -d
```

再度コンテナのステータスを確認すると`weaviate`コンテナが起動している
```
[user@hostname ~]$  podman ps
CONTAINER ID  IMAGE                                       COMMAND               CREATED         STATUS
 PORTS                                                  NAMES
55403e1e4c6b  docker.io/langgenius/dify-web:0.6.13                              27 minutes ago  Up 27 minutes
 3000/tcp                                               docker_web_1
eca999d7c3d2  docker.io/library/postgres:15-alpine        postgres              27 minutes ago  Up 27 minutes (healthy)  5432/tcp                                               docker_db_1
4e19335435a7  docker.io/library/redis:6-alpine            redis-server --re...  27 minutes ago  Up 27 minutes (healthy)  6379/tcp                                               docker_redis_1
c25b168f7991  docker.io/langgenius/dify-sandbox:0.2.1                           27 minutes ago  Up 27 minutes
                                                        docker_sandbox_1
1003b5bdd142  docker.io/ubuntu/squid:latest                                     27 minutes ago  Up 27 minutes
 3128/tcp                                               docker_ssrf_proxy_1
a3ec3e6eeaf9  docker.io/semitechnologies/weaviate:1.19.0  --host 0.0.0.0 --...  27 minutes ago  Up 27 minutes
                                                        docker_weaviate_1
061db32e8ed2  docker.io/langgenius/dify-api:0.6.13                              27 minutes ago  Up 27 minutes
 5001/tcp                                               docker_api_1
d4b662460cf2  docker.io/langgenius/dify-api:0.6.13                              27 minutes ago  Up 27 minutes
 5001/tcp                                               docker_worker_1
d127b93ed7c5  docker.io/library/nginx:latest                                    27 minutes ago  Up 27 minutes
 0.0.0.0:11080->80/tcp, 0.0.0.0:11443->443/tcp, 80/tcp  docker_nginx_1
```
## Difyへのアクセス
プラウザから`http://localhost:11080/install`へアクセスするとDifyのページが表示されるためユーザを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/03850e23-10e9-7c63-e4d6-47c1d1c9df2b.png)

以下ログインページが表示されたら先ほど設定したユーザでログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/bbabd7e2-50a8-5128-0d47-282100070cea.png)

ログインが完了すると以下のページが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/a45280c6-5035-1504-7f8d-08114c3dc013.png)

Difyのデプロイはいったん完了

# モデルの設定
利用するLLMを設定する
今回は`OpenAI`を利用してみる
## OpenAIのAPIキー取得
[OpenAI API](https://openai.com/index/openai-api/)にログインする
OpenAIが`Free trial`だとエラーとなってしまうため、支払情報を登録した上で`Dashboard`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/d3ab8fad-3087-504e-f014-bcca7774dfd2.png)

`API keys`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/7c9266ef-b79b-41b2-f276-10a3d1e65d0c.png)

`Create new secret key` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9c2095ac-b6e1-2dce-057b-612004545a2a.png)

`Name`を入力して`Create secret key`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/92d2245a-e31f-c124-8183-68d7bbdcee3c.png)

APIキーが生成されるのでテキストファイルに保存しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/ccaf8466-51b3-b108-c6d4-860395942aaf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/2545a1e4-aaf0-c808-fece-8df455a41819.png)

## Difyのモデルの追加
Difyの右上隅のアカウントアイコンをクリックし、`設定` -> `モデルプロバイダー`を選択する
`OpenAI` -> `セットアップ` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/5c6d0022-96e2-1851-2b2d-d515c4b73220.png)

生成したAPIキーを入力して`保存`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/4d29eb44-a576-a02d-4a6b-3b8af02b1392.png)


上部に表示されている`システムモデル設定`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/efd103bd-97fb-0979-d297-527cb0497bf2.png)

[【24年最新版】ChatGPT（OpenAI）のAPI料金体系まとめ](https://www.goatman.co.jp/media/openai-api-pricing/)を参考になるべくコストがかからないものを選択して`保存`をクリックした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/3e050caf-bcae-364f-276e-3eb7a2a9f2c5.png)


# OpenAIでテストボットを作る
動作確認のためにテストボットを作ってみる

## アプリの作成
`最初から作成`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/8b1bcd8f-4a09-5a26-7c14-b09702d6fdc5.png)

`チャットボット`を選択して`アプリの名前`と`説明`を入力して`作成する`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/cd272760-640e-1257-355a-31d87dbdfa2c.png)

右上のモデルで`gpt 3.5-turbo`を選択して`公開する`をクリックの上で`更新`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/15fbd100-e459-468d-1e05-39990686ae90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/1383f3c4-cf2f-cd7b-041d-ce8013ccfca3.png)

アプリが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/97cf32ae-81a2-a654-9742-83aac610ca2a.png)

# Firecrawlのインストール(コンテナ起動)
RAGデータをWebサイトのクローリングで登録するためにFirecrawlを利用する
FirecrawlはSaaS版もあるが、今回はOSS版をローカルにコンテナで起動する構成とする
## Firecrawlのデプロイ
Githubの[Github Firecrawl](https://github.com/mendableai/firecrawl)のリポジトリをクローンする
```
PS C:\WINDOWS\system32> git clone https://github.com/mendableai/firecrawl.git
```
次に、ローカルで起動するために.envファイルを用意します
```
# ディレクトリに移動
PS C:\WINDOWS\system32> cd firecrawl

# サンプルの環境変数をコピー
PS C:\WINDOWS\system32> cp ./apps/api/.env.example ./.env
```
コピーした .envファイルをエディタで開いて以下のように`REDIS_URL` , `USE_DB_AUTHENTICATION` , `TEST_API_KEY`に変更を加える

- `REDIS_URL`は、立ち上がったRedisコンテナに向き先を変更
- `USE_DB_AUTHENTICATION`は無効とする
- `TEST_API_KEY`はAPI Keyを意味している。この値は、fc-xxxxの形式であれば何でもOK。今回は「fc-test」を設定した

```
.env

...
REDIS_URL=redis://localhost:6379 -> REDIS_URL=redis://redis:6379
...
USE_DB_AUTHENTICATION=true -> USE_DB_AUTHENTICATION=false
...
TEST_API_KEY= -> TEST_API_KEY=fc-test
...
```
podman machine上でpodman-composeコマンドを利用するので、Windows PowerShell(管理者)にてWSLでpodman-machine-defaultに接続する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```
`podman-compose`を実行してコンテナを起動
```
[user@hostname ~]$ cd firecrawl/.
[user@hostname ~]$ podman-compose up -d
```
以下コマンドを実行して`Hello, World!`が出たらデプロイ成功
```
[user@hostname ~]$ curl -X GET http://localhost:3002/test
Hello, world!
```

## ローカルのDifyとの繋ぎこみ
次に、ローカルのDifyと繋ぎ込みを行う
Difyの`ナレッジ` -> `知識を作成` -> `Configure`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/0f44f86e-afd9-e0b9-24c6-c84422314270.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/87b09ea0-a50b-e37c-5ede-5958be1fce2e.png)

次に`Website` -> `Configure` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/94f771e5-580d-1e3d-c237-e8c64056c72b.png)

Firecrawlの設定モーダルが表示されるので、先程環境変数で設定した `TEST_API_KEY`の値(`fc-test`)とBase URLに`http://host.docker.internal:3002`を入力して`保存` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/799083fe-d1e5-4efe-f5d9-7529463e05b6.png)

`Active`になればつなぎこみ成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/74b7317f-e9e5-83d0-b873-4afd7df1ad2e.png)

## Webサイトのナレッジ登録
動作確認として、Red Hat Openstackの公式ドキュメントをナレッジとして登録してみる
対象のリンクとして`https://docs.redhat.com/ja/documentation/red_hat_openstack_platform/16.2`を設定して`Run`を選択
`Limit`は読み込む最大ページ数を指定する
`Max depth`はサブページを何階層まで読み込むかを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/eb65d7c6-039c-ff1d-1ff3-7508f2e34e04.png)

問題なければ下記のようにクローリングした結果が表示される
ナレッジ登録するページにチェックすればOK
今回は`Reset All`にチェックして全選択して`次へ`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/167e06a7-cb2e-29e1-073e-9b942110bea0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/90e10dd3-f47c-d667-607b-e09573c07822.png)

前処理画面が出てくるので必要に応じて設定して`保存して処理`を選択すればナレッジ登録が始まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/77e58442-467c-a7e4-a357-7422336376c6.png)

ナレッジの登録が完了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/ce0eb303-471d-6461-f975-e013dd611108.png)

# Redmineチケットのナレッジ登録
Redmineにはチケットをcsvエクスポートする機能がある
これを利用してチケットデータをナレッジとして登録する

## Redmineチケットのエクスポート
一度にエクスポート可能なチケットの件数はデフォルトでは最大500となっているため必要に応じて上限を変更しておく
変更は`管理` -> `設定` -> `チケットトラッキング`から`エクスポートするチケット数の上限`を変更して`保存`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e00d1a20-c675-f83d-1522-9d3d887785dd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/33de08ee-6b08-975e-7de9-466bfecc56f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9338d5c0-0940-ed5b-7ab7-ccb0eb6f5edd.png)

チケットタブの右下にある`csv`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/88e7be24-1224-9fda-d3c2-4e41524ed2ca.png)

`すべての項目`を選択し、`説明`,`最新のコメント`にチェックを入れて`エクスポート`をクリックする
csvファイルを適切なフォルダに保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/68445958-62de-eabf-2333-e96ab15f3df8.png)

## Difyのナレッジ登録
出力したcsvファイルをナレッジとして登録する
`ナレッジ` -> `知識を作成` の`+`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/074e9521-7c7a-988e-f8da-6ca8ba628896.png)


`テキストファイルからインポート`を選択し、`ファイルをドラッグ&ドロップするか 参照` のところにcsvファイルをドラッグ&ドロップして`次へ`をクリックする
`テキストファイル`とあるが、`TXT`,`MARKDOWN`,`PDF`,`HTML`,`XLSX`,`XLS`,`DOCX`,`CSV`がサポートされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e89a38ea-2230-1a9d-def2-b8b5ebfcfcfd.png)

いったんはデフォルトの状態で`保存して処理`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c3211d91-1d33-bc92-5faf-139773e98606.png)

しばらく待つと処理が完了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/b4054c6a-31cf-a61e-231f-ae745e8cd05f.png)

# RAGのチャットボットの作成
今まで登録したナレッジをRAGとして利用するチャットボットを作成する

## RAGの機能を持ったチャットボットの作成
`スタジオ` -> `テンプレートから作成` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/81934796-fec2-a619-4da4-64342ba40f06.png)

テンプレート一覧が表示されるので`Knowledge Retrieval + Chatbot` を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/adb7cfd3-4644-59eb-5841-8ab4762e531d.png)

`アプリの名前`と`説明`を入力して`作成` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/d96f2775-5e6e-b251-bc08-c80aa037af1e.png)

`Knowledge Retrieval` をクリックし、右側の`知識`の右側の`+` をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/ec10cb1f-c540-bcc2-f4fa-90570b8b8e59.png)


Red Hat Openstack 16公式ページのナレッジを選択して`追加`をクリックする
ナレッジは複数追加することもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/feac210b-6d98-03bd-5926-34bf7c899596.png)

RAGのデータ登録が完了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/558d2e71-97da-0f5f-dcec-15f622cde851.png)

`LLM`をクリックし、右側の`モデル` で `gpt-3.5-turbo`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/0c58efc6-65db-56c2-73f6-afea11719946.png)

`Knowledge Retrieval`の回答を`GPT`の入力に設定する
`LLM`ブロックをクリック後のパネルの`コンテキスト`より`Knowledge Retrieval > result Array[Object]`を選択する
これにより直前の`Knowledge Retrieval`の回答をそのまま LLM の入力として設定できる
`SYSTEM`の部分にはプロンプトを入力する
テンプレートからアプリを作成しているのでもともと英語でプロンプトが入力済みだが、日本語のコンテンツに対して日本語で質問するので日本語でプロンプトを入力してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/0ee056f1-a109-6a09-3edf-dcef7b085075.png)

入力したプロンプトは以下の通り
```
あなたはRed Hat Openstack 16に関する質問をサポートするアシスタントです
`コンテキスト`の情報を元に回答してください
`コンテキスト`の情報は以下の<context></context>というXML タグの中にあります
<context>
{{#context#}}
</context>
`コンテキスト`の情報から回答できない場合は`わかりません`と答えてください
回答で使用する各事実には必ず出典名(`コンテキスト`のURL。例だと`http://index1.html`や`https://index2.html`など)を行の末尾に記載します
出典名は必ず一つずつブラケット[]で囲んでください。例えば、`http://index1.html`なら、`[http://index1.html]`です。
ちなみに、`http://index1.html`や`http://index2.html`は架空の資料なので使用しないでください
質問者の言語に応じて回答してください
```

## アプリを公開
右上の`公開` -> `更新` をクリックするとアプリが公開される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/0caf9384-4dc1-9b2d-72c7-142f9e7fbcc9.png)

## お試し利用
`デバッグとプレビュー`をクリックするとアプリを実行できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/2ffeb735-1a45-e1a2-6c61-cb5ed8dc7220.png)

それっぽい回答が応答されるのでうまく動いているように見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/22209001-d9fd-6d99-d637-7a34acfd61ad.png)

# おわりに
以上でDify+Firecrawlをデプロイして自分用のRAGアプリを構築できる環境を作ることができた
個人のローカル環境で手軽に利用できる生成AIを活用したアプリ開発のテストベッドとして有効活用していきたい

# 参考ページ
- [Github Dify](https://github.com/langgenius/dify)
- [Dify | インストール](https://qiita.com/vb-long/items/97d8ab51ff6c44a85cd4)
- [初心者でもできた Dify環境構築メモ（Windows+Anaconda＋Docker Desktop）](https://note.com/sea_webma/n/n1ebacfa593c9)
- [Podman deployment issues: RuntimeError: missing networks: default and socket.gaierror: [Errno -3] Temporary failure in name resolution #4773](https://github.com/langgenius/dify/issues/4773)
- [Dify on WSL2の起動時にpostgresがエラーを出力する](https://qiita.com/Saaaam/items/111bf720f35d6261a29d)
- [DifyでLLMを使えるようにする(OpenAI GPT-4o)](https://zenn.dev/acntechjp/articles/03d6e8fa2b58bd)
- [Github Firecrawl](https://github.com/mendableai/firecrawl)
- [Firecrawlをローカルで動かしDifyと繋げてみる](https://zenn.dev/zozotech/articles/d177f4cdc02755)
- [5分でわかるRedmineのインポート・エクスポート機能](https://redmine.jp/gofun/import-export/#export)
- [Dockerで構築したDifyを利用しノーコードでRAGのチャットボットを作る](https://qiita.com/sey323/items/8921bb767e2b0656f1cc)
- [【24年最新版】ChatGPT（OpenAI）のAPI料金体系まとめ](https://www.goatman.co.jp/media/openai-api-pricing/)