毎日悩む「明日何着よう?」を解決したい!
はじめまして!すんすんです。
仕事の時も、プライベートな予定の時も、天気予報を見てから服を決めたけど、
いざ外に出てみると「思ったより暑いなぁ」「うわ!寒い!」なんてことはありませんか?
天気予報に表示されている気温から、予測して服を選ぶことが難しかったり、
最近は日によって寒暖差が激しいので、ますます難易度が上がっているように思います。
毎朝悩む時間を削減したい!お洋服の選択ミスを減らしたい!そんな思いから今回Weather checkerというLINE Botを作ってみました。
完成したBotはこちら
実装した機能・使用ツール
今回実装した機能
- ユーザーがLINEで「今日の東京の天気は?」などと送ると、その地点・その時間帯の天気を自動返信してくれる機能
- 天気の返信とともに「仕事・プライベートでおすすめの服装の提案」と「体調に関わる注意点」も自動返信してくれる機能
今回使用したツール
- Make
- LINE Developers
- Google Gemini AI
- 天気予報API(live door天気相互)
- Google AI Studio (API keys)※無料版
意外とシンプルな最終構造
さっそく作ってみよう!
最初に、LINEでオウム返しBotを作成します
オウム返しは今回の土台となる部分です。
Watch Eventsで"ユーザーから送られてきたメッセージ"を確認し、Send a Reply Messageで“返信する機能”を実装します。
しっかりオウム返しがされていることが確認できます。
続いて、お天気情報を返してくれる機能を作成します
①HTTP
LINEの間にHTTPのモジュールを追加し、ここにお天気APIのURLを入れます。
これでユーザーから送られてきた地点情報からお天気を見に行きます。

②JSON
次に、HTTPの隣にJSONを入れます。
お天気APIの情報は人間には読みにくいので、ここで人間が読みやすい言語に直します。
HTTPのところで繋げたお天気APIのサンプルデータを入れて、JSONに覚えてもらいます。

※ここで、オウム返しにならないように2個目のLINEのモジュールを手直ししておきます。
JSONさんに返して欲しいテキスト形式にしましょう。

LINEを送ってみると返ってきました。
これで人間が読みやすくなります。
でも、これだと地点コードをわざわざ探して入れないといけないですね、、、大変です。
それなら、AIに翻訳してもらえばいいじゃないか!!
近年急速に発達しているAIさん。
そんなAIさんに言葉を変換してもらえば、人間は自然言語を入れるだけでいいし、
APIはAIを通して変換されたコードを読みに行けばいいのだから一石二鳥です。
さっそくAIを入れてみる
言葉を翻訳してほしいので、1つ目のLINEとHTTPの間にAIを入れていきます。

今回は、GoogleのGemini(ジェミニ)を入れていきます。
※Geminiを選定した理由は、1分間に15リクエストまで無料で可能等と、
とても太っ腹だからです!!
※Geminiを入れるときはAPIKeyを取得する必要があります。
APIKeyはGoogle Studioにログインすると無料でゲットできます。

次の画面で、Geminiのモデル・プロンプトを入れていきます。
Model:Gemini Flash:Gemini Flash Latest
Flashは素早く回答を出すGemini、Latestは最新版という意味です。
Messageの部分を以下のように選択し、プロンプトをいれます。
※ここでのプロンプトはAIが一番AIを理解しているという理由から、
AIに作成してもらっています。
このGeminiを追加することで、自然言語を地点IDに翻訳してお天気APIを見に行く機能の追加ができました。
ここで一度、試しにLINEを送ってみたところ、、、上手く行かず。
「システムへの事前指示の入力枠が作られているのに、中身が空っぽだよ!」 とAIが困っている状態のようなのですが、ここでパニックになってしまった私は、この状態で強硬突破してしまいました。
この強行突破が、後で後悔することになるとは知らずに、、、

ここからが本題!
気を取り直して、今回の目標である、天気情報からおすすめのお洋服を提案する機能を付けたいと思います。
こちらの機能も、回答の自由度が高いAIを入れていきましょう。
またまたAI登場
これまで、地点名などの自然言語入力→システムが読みやすいコードへ変換→APIを読みに行く→JSONを自然言語にもどす→ユーザーに返信する という構造ができています。
この返信するタイミングに、お洋服のご提案を追加したいので、
HTTPの次のJSONと2個目のLINEの間にGeminiを入れていきます。

1個目のGeminiと同様に、Model・Messageの部分を以下のように選択し、プロンプトをいれます。今回もプロンプトはAIに考えてもらっています。
※細かい要望はあとから人間の手で追加しています。
※内容が長くなる可能性を懸念して、念の為文字数制限かけています。
これで、無事にお洋服のご提案をしてほしい要望をいれることができました。
いざ、送信!!
Run Onceで実際にLINEから送信してみたところ、、、
なんということでしょう。重たくて上手く動きません。

そこで、どちらもGeminiのモデルを最も軽く早いものにします。
選択したモデルはModel:Gemini Flash:Lite Latest
いざ、送信!!(2回目)

今度はちゃんと動きました!!が、しかし、、、
返信を見ると、データを想定して返信してくるようになりました。
これではBotとして全く意味がありません。
こんなことが起きている理由。それは、、、
AIが ハルシネーションを起こしているから
AIの特徴の1つとして、ハルシネーション(知ったかぶり)があります。
回答が分からないのに、それっぽく答えてしまうということです。
ハルシネーションは、プロンプトで制御することができますので、修正していきましょう。
いざ、送信!!(3回目)
なんということでしょう。今度は「知らない」としか返ってきません。

やっと解明できた原因
なんと、1つ目のGeminiが送り出したデータが親切に区切られていたこと、
逆に、お隣のHTTPは素直にそのまま取り出してAPIへ送り出す設定になっていました。
この状態だと、システムが「{city_code: 130010, day_offset: 1}」のような
記号混じりのデータをごっそりAPIに投げてしまい、
「こんなデータはない!」と弾かれる、、、といったことが起きます。
HTTPのValueを変更しましょう。
「Candidates[]: Content.Parts[]: Text」のAIが喋った純粋な文字(テキスト))をそのまま取り出す設定から、「Result : city_code」city_codeだけを取り出す設定にします。
ちなみに、自然言語を地点IDに翻訳して、お天気APIを見に行く機能を作成した時のエラー原因がこちらでした。
この時は落ち着いてエラー内容を確認できたので、原因を解明することができましたが、エラーを放置すると後々響いてくるということを痛感することとなりました。
いざ、送信!!(4回目)
上手く行きました!!!
某天気予報のアプリでも、天気・気温などの情報はほぼ同じです。
ちょうど日付を超えるタイミングだったので、もういちど同じ内容で送信してみました。

ちゃんと内容が変わってますね!!!
念のため、別地点で時間を指定して送ってみると、、、

しっかりと内容が返ってきます!!
(12時→お昼に変換されているのはお許しください(笑))
なんとか成功してよかった、、、
今回初めてMakeで実装してみたので、
こちらに掲載している以上に何度も何度もエラーが起きました。
心はバキバキに折れましたが、なんとか成功して本当にうれしいです!!
今後は、もっと深くMakeを理解して、さらに発展させた機能を追加できるほど余裕を持てたらいいなぁ、と切実に思っております。
また、今回焦ってしまったことで原因がわからなくなり、一度出たエラーを放置し強行突破してしまいました。このようなことは、原因がわからなくなってしまうため、プロトタイプの作成やシステム開発ではあってはならないことであることを再認識することができました。
今回は運よく解決でき、その上AIのハルシネーションを防ぐことができたという、ラッキーに恵まれましたが、今後は、”エラーを放置しない”ということを徹底していきたいと思います。
最後までお読みいただきありがとうございました!!!









