前回、Knowledgeのチャンクの作成方法について説明致しました。
【Dify】DifyのためのRAG構築 — Part1; AutomaticとCustomの検証次に、どのようにユーザーの質問に対して、どのチャンクをLLMに返すのか、について説明します。
Dify公式ガイドでは下記のように定義されています。
ベクトル検索:クエリ埋め込みを生成し、そのベクトル表現に最も類似したテキストセグメントを検索します。
全文検索:ドキュメント内のすべての語句をインデックスし、ユーザーが任意の語句をクエリし、それらの語句を含むテキストセグメントを返すことを可能にします。
ハイブリッド検索:全文検索とベクトル検索を同時に実行し、Rerankステップを追加して、2つの検索結果からユーザーの質問に最も適した結果を選択します。RerankモデルAPIの設定が必要です。
普通に考えて、ハイブリッド検索が一番良さそうですね。Recommendでもありますし。
1,ベクトル検索
ベクトル検索でピックアップされているチャンクはRerankのあり/なしで全て同じ。(取ってくるチャンク数を3個にしても同じチャンクを取ってきます)
Rerankなしだともともとのチャンクに付加されていたインデックスが返され、大体0.48-49の辺り、Rerankを行うと大きく異なる。しかも、順番も異なる。
2,全文検索
こちらも、Rerankのあり/なしで取ってくるチャンクに違いは生まれず。
全文検索だと、定義からチャンク単位でのインデックスに依存しない検索方法のため、Rerankなしだと、そのインデックスの数値が表示されない。(つまりチャンクとしての順番も存在しない)
Rerankすることで改めて順位付けがされる様子。
3,ハイブリッド検索
これは定義の通り、インデックス検索と全文検索それぞれに対してRerankを行い、その結果の数値が高いものが順番にピックアップされています。
結局、ハイブリッド検索でいいのではないか、ということになります笑
その他のパラメータとして『TopK』と『Score threshold』というのが存在します。
こちらは『何個のチャンクを返すか』という指定になります。
デフォルトは3個です。最大10個まで上げることができますが、そうなるとLLM側の処理ができなくなるため、(詳細はpart1を御覧ください)ほどほどが望ましいのだと思います。
おそらく3-5個程度が良いのだと思います。(こちらも後日LLMに渡した場合の検証結果を公開します。)
これは右上に出てくる数値と比較して、threshold以上のものを返す、という機能になります。
どれくらいが良いのかはもともとのデータや質問によるかと思いますが、上記の例の場合だと、『0.50』としてしまうと、『0.55』のチャンクの一つだけが返ってくることになります。
自分のデータを使いながら検証する必要があるかと思いますが、デフォルトではオフです。
あまりちゃんと理解していなかったRetrieval settingでしたが、色々と試してみると挙動がよくわかりました。
結論『ハイブリッド検索』『TopK = 3~5』くらいでいいのではないでしょうか?
参考になれば幸いです。
次回はこれらのチャンクを拾ってきた場合、LLMがどのように返答するかの検討です。
・チャンクの長さを変えるとどうなる?
・TopKを変えてチャンク数を変えるとどうなる?
ということを検証したいと思います。
これまでのDify記事の一覧に戻る場合はこちら
【Dify】Dify操作記事まとめ(随時更新)