以前、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.example
を docker/.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 つを設定しました。
多くの方は ChatGPT とか Google の Gemini などを利用されると思いますし、その辺はお好みで問題ないのですが、Cohere については後で Rerank API を使用したいので、もしまだ持っていない場合は、アカウントを作成して API キーを取得し、設定しておきましょう。
この設定まで完了すれば、チャットボット作ったり、色々とできますので、ナレッジを使用しないのであれば、あとは使ってみるだけです。
ナレッジに Web ページからデータを登録する
まず、Firecrawl のアカウントを作成して、API キーを取得しておきましょう。とりあえずは無料のプランで問題ないと思います。
次に、Dify の上部メニューから 「ナレッジ」 を選択し、「ナレッジの作成」 画面に進みます。データソースとして 「ウェブサイトから同期」 を選択すると、下記のようにまずは Firecrawl の設定をしろと言われると思いますので、「Configure」 を押して、先ほど取得した API キーを設定していきましょう。
「Website」 の方を選択して進みます。
表示された画面で Firecrawl の API キーを入力しましょう。入力が終わったら保存して、設定ダイアログを閉じます。
Firecrawl の設定が終わると、下記のように URL を指定可能になります。
オプションで、サブページも読み込む設定がデフォルトで有効になっていると思います。この場合は設定内容に応じて指定した URL を起点に、どういう風にページを読み込むかが決まります。
「Limit」 の設定は、最大で何ページ読み込むかなので、例えば何かの一覧ページを URL として指定して、そこからリンクされたページを読み込みたい場合は、その数に応じて変更します。ただし、Firecrawl の無料プランでは、最大 500 ページまでしか利用できませんので注意。
「Max depth」 は、読み込む階層の深さです。「除外するパス」「含めるパス」 の設定と合わせて、うまく設定してあげると、希望通りの結果になると思います。
Web ページの読み込みがうまくいくと、次に取得したデータをどのように処理するかを選択する画面になります (下記参照)。
慣れてきたら色々とカスタム設定などを試してみるとよいと思いますが、まずは初期設定のまま進めてみましょう。
「検索設定」 内の 「再ランクモデル」 を有効にすると、Cohere の設定が完了していれば、Rerank モデルが選択できると思います。日本語のデータソースの場合は、多言語に対応した rerank-multilingual-v3.0
を選択しておけばよいでしょう。もしデータソースが英語の場合は rerank-english-v3.0
でよいと思います。
「保存して処理」 を押すことで、データソースの設定が完了します。終わったら 「ドキュメントへ移動」 し、右側のメニューから 「検索テスト」 を選択して、適当なキーワードでテストしてみましょう。データソース内から関連する箇所が抽出されることが確認できると思います。
下記は、試しに自分の会社のニュース・コラムで書いた記事から最新 10 件だけデータソースに取り込んで、そこに含まれていそうなキーワードで検索テストした結果ですが、しっかりと、該当する箇所 (チャンク) が抽出されていることがわかります。
あとは、「スタジオ」 に移動し、このデータソースを使用して、チャットボットを作ったり、ワークフロー機能を使って何か処理をさせたり、みたいなことを用途に応じてやってあげれば、自分だけのデータソースを用いた、AI アプリケーションを稼働させることが可能です。
最終的にはデータソースの量や精度、そのデータを使って何をするかというアイデアが一番重要になるので、Dify の導入自体は単なるスタートラインなんですが、既存の Web ページの内容をデータソースとして使いたい場合には、今回紹介した Dify はかなり便利なので、試してみてもよいと思います。