🪐

Difyで天気予報アプリを作成してみた #1

2024/05/24に公開
1

はじめに

Difyは、最小限のコーディングで迅速なアプリケーション開発を実現するプラットフォームとして知られています。
この記事ではDifyを使用して天気予報アプリを作成します。
またDifyの導入方法や起動方法については記述していませんので、環境構築から始める方は以下ご参照ください🙇‍♂️
 
https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5
https://note.com/sangmin/n/na60a68ee05c2
 
 
【やりたいこと】
以下2つをニュース原稿風に出力します。

  1. 特定の地域の天気予報
  2. ユーザーが指定した地域の天気予報

1.特定の地域の天気予報アプリの作成

アプリ作成の「から作成する」を選択します。

 
アプリタイプは「ワークフロー」を選択し、アプリ名を入力して「作成する」ボタンを押下します。

 
「作成する」ボタンを押下後以下の画面が表示されます。
ユーティリティの「HTTPリクエスト」ブロックを追加し、天気予報JSONデータの取得します。

 
■天気予報JSONデータの取得方法
以下サイトを参考に気象庁のサイトから天気予報JSONデータの取得します。
https://www.mgo-tec.com/blog-entry-jp-weather01.html#title01
 
東京都のofficeコードは「130000」のため、以下のURLの「xxxxxx」部分にofficeコードを入力。

https://www.jma.go.jp/bosai/forecast/data/forecast/xxxxxx.json

「HTTPリクエスト」ブロックを押下すると右側にブロックの詳細が表示されるため、APIに上記のURLを設定します。JSONデータを取得するためHTTPメソッドは「GET」を指定します。

 
 
取得した東京の天気予報をニュースの原稿風にするためにLLMで処理を行います。
HTTPリクエストブロックの「+」ボタンを押下しLLMブロックを追加できます。
LLMのモデルは「claude-3-haiku」を使用。

 
 
LLMに対して動作の指示をします。
「メッセージを追加」を押下すると、USERプロンプトが追加されます。
ここでSYSTEMプロンプトとUSERプロンプトの使い分けは・・?という疑問が出たため
調査した内容を少しメモ📝
SYSTEMプロンプト:言語モデルに対して役割(モデルの振る舞いや性格など)を与えることができる。(省略可能)
USERプロンプト:言語モデルに対して質問したり指示を出すことができる。

HTTPリクエストで取得した天気予報はHTTPリクエストの「body」に出力されます。
■確認方法
・HTTPリクエスト詳細表示の「▷」ボタンを押下。
・「実行を開始」を押下するとHTTPリクエストブロック単体で実行することができる。
・取得した天気予報がbodyに出力されていることを確認。

 
 
取得した天気予報の情報をニュース原稿風に出力したいため、USERプロンプトで「body(変数)から東京都の天気情報をまとめ、ニュース原稿にしてください。」と指示します。
言語モデルに対して役割を与える必要はないため、SYSTEMプロンプトは省略します。
※「/」を入力すると変数が選択できます。

 
 
「終了」ブロックを追加し、出力変数にLLMの出力結果を指定します。

 
 
「実行」ボタンを押下すると、右側のTest Resultの結果にニュース原稿が出力されました。

 
 
特定の地域の天気予報アプリの作成手順としては以上となります🫡

2. ユーザーが指定した地域の天気予報のアプリ作成

1.特定の地域の天気予報アプリの作成では、東京都のみの天気予報を出力するようにしていましたが、今回はユーザーが指定した地域の天気予報を出力していきます。
 
1.特定の地域の天気予報アプリの作成と同様にアプリを作成します。
アプリの作成ができたら、開始ブロックの詳細を表示し「入力フィールド」を追加します。

 
ユーザーが入力した地域の天気予報JSONを取得するには、各地域の地域コードが必要となるため
地域コードを検索という処理を追加します。
「知識取得」ブロックを使用することで外部情報の検索ができるため、
外部情報として地域名と地域コードが紐づいたファイルを用意します。
 
https://www.jma.go.jp/bosai/common/const/area.json
上記の地域コード一覧のJSONデータ内から「offices」のみ抽出した
テキストファイルを作成しました。
area.txt↓

 
   
知識取得ブロック内でarea.txtを読み込むにはナレッジに登録が必要です。
■ナレッジ登録方法
・画面上部の「ナレッジ」を押下し「知識を作成」で知識を追加します。

 
 
・作成したarea.txtをアップロードし、「次へ」ボタンを押下します。

 
 
・アップロードしたファイルの設定を行い、「保存して処理」ボタンを押下します。
 各種設定は以下で、チャンク設定、検索設定はデフォルトの状態です。
 チャンク設定:自動
 インデックスモード:経済的
 検索設定:逆イデックス
 ・トップK:3
 
・「ナレッジが作成されました」の画面が表示されたら完了です。

 
 
 
天気予報アプリ-地域検索のワークフローに戻り、知識取得ブロックを選択し先ほど登録した「area.txt」を指定します。知識取得の詳細で「知識」の「+」ボタンを押下することでナレッジに登録したドキュメントが選択できます。
また、クエリ変数には開始ブロックでユーザーが入力した変数を設定することで、ユーザーが入力した地域をarea.txt内から検索することができます。

 
 
知識取得で出力された地域から6桁の地域コードを取得するためにLLMを追加し指示します。

動作確認

以下の操作で6桁の地域コードが取得できているか確認します。
・右側の「▷実行」ボタンを押下
・入力フィールドに「宗谷地方」を入力
・「実行を開始」ボタンを押下
 
トレースで各ブロックの出力結果が確認できます。
【知識取得】
result内のcontentに地域名と地域コードが出力されています。

 
【LLM】
textに「011000」と宗谷地方の地域コードが取得できることが分かります。

 
 
6桁の地域コードが取得できたため、HTTPリクエストブロックを追加し、各地域の天気予報を取得します。取得した地域コードはLLMのtext変数に格納されているため、以下URLの「xxxxxxx」にtext変数を設定します。

1.特定の地域の天気予報アプリの作成の手順同様に、LLMブロックを追加し取得した天気予報の情報をニュース原稿風にまとめます。まとめた内容を「終了」ブロックで出力します。

動作確認

右上の「▷実行」ボタンを押下し「宗谷地方」を入力し実行ボタンを押下すると
宗谷地方の天気予報が出力できました。

 
 
「東京都」も同じように実行できるか確認したところ、エラーとなってしましました・・

 
 
トレースを確認したところ、知識取得のresultが空となっています。

 
 
原因としてはナレッジの登録方法に問題があったようです。
上記で登録した際には、チャンク設定を自動にしていたことにより
チャンクの分割が上手くできてなかったようです・・

 
 
ナレッジ登録の際にチャンク設定で「カスタム」を選びチャンク設定を行います。
セグメント識別子を「/n」とし改行毎でチャンクを分割します。
「確認&プレビュー」で右側にチャンクの内容が確認できます。

 
 
ナレッジに登録したドキュメントを確認すると、地域名と地域コードで分割できていることが分かります。

 
 
天気予報アプリのワークフローに戻り「知識取得」ブロックを選択し、
ナレッジの内容を先ほど登録したドキュメントに変更します。
再度「東京都」で実行したところ、東京都の天気予報を出力することができました。

 
 
知識取得の出力結果を確認するとresultのcontentに
東京都と地域コードを取得することができました。

 
 
ナレッジ登録でつまずいた部分はありましたが、ユーザーが指定した地域の天気予報アプリの作成手順でした!
 
今回は以上となります🫡

Discussion

ヨシオヨシオ

参考になる記事の公開ありがとうございます!
画像のリンク切れが複数枚あるようなので、よかったら画像パスを直していただけると嬉しいです!