🌛

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

2024/05/30に公開

前回の記事はコチラ👇
https://zenn.dev/itella_blog/articles/a87911e5e04bf7

はじめに

作成中の天気予報アプリではユーザーが自由に入力することが可能なため、様々な地域が入力できます。今回は入力された地域の都道府県の天気予報を出力する動作を追加してみようと思います。
 
ナレッジに登録している地方、都道府県は以下となります。

ナレッジに登録していない地域や場所が入力された場合に
その場所はどこの都道府県または地方に該当するのかという処理を追加しようと思います。

動作確認-1

はじめにナレッジに登録していない地域を入力した際にどのように出力されるのか確認します。
以下操作を行います。
※知識取得で使用しているarea.txtのインデックスモードは「高品質」となっています。
・右側にある「▷実行」を押下
・入力エリアに「渋谷」を入力
・「実行を開始」を押下
結果:天気予報の出力ができない。

トレースの確認👇
知識取得で「宗谷地方」と「千葉県」の情報が取得されていることがLLMの入力値から分かります。LLMの出力結果は「渋谷の6桁の数値は120000です。」と・・🤔

LLMの出力結果がHTTPリクエストで使用されるため天気情報の取得が出来ないURLとなっています・・

試行-1

渋谷は千葉県や宗谷地方に位置しないため、渋谷は東京都と調べる処理を追加します。
「開始」と「知識取得」の間に「LLM」を追加し入力された場所がどこの都道府県か調べてもらいます。

以下ブロックを修正します。
【知識取得】

クエリ変数:開始/area → LLM/text
開始/areaの変数にはユーザーが入力した地域が入っているため、LLMで取得した都道府県(LLM 3/textの変数)を指定します。
 
【LLM】

LLMのUSERプロンプトで開始/areaの変数を使用していたため、都道府県を取得したLLM 3/textの変数を指定します。

動作確認

操作としては動作確認-1と同じ手順です。
結果:渋谷を入力して東京都の天気予報を出力することができました🎉

上記の動作としては問題なさそうですが・・
北海道の「稚内市」を入力すると「胆振・日高地方」の地域コードを取得してしまいます・・🤔
稚内市は宗谷地方に位置しますが、胆振・日高地方の天気予報を出力するのは間違っているため、
北海道・奄美・沖縄のような、都道府県ではなく○○地方で登録しているものについては処理を分けたほうが良さそうです・・

試行-2

入力した地域が北海道・奄美・沖縄なのか、それ以外の都道府県に該当するのか仕分けします。
仕分けの方法としては「質問分類器」を使用します。
 
質問分類器について分かりやすく説明しているサイトがあったので貼っておきます👇
https://note.com/hantani/n/n0ac6505768c7
 
 
「開始」と「LLM3」の間に「質問分類器」を追加します。
質問分類器の入力変数には開始のarea変数を使用します。

ユーザーが「稚内」と入力した場合は「北海道・奄美・沖縄」へ
ユーザーが「渋谷」と入力した場合は「その他」の処理が動きます。
 
「その他」では試行-1の処理を行います。
「北海道・奄美・沖縄」については処理を追加します👇
  
入力された地域が「北海道・奄美・沖縄」のどの地方に該当するか調べてもらいます。
LLMで以下のように指示します。
今回USERプロンプトだけでは期待している動きとならなかったため、SYSTEMプロンプトにも指示を追加しました。

上記で追加したLLMの後の処理は試作-1と同じフローで以下のようになります。
知識取得→LLM(6桁の地域コードを取得)→HTTPリクエスト
→LLM(天気情報をニュース原稿風に出力)→終了

動作確認

以下操作を行います。
・右側にある「▷実行」を押下
・入力エリアに「稚内市」を入力
・「実行を開始」を押下
結果:宗谷地方の天気を出力することができました🎉

他の地域も試してみましたがニュース原稿風にいい感じに出力できています👍
なぜか奄美地方は天気情報取得が出来ないみたいです・・
ブラウザで以下アクセスすると「Not Found」の表示となっていたので天気情報が取得できないのかなと・・🤔
https://www.jma.go.jp/bosai/forecast/data/forecast/460040.json

おまけメモ

1. インデックスモード「高品質」と「経済的」のドキュメントを使用したときの動作の違い

■インデックスモード:経済的
インデックスモード「経済的」のドキュメントを使用した場合に、天気予報がどのように出力されるのか確認します。
 
※注意点
・試行1,2対応前の環境となります。
・知識取得で使用しているarea.txtのインデックスモードは「経済的」となっています。
 
以下操作を行います。
・右側にある「▷実行」を押下
・入力エリアに「渋谷」を入力
・「実行を開始」を押下
 
結果:エラーが発生しました。 
トレースの知識取得を確認したところ「渋谷」の地域コードが空となっていて取得できないため、HTTPリクエストで天気予報の取得に失敗しています。

■インデックスモード:高品質
 動作確認-1に記載

まとめ

結果としてはどちらも天気予報の出力が出来てませんが、知識取得の処理で動作が違うことが分かりました。
高品質の場合は「宗谷地方」と「千葉県」がヒットしています。
渋谷と宗谷では「谷」が一致するので宗谷地方がヒットするのはなんとなく分かるけど千葉県がヒットするのは謎です・・🤔
経済的の場合は知識取得の出力結果が空ということから、インデックスモードで検索力が違うんだなと・・!

2. IF/ELSEブロックを使ってみた

上記の試行1,2のやり方にたどり着く前に「IF/ELSE」を使ってできるか試したためメモを残します。

動作確認

※知識取得で使用しているarea.txtのインデックスモードは「経済的」となっています。
以下操作を行います。
・右側にある「▷実行」を押下
・入力エリアに「渋谷」を入力
・「実行を開始」を押下
結果:エラーが発生。 
トレースの知識取得を確認したところ「渋谷」の地域コードが空となっていて取得できないため、HTTPリクエストで天気予報の取得に失敗しています。

試行

「渋谷」が知識取得でヒットしないためresultは空で出力します。
知識取得が「空」か「空ではないか」で判定します。
 
知識取得とLLM間の線にカーソルを乗せると「+」ボタンが表示されるので
「+ボタン」を押下しロジックの「IF/ELSE」を追加します。
 
「IF/ELSE」の詳細表示を行い条件を追加します。
条件は「もし知識取得/result(変数)が空でない場合」とします。
resultが空でない場合は今まで通りの処理を行います。

resultが空の場合はユーザーが指定した地域はどこの地方または都道府県なのか調べて天気予報を出力するようにします。
フローの流れとしては以下になります。
・LLM:○○はどこの都道府県なのか、都道府県のみを出力するように指示。
・知識取得:LLMで出力した都道府県をarea.txt内検索。
・LLM:6桁の地域コードを出力するように指示。
・HTTPリクエスト:取得した6桁の地域コードを使用し天気予報を取得する。
・LLM:取得した天気予報をニュース原稿風にまとめる。
・終了:ニュース原稿を出力。

フローが複雑になってきました・・🤦‍♂️

動作確認とまとめ

操作としては動作確認と同じ手順です。
結果:東京都の天気予報が出力することができました🎉

ただ、北海道や沖縄などは○○地方で登録されているため、上記の方法では地域コードが取得できず天気予報が出力できません。
上記のフローに「質問分類器」を追加して、北海道や沖縄などの○○地方で登録しているものを検索して・・と考えればできなくはないですが、フローが更に複雑になってしまいそうなのでやめました😮‍💨
試行1,2のほうがシンプルで良いかなと・・🤔
 
 
今回は以上となります🫡

Discussion