🔍
概念 #Dify #RAG #チャンキング #ベクトル検索 #精度改善 #ナレッジベース #実践 📚 Dify実践ガイド

DifyのRAG精度チューニングガイド

チャンキング戦略・埋め込みモデル選定・ハイブリッド検索・リランキング・メタデータフィルタリングまで、Difyのナレッジ検索精度を上げる実践テクニック。

RAG 精度が低いときの典型的な原因

RAG が「使えない」と感じる原因のほぼすべては以下に集約される:

① チャンキングが文書の構造を無視している
  → 条文・段落・Q&A がブツ切りになり、文脈が失われる

② 検索にヒットしているが、正しいチャンクが上位に来ない
  → 埋め込みモデルやリランキングの問題

③ 正しい情報がナレッジにあるのに検索されない
  → ユーザーの語彙とドキュメントの語彙が違う(語彙ギャップ)

④ 無関係な情報が検索にヒットする
  → Top K が多すぎる、類似度閾値がゆるすぎる

チャンキング戦略: 文書種別ごとに最適化する

チャンキングモードの選択

Dify が提供するチャンキングモード:

Automatic(自動):
  デフォルト設定で動くが精度は最低限。
  プロトタイプ確認用と割り切る。

Custom(カスタム):
  チャンクサイズ・オーバーラップ・区切り文字を指定。
  本番運用ではこちらを使う。

Q&A(Q&Aモード):
  LLM が文書からQ&Aペアを自動生成してインデックス化。
  FAQや手続き案内に最適。精度が高い。

文書種別ごとの推奨設定

FAQ・手続き案内文書:
  モード: Q&A
  理由: 質問→回答のペアとして検索されるため意味的に一致しやすい

契約書・法律文書:
  モード: カスタム
  チャンクサイズ: 条文単位(200〜400トークン)
  区切り文字: 「第○条」「■」等の条番号パターン
  オーバーラップ: 50〜100トークン(前後の条文文脈を保持)

技術マニュアル・手順書:
  モード: カスタム
  チャンクサイズ: 500〜800トークン
  区切り文字: 見出し(##・■・1.)
  オーバーラップ: 100トークン

製品カタログ・商品説明:
  モード: カスタム
  チャンクサイズ: 1商品 = 1チャンク
  区切り文字: 商品区切り記号
  メタデータ: 商品カテゴリ・価格帯を付与

長文レポート・論文:
  モード: カスタム
  チャンクサイズ: 1,000〜1,500トークン(大きめ)
  区切り文字: 章・節の見出し
  Parent-Child チャンキングを検討(後述)

Parent-Child チャンキング(高精度テクニック)

問題:
  大きなチャンクは文脈が豊富だが、検索ヒット精度が下がる
  小さなチャンクは検索には強いが、文脈が不足する

解決策: Parent-Child チャンキング

  Parent チャンク(大): 1,000トークン → LLM に渡すコンテキスト用
  Child チャンク(小):   200トークン → ベクトル検索用のインデックス

  処理フロー:
    1. Child チャンクでベクトル検索してヒット
    2. ヒットした Child の Parent チャンクを取得
    3. Parent(文脈の豊富な大チャンク)を LLM に渡す

Dify での実装:
  Knowledge Retrieval ノードの設定で
  「Parent-child retrieval」を有効にする

埋め込みモデルの選定

埋め込みモデルが検索精度に大きく影響する。

推奨モデル(日本語コンテンツの場合):

text-embedding-3-large(OpenAI):
  精度: ★★★★★(最高水準)
  コスト: ★★★☆☆(中程度)
  1M トークンあたり $0.13
  → 精度最優先の本番環境に最適

text-embedding-3-small(OpenAI):
  精度: ★★★★☆
  コスト: ★★★★★(最安)
  1M トークンあたり $0.02
  → コスト重視の場合の標準選択肢

multilingual-e5-large(ローカル):
  精度: ★★★★☆
  コスト: 無料(Ollama でローカル実行)
  → セルフホスト + コスト無料が条件なら有力候補

注意:
  埋め込みモデルを後から変更すると
  ナレッジベース全体の再インデックスが必要になる。
  本番前にモデルを確定させること。

検索設定のチューニング

検索モードの選択

Dify の検索モード:

Vector Search(ベクトル検索):
  仕組み: 意味的な類似度でチャンクを検索する
  得意: 言い換え・同義語への対応
  苦手: 固有名詞・製品番号・コード等の完全一致

Full-text Search(全文検索):
  仕組み: キーワードの完全一致・部分一致で検索する
  得意: 製品番号・法令番号・人名の正確な一致
  苦手: 表現が違う同義語への対応

Hybrid Search(ハイブリッド):
  仕組み: ベクトル + 全文検索の両方を組み合わせる
  → RRF(Reciprocal Rank Fusion)で結果をマージ
  ほぼすべてのケースで最高精度を出す。本番は基本これ。

Top K と類似度閾値の調整

Top K(取得するチャンク数):

  K を大きくする(5〜10):
    → 答えが含まれるチャンクを取りこぼしにくくなる
    → LLM に渡すコンテキストが増えてコスト・レイテンシが上がる
    → 無関係な情報が混入するリスクが高まる

  K を小さくする(1〜3):
    → 精度の高いチャンクのみを使う
    → 回答できる質問の範囲が狭まる

  推奨設定:
    FAQ ボット(回答が1箇所に集中): K=3
    複数文書をまたいだ質問(規程集等): K=5〜8
    「わからない」と答えてほしいケースが多い: K=2 + 閾値を高く

類似度スコア閾値:

  0.5 以下: 緩すぎ(無関係な回答が混入する)
  0.6〜0.7: 標準的(バランスが取れる)
  0.8 以上: 厳しめ(精度は高いが回答できないケースが増える)

  チューニング手順:
    1. 類似度スコアのログを収集する(Dify のログ確認)
    2. 「正しい回答が得られた」ケースのスコア分布を確認
    3. 分布の下限付近に閾値を設定する

リランキングの活用

問題:
  ベクトル検索で上位に来たチャンクが
  実際の質問に対して最も関連性が高いとは限らない

解決策: Reranker モデルで再順位付けする

仕組み:
  1. ベクトル検索で K=20 のチャンクを取得
  2. Reranker が「質問 ↔ 各チャンク」のペアを精密に評価
  3. スコア順に並べ替え、上位3〜5件のみ LLM に渡す

使えるリランキングモデル:
  Cohere Rerank     → 最も手軽。Dify から設定するだけ
  BGE Reranker      → ローカル実行可能。日本語対応
  Jina Reranker     → 高精度。API 利用

Dify での設定:
  Knowledge Retrieval ノード
  → 「Rerank」セクションを有効にする
  → モデルプロバイダーで Cohere API キーを設定する

効果:
  リランキングを追加するだけで
  回答精度が 10〜20% 向上するケースがある

メタデータフィルタリング

問題:
  「2026年度版の規程」を聞いているのに
  「2024年度版の規程」が検索される

解決策:
  文書にメタデータを付与して、検索前にフィルタリングする

メタデータの設定:
  ファイル登録時に以下のメタデータを付与できる:
    - document_type: "規程集" / "マニュアル" / "FAQ"
    - fiscal_year: "2026"
    - department: "人事部" / "財務部"
    - last_updated: "2026-04-01"

Dify でのフィルタリング設定:
  Knowledge Retrieval ノードの
  「Metadata Filtering」で条件を設定する

  例:
    fiscal_year = {{current_year}}  ← 会話変数と組み合わせる
    document_type = "規程集"

活用例:
  複数年度の文書が混在するナレッジで
  「最新年度のみを検索対象にする」

RAG 精度の評価方法

精度指標:

Hit Rate(ヒット率):
  テストクエリ N 件のうち、正しいチャンクが
  Top K 以内に含まれた割合
  → 目標: 80% 以上

MRR(Mean Reciprocal Rank):
  正しいチャンクが何位に来たかの平均逆数ランク
  → MRR = 1.0: 常に1位で正解(理想)
  → MRR < 0.5: 精度要改善

評価の実施手順:
  1. 代表的な質問20〜50件と、正解チャンクのペアを作る
  2. Dify ログでヒットしたチャンク ID を確認
  3. 正解チャンクが Top K 以内に含まれているかを集計
  4. チャンキング設定・埋め込みモデルを変えて比較する

Dify の評価機能:
  アプリ設定 → 「アノテーション」機能で
  回答に対して 👍/👎 を記録できる
  → 改善前後での比較指標として活用

チューニングのロードマップ

Step 1: 文書のチャンキングを見直す(最もインパクトが大きい)
  → 文書種別ごとにチャンクサイズ・区切り文字を設定

Step 2: 検索モードをハイブリッドに変更する
  → ほぼすべてのケースでベクトル単体より精度向上

Step 3: Top K と類似度閾値を調整する
  → ログを見ながら実際のスコア分布に合わせる

Step 4: リランキングを追加する
  → Cohere Rerank が最も手軽。精度 10〜20% 向上が見込める

Step 5: メタデータフィルタリングを導入する
  → 複数バージョン・部署別の文書が混在する場合

Step 6: 埋め込みモデルをアップグレードする(最後に検討)
  → 再インデックスが必要なため、最後に実施

参考:関連ドキュメント

出典: Dify公式ドキュメント / RAGチューニングガイド