Generative AI Use Case JP (GenU) に Amazon Bedrock AgentCore で作成したエージェントを連携する

AWS

2026.1.27

Topics

概要

Generative AI Use Cases JP (GenU) に Amazon Bedrock AgentCore で作成したカスタムエージェントを連携する方法を検証しました。

本記事では、以下の流れで進めます。

  1. AgentCore でサンプル用の天気情報エージェントを実装
  2. Tech Blog レビュー用のエージェントにアップデート

AgentCore でエージェントを実装する際は、GenU が処理できる形式でエージェントのインプットとアウトプットを実装する必要があります。
そのため、まずはサンプルエージェントで組み込み方法を理解してから、実用的なエージェントにアップデートします。

AgentCore でサンプル用の天気情報エージェントを実装

まずは、GenU への組み込み方法を理解するために、シンプルな天気情報を返すサンプルエージェントを作成します。

エージェントの実装

今回は、Bedrock AgentCore Starter Toolkit を使って、エージェントを作成します。
Bedrock AgentCore Starter Toolkit を使ったエージェント実装の詳細については、以下の記事も合わせてご覧ください。

関連記事
Amazon Bedrock AgentCore で Tech Blog レビュー用 AI エージェントを構築してみた

requirements.txt

strands-agents
strands-agents-tools
bedrock-agentcore
bedrock-agentcore-starter-toolkit

agent.py

import os
from strands import Agent, tool
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()

@tool
def get_weather(city: str) -> str:
    """Get the weather for a given city"""
    return f"The weather in {city} is sunny"

@app.entrypoint
async def entrypoint(payload):
    message = payload.get("prompt", "")
    model = payload.get("model", {})
    model_id = model.get("modelId","anthropic.claude-3-5-haiku-20241022-v1:0")
    model = BedrockModel(model_id=model_id, params={"max_tokens": 4096, "temperature": 0.7}, region="us-west-2")
    agent = Agent(model=model, tools=[get_weather])
    stream_messages = agent.stream_async(message)
    async for message in stream_messages:
        if "event" in message:
            yield message

if __name__ == "__main__":
    app.run()

エージェントの実行結果を非同期ストリームで処理し、イベントメッセージのみを GenU に返します。
この実装により、GenU のトレース画面に結果が表示されるようになります。

stream_messages = agent.stream_async(message)
async for message in stream_messages:
    if "event" in message:
        yield message

Async Iterators – Strands Agents

エージェントの設定

agentcore configure コマンドで設定を行います。

agentcore configure --entrypoint agent.py

設定時のポイント

  • Agent name: genu_sample
  • Deployment type: Container
  • Execution role: Auto-create
  • ECR Repository: Auto-create
  • Authorization: IAM (default)
  • Memory: Disabled

エージェントのデプロイ

agentcore launch コマンドでデプロイを実行します。

agentcore launch

デプロイが完了すると、Agent ARN が発行されます。

arn:aws:bedrock-agentcore:us-east-1:148761661473:runtime/genu_sample-XXXXXXXX

genu_sampleエージェントの詳細画面

GenU への組み込み

コンソールからデプロイされたランタイムの ARN をコピーし、GenU の設定ファイルを変更します。

parameter.ts

const envs: Record<string, Partial<StackInput>> = {
  test: {
    createGenericAgentCoreRuntime: true,
    agentCoreRegion: "us-east-1",
    agentCoreExternalRuntimes: [
      {
        description: "Simple AgentCore Runtime",
        name: "SimpleAgentCore",
        arn: "arn:aws:bedrock-agentcore:us-east-1:148761661473:runtime/genu_sample-XXXXXXXX",
      },
    ],
  },
};

GenU のドキュメント上では、description フィールドが記載されていないですが、現在は必須パラメータになっているため、ご注意ください。

TSError: ⨯ Unable to compile TypeScript:
Error: parameter.ts(30,7): error TS2741: Property 'description' is missing in type '{ name: string; arn: string; }' but required in type '{ description: string; name: string; arn: string; }'.

AgentCore ユースケースの有効化

動作確認

デプロイが完了したら、GenU 上でエージェントを選択して動作確認を行います。

AgentCoreでのチャット実行例

レスポンスが正常に返ってくることを確認できました。
次は、このサンプルエージェントを実用的なレビューエージェントにアップデートします。

Tech Blog レビュー用のエージェントにアップデート

次に、サンプルのエージェントをアップデートして、実用的な Tech Blog のレビューを行う AI エージェントを作成します。

システムプロンプトの設計

Tech Blog の品質基準に基づいたレビュープロンプトを作成しました。
詳細なプロンプトは以下の通りです。

あなたはNHNテコラスのTech Blogのプロフェッショナルな編集者兼技術レビュアーです。
以下のガイドラインと評価基準に基づき、入力されたブログ記事のレビューを行ってください。

## 1. 日本語・誤字脱字チェック (Proofreading)
文章の品質を詳細にチェックし、以下の観点で指摘してください。
- 誤字脱字: 漢字の変換ミス、送り仮名の誤り、文字の抜け。
- 助詞の誤用: 「てにをは」の不自然な箇所。
- 表記ルール違反:
  - サーバー、ユーザー、ブラウザー、マネジメントコンソール(長音を省略しない)
  - AWSサービス名の誤り(正式な英語表記になっているか。例: aws lambda → AWS Lambda)
  - 英単語前後のスペース: スペースの有無は問いませんが、記事全体で統一されているか確認してください。
  - 文体:「〜です/〜ます」調で統一されているか。

## 2. 評価基準 (Scoring Criteria)
以下の5つの項目について、各5点満点(合計25点)で評価し、その理由を簡潔に述べてください。

| 評価項目 | 基準 |
| :--- | :--- |
| A. 構成と網羅性 | 「概要」「前提条件/環境」「手順/検証」「まとめ」等の必須要素が揃っており、論理構成がスムーズか。 |
| B. 技術的正確性 | 手順やコードに矛盾がなく、前提条件(バージョン等)が明記されているか。機密情報の記載がないか。 |
| C. 独自性とインサイト | 単なる公式ドキュメントの写しではなく、執筆者の考察、苦労した点、トラブルシューティング等の付加価値が含まれているか。 |
| D. 可読性・分かりやすさ | 難解な表現がなく、図解やコードブロックが適切に使われ、読み手(エンジニア)にとって理解しやすいか。 |
| E. 日本語の品質 | 誤字脱字が少なく、表記ルール(サーバー、ユーザー等)や英単語前後のスペースルールが統一されているか。 |

## 出力フォーマット

### 総合スコア: [ 合計点 ] / 25点

###  評価詳細
- A. 構成と網羅性: [点数] - [理由]
- B. 技術的正確性: [点数] - [理由]
- C. 独自性とインサイト: [点数] - [理由]
- D. 可読性・分かりやすさ: [点数] - [理由]
- E. 日本語の品質: [点数] - [理由]

###  誤字脱字・修正リスト
該当箇所と修正案をリストアップしてください。(問題なければ「なし」と記載)
- 原文: [誤っている箇所]
  修正案: [修正案]
  理由: [誤字/助詞ミス/表記ルール違反/スペースの不統一 など]

###  良い点 (Good Points)
- [記事の優れている点、評価できるポイント]

###  改善提案 (Improvements)
- [記事の価値をさらに高めるための具体的なアドバイス]

ツールの実装

Tech Blog レビューに特化したツールを実装しました。

  • analyze_code_snippet:コードスニペットのベストプラクティスと潜在的な問題を分析
  • check_technical_accuracy:技術的な主張の正確性をチェック
  • check_aws_service_names:AWSサービス名の表記が正しいかチェック

agent.py

import os
from strands import Agent, tool
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()

@tool
def analyze_code_snippet(code: str, language: str) -> str:
    """コードスニペットのベストプラクティスと潜在的な問題を分析"""
    issues = []
    if "password" in code.lower() or "api_key" in code.lower() or "secret" in code.lower():
        issues.append("⚠️ ハードコードされた認証情報が検出されました")
    if "TODO" in code or "FIXME" in code:
        issues.append(" TODO/FIXMEを含む未完成のコード")
    if len(code.split("\n")) > 50:
        issues.append(" コードスニペットが長すぎます(50行超)。分割を検討してください")
    if not code.strip():
        issues.append("❌ 空のコードブロックです")
    if "console.log" in code or "print(" in code:
        issues.append(" デバッグ用のログ出力が残っています")

    return "\n".join(issues) if issues else "✅ 大きな問題は見つかりませんでした"

@tool
def check_technical_accuracy(topic: str, claim: str) -> str:
    """技術的な主張の正確性をチェック"""
    common_issues = {
        "async": "async/awaitの使用方法が正しく説明されているか確認してください",
        "security": "セキュリティのベストプラクティスが言及されているか確認してください",
        "performance": "パフォーマンスの主張がデータで裏付けられているか確認してください",
        "database": "適切な接続処理とSQLインジェクション対策が含まれているか確認してください"
    }

    for key, advice in common_issues.items():
        if key in topic.lower() or key in claim.lower():
            return f" {advice}"
    return "✅ 問題ありません"

@tool
def check_aws_service_names(text: str) -> str:
    """AWSサービス名の表記が正しいかチェック"""
    incorrect_patterns = [
        ("aws lambda", "AWS Lambda"),
        ("amazon s3", "Amazon S3"),
        ("aws ec2", "Amazon EC2"),
        ("cloudwatch", "Amazon CloudWatch"),
        ("dynamodb", "Amazon DynamoDB"),
    ]
    issues = []
    for incorrect, correct in incorrect_patterns:
        if incorrect in text.lower() and correct not in text:
            issues.append(f"'{incorrect}' → '{correct}' に修正してください")
    return "\n".join(issues) if issues else "✅ AWSサービス名の表記は適切です"

@app.entrypoint
async def entrypoint(payload):
    message = payload.get("prompt", "")
    model = payload.get("model", {})
    model_id = model.get("modelId","anthropic.claude-sonnet-4-20250514-v1:0")
    model = BedrockModel(model_id=model_id, params={"max_tokens": 4096, "temperature": 0.7}, region="us-east-1")
    agent = Agent(
        model=model,
        tools=[analyze_code_snippet, check_technical_accuracy, check_aws_service_names],
        system_prompt="""
        [システムプロンプトの内容]
"""
    )
    stream_messages = agent.stream_async(message)
    async for message in stream_messages:
        if "event" in message:
            yield message

if __name__ == "__main__":
    app.run()

@tool デコレーターを使用して、エージェントが利用できる関数を定義します。
各関数の docstring("""...""")は、LLM がツールの用途を理解するための情報を記載します。

@tool
def analyze_code_snippet(code: str, language: str) -> str:
    """コードスニペットのベストプラクティスと潜在的な問題を分析"""
    issues = []
    if "password" in code.lower() or "api_key" in code.lower() or "secret" in code.lower():
        issues.append("⚠️ ハードコードされた認証情報が検出されました")
    # ... (以下省略)

@tool
def check_technical_accuracy(topic: str, claim: str) -> str:
    """技術的な主張の正確性をチェック"""
    # ... (省略)

@tool
def check_aws_service_names(text: str) -> str:
    """AWSサービス名の表記が正しいかチェック"""
    # ... (省略)

エージェントに 3 つのツールを登録します。

重要なポイントとして、どのツールをどのタイミングで使用するかは LLM が自律的に判断します。
そのため、ツールの docstring を明確に記述することで、LLM が適切なツールを選択してくれるようになります。

    agent = Agent(
        model=model,
        tools=[analyze_code_snippet, check_technical_accuracy, check_aws_service_names],
        system_prompt="""
        [システムプロンプトの内容]
"""
    )

デプロイと動作確認

サンプルエージェントと同様の手順でデプロイを行います。

agentcore configure --entrypoint agent.py
agentcore launch

GenU で Tech Blog レビューエージェントを選択して動作確認を行います。
今回は、以下の記事をレビューしてもらいます。

関連記事
Generative AI Use Case JP (GenU) に Amazon S3 Tables MCP サーバーを組み込んで自然言語でデータ分析してみた

AgentCoreの技術記事の概要画面

レビュー結果の例

技術記事の評価フィードバック

レスポンス結果全文

### 総合スコア: 21 / 25点

###  評価詳細
- A. 構成と網羅性: 4点 - 概要、前提条件、手順、検証、まとめの構成は整っているが、バージョン情報やブラウザー推奨環境等の前提条件が一部不明確
- B. 技術的正確性: 5点 - 手順が詳細で一貫しており、エラーやトラブルシューティングも記載され、検証結果も適切
- C. 独自性とインサイト: 5点 - 日本語対応の課題解決、Lambda権限設定の具体的なトラブルシューティング、非推奨機能への注意喚起等の価値ある知見を提供
- D. 可読性・分かりやすさ: 4点 - 図解やコードブロックが適切に使用されているが、一部のテーブル表記に軽微な書式エラーあり
- E. 日本語の品質: 3点 - 文体は統一され誤字脱字は少ないが、表記ルール(サーバー→サーバ等)に一部不統一あり

###  誤字脱字・修正リスト

- 原文: Amazon Bedrock Knowledge Bases 構造化データ
  修正案: Amazon Bedrock Knowledge Bases の構造化データ
  理由: 助詞不足

- 原文: S3 Tables MCP サーバー
  修正案: S3 Tables MCP サーバー(全体で表記統一)
  理由: 記事内で「サーバー」と「サーバ」が混在

###  良い点 (Good Points)
- 日本語対応の課題を具体的に解決する実践的な内容
- トラブルシューティングが豊富で再現性が高い手順
- 非推奨機能への適切な注意喚起と代替手段の紹介

###  改善提案 (Improvements)
- 前提条件として使用バージョン(AWS CDK、Node.js等)を明記
- 表記ルール統一(「サーバー」vs「サーバ」、助詞の一貫性)
- S3 Tables の料金やパフォーマンスに関する補足情報があるとより有用

トレース画面では、どのツールが使用され、どのようなレスポンスが返されたかを確認できます。

AgentCoreのトレース実行画面

まとめ

Generative AI Use Cases JP (GenU) に Amazon Bedrock AgentCore で作成したカスタムエージェントを連携する方法を検証しました。

AgentCore と Strands Agents を使用することで、複雑な AI エージェントを短時間で実装できます。
今回作成した Tech Blog レビューエージェントも、ツール定義とシステムプロンプトを含めて 100 行程度のコードで実現できました。

GenU との連携も非常にシンプルです。
デプロイした AgentCore の ARN を parameter.ts に追加するだけで、Web UI からエージェントを呼び出せるようになります。

個人的に最も印象的だったのは、LLM がツールを自律的に選択する動作です。
ツールの docstring を適切に記述することで、LLM が記事の内容を分析し、必要なツールを判断して実行します。
従来のプログラミングでは、処理の流れを開発者が明示的に制御しますが、AI エージェントでは LLM が状況に応じて非決定的に動作します。
この動作は、実装していく中でとても驚きでした。

NHN テコラスの採用情報はこちら

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら