AIエージェント開発が簡単に!AWS「Strands Agents」のご紹介

記事タイトルとURLをコピーする

本記事では、AIエージェントの構築と実行を簡素化するAWSの新しいオープンソースSDK「Strands Agents」をご紹介します。

※AWSが公開したブログも合わせてご参照ください。

aws.amazon.com

Strands Agentsの登場背景

初期のLLM(大規模言語モデル)を使用する従来のAIエージェント開発では、タスク実行のためにどの機能をどの順番で呼び出すかといった、いわゆる「オーケストレーション」ロジックを開発者が細かく設計する必要がありました。

しかし、最近のLLMは推論能力やツール連携機能が飛躍的に向上しています。

Strands Agentsは、この進化したLLMの能力を最大限に活用する「モデル駆動型アプローチ」を採用しています。

「モデル駆動型アプローチ」とは?

Strands Agentsの最大の特徴は、開発者が複雑なワークフローを細かく定義する代わりに、モデル自身に計画、思考連鎖、ツール呼び出し、自己反省を行わせる点にあります。

開発者は、基本的にプロンプトと利用可能なツールのリストを定義するだけで、AIエージェントを構築できます。

Strands Agentsを構成する3つの主要要素

Strands Agentsは、主に以下の3つの要素で構成されます。

  1. モデル: Strands Agentsは非常に柔軟なモデルサポートを提供しており、Amazon Bedrock、Anthropic、Ollama、Metaなどのモデルプロバイダー、およびLiteLLMを介したその他のプロバイダーを含む、推論およびツール使用能力を持つ任意のモデルをサポートしています。

  2. ツール: エージェントが利用できるツールは多岐にわたります。 公開されている数千のModel Context Protocol (MCP) サーバーを利用できるほか、ファイル操作、APIリクエスト実行、AWS APIとの連携など、20以上の組み込み済みツール例も提供されています。 また、任意のPython関数をツールとして利用することも可能です。

  3. プロンプト: エージェントに実行させたいタスクを自然言語で定義する「ユーザープロンプト」と、エージェントの一般的な指示や望ましい振る舞いを定義する「システムプロンプト」の2種類があります。 エージェントは、このプロンプトで与えられたタスクを完了するまで、モデルとツールとの間で対話を繰り返します。この対話のループは「エージェントループ」と呼ばれ、Strands Agentsの能力の中核をなすものです。

実際に試してみる

User GuideのQuickstartを参考に実際に試してみます。

strandsagents.com

前提条件

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認証情報は以下のいずれかの方法で設定できます。

  1. 環境変数: AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN を環境変数に設定
  2. AWS認証情報ファイル: aws configureコマンドを使用して認証情報を設定
  3. 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エージェントの開発に興味がある方は、ぜひ一度お試しください。