Dify をアップデートしたらナレッジのデータソースで 「Web サイト」 を指定可能になっていた件

ローカル環境 (Windows 11 上の WSL2 で動作する Ubuntu 22.04) で Dify を立ち上げる方法と、Firecrawl を使用して Web ページをクローリング、スクレイピングしてナレッジにデータソースとして登録するまでの流れを簡単に。

以前、Chatbot UI (オープンソースの LLM 横断型チャットアプリケーション) を自前でホストする話を書いたんですが、この手の、色々な LLM (大規模言語モデル) を横断的に使用できるプラットフォーム的なサービスとして、「Dify」 についてもずいぶん前からローカル環境で立ち上げて使っています。

で、Dify には 「ナレッジ (Knowledge)」 という、あらかじめデータソースをアップロードしておいて、それを基に RAG (Retrieval-Augmented Generation) アプリケーションを簡単に構築できる便利機能があるんですよ。

このナレッジ機能、データソースの登録は、今までファイルのアップロード (.txt.pdf.csv など対応するファイル形式は様々)、もしくは Notion から同期する方法が用意されていたものの、URL を指定した任意の Web サイトからのデータ読み込みは 「Coming soon」 みたいになってたんですけども、最近、Dify をアップデートしたらこれが有効になってました (最新版の v0.6.11 で対応したらしい)。

例えば Web 上にカタログサイトを持っていますよ、とか、FAQ サイトに膨大なナレッジが溜まってます、みたいな企業さんにとってはこれら Web ページをデータソースにして、LLM を使用したチャットボットとか、インテリジェントな検索システムとか、問い合わせへの自動返答システム...... みたいなものを構築できたりと、色々と活用アイデアが湧きそう。

と、まぁそういう高度な話は今回は長くなるので置いておいて、ここでは Dify について全く記事を書いてなかったなというのもあり、とりあえず今回はローカル環境 (Windows 11 上の WSL2 で動作する Ubuntu 22.04) で Dify を立ち上げる方法と、Firecrawl、および Cohere の Rerank API を使用して Web ページをクローリング、スクレイピングして、ナレッジにデータソースとして登録するまでの流れを簡単にメモっとこうと思います。

ローカル環境で Dify を立ち上げる

Dify は Docker で利用できるので、下記の公式ドキュメントに記載の通りで簡単に終わります。

Windows の場合は、WSL2 を利用して Ubuntu を稼働させるのが簡単です。今回は Windows 11 上の WSL2 で動作する Ubuntu 22.04 を前提にしていますが、Windows や Ubuntu のバージョンが違ってもほぼ同じだと思います。

前提

  • Docker Desktop がインストールされている
  • WSL2 が有効になっていて、Ubuntu が導入済み

WSL2 のセットアップについては、Micerosoft さんの公式ドキュメントを探すより、下記、DevelopersIO さんの記事の方が多分わかりやすい。

Windows 環境で開発とかやってる人は、今さら WSL2 とか言われなくてもすでに利用している気もしますし、Docker Desktop もすでに入ってるよという人も多いと思いますのでそういう方は次へ。

Dify の立ち上げ

基本的には Ubuntu にログインして、下記の通り、Dify のソースコードを GitHub から取得したら、dify/docker ディレクトリで docker compose up すれば終わりなんですが、私の場合は、docker-compose.yaml を 1箇所だけ修正しました。

git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d

最後の方、nginx に関する設定部分ですね。ports: のところ、"80:80""127.0.0.2:80:80" にしています。

2024 年 6 月 28 日にリリースされた v0.6.12 以降は .env が使用可能になっていますので、docker/docker-compose.yaml を直接修正せず、docker/.env.exampledocker/.env にリネームした上で、NGINX_PORT に値を設定しましょう。

...略...
# The nginx reverse proxy.
# used for reverse proxying the API service and Web service.
nginx:
  image: nginx:latest
  restart: always
  volumes:
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    - ./nginx/proxy.conf:/etc/nginx/proxy.conf
    - ./nginx/conf.d:/etc/nginx/conf.d
    #- ./nginx/ssl:/etc/ssl
  depends_on:
    - api
    - web
  ports:
    - "127.0.0.2:80:80"
    #- "443:443"
...略...

私の場合は案件によってローカル環境で色々とサーバを立ち上げたりする関係上、IP アドレスが重複しないようにですが、別に必須ではないと思います。

また、永続的に利用するなら IP アドレスはわかりにくいかもしれないので、/etc/hosts に設定を追加してもよいかもしれません。例えば下記のように。

127.0.0.2  dify

実際に Dify が立ち上がった状態で起動中のコンテナ情報を確認してみると下記のような感じです。

$ docker ps

CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS                            PORTS                  NAMES
566908500b21   nginx:latest                       "/docker-entrypoint...."   7 seconds ago   Up 4 seconds                      127.0.0.2:80->80/tcp   docker-nginx-1
9dbe35a43700   langgenius/dify-api:0.6.11         "/bin/bash /entrypoi..."   7 seconds ago   Up 4 seconds                      5001/tcp               docker-worker-1
2b2e08cd6e50   langgenius/dify-api:0.6.11         "/bin/bash /entrypoi..."   7 seconds ago   Up 5 seconds                      5001/tcp               docker-api-1
89566c679888   postgres:15-alpine                 "docker-entrypoint.s..."   7 seconds ago   Up 5 seconds (healthy)            5432/tcp               docker-db-1
3fe8ec711389   redis:6-alpine                     "docker-entrypoint.s..."   7 seconds ago   Up 5 seconds (health: starting)   6379/tcp               docker-redis-1
6b981ea4293e   ubuntu/squid:latest                "entrypoint.sh -f /e..."   7 seconds ago   Up 5 seconds                      3128/tcp               docker-ssrf_proxy-1
dc1fdf901d4a   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos..."   7 seconds ago   Up 6 seconds                                             docker-weaviate-1
a38e5d561f6d   langgenius/dify-sandbox:0.2.1      "/main"                  7 seconds ago   Up 6 seconds                                             docker-sandbox-1
bae6349b2714   langgenius/dify-web:0.6.11         "/bin/sh ./entrypoin..."   7 seconds ago   Up 6 seconds                      3000/tcp               docker-web-1

ここまで来たらあとはブラウザでセットアップです。

特に docker-compose.yaml を触らず、デフォルトのまま立ち上げたなら http://localhost に、私のように IP アドレスを変更したならそのアドレス (例えば http://127.0.0.2) にブラウザでアクセスするとアカウント作成画面になると思いますのでメールアドレスやパスワードを入力してログインしましょう。

これで、Dify の立ち上げは完了です。

使用するモデルプロバイダの設定

Dify に無事ログインできたら、まず最初に利用するモデルプロバイダを選択して、API キーなどの設定をします。なお、Dify の言語設定は 「日本語」 になっている前提で進めます (設定 -> 言語 からタイムゾーンとあわせて変更可能)。

画面右上に、アイコンとアカウント名が表示されていると思いますので、そこをクリックすると 「設定」 を選択できます。

設定画面を開いたら、「モデルプロバイダー」 の項目を開きましょう。そこにずらーっとモデルプロバイダが並んでいると思いますので利用したいものを選択し、API キーなどを設定します。私の場合は、下記の 3 つを設定しました。

Dify のモデルプロバイダ選択画面

多くの方は ChatGPT とか Google の Gemini などを利用されると思いますし、その辺はお好みで問題ないのですが、Cohere については後で Rerank API を使用したいので、もしまだ持っていない場合は、アカウントを作成して API キーを取得し、設定しておきましょう。

この設定まで完了すれば、チャットボット作ったり、色々とできますので、ナレッジを使用しないのであれば、あとは使ってみるだけです。

ナレッジに Web ページからデータを登録する

まず、Firecrawl のアカウントを作成して、API キーを取得しておきましょう。とりあえずは無料のプランで問題ないと思います。

次に、Dify の上部メニューから 「ナレッジ」 を選択し、「ナレッジの作成」 画面に進みます。データソースとして 「ウェブサイトから同期」 を選択すると、下記のようにまずは Firecrawl の設定をしろと言われると思いますので、「Configure」 を押して、先ほど取得した API キーを設定していきましょう。

Dify ナレッジの新規作成画面。「ウェブサイトから同期」 を選択すると、初回は Firecrawl のセットアップ指示が表示されます。

「Website」 の方を選択して進みます。

Firecrawl のセットアップ画面。「Website」 の方を選択して進みます。

表示された画面で Firecrawl の API キーを入力しましょう。入力が終わったら保存して、設定ダイアログを閉じます。

Firecrawl のセットアップ画面。API キーを入力しましょう。

Firecrawl の設定が終わると、下記のように URL を指定可能になります。

Web ページからデータソースを登録する画面

オプションで、サブページも読み込む設定がデフォルトで有効になっていると思います。この場合は設定内容に応じて指定した URL を起点に、どういう風にページを読み込むかが決まります。

「Limit」 の設定は、最大で何ページ読み込むかなので、例えば何かの一覧ページを URL として指定して、そこからリンクされたページを読み込みたい場合は、その数に応じて変更します。ただし、Firecrawl の無料プランでは、最大 500 ページまでしか利用できませんので注意。

「Max depth」 は、読み込む階層の深さです。「除外するパス」「含めるパス」 の設定と合わせて、うまく設定してあげると、希望通りの結果になると思います。

Web ページの読み込みがうまくいくと、次に取得したデータをどのように処理するかを選択する画面になります (下記参照)。

テキストの前処理とクリーニング画面

慣れてきたら色々とカスタム設定などを試してみるとよいと思いますが、まずは初期設定のまま進めてみましょう。

「検索設定」 内の 「再ランクモデル」 を有効にすると、Cohere の設定が完了していれば、Rerank モデルが選択できると思います。日本語のデータソースの場合は、多言語に対応した rerank-multilingual-v3.0 を選択しておけばよいでしょう。もしデータソースが英語の場合は rerank-english-v3.0 でよいと思います。

「保存して処理」 を押すことで、データソースの設定が完了します。終わったら 「ドキュメントへ移動」 し、右側のメニューから 「検索テスト」 を選択して、適当なキーワードでテストしてみましょう。データソース内から関連する箇所が抽出されることが確認できると思います。

下記は、試しに自分の会社のニュース・コラムで書いた記事から最新 10 件だけデータソースに取り込んで、そこに含まれていそうなキーワードで検索テストした結果ですが、しっかりと、該当する箇所 (チャンク) が抽出されていることがわかります。

データソースの検索テスト結果

あとは、「スタジオ」 に移動し、このデータソースを使用して、チャットボットを作ったり、ワークフロー機能を使って何か処理をさせたり、みたいなことを用途に応じてやってあげれば、自分だけのデータソースを用いた、AI アプリケーションを稼働させることが可能です。

最終的にはデータソースの量や精度、そのデータを使って何をするかというアイデアが一番重要になるので、Dify の導入自体は単なるスタートラインなんですが、既存の Web ページの内容をデータソースとして使いたい場合には、今回紹介した Dify はかなり便利なので、試してみてもよいと思います。

関連エントリー

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?