LoginSignup
0
0

はじめに

今回はMultiQueryRetrieverを作成してみました。
LangChainのドキュメントに実装が記載されています。ここが出典なのかは正直わからないです。
https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/MultiQueryRetriever/

ではまずMultiQueryRetrieverとは何かから解説していきます。

MultiQueryRetrieverとは?

MultiQueryRetriever結構便利なんですよね。
普通のベクトル検索だとクエリの表現が少しでも変わったり、埋め込みがデータの意味をうまく捉えていなかったりすると、検索結果がガラッと変わってしまうんですよね。
これを手動で何とかしようとすると、プロンプトエンジニアリングやチューニングなんて面倒な作業が待っています。

MultiQueryRetrieverはユーザ入力クエリに対して色々な角度からクエリを再度生成し、各クエリに対して関連ドキュメントを取得し、それらを組み合わせることで、より幅広く関連する可能性のあるドキュメントを見つけ出すことができます。
簡単にプロンプトチューニングを自動化してくれるみたいなもんですね。

流れでいうと

  1. 質問からLLMに別視点の質問を生成させる
  2. 各質問からベクトル検索でコンテキストを取得する
  3. 元質問と、各質問のベクトル検索で得られたコンテキストを用いてLLMに回答させる

これらをイメージ図に落とすと以下のような感じになります。
image.png

質問から生成した質問の例

イメージがつきやすいように質問から生成した質問の例を一つ載せておきます。

  • 質問:ファインチューニングとは?
  • 生成された質問:
    • 事前学習済みモデルのファインチューニングとは?
    • ファインチューニングの手順と注意点
    • 転移学習におけるファインチューニングの役割
    • ファインチューニングとスクラッチ学習の違い
    • ファインチューニングの成功事例と応用分野

全体像

では早速Difyで構築していきましょうか。
全体像はこんな感じです。
生成した質問をIterationを回してベクトル検索しています。
並列にベクトル検索できないのが残念ですね。
image.png

では個々のノードを解説していきます。

質問生成ノード

質問生成ノードでは質問から別視点の質問を生成します。
プロンプトは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#}}

image.png

質問抽出ノード

質問生成ノードから改行区切りで質問が渡されるので質問を抽出しましょう。
今回はLLMで実行していますが、コードを使用した方が確実です。
image.png

知識取得 & 集約ノード

生成した質問はIterationを回してベクトル検索します。
生成が終わったら結果を全てまとめておきましょう。
image.png

回答ノード

元質問と、各質問のベクトル検索で得られたコンテキストを用いてLLMに回答させる。
image.png

出力はみなさん試してみてください!結構いい感じに回答されます。

最後に

Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto

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