本記事では、AIエージェントの構築と実行を簡素化するAWSの新しいオープンソースSDK「Strands Agents」をご紹介します。
※AWSが公開したブログも合わせてご参照ください。
Strands Agentsの登場背景
初期のLLM(大規模言語モデル)を使用する従来のAIエージェント開発では、タスク実行のためにどの機能をどの順番で呼び出すかといった、いわゆる「オーケストレーション」ロジックを開発者が細かく設計する必要がありました。
しかし、最近のLLMは推論能力やツール連携機能が飛躍的に向上しています。
Strands Agentsは、この進化したLLMの能力を最大限に活用する「モデル駆動型アプローチ」を採用しています。
「モデル駆動型アプローチ」とは?
Strands Agentsの最大の特徴は、開発者が複雑なワークフローを細かく定義する代わりに、モデル自身に計画、思考連鎖、ツール呼び出し、自己反省を行わせる点にあります。
開発者は、基本的にプロンプトと利用可能なツールのリストを定義するだけで、AIエージェントを構築できます。
Strands Agentsを構成する3つの主要要素
Strands Agentsは、主に以下の3つの要素で構成されます。
モデル: Strands Agentsは非常に柔軟なモデルサポートを提供しており、Amazon Bedrock、Anthropic、Ollama、Metaなどのモデルプロバイダー、およびLiteLLMを介したその他のプロバイダーを含む、推論およびツール使用能力を持つ任意のモデルをサポートしています。
ツール: エージェントが利用できるツールは多岐にわたります。 公開されている数千のModel Context Protocol (MCP) サーバーを利用できるほか、ファイル操作、APIリクエスト実行、AWS APIとの連携など、20以上の組み込み済みツール例も提供されています。 また、任意のPython関数をツールとして利用することも可能です。
プロンプト: エージェントに実行させたいタスクを自然言語で定義する「ユーザープロンプト」と、エージェントの一般的な指示や望ましい振る舞いを定義する「システムプロンプト」の2種類があります。 エージェントは、このプロンプトで与えられたタスクを完了するまで、モデルとツールとの間で対話を繰り返します。この対話のループは「エージェントループ」と呼ばれ、Strands Agentsの能力の中核をなすものです。
実際に試してみる
User GuideのQuickstartを参考に実際に試してみます。
前提条件
Python 3.10以上がインストールされていること
インストール
1.仮想環境の作成と有効化
python -m venv .venv source .venv/bin/activate
1.必要なパッケージのインストール
pip install strands-agents pip install strands-agents-tools strands-agents-builder
認証情報の設定
Strands Agentsは複数のモデルプロバイダーをサポートしています。デフォルトではAmazon BedrockのClaude 3.7モデルを使用します。
AWS認証情報は以下のいずれかの方法で設定できます。
- 環境変数:
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_SESSION_TOKEN
を環境変数に設定 - AWS認証情報ファイル:
aws configure
コマンドを使用して認証情報を設定 - IAMロール: EC2、ECS、Lambda などの AWS サービス上で実行する場合は、IAM ロールを使用
基本的なエージェントの実装
agent.py
に以下のコードを実装します。
from strands import Agent, tool from strands_tools import calculator, current_time, python_repl # Define a custom tool as a Python function using the @tool decorator @tool def letter_counter(word: str, letter: str) -> int: """ Count occurrences of a specific letter in a word. Args: word (str): The input word to search in letter (str): The specific letter to count Returns: int: The number of occurrences of the letter in the word """ if not isinstance(word, str) or not isinstance(letter, str): return 0 if len(letter) != 1: raise ValueError("The 'letter' parameter must be a single character") return word.lower().count(letter.lower()) # Create an agent with tools from the strands-tools example tools package # as well as our custom letter_counter tool agent = Agent(tools=[calculator, current_time, python_repl, letter_counter]) # Ask the agent a question that uses the available tools message = """ I have 4 requests: 1. What is the time right now? 2. Calculate 3111696 / 74088 3. Tell me how many letter R's are in the word "strawberry" 🍓 4. Output a script that does what we just spoke about! Use your python tools to confirm that the script works before outputting it 回答は日本語で出力してください。 """ agent(message)
エージェントを実行する
agent.py
を実行します。
python -u agent.py
実行すると以下の結果が出力されました。
4つのリクエストにお答えします。日本語で結果を説明します。 ## 1. 現在の時刻 Tool #1: current_time 現在の時刻はUTC(世界協定時)で2025年5月20日 06:35:43 です。 ## 2. 計算: 3111696 ÷ 74088 Tool #2: calculator 3111696 ÷ 74088 = 42 です。 ## 3. 「strawberry」内の「r」の数 Tool #3: letter_counter 「strawberry」という単語には「r」の文字が3回出現します。 ## 4. これまでの処理を行うPythonスクリプト スクリプトを作成して、実行して確認します: Tool #4: python_repl Do you want to proceed with Python code execution? [y/*] y 1. 現在の時刻: 2025-05-20T06:36:03.467680+00:00 2. 3111696 ÷ 74088 = 42.0 3. 「strawberry」内の「r」の数: 3 ## まとめ 1. **現在の時刻**: UTC(世界協定時)で2025年5月20日 06:35:43です。 2. **計算結果**: 3111696 ÷ 74088 = 42 です。 3. **文字カウント**: 「strawberry」という単語には「r」の文字が3つあります。 4. **Pythonスクリプト**: 以下のスクリプトで上記の3つの処理を実行できます。実行結果も確認済みです:
from datetime import datetime, timezone import pytz # 1. 現在の時刻を表示 def get_current_time(): current_time = datetime.now(timezone.utc) return current_time.isoformat() # 2. 3111696 ÷ 74088 を計算 def calculate_division(): return 3111696 / 74088 # 3. "strawberry"内の"r"の数をカウント def count_letter_r(word): return word.lower().count('r') # 関数を実行して結果を表示 print("1. 現在の時刻:", get_current_time()) print("2. 3111696 ÷ 74088 =", calculate_division()) print("3. 「strawberry」内の「r」の数:", count_letter_r("strawberry"))
このスクリプトを実行すると、現在の時刻、計算結果(42.0)、そして「strawberry」内の「r」の文字数(3)が表示されます。
実行結果の解説
1. 現在の時刻を表示
一般的なLLMは正確な現在時刻を返してくれる事はありませんが、current_time
というツールを利用して現在時刻を返してくれています。
2. 3111696 ÷ 74088 を計算
一般的なLLMは計算が苦手と言われています。calculator
というツールを利用して正確な計算結果を返してくれています。
3. 「strawberry」内の「r」の数をカウント
定義済みのletter_counter
関数を実行して、r
の数をカウントしてくれています。
4. これまでの処理を行うPythonスクリプト
これまでの処理が正しいかpython_repl
というツールを利用して、Pythonコードを実行して確認してくれています。
実行前には Do you want to proceed with Python code execution? [y/*]
と確認もしてくれています。
実行後には実行したPythonスクリプトも表示してくれています。
まとめ
Strands Agentsはプロンプトと利用可能なツールのリストを定義するだけで、簡単にAIエージェントを構築できるAWSの新しいオープンソースSDKです。
AIエージェントの開発に興味がある方は、ぜひ一度お試しください。