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という概念を中心に構築されています。

[引用]

今回やること

  • ① 最初にエージェントを動かしてみる
  • ② ユーザーの質問が何の質問かを分類するエージェントの作成

準備

  • 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を選択して次へボタンをクリック後、画面が変わるので送信ボタンをクリック
  • 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でした。

Fusic 技術ブログ

Discussion