はじめに
今回はMultiQueryRetrieverを作成してみました。
LangChainのドキュメントに実装が記載されています。ここが出典なのかは正直わからないです。
https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/MultiQueryRetriever/
ではまずMultiQueryRetrieverとは何かから解説していきます。
MultiQueryRetrieverとは?
MultiQueryRetriever結構便利なんですよね。
普通のベクトル検索だとクエリの表現が少しでも変わったり、埋め込みがデータの意味をうまく捉えていなかったりすると、検索結果がガラッと変わってしまうんですよね。
これを手動で何とかしようとすると、プロンプトエンジニアリングやチューニングなんて面倒な作業が待っています。
MultiQueryRetrieverはユーザ入力クエリに対して色々な角度からクエリを再度生成し、各クエリに対して関連ドキュメントを取得し、それらを組み合わせることで、より幅広く関連する可能性のあるドキュメントを見つけ出すことができます。
簡単にプロンプトチューニングを自動化してくれるみたいなもんですね。
流れでいうと
- 質問からLLMに別視点の質問を生成させる
- 各質問からベクトル検索でコンテキストを取得する
- 元質問と、各質問のベクトル検索で得られたコンテキストを用いてLLMに回答させる
質問から生成した質問の例
イメージがつきやすいように質問から生成した質問の例を一つ載せておきます。
- 質問:ファインチューニングとは?
- 生成された質問:
- 事前学習済みモデルのファインチューニングとは?
- ファインチューニングの手順と注意点
- 転移学習におけるファインチューニングの役割
- ファインチューニングとスクラッチ学習の違い
- ファインチューニングの成功事例と応用分野
全体像
では早速Difyで構築していきましょうか。
全体像はこんな感じです。
生成した質問をIterationを回してベクトル検索しています。
並列にベクトル検索できないのが残念ですね。
では個々のノードを解説していきます。
質問生成ノード
質問生成ノードでは質問から別視点の質問を生成します。
プロンプトはLangChainのドキュメントで使われているプロンプトを使用します。
プロンプト
You are an AI language model assistant.
Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database.
By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search.
Provide these alternative questions separated by newlines.
Original question: {{#sys.query#}}
質問抽出ノード
質問生成ノードから改行区切りで質問が渡されるので質問を抽出しましょう。
今回はLLMで実行していますが、コードを使用した方が確実です。
知識取得 & 集約ノード
生成した質問はIterationを回してベクトル検索します。
生成が終わったら結果を全てまとめておきましょう。
回答ノード
元質問と、各質問のベクトル検索で得られたコンテキストを用いてLLMに回答させる。
出力はみなさん試してみてください!結構いい感じに回答されます。
最後に
Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto