話題のDifyをBedrockで試してみた！

## この記事の目的
巷で話題の[Dify](https://dify.ai/jp)を試してみました。

## ユースケース
ある程度実用的なユースケースを想定して、カスタマーからのメールの返信文案を考えてもらうというのをワークフローで組んでみました。

メールの内容から判断して

- Complaint（苦情）
- Inquiry（質問）

に分類して、それぞれに応じたメール文章を提案する。
Inquiryの場合には、文末にキャンペーンのお知らせを挿入する。

## 環境
* mac OS Sonoma 14.2
* Dockerを用いてセルフホスティング
* LLMは、Amazon BedrockからAnthropic Claude3を利用

## Workflow
ワークフローは以下のように定義しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/cb09fcad-bd36-dd61-d1ba-0f99fc42055d.png)

以下、ノードごとに要点を説明します。

### Startノード
以下のように、メールタイトルとメールボディーを定義しています。（あとでタイトル足したので、下に配置されていますが、ご愛嬌ということで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/c5850525-986d-e389-3e6f-8951e3b78ec9.png)

### Question Classifierノード

前のノードのInput_Textを参照して、内容に応じてComplaint(苦情)、Inquiry(質問)に振り分けています。
高度な設定という欄で、指示(プロンプト)を与えています。雑なプロンプトですが、割と意図通りに機能しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/fbc002d4-c656-c21e-52e3-9f8f39088f64.png)

### LLM(CompaintResponse)ノード
こちらは苦情の対応なので、ちょっと奮発してSonnetを使っています。（他は全部Haikuです）
**Bedrockを使う場合のポイント**なのですが、SYSTEMの欄にプロンプトを書いてもうまく動作しません(エラーになります)。その場合にはUSERの欄に書くと良いようです。
参考：https://github.com/langgenius/dify/issues/3397

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/cdacb83a-d5f3-6b83-3432-9d18fd2aac40.png)

### End(Complaint)ノード
後で、Inquiryのところで説明します。

### LLM(Inquiry)ノード
特に、ComplaintResponseと変わるところはないです。
なお、プロンプトの中で、問い合わせ受付の番号を払い出して…と片付けていますが、本来は、ここはIssueトラッカーなどを呼び出して番号を受け取る処理を挟むべきです。(そのうち試す予定)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/56bbb6ca-f170-e2f2-9398-c323336d6efb.png)

### Template(Add Information)ノード
質問への回答なので、キャンペーンのお知らせを文末に入れています。
これはTemplateの機能を試したかっただけなので、大きな意味はありません。

ちなみに、Templateの直後にEndノードをつけるとjson形式で出力されてしまうので、次のノードでTextだけを取り出すようにしています。(苦肉の策)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/9245c06b-34d3-405b-e10b-f25a19aa1584.png)

### LLM(ExtractText)ノード
「そのまま出力してください。」というプロンプトを初めて書いたw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/62c241d1-2ed9-0441-2286-d1e0cbf1a951.png)

### Endノード
特に説明は不要かもしれません。
ワークフローに必ず一つはEndノードが要るそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/a313c887-624f-fdc9-ef38-807ff8a1fdb1.png)

## 使ってみた様子
▪️苦情対応：
まずまず丁寧なので初動としては良さそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/40ee61f2-9d1e-a564-1de1-2f695e982b73.png)

▪️質問対応：
特に根拠なしに「対応させていただきます」って答えているのが気になりますが、この辺はプロンプトを工夫するとかガードレール的なものを導入することにより精度が高まると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/07c4dac7-99c1-aa1e-15ea-34e3e8a63837.png)

## 驚いた点！
驚き屋らしくちょっと驚いてみます！
特に何の指定もしてませんでしたが、「Run Batch」というタブがあり、CSVで複数の依頼を一括実行できるようです。
並列処理でサクッと動いているようですし、結果のDownloadまでできます！
これはかなり便利ですね！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/00b98026-8c11-8b49-8eab-8f0b239fdcd6.png)

## 課題

**業務的な課題**
実際の業務で使う場合には、メール本文に個人情報があった場合に、それをそのままAIに渡すわけにもいかないので、事前のマスキング処理が要ります。これをどうするか？というのは個人情報保護法や各組織のポリシーに応じて作り込みが要ります。
（パブリッククラウドの場合にはリージョンを指定できますが、現時点では海外を使う場合が多いため、より一層個人情報の扱いには慎重さが求められます。これは海外だと危ないとかそういう話しではなく個人情報保護法の定めによるものです。[参考](https://www.ppc.go.jp/all_faq_index/faq1-q12-3/)）

**技術的な課題**
これは課題というよりは今後の検証テーマということになりますが、
今回は時間の関係で、一部の機能しか試せていません。（当然ではありますが）

ワークフローの[Nodes](https://docs.dify.ai/features/workflow/node)だけでこれだけあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/8f6e5606-e8eb-ba96-1c18-52e07616261f.png)

この中で有用そうなものとしては、HTTP Requestがあります。
既存のシステムとの連携などは、APIを既存システム側に生やしてそれを叩いて連携するというケースが多いと思います。

（既存システムもだいたいはAPI生やす対応が終わっているかもですが…）


## 最後に

最後までお読みいただきありがとうございます。

ノーコードでここまでできるというのは正直驚きでした。
もちろん作り込みをする上ではコーディングをするという局面も出てくると思いますが、ある程度のことは標準機能でもできそうです。

特に優れているなぁと思った点は、以下です。
* セルフホスティング（実際はローカルでやってます）もdocker composeで簡単に試し始められる
* ワークフローを作りながらデバッグするのが楽（実行経過がすぐに見られる）
* 今回は触れてませんが、定義をyamlに書き出して共有可能である点
* LLMの事前知識は少し必要ですが、UIが直感的でドキュメント読まなくても使える

### 以下の情報を参考にさせていただきました。ありがとうございました。

https://note.com/sangmin/n/na60a68ee05c2

https://youtu.be/kvUy_dvZhGM?si=yNQ5WQJb4v_5hANT

https://zenn.dev/karaage0703/articles/6bcbaf37d6607d