はじめに
日々、AIチャットやバイブコーディーングでAIに触れていますが、「アプリの中で AI を動かす」までは手を出したことがありませんでした。
AIを使って欲しい情報をいい感じで収集してくれて、情報をまとめてくれて、通知をくれるものを低コストで作ってみたく、最終的にマルチAIエージェントアプリに手を出してみた話です。
AIエージェントとは
マルチAIエージェントに手を出す前に、まずはAIエージェントとは何か、というところからですね。
指示を出すことで、それを達成するために調査・実行までを自律的にやってくれるものです。
Webブラウザを検索したり、プログラムを実行したりします。
単体でも、指示を出せば複数のタスクをこなしてくれます。
ただ、一つのコンテキストに対していろんな情報を詰め込むと、出力が安定しにくいと感じました。
実際に1つのエージェントに複数の指示とタスクの実行を埋め込んだ際には、
トークンがキャパオーバーしたり
タスクで情報収集させた結果、「情報なし」のはずが、情報を生成してしまったり(ハルシネーション)
プロンプトで指示した情報以外の出力になったり(コンテキスト汚染)
といった事象に悩みました。
マルチAIエージェントとは
専門化された複数のAIエージェントを協調させることです。
それぞれのタスクに対応するAIエージェントを準備して、それらのAIエージェントを統括するAIエージェントによって自律的にコントロールするイメージです。
それぞれのAIエージェントは、個々のタスクに集中することができるため、
シンプルな指示だけで各タスクを実行させやすくなります。
今回作るもの
釣果情報を調べたかったので
- 行けそうな場所の釣果情報のリンクから 1 週間の釣果情報を収集します。
- 釣果のあった場所の週末天気・風・潮見を収集します。
- 釣り日和かどうかを示す通知メッセージを生成します。
これを実現できるものを作っていきます。
今回使うもの
作業 PC のスペックやメンテの手間、お金をあまり気にしなくていい構成がよかったので、AWS でサーバーレス構成にしてみます。
- AWS 環境
- Lambda
LangGraph のワークフローを動かします。ライブラリサイズが大きいので、コンテナイメージからデプロイします。
コードはエージェント構成とプロンプトを先に作成して、それを元にバイブコーディングしました。 - S3
プロンプトや結果を保存します。 - Bedrock
シンプルなタスク(釣果のURLから最近の釣果情報を取得してくる)なので、推論の性能は抑えて、コスト重視の Nova Micro を使います。 - SNS
スマホへ結果を通知するために使います。
- Lambda
エージェント構成
LangGraph使い、複数のエージェントがバトンを繋いでいく形で動いています。
- 司令塔 (Supervisor): 次に誰が作業するかを決めるボスです。
- 釣果担当: 最近、魚が釣れているかを調べます。
- 天気担当: 風や波が強くないか、釣りに適した予報かを調べます。
- お知らせ担当: 最終的な結果をスマホ(SNS)に送ります。
動作チェック
動かしてみた結果は、このような感じになりました。
<省略>
### 北九州 響灘大橋下
最近釣れている魚:サヨリ
場所:響灘大橋下
状況:25cm前後が絶好調!お昼の釣り物はサヨリがおすすめ!
おすすめ度:★★★★☆
備考:天気は晴れで、風速は5m/s以下。潮は満潮が朝マズメに重なるため、おすすめポイント。
<省略>
一部抜粋ですが、ちゃんと釣果情報と週末が釣り日和かの情報を通知してくれます。
実際の釣果情報と比較しても、大きく外れておらず、実用に足る内容だと判断できました。
この処理を、EventBridgeなどで定期駆動させれば自動で情報収集もできそうですね。
成果物
次のリポジトリに配置しています。
https://github.com/yosi-mon/serverless-fishing-agent
Terraform にしてみました。プロンプトも置いています。
README にエージェントの解説やTerraformでの構築方法を記載しています。
最後に
作ってみる前には、1つのAIエージェントに対して、指示さえしっかり出していればマルチエージェントなどは不要と思っていました。
実際にやってみると、トークンがパンクしたり、ハルシネーションが発生したり、出力が制御できなかったりという体験ができました。
モデルや指示を見直すことで、これらは改善できるとも思っていますが、マルチエージェント構成にすることでエージェントへのコンテキスト量を抑え、不要な情報が混ざらないようにできる点が結果の安定に繋がるのかと感じられました。
本記事は個人の意見です。技術的な実験や個人的な学習メモとして作成しています。

