Difyで作成したRAGにて複数LLMで生成した回答結果を比較してみる

# はじめに
RAGなどLLMを活用したアプリケーションを作成する際には、どのモデルを利用するのが良いか比較するケースがあると考えられる
Difyでは比較的簡単に複数のモデルの回答を比較できそうなので、その実装方法を検討した
今回はRAG構築する中で複数のモデルの回答を得られるアプリを実装した

# チャット実行時にモデルを選択するタイプ
## モデル選択式ワークフローの作成
`スタジオ` -> `テンプレートから作成`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/820d4ae5-0a60-2185-62b3-983a525ce4f9.png)

`Knowledge Retrieval + Chatbot`の`このテンプレートを使用する`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/b05b81f2-0fa0-8aa0-2c92-19d4aac11d1b.png)

`名前`と`説明`を入力の上`作成`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c28e7e7f-3e38-afe7-0e9d-e6894c94072a.png)

最終的に作成したワークフローは以下となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/59c1d5aa-74eb-bc98-953b-8e4c36e91489.png)


ポイントは以下
- `Start`に使用するモデルを選択するパラメータを追加
- `LLM`ブロックを複数作成してそれぞれ使用するモデルを設定
- `IF/ELSE`ブロックにて選択したモデルを選択するパラメータに応じた`LLM`ブロックを紐づける
- 複数の`LLM`ブロックが出力した結果を`変数集約器`でまとめる
- `ANSWER`ブロックで回答結果が分かりやすいように編集

## モデル選択パラメータの追加
`Start`を選択して`入力フィールド`右の`+`をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/09b276bb-0960-4889-386d-89759947d5ef.png)

`フィールドタイプ`は`選択`を選んだうえで、`変数名`,`ラベル名`では任意の値を設定し、`オプションを追加`ボタンを押して選択可能なモデル名のリストを追加して`保存`ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/52ae133c-4c5c-cbad-3d02-fb7325a3ad4c.png)

## 複数LLMの追加
テンプレートとして追加されている`LLM`の名前を任意に修正し、`モデル`で使用したいモデルを選択する
`コンテキスト`は`KNOWLEDGE RETRIEVAL_result`を選択する
`SYSTEM`にはプロンプトを入力しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/3896456c-4d7e-4544-c710-087db93b0eb9.png)

`LLM`ブロックの右上の`...`をクリックし、`コピー`を選択すると同じ設定のLLMブロックがコピーされる
スタジオパネル内で右クリックし`ここに貼り付け`を選択するとコピーされたLLMブロックが貼り付けられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9b866a75-25c3-b1ec-379e-ad6b9c95821c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/64b2308f-5c10-08e4-8568-2d38114f87e7.png)

貼り付けた`LLM`ブロックを選択したうえで、`モデル`を他に使用したいモデルへ変更して複数の`LLM`ブロックを作成できる

## IF/ELSEロジックの追加
`ブロックを追加`ボタンから`IF/ELSE`を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/462e18e9-ba15-094e-a62a-184abe603397.png)

`Start`にて追加した`selectmodel`パラメータに応じて使用する`LLM`ブロックを紐づける
Dify v0.6.14からIF/ELSEブロックにELIFが追加されたので複数モデルを選択できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e9e47234-3a5d-43bf-6fbc-d0457ab8f92a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c0648121-2b3c-15d1-8da8-ac90c57afc0f.png)


## 変数集約器の追加
`ブロックを追加`ボタンから`変数集約器`を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/6b048cd6-ba59-8fd0-7afc-e38f93fa4303.png)

各`LLM`と`変数集約器`を紐づける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e67c2afd-bd1e-42b8-1229-10ca058e97b9.png)

`変数集約器`ブロックの`変数を代入する`の右側の`+`をクリックして、各`LLM`からの出力を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/7b9d05cf-458c-08c0-e9ed-1dac9c9be4bc.png)

## Answerの編集
`変数集約器`と`Answer`を紐づける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9db1d8f4-e281-a6eb-82cf-4fae4263ee2f.png)

`Answer`ブロックを選択して`回答`フィールドを編集する
どのモデルからの回答かをわかりやすくするために``START_selectmodel` からの回答`という文章を追加する
回答自体は`変数集約器_output`が出力されるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e23f0248-16eb-6a59-7846-84fb26bade9e.png)

全ての編集が完了したら`公開する` -> `更新` ボタンをクリックする

## アプリケーションの実行
`プレビュー`からテスト実行が行える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c6593cf3-c570-ef05-c1ce-0e79cdad0199.png)

`selectmodel`フィールドで利用したいモデルを選択する
回答結果のところの`ワークフロー処理`を展開するとどのモデルが選択されたかが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9e6e635e-287d-665a-f04c-2fd3e8255a72.png)

ワークフロー上でもどのモデルが選択されたかを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9581d3b3-4828-3252-7789-503215717b00.png)

# 複数モデルの回答を列挙するタイプ
## 複数モデル回答式ワークフローの作成
上記で作成したアプリを複製して作成する
上記で作成したアプリの右下隅の`...`ボタン -> `複製`をクリックする

`名前`を修正したうえで`複製`ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/ce4b3bbc-ce4b-03c4-b5cb-64f5f8ea23ae.png)

最終的に作成したワークフローは以下となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/03289ae9-7b4e-6814-c35c-f8a54bda741b.png)



ポイントは以下
- `Start`に追加した使用するモデルを選択するパラメータは不要のため削除
- `LLM`ブロックと`ANSWER`ブロックを直結して、数珠つなぎにしていく
- `ANSWER`ブロックで回答結果が分かりやすいように編集

## 複数LLMの追加
テンプレートとして追加されている`LLM`の名前を任意に修正し、`モデル`で使用したいモデルを選択する
`コンテキスト`は`KNOWLEDGE RETRIEVAL_result`を選択する
`SYSTEM`にはプロンプトを入力しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/3896456c-4d7e-4544-c710-087db93b0eb9.png)

`LLM`ブロックの右上の`...`をクリックし、`コピー`を選択すると同じ設定のLLMブロックがコピーされる
スタジオパネル内で右クリックし`ここに貼り付け`を選択するとコピーされたLLMブロックが貼り付けられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/9b866a75-25c3-b1ec-379e-ad6b9c95821c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/64b2308f-5c10-08e4-8568-2d38114f87e7.png)

貼り付けた`LLM`ブロックを選択したうえで、`モデル`を他に使用したいモデルへ変更して複数の`LLM`ブロックを作成できる

## Answerの編集
`LLM`と`Answer`を紐づける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/8344c6da-7d7e-2ec8-efdd-631c79b06457.png)

`Answer`ブロックを選択して`回答`フィールドを編集する
どのモデルからの回答かをわかりやすくするために`gpt-3.5-turbo からの回答`という文章を追加する
回答自体は`LLM_text`が出力されるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/37ae1ab4-33f5-64a2-0d46-436905ebc036.png)

## 複数LLM-ANSWERを数珠つなぎにする
同様に`LLM`と`ANSWER`の紐づけを作成し、複数の`LLM`-`ANSWER`を数珠つなぎにしていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/e7ef72f9-cd08-f588-65da-f84cf6549772.png)

全ての編集が完了したら`公開する` -> `更新` ボタンをクリックする

## アプリケーションの実行
`プレビュー`からテスト実行が行える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c6593cf3-c570-ef05-c1ce-0e79cdad0199.png)

モデルによって回答内容が異なることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/f37a5405-49d2-c48f-1451-efb8acd09c8b.png)

# おわりに
生成AIアプリ開発においてはどのモデルを利用するのが良いか比較するケースがあり得る
Difyであれば今回紹介した方法で比較的容易にモデル間の比較ができると考えている

# 参考ページ
- [Difyで複数のLLMを切り替えるチャットを実現する](https://acro-engineer.hatenablog.com/entry/2024/08/21/110000)