見出し画像

DifyをつかったAI構築: RAG検索の精度向上テクニック

最近、テック業界で話題になっているDifyをご存知でしょうか?AIアプリケーション開発を簡素化するこのツールは、多くの開発者の注目を集めています。本記事では、Difyの概要と、AI技術の一つであるRAG(Retrieval-Augmented Generation)の精度を向上させるテクニックについて解説します。

(この記事はDifyについては聞いたことがある、少しは触っているという方を想定しています。)

Difyとは?

Difyは、AI機能を持つアプリケーションの開発を支援するオープンソースのプラットフォームです。複雑なAI技術の知識がなくても、直感的なインターフェースを通じてAIアプリを作成できることが特徴です。

主な特徴:

  • ノーコードでのAIアプリ開発

  • 複数のAIモデルに対応

  • RAG機能を手軽に導入できる

  • API呼び出しで外部ツールやデータベースと連携可能

RAGとはなにか?

RAG(Retrieval-Augmented Generation)は、大規模言語モデル(LLM)の出力を改善するために使用される技術です。

LLMの利用ではハルシネーションと呼ばれる問題、LLMが持っていない知識についてあたかも知っているように嘘をついてしまう問題に悩まされていました。そこで取り入れられたのがRAGで、LLMと検索システムが連携し、知っている知識を取り出して、それをもとに回答させることで回答精度が高まります。

Difyでも活用できるこの技術ですが、ユーザーの問いの文章からそのまま検索をすると、思うように回答を得られないことがありました。

セマンティック検索とはなにか?

セマンティック検索はRAGのコアにある技術です。従来のキーワードベースの検索方法を超えて、検索クエリの意味や意図を理解し、より関連性の高い結果を提供する検索技術です。

キーワード検索が単純に入力された単語や語句の一致を探すのに対して、セマンティック検索は検索クエリの意味や意図を理解します。

例えば、「スマートフォンの画面が突然真っ暗になった」と問われた時に、キーワード検索であれば、「画面が暗い時の対処法」「スマートフォンの画面が暗い原因」といったコンテンツが検索されるでしょう。

セマンティック検索であれば、「スマホの画面が反応しない場合の診断方法」や「画面の突然のトラブルの解決方法」といった直接単語は含まれていないが類似の意図を持った検索結果も表示されるはずです。

質問と回答をセットでRAGを構築すると精度が高まる

RAGに入っているデータのかたまりをチャンクといいますが、チャンクには質問と回答をセットにしておくと精度が高まるというテクニックがあります。

ユーザーは質問文の形式でRAGに問い合わせるので、回答だけの文章よりも質問文を入れた方が一致率が高まるためです。

ユーザーの質問があいまいすぎると検索精度は下がる

チャットのやり取りの中で、ユーザーの入力をそのまま検索に使用すると、十分な精度が得られないことがあります。というのは、ユーザーはチャットの文脈の中で単語を省略してしまうことがあるからです。

例えば、
ユーザー「友達の誕生日プレゼントに、おすすめの服を提案して」
AI「XXXというブランドのワンピースはいかがでしょうか?夏に爽やかなカラーですよ」
ユーザー「いいね。それの購入方法は?」
AI「一般的に商品を購入する場合、店舗に行くか…」

といったように、それやあれなどと文脈を示した場合に、最新のユーザーの問いだけでは、情報が足りずに精度の高い検索ができない問題があります。

回答精度をあげるアイディア。質問文を生成して具体化する

この問題を解決するために、ユーザーの質問を一度具体的に精密化するプロセスを導入すると効果的でした。

セマンティック検索のクエリに、ユーザーの質問をそのまま与えるのではなく、LLMで文脈をもとにクエリを再生成するのです。

例)
ユーザー「友達の誕生日プレゼントに、おすすめの服を提案して」
AI「XXXというブランドのワンピースはいかがでしょうか?夏に爽やかなカラーですよ」
ユーザー「いいね。それの購入方法は?」

ここからLLMが生成する検索クエリの例
「XXXというブランドのワンピースの購入方法を教えてください」

このプロセスにより、より関連性の高い情報を検索でき、ユーザーの意図に沿った回答が得られやすくなります。

実装例

Difyを使用してRAGを実装する具体例を見てみましょう。

もっともシンプルな構成は以下のようになります。

まずは過去の会話履歴を振り返ることができるように、「質問を精緻化」ブロックのメモリ機能を有効にします。そして、USERのプロンプトにsys.queryでこれまでの会話データを渡します。

プロンプトの内容は以下のようなイメージです。

あとはRAG検索と回答生成は通常どおり行ってください。

まとめ

ユーザーの問いをLLMで具体化する、というテクニックはいろいろと使えそうだなと思いました。

LLMの生成したクエリ文章が正しくユーザーの意図をくみとれている保証はないので、そこはユーザーの入力とLLMの生成したクエリ、キーワード検索などを複合的に組み合わせて、リランクと呼ばれる再評価をすると良さそうですが、そのあたりはDifyでは難しそうなのでおいおい試してみたいと思います。

Difyをつかってどんなアプリを作ろうかワクワクしますね!テクニックを見つけたらまた投稿していきます。

いいなと思ったら応援しよう!