【要約】AWS Lambda + Claude APIで「AI上司」を作った — NotionタスクをSlackに届けるBoss Agent [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
筆者が個人のタスク管理を自動化しようとした際、単なる通知機能ではタスクの形骸化を招くという課題に直面した。また、実装過程で以下の技術的な制約にも直面した。
- ・通知の形骸化:単純なBot通知ではユーザーが無視しやすく、能動的な働きかけが必要であった。
- ・Slackの3秒制限:Slack Webhookは3秒以内に応答を返さないとリトライが発生する。LLMの推論時間をこの制限内に収めることは困難であった。
- ・リトライによる重複:タイムアウトに伴うSlackからのリトライ要求により、メッセージの重複送信が発生する懸念があった。
// Approach
筆者は、LLMの出力制御と非同期アーキテクチャを採用することで、これらの課題を解決した。具体的な手法は以下の通りである。
- ・出力の制御:System Promptでキャラクターを定義し、max_tokensを300に制限することで、簡潔な応答を技術的に担保した。
- ・非同期処理の実装:API Gatewayからのリクエストに対し、Lambdaが即座に200を返却した後、自分自身を非同期(InvocationType='Event')で呼び出すself-invokeパターンを採用した。
- ・自然言語による操作:Claudeのtool_use機能を定義し、LLMがユーザーの意図を解釈してNotion APIを直接呼び出す仕組みを構築した。
// Result
本システムの構築により、タスク管理の能動化と、Slack上での直感的な操作の両立を実現した。具体的な成果は以下の通りである。
- ・能動的なタスク管理:毎朝の自動通知に加え、停滞しているタスクに対してAIが自発的に問いかける環境を構築した。
- ・自然言語による更新:Slackでの会話を通じて、Notion上のタスクステータスや優先度を直接更新することが可能となった。
- ・運用の継続性:キャラクター性を持たせることで、タスク管理に対する心理的なプレッシャーとモチベーションの維持を図った。
Senior Engineer Insight
> Slackの3秒制限に対するself-invokeによる回避策は、実務における非同期設計の定石であり、非常に実戦的である。また、max_tokensによる出力制御は、コスト管理とUXの両面で理にかなっている。ただし、本番環境への投入を検討する場合、tool_useのループ回数制限(本記事では5回)に加え、API呼び出し失敗時のリトライ戦略や、LLMの誤操作を防ぐための人間による承認フロー(Human-in-the-loop)の検討が不可欠である。