0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[dify] Ver1.9 新機能「インテリジェントQ&A生成」をオンプレで構築、RAG回答精度向上を狙う

Last updated at Posted at 2025-11-05

RAGの応答精度向上を目的に、ナレッジ文書と併せて当該文書に基づく想定Q&Aをベクトルデータベースへ格納することで、LLMの応答精度向上が見込まれます。

これを踏まえ、Dify 1.9 の新機能「インテリジェントQ&A生成」を用い、Q&A形式ではないドキュメントから自動でQ&A形式のファイルを生成できる旨のガイド記載を受け、オンプレミス環境で検証を実施しました。

結論としては、なかなか使い物になりそうです。
今後は RAG登録前の前処理として適用し、適用有無のA/B比較により LLM回答精度の向上効果を継続検証していこうと思います。

1)前提条件

Ubuntuにオンプレ版のdifyがdocker(コンテナ)でインストールされていること。
docker実行例(実行例環境の場合、OpenWebUI、Ollama、doclingも動作中)

$ docker ps
CONTAINER ID   IMAGE                                                COMMAND                   CREATED        STATUS                  PORTS                                                                          NAMES
19198cf7e1b   ghcr.io/open-webui/open-webui:v0.6.33                "bash start.sh"           32 hours ago   Up 22 hours (healthy)   0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp                                    open-webui
e33c52c4919   ghcr.io/docling-project/docling-serve-cu128:latest   "container-entrypoin…"   32 hours ago   Up 22 hours (healthy)   0.0.0.0:5001->5001/tcp, [::]:5001->5001/tcp, 8080/tcp                          docling
68ac5a5907b   ollama/ollama:0.12.4                                 "/bin/ollama serve"       32 hours ago   Up 22 hours             0.0.0.0:11434->11434/tcp, [::]:11434->11434/tcp                                ollama
34ffc5b269d   langgenius/dify-plugin-daemon:0.3.0-local            "/bin/bash -c /app/e…"   2 weeks ago    Up 22 hours (healthy)   0.0.0.0:5003->5003/tcp, [::]:5003->5003/tcp                                    docker-plugin_daemon-1
039f6582ca4   langgenius/dify-api:1.9.1                            "/bin/bash /entrypoi…"   2 weeks ago    Up 22 hours             5001/tcp                                                                       docker-api-1
8815c5b1663   langgenius/dify-api:1.9.1                            "/bin/bash /entrypoi…"   2 weeks ago    Up 22 hours             5001/tcp                                                                       docker-worker-1
9cdd65785cf   langgenius/dify-api:1.9.1                            "/bin/bash /entrypoi…"   2 weeks ago    Up 22 hours             5001/tcp                                                                       docker-worker_beat-1
be6b36e835f   nginx:latest                                         "sh -c 'cp /docker-e…"   2 weeks ago    Up 22 hours             0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp   docker-nginx-1
14070d38890   langgenius/dify-sandbox:0.2.12                       "/main"                   2 weeks ago    Up 22 hours (healthy)                                                                                  docker-sandbox-1
e644a61e49b   langgenius/dify-web:1.9.1                            "/bin/sh ./entrypoin…"   2 weeks ago    Up 22 hours             3000/tcp                                                                       docker-web-1
a8aae196c0d   semitechnologies/weaviate:1.19.0                     "/bin/weaviate --hos…"   2 weeks ago    Up 22 hours                                                                                            docker-weaviate-1
2a2e5b137a3   ubuntu/squid:latest                                  "sh -c 'cp /docker-e…"   2 weeks ago    Up 22 hours             3128/tcp                                                                       docker-ssrf_proxy-1
63cc14469af   postgres:15-alpine                                   "docker-entrypoint.s…"   2 weeks ago    Up 22 hours (healthy)   5432/tcp                                                                       docker-db-1
f893a89ddbb   redis:6-alpine                                       "docker-entrypoint.s…"   2 weeks ago    Up 22 hours (healthy)   6379/tcp                                                                       docker-redis-1

2)Dify“拡張実行エンジン” plugin-daemonの構築

difyのUiで「インテリジェントQ&A生成」プラグインを
インストールしようとしたらエラーとなったため
調べるとplugin-daemonが必要ということなので設定することに。

2-1)plugin-daemonカスタム Docker イメージの作成

素のplugin-daemonコンテナを動作させたところ、cairoが無いぞとエラーが出たのでcairoをコンテナに追加。

20251109追記
cairoとは:きれいな2D画像を描くためのエンジン(C言語)
今回のファイル取り込み動作ではCairo のような描画系ネイティブ依存は基本不要のようです。今回は設定してしまったので将来的にpdf出力処理時に活躍を期待したい。通常は素のplugin-daemonコンテナで問題無いようです。

必要パッケージを(cairo 系など)を入れた plugin-daemon カスタム Docker イメージを作成する。
※「Dockerfile.plugin-daemon-cairo」ファイルはどのdirに作成してもOK。ただし、ファイルを作成したdir直下でビルドコマンドを実行すること。

mkdir ~/projects/dify-plugin-daemon
cd ~/projects/dify-plugin-daemon
pwd
ls -l
vi Dockerfile.plugin-daemon-cairo

以下内容で「Dockerfile.plugin-daemon-cairo」ファイルを作成

FROM langgenius/dify-plugin-daemon:0.3.0-local
USER root
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      build-essential pkg-config libcairo2 libcairo2-dev libpango1.0-dev \
      libjpeg-dev zlib1g-dev libfreetype6-dev libffi-dev cmake && \
    rm -rf /var/lib/apt/lists/*

2-2) ビルドしてローカルに“自前Dockerイメージ”を作成

※Dockerfile を置いたディレクトリで実行。

cd ~/projects/dify-plugin-daemon
pwd
ls -l
docker build -t my/dify-plugin-daemon:cairo -f Dockerfile.plugin-daemon-cairo .

2-3) plugin-daemon起動用docker-compose.yml作成

cd ~/projects/dify-plugin-daemon
pwd
ls -l
vi docker-compose.yml

以下内容で「docker-compose.yml」ファイルを作成
※通常は「image: langgenius/dify-plugin-daemon:latest 」と記述することろ
今回は“自前Dockerイメージ”で起動するため「my/dify-plugin-daemon:cairo」と変更して作成
20251108変更:networkにapp-net追加。NO_PROXY設定追加。

networks:
  docker_default:
    external: true
  app-net:
    external: true

services:
  plugin_daemon:
    image: my/dify-plugin-daemon:cairo
    container_name: docker-plugin_daemon-1   # 衝突するなら外す or 別名に
    restart: unless-stopped
    environment:
      # ── 必須 ─────────────────────────────────────────────
      SERVER_PORT: 5002
      SERVER_KEY: # <Difyの .env の PLUGIN_DAEMON_KEY と同じ値>
      DIFY_INNER_API_URL: http://api:5001
      DIFY_INNER_API_KEY: # <Difyの .env の PLUGIN_DIFY_INNER_API_KEY と同じ値>

      # PANIC対策(必須)
      PLUGIN_REMOTE_INSTALLING_HOST: "plugin_daemon"
      PLUGIN_REMOTE_INSTALLING_PORT: "5003"

      # ── DB 接続(plugin用DB。公式既定は dify_plugin)──
      DB_HOST: db
      DB_PORT: "5432"
      DB_USERNAME: postgres
      DB_PASSWORD: # あなたの本体composeの既定に合わせる
      DB_DATABASE: dify_plugin

      # ── 推奨(動作/耐久性)────────────────────────────
      PLUGIN_STORAGE_TYPE: local
      PLUGIN_STORAGE_LOCAL_ROOT: /app/storage
      PLUGIN_WORKING_PATH: /app/storage/cwd
      PLUGIN_MEDIA_CACHE_PATH: assets
      PLUGIN_INSTALLED_PATH: plugin
      PYTHON_ENV_INIT_TIMEOUT: "300"
      PIP_MIRROR_URL: ""            # 社内Apt/PyPIが不要なら空でOK

      # Dify本体のredisに合わせる docker compose config | grep -nE 'REDIS_PASSWORD|CELERY_BROKER_URL|redis-server --requirepass'
      REDIS_HOST: "redis"
      REDIS_PORT: "6379"
      REDIS_USERNAME: ""              # 使っていなければ空でOK
      REDIS_PASSWORD: ""         # Dify本体と同じパスワード
      REDIS_DB: "0"                   # 0でOK(Celeryは/1だがdaemonは/0で十分)
      REDIS_USE_SSL: "false"
      # ── プロキシ干渉回避(内部名解決をプロキシに出さない) ──
      NO_PROXY: "localhost,127.0.0.1,api,db,redis,ollama,docling,plugin_daemon,.local"
      no_proxy: "localhost,127.0.0.1,api,db,redis,ollama,docling,plugin_daemon,.local"

    volumes:
      - /docker_data/dify-plugin-daemon/storage:/app/storage

    ports:
      - "5003:5003"     # デバッグ用UI/リモートインストールのホスト公開
      # ※5002は同一ネット越しで api→plugin_daemon がアクセスするので公開不要

    networks:
      - docker_default
      - app-net

2-4) plugin_daemon 起動

その Docker イメージで plugin_daemon を起動する。

docker compose up -d plugin_daemon

2-5)動作確認

a) 起動確認

docker ps -a に docker-plugin_daemon-1 が見えるか?

b) ヘルスチェック1

curl -i http://localhost:5003/health/check が 200 か?

c) ヘルスチェック2

Dify の API コンテナから(内部ポート 5002 の疎通)

d) ログ監視

インストール直後ログに pycairo / cairo / pkg-config エラーが出ていないか?

# a)起動確認
docker ps -a |grep dify-plugin-daemon

# b)ヘルスチェック1(ホスト→コンテナ)
docker exec -it docker-plugin_daemon-1 curl -sS http://127.0.0.1:5002/health/check | jq .

# c)ヘルスチェック2
docker exec -it docker-api-1 curl -sS http://plugin_daemon:5002/health/check

# d)ログ監視
docker logs --tail=200 -f docker-plugin_daemon-1

2-6) [参考] うまくいかない場合の対応

キャッシュ掃除 → 再起動

docker exec -it docker-plugin_daemon-1 bash -lc '
  rm -rf /app/storage/assets /app/storage/cwd /app/storage/plugin /app/storage/plugin_packages || true
'
docker restart docker-plugin_daemon-1

3)必要プラグインのインストール

DifyのUIで Markdown Exporter(2.0.0)を Install

3-1)Dify初期画面⇒「ナレッジ」選択

3-2)「知識パイプラインから作成する」選択

image.png

3-3)「インテリジェントQ&A生成」選ぶ

image.png

3-4)Markdownエクスポーター「インストール」クリック

image.png

3-5)「閉じる」クリック

image.png

3-6)difyナレッジに「LLM Generated Q&A」が作成される

image.png

4)作成したナレッジベースの設定変更

4-1) 設定画面表示

ナレッジ→今回作成したナレッジ選択「LLM Generated Q&A」→設定選択
image.png

4-2) 埋め込みモデル、検索方法の変更

a)デフォルト設定の「Jina Embeddings」は有料API動作なので「埋め込みモデル」を事前にollamaでダウンロードしておいた「bge-m3」に変更。
※「emdeddinggemma」もollama経由で設定は可能ですが、現状difyとの相性が悪いようです。動作の安定性が低いと情報あり。

b) 「検索設定」を「ハイブリッド検索」に変更
image.png
image.png

5)動作テスト

5-1) 実行手順

a) 編集&実行画面の表示

ナレッジ→今回作成したナレッジ選択「LLM Generated Q&A」→「パイプライン」選択
image.png

b) 取込ファイル選択

テストラン押下→データソース→「file」選択→ファイルまたはフォルダをドラッグアンドドロップする→「参照」押下→取り込みたいファイルを選択→取り込みたいファイルが画面内に表示

c) 実行

次へ押下→プロセス押下→処理中となる→テストラン結果が表示
image.png

d) エラーが出た場合

テストラン結果画面→実行追跡を押下→各処理が緑色レになっていればOK。エラーが出た場合をその箇所を確認する。
image.png

5-2) 今回の取り込みファイル例

購入製品オーダー表 (pdfファイル)
image.png

5-3) 今回の取り込み結果例

製品のオーダー表なのでいつ注文したかなどの質問をLLMが自動作成し、登録したpdfを元にその回答作成してくれている。結構使えるかも!

Chunk-01 32 文字
Q What is the order date?
A 2024年1月3日

Chunk-02 31 文字
Q What is the order number?
A 00357825

Chunk-03 25 文字
Q Who is the customer?
A 山田太郎様

Chunk-04 70 文字
Q What is the shipping address?
A 東京都千代田区大手町●● 山田太郎様

Chunk-05 37 文字
Q What is the member ID?
A 936854265635

Chunk-06 37 文字
Q What payment method was used?
A クレジットカード

検索試験

Q:申し込み日は?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?