AWSのAgent構築 SDK Strands Agentsを試してみた
はじめに
Fusicのレオナです。今回はAWSが公開しているStrands Agent
について解説と実際に試してみます。
概要
Strands AgentsはAWSが2025年5月に公開したオープンソースのAIエージェント構築SDKです。数行のPythonコードでAIエージェントを作成できるモデル駆動型のフレームワークになります。Strands
AgentはLLMの推論力で計画、CoT(Chain-of-Thought)、ツールの呼び出しを行えます。Amazon Bedrock、Anthropic等のLLMプロバイダー、またLiteLLM経由で利用できるその他のプロバイダーを含め、推論とツール使用機能を持つモデルにもサポートされています。
Strands Agentsの概念
Strands Agentsのコアコンセプトは、Agentic Loop
です。これは、最初にエージェントがモデルに考えさせ、その後、必要なときにだけツールを呼び出すというプロセスです。
比較 | 単一エージェント | マルチエージェント | Strands Agents |
---|---|---|---|
定義 | 1体のAIエージェントが環境と対話し、単独でタスクを完結するシステム | 複数エージェントが役割分担して協調しながらタスクを遂行する分散システム | OSS エージェント SDK |
概念 | 単一のAgentが特定のタスクを達成するためのアクションを自己決定する | 複数のAgentが特定のタスクを協力して達成する(Workflow/Swarm など) | Agentic Loop |
以上の表は、単一エージェントシステム、マルチエージェントシステム、そしてStrands Agents SDKの違いをまとめてみました。Strands Agentsは、エージェント間でツールの呼び出しや推論をどのように扱うか、そしてそのプロセスを最適化するためのAgentic Loopという概念を中心に構築されています。
[引用]
- https://aws.amazon.com/jp/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk/
- https://github.com/strands-agents
- https://strandsagents.com/0.1.x/
今回やること
- ① 最初にエージェントを動かしてみる
- ② ユーザーの質問が何の質問かを分類するエージェントの作成
準備
- Python 3.10以上
- 自分はMacでuvで仮想環境を使用しています
- ライブラリをインストールする
uv pip install strands-agents strands-agents-tools strands-agents-builder
- 今回はClaude Sonnet 3.7を使用します。もしモデルの有効化ができていない場合は以下の手順でモデルの有効化を行って下さい。
- マネジメントコンソールから、Amazon Bedrock を開く -> 左ナビゲーションから
モデルアクセス
をクリック
-
モデルアクセスを変更
ボタンをクリック
- Claude Sonnet 3.7を選択して
次へ
ボタンをクリック後、画面が変わるので送信ボタン
をクリック
- マネジメントコンソールから、Amazon Bedrock を開く -> 左ナビゲーションから
- AWS CLIの認証情報を設定し、環境変数として保存します。
使用するデータセット
Hugging FaceでMITライセンスの公開されているallganize/RAG-Evaluation-Dataset-JAにある日本語ドキュメントと質問とドメインカラムを使います。
実装① エージェントを動かしてみる
from strands import Agent
agent = Agent()
agent("こんにちは")
結果①
こんにちは!お手伝いできることがあれば、お気軽にお尋ねください。何かご質問やお話ししたいことはありますか?
実装②
以下のコードは、ユーザーからの質問を読み取り、質問がどのドメインに該当するかを分類するエージェントを作成する例です。
from strands import Agent
agent = Agent(
system_prompt="""
役割
あなたは *ドメイン分類エージェント* です。ユーザーからの質問を読み取り、次の 5 つのドメインのうち **いずれか 1 つ** を割り当ててください。
• finance
• it
• manufacturing
• public
• retail
出力形式(必ずこの形式を厳守)
{
"domain": "<finance|it|manufacturing|public|retail>",
}
"""
)
データの準備
質問とその対応するドメインのデータを使って、エージェントに分類タスクを実行させます。
# 例: 各ドメインから1行ずつ抜いたデータフレームを作成
one_each = (
df.groupby('domain').head(1)
.reset_index(drop=True)
)
question_domain = one_each[['question','domain']].copy()
question_domain.reset_index(drop=True, inplace=True)
question_domain
question_domainには以下のようなデータフレームが生成されます。
question | domain |
---|---|
火災保険の収益悪化に対し、損害保険各社はどのような収益改善策を講じているか、具体的な例を挙げて説明してください。さらに、これらの改善策がどのように保険引受利益に影響を与えたかについても教えてください。 | finance |
データの共通理解がなされた状態とは、どのような状態を指すか? | it |
事業者が食品パッケージに「無添加」という表示を戦略的に使用したい場合、どのようなことに注意するべきですか? | manufacturing |
保健センターと保健所の違いを教えてください。 | public |
GDPの品質システムとして、卸売業者等の経営陣は具体的にどのような責任を担う必要があるか。また、経営陣の役割や役職目安についても教えてください。 | retail |
結果②
エージェントに対して質問を送信し、分類結果を取得します。
question_domain['agent_answer'] = question_domain['question'].apply(lambda q: agent(q))
question_domain
question | domain | agent_answer |
---|---|---|
火災保険の収益悪化に対し、損害保険各社はどのような収益改善策を講じているか、具体的な例を挙げて説明してください。さらに、これらの改善策がどのように保険引受利益に影響を与えたかについても教えてください。 | finance | json<br>"{<br> ""domain"": ""finance""<br>}<br>" |
データの共通理解がなされた状態とは、どのような状態を指すか? | it | json<br>"{<br> ""domain"": ""it""<br>}<br>" |
事業者が食品パッケージに「無添加」という表示を戦略的に使用したい場合、どのようなことに注意するべきですか? | manufacturing | json<br>"{<br> ""domain"": ""retail""<br>}<br>" |
保健センターと保健所の違いを教えてください。 | public | json<br>"{<br> ""domain"": ""public""<br>}<br>" |
GDPの品質システムとして、卸売業者等の経営陣は具体的にどのような責任を担う必要があるか。また、経営陣の役割や役職目安についても教えてください。 | retail | json<br>"{<br> ""domain"": ""manufacturing""<br>}<br>" |
最後に
Strands Agentsを使ったエージェントの作成は非常に簡単であり、LLMを簡単に行えることがわかりました。今回の実装では、ドメイン分類エージェントを作成しました。今回のケースでは分類がうまくいかない個所もありました。今後は、さらに複雑なワークフローやマルチエージェント構成に挑戦してみたいと思います。Strands Agentsは、AWSサービスを活用してAIエージェントを構築したい方にはおすすめしたいOSSでした。
Discussion