オープンソースのAIエージェントSDK「Strands Agents」をハンズオンしてみよう!

technologies

  • HOME
  • BLOG
  • technologies
  • オープンソースのAIエージェントSDK「Strands Agents」をハンズオンしてみよう!

目次

  1. はじめに
  2. Strands Agentsとは
    1. Strands Agentsの概要
    2. エージェント構成の3要素
    3. エージェントループについて
  3. Strands Agentsを構築してみる
    1. 前提条件
    2. サンプルコードを実行してみる
    3. オレゴンリージョン(us-west-2)のAmazon BedrockにてClaude 3.7 Sonnetを有効化する
    4. 作業用端末にてAWS CLIの認証情報を設定する
    5. 改めてサンプルコードを実行してみる
  4. まとめ

1. はじめに

こんにちは!ベンジャミンの松延(まつのぶ)です!
AWS公式ブログにてオープンソースのAIエージェントSDKである「Strands Agents」が紹介されました。
Strands Agents SDKを使用することで、AIエージェントをプログラム上で簡単実装できるようになります。
本記事では、Strands Agentsについてシェアできればと思います。


2. Strands Agentsとは

1. Strands Agentsの概要

Strands Agents」とは、大規模言語モデル(以下、LLM)の能力を最大限に活かしたモデル駆動型アプローチを採用したAIエージェントSDKです。このアプローチにより、開発者は複雑なワークフローを定義する代わりにAIモデルの推論能力に依存してエージェントを動作させることが可能となります。
すでにAmazon Q Developer、AWS Glue、VPC Reachability Analyzerなどで活用されているとのことです。
以下はStrands Agents公式に記載されている特徴を引用しています。

特徴説明
軽量かつ邪魔にならない設計シンプルに動作し、完全にカスタマイズ可能なエージェントループを提供
本番環境対応エージェントを大規模に実行するための完全な観測性、トレース、デプロイオプションを装備
モデル、プロバイダー、デプロイに依存しないAmazon Bedrockを始め、Anthropic、LiteLLM、Ollama、LlamaAPIなど多様なプロバイダーの様々なモデルをサポート
強力な組み込みツール幅広い機能のツールで迅速に開発を開始可能
マルチエージェントと自律エージェントエージェントチームや時間とともに自己改善するエージェントなどの高度なテクニックを適用可能
会話型、非会話型、ストリーミング対応あらゆるタイプのエージェントと様々なワークロードをサポート
安全性とセキュリティを優先データを保護しながら責任を持ってエージェントを実行

2. エージェント構成の3要素

Strands Agentsでは、エージェントは以下3つの要素から構成されます。

構成要素説明
モデルエージェントの頭脳となるLLM
ツールエージェントが実行可能な機能のコレクション
プロンプトエージェントに与えられるタスクや指示

この3要素を適切に組み合わせることで、多様なタスクを自律的に実行するAIエージェントを構築できます。

3. エージェントループについて

Strands Agentsのコンセプトは、「エージェントループ」と呼ばれる仕組みです。
Strands Agentsがユーザ入力を処理して判断を下し、ツール実行を行なって応答を生成するプロセスになります。ツールとLLMをシームレスに連携することで複雑で多段階的な推論とアクションをサポートするように設計されています。

(From What is the Agent Loop?

このループは以下の流れで動作します。

  1. ユーザー入力とコンテキスト情報を受け取る
  2. LLMを用いて入力を処理する
  3. ツールを使用するか、アクションを実行するかを決定する
  4. ツールを実行し、結果を受け取る
  5. 新しい情報を用いて推論を継続する
  6. 最終的な応答を生成するか、ループを再度繰り返す

3. Strands Agentsを構築してみる

Strands Agents公式のサンプルコードを使用してStrands Agents SDKをハンズオンしてみましょう!

1. 前提条件

  • Python 3.10以上がインストールされていること
  • 作業端末にAWS CLIがインストールされていること
  • 本記事はMacOS利用者向けのため、WindowsOSの方は必要に応じてコマンドを置き換えるなどしてください

2. サンプルコードを実行してみる

1. ハンズオン用のディレクトリを作成してください。

mkdir ~/Desktop/strands-agents-handson
cd ~/Desktop/strands-agents-handson

2 .以下コマンドを実行してStrands Agentsをインストールしてください。

pip install strands-agents

3. Pythonファイルを作成してください。

touch agent.py

4. さきほど作成したagent.pyをVSCodeやCursorなどのIDEを開き、以下ソースコードをコピー&ペーストして保存してください。

from strands import Agent

# Create an agent with default settings
agent = Agent()

# Ask the agent a question
agent("AIエージェントについて教えてください")

5. 以下コマンドを実行してください。

python -u agent.py

すると、以下のようなエラーが表示されるかと思います。

matsunobu@ip-192-168-3-37 strands-agents-handson % python -u agent.py
Traceback (most recent call last):
  File "/Users/matsunobu/Desktop/strands-agents-handson/agent.py", line 7, in <module>
    agent("Tell me about agentic AI")
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/agent/agent.py", line 343, in __call__
    result = self._run_loop(prompt, kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/agent/agent.py", line 445, in _run_loop
    return self._execute_event_loop_cycle(invocation_callback_handler, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/agent/agent.py", line 472, in _execute_event_loop_cycle
    stop_reason, message, metrics, state = event_loop_cycle(
                                           ^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/event_loop/event_loop.py", line 190, in event_loop_cycle
    raise e
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/event_loop/event_loop.py", line 148, in event_loop_cycle
    stop_reason, message, usage, metrics, kwargs["request_state"] = stream_messages(
                                                                    ^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/event_loop/streaming.py", line 340, in stream_messages
    return process_stream(chunks, callback_handler, messages, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/event_loop/streaming.py", line 290, in process_stream
    for chunk in chunks:
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/types/models.py", line 115, in converse
    for event in response:
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/strands/models/bedrock.py", line 250, in stream
    response = self.client.converse_stream(**request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/client.py", line 569, in _api_call
    return self._make_api_call(operation_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/client.py", line 1005, in _make_api_call
    http, parsed_response = self._make_request(
                            ^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/client.py", line 1029, in _make_request
    return self._endpoint.make_request(operation_model, request_dict)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/endpoint.py", line 119, in make_request
    return self._send_request(request_dict, operation_model)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/endpoint.py", line 196, in _send_request
    request = self.create_request(request_dict, operation_model)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/endpoint.py", line 132, in create_request
    self._event_emitter.emit(
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/hooks.py", line 412, in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/hooks.py", line 256, in emit
    return self._emit(event_name, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/hooks.py", line 239, in _emit
    response = handler(**kwargs)
               ^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/signers.py", line 106, in handler
    return self.sign(operation_name, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/signers.py", line 198, in sign
    auth.add_auth(request)
  File "/Users/matsunobu/.pyenv/versions/3.12.0/lib/python3.12/site-packages/botocore/auth.py", line 423, in add_auth
    raise NoCredentialsError()
botocore.exceptions.NoCredentialsError: Unable to locate credentials

Strands Agents公式に以下記載がります。

Note: To run this example hello world agent you will need to set up credentials for our model provider and enable model access. The default model provider is Amazon Bedrock and the default model is Claude 3.7 Sonnet in the US Oregon (us-west-2) region.

For the default Amazon Bedrock model provider, see the Boto3 documentation for setting up AWS credentials. Typically for development, AWS credentials are defined in AWS_ prefixed environment variables or configured with aws configure. You will also need to enable Claude 3.7 model access in Amazon Bedrock, following the AWS documentation to enable access.

Different model providers can be configured for agents by following the quickstart guide.

つまり、以下設定が必要になります。

  • 事前にAWSアカウントを用意し、オレゴンリージョン(us-west-2)のAmazon BedrockにてClaude 3.7 Sonnetが有効化済みであること
  • 作業用端末にてAWS CLIの認証情報が設定済みであること(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCCESS_KEY)

3. オレゴンリージョン(us-west-2)のAmazon BedrockにてClaude 3.7 Sonnetを有効化する

では、オレゴンリージョンのAmazon BedrockにてClaude 3.7 Sonnetを有効化していきましょう。
(※)AWS公式に手順が記載されています

1. AWSマネジメントコンソールにログインし、リージョンをオレゴンリージョン(us-west-2)に切り替えてください。

2. AWSマネジメントコンソール上部の検索エリアに[Bedrock]と入力して、Bedrockホーム画面を開いてください。

3. Berock画面左側の[Bedrock configurations] > [モデルアクセス]を選択してください。

4. モデルアクセス画面の[モデルアクセスを変更]を選択してください。

5. ベースモデルの検索エリアに[Claude 3.7 Sonnet]と入力して、Enterを押下してください。

6. 検索結果の[Claude 3.7 Sonnet]を選択して、[次へ]を選択してください。

7. モデルアクセスの変更について利用規約があるので、確認して[送信]を選択してください。

8. BedrockからClaude 3.7 Sonnetへのアクセスが付与されていることを確認してください。

これでオレゴンリージョンのAmazon BedrockにてClaude 3.7 Sonnetが有効化されました!

4. 作業用端末にてAWS CLIの認証情報を設定する

続いて、IAMユーザを新規作成し、AWS CLIにて認証情報を設定しましょう。

1. AWSマネジメントコンソール上部の検索エリアに[IAM]と入力して、IAMホーム画面を開いてください。

2. IAM画面左側の[アクセス管理] > [ユーザー]を選択して、IAMユーザ一覧画面を表示してください。

3. [ユーザーの作成]を選択してください。

4. ユーザ詳細画面にて以下を設定し、[次へ]を選択してください。

項目名設定値
ユーザー名strands-agents-handson-user
AWSマネジメントコンソールへのユーザーアクセスを提供するチェックなし

5. 今回はハンズオンのためAmazon Bedrockへのフルアクセス権限を付与してIAMユーザを作成してください。
(※)実際にシステム構築する際は、AWSベストプラクティスである「最小権限の原則」に従い、必要な権限のみ付与するようにしてください。

6. IAMユーザ作成後、該当IAMユーザの詳細画面からアクセスキーを発行しましょう。
[セキュリティ認証情報]タブの[アクセスキー]セクションにて、[アクセスキーを作成]を選択してください。

7. ユースケースを選択して、[次へ]を選択してください。

8. 説明タグは省略して[アクセスキーを作成]を選択してください。

9. アクセスキーをダウンロードし外部に漏れないように厳重に保管してください。

10. ターミナルを開き、環境変数にさきほど作成したIAMユーザの認証情報を設定しましょう。

export AWS_ACCESS_KEY_ID=<IAMユーザのアクセスキー>
export AWS_SECRET_ACCESS_KEY=<IAMユーザのシークレットアクセスキー>
export AWS_REGION=us-west-2

5. 改めてサンプルコードを実行してみる

では、改めてStrands Agentsのサンプルコードを実行してみましょう!

1. 以下コマンドを実行してください。

python -u agent.py

2. 以下のように回答を得ることができました!

# AIエージェントとは

AIエージェントとは、一定の自律性を持ち、環境を認識し、決断を下し、目標達成に向けて行動する人工知能システムです。

## AIエージェントの主な特徴

1. **自律性**: 人間の継続的な指示なしに動作できる
2. **環境認識**: センサーやデータを通じて周囲の状況を把握する
3. **目標指向**: 特定の目標達成に向けて行動する
4. **意思決定能力**: 選択肢から最適な行動を判断する

## AIエージェントの種類

- **単純反射型**: 現在の状態のみに基づいて行動(例:温度センサー付き温度調節器)
- **モデルベース**: 環境の変化を予測する内部モデルを持つ
- **目標ベース**: 具体的な目標達成のために計画を立てる
- **効用ベース**: 様々な状態の「望ましさ」を評価して行動を決定する
- **学習型**: 経験から学習して行動を改善する

## 応用分野

- バーチャルアシスタント(Siri、Alexa等)
- 自動運転車
- ゲームAI
- トレーディングボット
- 推薦システム
- 産業用ロボット

AIエージェントは、複雑なタスクの自動化や人間の意思決定支援など、様々な分野で活用されており、技術の進歩とともにその能力と応用範囲は拡大しています。

このようにStrands Agentsを使用することで、わずか数行でAIエージェント機能を実装することができるようになります。


4. まとめ

今回はオープンソースのAIエージェントSDKであるStrands Agentsについての検証をまとめてみました。わずか数行でAIエージェントを簡単に実装できるため、様々なAIエージェントを実装し他システムとの連携も容易になるのではと考えています。皆様の一助になれば幸いです!

Related posts