Difyをご存知だろうか。生成AIのChatBotを作る際に誰しもが通るRAGという仕組みを簡単に実装することができるノーコードツールである。
今回は自分が実際にDifyで作ったWebアプリケーションで回答の精度が悪い時に試したことを列挙する。
DifyでRAGを実装する人や、生成AIのアプリケーションを実装する人の参考になれば幸い。
そもそもRAGって何?

生成AIのモデルはデフォルトだと、知識に制限がある。
例えば、よほどの有名人ではない限り、AIに自分の名前を打ち込んでも、自分自身のことは返してくれない。
このような場合、あらかじめたくさんの資料をデータベース上に用意しておき、回答に必要な情報を取り出し、その情報をもとに答えを作り出す仕組みが「RAG(Retrieval Augmented Generation)」と言われている。
厳密な言い方じゃないんだけど、AIの知識を自由にカスタマイズできる仕組みと考えてほしい。
RAGを簡単に実装できることがDifyの強み

生成AIのアプリを簡単に作ることができるDify。
触ってみて一番感動したのはRAGの回答精度の良さと実装の簡単さ。
自分でコードを組んで、RAGができるChatBotを作ろうとしたことがあったんだけど、正直精度は使えるものじゃなかった。それが瞬時にできてしまうのは本当に感動する。
Difyの強みは他にも色々あるんだけど、最初に感動したのはこのRAG精度の高さだった。
社内文書をもとに回答を生成する問い合わせ窓口を作ってみた
自分は非エンジニアなんだけど、Difyを使って社内の文書やマニュアルを参照してユーザーの質問に答えるChatBotを作ってみた。
できることを具体的に紹介すると、
- 賞与の計算方法を知ることができる
- 社員の連絡先を確認することができる(社用のメールアドレスと電話番号)
- 各種申請のやり方を確認することができる
他にも色々できるんだけど、こんなことができるものを作っている。
回答精度が安定しない時には。。。
上記のアプリを作っている時に、特定の質問で回答が安定しないことが多々あった。
今回はその時に自分が採用した方針を紹介する。
基本方針①|破産するからモデルの変更は検討しない
元も子もない話なんだけど、言語モデルを上位のものに変更すれば回答の精度は上がるし、文章も融通がきくことが多い。
ただ、モデルを上位のものに変えようとするとお金がいくらあっても足りない。

よって知識として入れるデータの綺麗さを整えることを第一に考えて改善をすることをおすすめする。
基本方針②|チャンクの切り方を変更する
DifyのRAGの仕組みなんだけど、入力した文書を小さなまとまり(チャンク)に分けて理解する。
ユーザーの質問を読んで、関係ありそうなチャンクをいくつか引っ張ってきて、その文章を読んで回答を出す。
回答の精度が安定しない場合はチャンクの切り方があまり良くない場合がほとんど。逆にここを治すことによって回答の精度は格段に上がる。
モデルの変更を予算の関係で避ける以上は、AIが読みやすいチャンクの切り方をする必要がある。
チャンクの切り方のコツ
並列の関係のものは分けない
例えば以下の文章。
<野球のルール説明>
◯攻撃時
・バッターがボールを打つ
◯守備時
・投手や内野手がボールを捕ってアウトを取る
この文章を攻撃時と守備時でチャンク分けするとどうなるか。 「野球のルール」の中の解説であることの並列関係がなくなり、回答の精度がブレる。
他にも条件分岐のような場合など、並列の関係で記述されている文章は基本的にチャンクわけしない方針にする。
意味的なまとまりでチャンクを切る
例えば以下の文章。
ケーキを作るときは、まず卵や砂糖、バターなどの材料を混ぜ、次にオーブンで焼きます。
この文章をひとまとめにしないと、卵や砂糖がケーキの材料であることや、なんでオーブンで焼いたのかがわからなくなり、結果適切にチャンクが呼び出されないことが多い。
よって、意味ごとにひとまとまりのチャンクとして格納しておくことがおすすめ。
検索結果が複数になりそうなものは一つのチャンクにまとめる
これは名簿とかでよくある。

例えば佐藤さんがたくさんいる時。「佐藤さん」の塊で一つのチャンクを作っておくと、回答の精度が上がる。
そうしないと、「佐藤さんに連絡したい」などのクエリが発生した時に、どの佐藤さんにアクセスすればいいのかがわからなくなる。
よって一つのチャンクに同姓のデータはまとめておくことがおすすめ。
まとめ
今回はDifyでRAG機能を実装する際に回答の精度を安定させるための方法を解説した。
Difyを使うと簡単に生成AIのChatBotを作ることができる。
プロトタイプの作成にも使えるのでぜひトライしてみてほしい。