はじめに
今回は練習がてらDifyでCRAGのフローを組んでみました。
CRAGのフローをLangChainブログの簡略化版ではなく、論文で提示されている版を組むとなかなか大変です。
みなさんも一度これを読んでCRAGの構築実践してみましょう!
これができたらDify中級者なんじゃないでしょうか?
では始めます。
CRAGとは
(Referenced by https://arxiv.org/pdf/2401.15884.pdf)
プロセスとしては、
-
持っているドキュメントに検索しに行く
-
検索したドキュメントから取得した内容が、関連しているか、してないかを判定する。
-
知識をより洗練する。
- 取得した内容が関連していない → 文脈を補足するためにウェブベースの文書検索を実行する。そのために質問をWeb検索用に最適化+Webで検索して知識を補強!
- 取得した内容が関連している → 取得してきたドキュメントを分割して、各分割に対して評価して無関係なものは除去!
- 取得した内容が関連してるか微妙 → 知識の洗練とWebでの情報取得の両方を行う。
-
回答を生成する。
- 取得した内容が関連していない → 質問+Webで検索して知識で回答を生成
- 取得した内容が関連している → 質問+洗練した知識で回答を生成
- 取得した内容が関連してるか微妙 → 質問+Webで検索して知識+洗練した知識で回答を生成
簡単にいうと、
RAGに指定した文書に関連する内容があったら、知識を洗練する!なかったらWeb検索しに行けばいいんやん、関連してるかわからんやったらどっちもやろ!
ってことです。
具体的には以下のブログを見てみてください。︎(私が書いた記事で恐縮です。)
https://zenn.dev/yamada_quantum/articles/ab41b431581eba
全体像
ではDifyで構築するとの全体像は以下です。
上記に記載したCRAGの図のようなknowledge refineはDifyで現状難しそうなのでLLMにRefineさせるようにしています。
では各モジュールを見ていきましょう。
知識の取得から分類まで
知識取得してから、質問分類できるように文字列にします。
そして検索がいい感じかをCorrect, Incorrect, Ambiguousの3つに分類します。
Correctの場合
Incorrectの場合
Ambiguousの場合
ここまでできたら終了です。
プロンプト
では実際に使用しているプロンプトを記載します。
KnowledgeRefineのプロンプト
Please organize your information so that you can properly answer the questions.
{{#context#}}
質問変換のプロンプト
You are generating questions that is well optimized for retrieval. \n
Look at the input and try to reason about the underlying sematic intent / meaning. \n
Here is the initial question:
\n ------- \n
{{#sys.query#}}
\n ------- \n
Formulate an improved question:
回答生成のプロンプト
Please answer the following questions according to the instructions on the following information.
{{#context#}}
Question: {{#sys.query#}}
Ambiguousの場合はコンテキストにtavilyの出力も入れておきましょう。
最後に
CRAGのDifyでの構築はいかがでしたでしょうか?
今回は少し長めのフロー組んでみました。みなさんのDifyの練習になれば嬉しいです。
Xやってるので気になる方はフォローお願いします。
https://x.com/hudebakonosoto