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)「知識パイプラインから作成する」選択
3-3)「インテリジェントQ&A生成」選ぶ
3-4)Markdownエクスポーター「インストール」クリック
3-5)「閉じる」クリック
3-6)difyナレッジに「LLM Generated Q&A」が作成される
4)作成したナレッジベースの設定変更
4-1) 設定画面表示
ナレッジ→今回作成したナレッジ選択「LLM Generated Q&A」→設定選択

4-2) 埋め込みモデル、検索方法の変更
a)デフォルト設定の「Jina Embeddings」は有料API動作なので「埋め込みモデル」を事前にollamaでダウンロードしておいた「bge-m3」に変更。
※「emdeddinggemma」もollama経由で設定は可能ですが、現状difyとの相性が悪いようです。動作の安定性が低いと情報あり。
5)動作テスト
5-1) 実行手順
a) 編集&実行画面の表示
ナレッジ→今回作成したナレッジ選択「LLM Generated Q&A」→「パイプライン」選択

b) 取込ファイル選択
テストラン押下→データソース→「file」選択→ファイルまたはフォルダをドラッグアンドドロップする→「参照」押下→取り込みたいファイルを選択→取り込みたいファイルが画面内に表示
c) 実行
d) エラーが出た場合
テストラン結果画面→実行追跡を押下→各処理が緑色レになっていればOK。エラーが出た場合をその箇所を確認する。

5-2) 今回の取り込みファイル例
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:申し込み日は?








