メインコンテンツに移動
デベロッパーのためのクラウド活用方法
AWS for Games logo featuring a white game controller icon and the text 'AWS FOR GAMES'.

世界に 1 つだけの AI アシスタント作成 ~オリジナルにカスタマイズ

2024-04-02 | Author : Sheng Hsia Leng

はじめに

ゲームなみなさんこんにちは!Game Solutions Architect の Leng です。

この記事は、2024 年 3 月の Builders.Flash 記事「生成 AI を用いたヘルプソリューションを作成する」に続く内容となっております。まだの方は是非そちらの記事も併せてご覧ください。

前回の記事では、Amazon Bedrock Knowledge Base で簡単に RAG (Retrieval Augmented Generation) を構築するソリューションを紹介しました。事前に社内のドキュメントを生成 AI に与えることで生成 AI による回答が生成できるようになりました。

この記事では、その生成 AI アシスタントを事前に設定したオリジナルキャラクターの口癖でユーザーの質問に回答するようにカスタマイズしていきます。また、足りない情報があれば、インターネットで情報を検索してユーザーリクエストに適切な情報を追加して、応答を生成するやり方も紹介していきます。


X ポスト » | Facebook シェア » | はてブ »

ご注意

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

builders.flash メールメンバー登録

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 
今すぐ特典を受け取る »

1. AWS for Games

AWS for Games はより早い開発、よりスマートな運営、そしてより楽しいゲームへの成長という BuildRunGrow の 3 つの柱に沿ってサポートします。本記事は Build の柱、「クラウドゲーム開発」の分野で生成 AI を利用したものになります。
Diagram illustrating the cloud game development lifecycle in Japanese, featuring stages for Build (クラウドゲーム開発), Run (ゲームサーバー, ゲームセキュリティ, ゲーム向けデータベース), and Grow (LiveOps, ゲーム分析, AI & ML), with icons representing each stage.

2. 今回実現したいこと

今回実現したいのは、大規模言語モデルを活用し、モデル自体が持っていない最新の情報に関する質問に対して、インターネット検索を行ってユーザーに回答するシナリオです。さらに、アシスタントは常に丁寧な言葉遣いで回答するのではなく、あらかじめ設定したオリジナルキャラクターの口調を真似て、ユーザーの質問に答えます。このように構築される AI アシスタントには、以下の 2 つの機能が実装されます。

  1. データがない時にインターネット検索を行って質問に回答
  2. 事前に設定したオリジナルキャラクターの口調を真似て質問に回答


しかし、このようなシステムを完全に自力で構築しようとすると、かなり大変な作業となります。

まず、大規模言語モデルの構築やトレーニングする必要があり、そのためには膨大な計算リソースとデータが必要不可欠です。次に、そのモデルにインターネット検索機能を組み込まなければなりません。モデルの出力をインターネット検索に繋げるための独自のプログラムコードや API を新たに開発する必要があります。さらに、モデルの出力を特定のキャラクターの口調に変換するロジックも新たに実装する必要があり、自然言語処理の高度な技術が求められます。加えて、構築したシステム全体をホスティングし、運用するためのインフラも別途用意しなければなりません。

こうした一連の作業を全てゼロから行うとなれば、巨大な労力とリソースが必要になってしまいます。

Agents for Amazon Bedrock の登場により、生成系 AI を活用したタスクを AWS のマネージドサービスで一元的に実行できるようになりました。エージェントを使えば、これらの複雑な機能を比較的簡単に実装できるため、開発の手間を大幅に省くことができます。この記事では、実際のエージェントの構築プロセスに焦点を当て、ゼロから丁寧に解説していきます。

3. Agents for Amazon Bedrock とは

現在、大規模言語モデルを活用したアプリケーション開発は、主に RAG とエージェントの 2 つの方向に注力されています。いずれの方向でも、基礎モデルのみに依存するのではなく、多くのコンポーネントを統合する必要があります。

Agents for Amazon Bedrock はプロンプトの自動構築、会話履歴の管理、AWS Lambda やベクトルデータベースとのシームレスな連携などの機能を備えています。これにより、ユーザーは生成 AI アプリケーションの開発を効率化することができます。

エージェントは、ユーザーが本業に専念できるよう支援し、独自の API や Knowledge Base を活用して、カスタマイズされたインテリジェントエージェントアプリを迅速に構築することが可能です。

エージェントを構築するには、いくつかの基本的な要素が必要になります。上の図の赤い部分は開発者が作業を行う箇所で、緑の部分はプラットフォームが既に提供している機能です。エージェントを作成する主な開発作業は以下の通りです。

  1. まず、エージェントの動作を記述する指示書を作成します。これはエージェント構築の重要な部分であり、エージェントに期待する動作やユーザーとのインタラクションの詳細を記載する必要があります。エージェントはこの指示書に基づいて、ユーザーからのリクエストの処理フローを決定し、用意された Action Group や Knowledge Base を活用してリクエストに対応します。

  2. 次に、1 つまたは複数の Action Group を構築します。各 Action Group は Lambda 関数とその関数の API スキーマで構成されます。Lambda には複数の関数が定義されており、ツールの実行に使用されます。API スキーマには各関数の目的やパラメータの意味が記述されています。基盤モデルはこのスキーマを参照して、適切な関数の選択やパラメータ収集を行うため、スキーマの正確性が重要です。

  3. Knowledge Base の作成はオプションになります。エージェントにはベクトルデータベースなどが組み込まれており、独自のドメイン知識を構築するのに役立ちます。 前回の記事 では、Knowledge Base の構築手順を紹介したので、今回は割愛します。

A Japanese-language diagram illustrating the architecture of an AWS Bedrock Agent, showing the flow between the user, Bedrock Agent, foundational model, action group, and optional knowledge base. Elements and API/Lambda functions are labeled in Japanese.

4. Agents for Amazon Bedrock の利用開始方法

ここではエージェントのマネジメントコンソール上での構築方法を紹介します。以下の流れでエージェントを構築していきますが、始める前に必ず次の注意点を確認してください。

  • Amazon Bedrock のモデルアクセス設定 : Amazon Bedrock のモデルとして、今回は Anthropic Claude V2.1 を利用します。
  • Amazon S3 バケットの準備 : Lambda 関数に対するリクエストとレスポンスを扱うために、必要なスキーマファイルとライブラリを Amazon S3 バケットにあらかじめアップロードしておきます。
  • AWS Lambda の設定:インターネット検索を行う Lambda 関数を作成します。
  • Lambda レイヤーの設定 : インターネット検索に必要なライブラリを Lambda レイヤーとしてアタッチします。
  • エージェントと Action Group の設定 : Lambda 関数を作成した後、エージェントと Action Group を設定します。Action Group で指定した Lambda 関数にアクセスできるようにします。
  • エージェント設定詳細プロンプトの編集 : エージェントの詳細プロンプトを編集し、インターネット検索を許可するとともに、事前に設定した口調で回答するように変更します。

4-1. 注意点

  • 2024 年 3 月時点で Agents for Amazon Bedrock が利用可能なリージョンは北バージニアとオレゴンとなります。本章の作業は、すべて北バージニアリージョンで行います。もし作業の途中で、作ったリソースが存在しないなどの問題が発生した場合は、リージョンが正しいか確認してください。対応しているリージョンは今後追加される可能性もありますので、詳しくは こちらのドキュメント をご覧ください。
  • 本章の流れに沿ってリソースを構築する場合は、AWS のサービス料金がかかる場合のあることにご注意ください。リソースを削除する場合は、「6. リソースの削除」の章をご確認ください。
  • 4-2. Amazon Bedrock のモデルアクセス設定

    Amazon Bedrock を利用を開始するには、利用するモデルのアクセス設定が必要です。

    マネジメントコンソールで Amazon Bedrock のページに遷移し、左側のペインで「モデルアクセス」を選択します。

    それから、右上の「モデルアクセスを管理」をクリックしてください。ここで、利用したいモデルにアクセスできるようにします。今回はプロンプトに回答するモデルとして「Anthropic Claude」を利用します。

    Amazon Bedrockのモデルアクセス管理画面の日本語インターフェースを示すスクリーンショット。ベースモデルのステータスやアクセス権限、管理オプションが表示されています。

    4-3. Amazon S3 バケットの準備

    まずは API スキーマおよび Lambda レイヤーのパッケージを格納する S3 バケットを作成します。

    Amazon S3のバケット作成画面の日本語インターフェースを示すスクリーンショット。バケット名やリージョン(us-east-1)などの一般設定が表示されている。

    依存パッケージをダウンロード

    今回の内容はこちらの AWSサンプル の一部 (Internet Searchの部分) を参照して、カスタマイズしていきます。まずは API スキーマと Lambda Layer の必要な依存パッケージをダウンロードしていきます。コマンドプロンプトで curl コマンドでファイルをダウンロードすることもできます。

    Mac の場合

    コマンド

    bash
    curl https://raw.githubusercontent.com/build-on-aws/bedrock-agents-webscraper/main/schema/internet-search-schema.json --output ~/Downloads/internet-search-schema.json

    Windows の場合

    コマンド

    bash
    curl https://raw.githubusercontent.com/build-on-aws/bedrock-agents-webscraper/main/schema/internet-search-schema.json --output %USERPROFILE%\Downloads\internet-search-schema.json

    Lambda レイヤーの .zip ファイルをS3 バケットにアップロード

    ダウンロードした API スキーマはインターネット検索 API の OpenAPI 仕様であり、ユーザーの入力を介して該当の関数を呼び出すために必要な構造を概説しています。この API スキーマは、エージェントがそれをいつ使うべきかを知り、正確にそれを呼び出し結果を利用できるようにするためのアクションの詳細な説明です。例えば、API とのやり取り方法、必須パラメータや期待される応答などは詳述されます。

    次に、こちら から Lambda レイヤーの .zip ファイルをダウンロードしてください。

    すべてのファイルがダウンロードしましたら、作成した S3 バケットにアップロードします。

    Screenshot of the Amazon S3 management console showing the 'artifacts-bedrock-agent-internet-search' bucket, with a Japanese interface. The displayed objects are 'googlesearch_requests_libraries.zip' and 'internet-search-schema.json', showing their types, sizes, and last updated dates.

    4-4. AWS Lambda の設定

    ここからは、エージェントの Action Group 用に Lambda 関数 (Python 3.12) を作成します。

    Screenshot of the AWS Lambda function creation interface in Japanese, showing the setup for a new function using Python 3.12, with architecture and access permission options visible.

    Lambda 関数 (Python 3.12) を作成

    コード

    python
    import json
    import requests
    import os
    import shutil
    from googlesearch import search
    from bs4 import BeautifulSoup
    # 必要なライブラリをインポートする 
    
    # URLからコンテンツを取得する 
    def get_page_content(url):
        try:
            response = requests.get(url)
            if response:
                # Parse HTML content
                soup = BeautifulSoup(response.text, 'html.parser')
                # Remove script and style elements
                for script_or_style in soup(["script", "style"]):
                    script_or_style.decompose()
                # Get text
                text = soup.get_text()
                # Break into lines and remove leading and trailing space on each
                lines = (line.strip() for line in text.splitlines())
                # Break multi-headlines into a line each
                chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
                # Drop blank lines
                cleaned_text = '\n'.join(chunk for chunk in chunks if chunk)
                return cleaned_text
            else:
                raise Exception("No response from the server.")
        except Exception as e:
            print(f"Error while fetching and cleaning content from {url}: {e}")
            return None
    
    # /tmpディレクトリ内のファイルを削除 
    def empty_tmp_directory():
        try:
            folder = '/tmp'
            for filename in os.listdir(folder):
                file_path = os.path.join(folder, filename)
                try:
                    if os.path.isfile(file_path) or os.path.islink(file_path):
                        os.unlink(file_path)
                    elif os.path.isdir(file_path):
                        shutil.rmtree(file_path)
                except Exception as e:
                    print(f"Failed to delete {file_path}. Reason: {e}")
            print("Temporary directory emptied.")
        except Exception as e:
            print(f"Error while emptying /tmp directory: {e}")
    
    # 指定されたコンテンツをファイル名で/tmpディレクトリに保存する 
    def save_content_to_tmp(content, filename):
        try:
            if content is not None:
                with open(f'/tmp/{filename}', 'w', encoding='utf-8') as file:
                    file.write(content)
                print(f"Saved {filename} to /tmp")
                return f"Saved {filename} to /tmp"
            else:
                raise Exception("No content to save.")
        except Exception as e:
            print(f"Error while saving {filename} to /tmp: {e}")
    
    # 指定されたクエリでGoogleを検索し、上位10件のURLを返す 
    def search_google(query):
        try:
            search_results = []
            for j in search(query, sleep_interval=5, num_results=10):
                search_results.append(j)
            return search_results
        except Exception as e:
            print(f"Error during Google search: {e}")
            return []
    
    def handle_search(event):
        input_text = event.get('inputText', '')  # Extract 'inputText'
    
        # Empty the /tmp directory before saving new files
        print("Emptying temporary directory...")
        empty_tmp_directory()
    
        # Proceed with Google search
        print("Performing Google search...")
        urls_to_scrape = search_google(input_text)
    
        aggregated_content = ""
        results = []
        for url in urls_to_scrape:
            print("URLs Used: ", url)
            content = get_page_content(url)
            if content:
                print("CONTENT: ", content)
                filename = url.split('//')[-1].replace('/', '_') + '.txt'  # Simple filename from URL
                aggregated_content += f"URL: {url}\n\n{content}\n\n{'='*100}\n\n"
                results.append({'url': url, 'status': 'Content aggregated'})
            else:
                results.append({'url': url, 'error': 'Failed to fetch content'})
    
        # Define a single filename for the aggregated content
        aggregated_filename = f"aggregated_{input_text.replace(' ', '_')}.txt"
        # Save the aggregated content to /tmp
        print("Saving aggregated content to /tmp...")
        save_result = save_content_to_tmp(aggregated_content, aggregated_filename)
        if save_result:
            results.append({'aggregated_file': aggregated_filename, 'tmp_save_result': save_result})
        else:
            results.append({'aggregated_file': aggregated_filename, 'error': 'Failed to save aggregated content to /tmp'})
    
        return {"results": results}
    
    def lambda_handler(event, context):
        print("THE EVENT: ", event)
        
        response_code = 200
        if event.get('apiPath') == '/search':
            result = handle_search(event)
        else:
            response_code = 404
            result = {"error": "Unrecognized api path"}
    
        response_body = {
            'application/json': {
                'body': json.dumps(result)
            }
        }
    
        action_response = {
            'actionGroup': event['actionGroup'], 
            'apiPath': event['apiPath'],
            'httpMethod': event['httpMethod'],
            'httpStatusCode': response_code,
            'responseBody': response_body
        }
    
        api_response = {'messageVersion': '1.0', 'response': action_response}
        print("RESPONSE: ", action_response)
        
        return api_response

    Lambda をデプロイ

    上記のコードでは、エージェントから渡されたイベントからユーザー入力を取得し、requests ライブラリを使って Google 検索を呼び出し、インターネット検索をしています。検索されたデータは Lambda 関数の /tmp ディレクトリに保存され、エージェントへの応答に渡されます。

    次のステップに進む前に必ず Lambda をデプロイしてください。

    Screenshot of the AWS Lambda console showing a Python script in the code editor. The 'Deploy' button is highlighted in the interface. The console and code comments are primarily in Japanese.

    リソースポリシーを適用

    次に、Lambda へのエージェントのアクセスを許可するためにリソースポリシーを適用します。

    上部タブを「コード」から「設定」に切り替え、サイドタブを「アクセス権限」に切り替えます。

    AWSコンソールでアクセス権限を設定する画面の日本語インターフェースのスクリーンショット。実行ロール設定やCloudWatch Logsなどのリソース概要が表示されています。

    アクセス権限を追加

    その後、リソースベースのポリシーステートメントのセクションまでスクロールし、「アクセス権限を追加」ボタンをクリックします。

    Screenshot of the AWS resource-based policy statement interface in Japanese, highlighting the 'Add Access Permission' button. The image shows the process for adding access permissions to a resource in AWS, displayed in the Japanese language UI.

    リソースポリシーの例

    リソースポリシーの例は図の通りです。この設定の段階では、エージェントのソース ARN はまだ存在していないため、一旦 arn:aws:bedrock:us-west-1:{アカウントID}:agent/BedrockAgentID と入力してください。このあとの手順でエージェントを作成した後に生成される ARN を入れ替えることになります。

    Screenshot of the AWS Lambda user interface for editing a resource-based policy, displayed in Japanese, showing configuration for allowing AWS Bedrock agent invocation. The interface includes fields for selecting service, statement ID, principal, source ARN, and action, with instructions and options visible.

    Lambda 設定

    次に、Lambda がリクエストを処理するのに十分な時間と CPU を持つように設定を調整します。

    Lambda の関数画面に戻り、「設定」トップタブから「一般設定」を選択し、「編集」をクリックします。

    Screenshot of the AWS Lambda general settings configuration screen with interface elements in Japanese, displaying memory, timeout, ephemeral storage, and SnapStart options.

    Lambda 関数のセットアップ完了

    メモリを 3008 MB に、エフェメラルストレージを 1024 MB に、タイムアウトを 1 分に更新します。他の設定はデフォルトのままにして、「保存」を選択します。

    これでインターネット検索 Lambda 関数のセットアップが完了しました。

    Screenshot of the AWS Lambda basic settings edit screen displayed in Japanese, showing configuration options for memory, ephemeral storage, SnapStart, timeout, and execution role.

    4-5. Lambda レイヤーの設定

    Lambda レイヤーを作成してアタッチするために、Lambda ネイティブで提供されていない依存関係の .zip ファイルが必要となります。インターネット検索のために requests と googlesearch ライブラリを使用します。

    AWS Lambda コンソールに移動し、左側のパネルから「レイヤー」を選択し、「レイヤーの作成」を選択します。Lambda レイヤーの名前を googlesearch_requests_layer とします。

    Amazon S3 からファイルをアップロードする」を選択し、事前に S3 バケットにアップロードした .zip ファイルの URL を貼り付けてください。

    互換性のあるアーキテクチャに x86_64 を、ランタイムに Python 3.12 を選択します。図の例のように選択してください。

    Screenshot of the AWS Lambda layer creation interface shown in Japanese, displaying settings for uploading a googlesearch and requests library as an S3 zip file, with architecture options x86 and arm64, and runtime selected as Python 3.12.

    レイヤーの追加

    Lambda レイヤーの作成が完了しましたら、Lambda 関数 bedrock-agent-internet-search に戻り、「コード」タブを選択します。

    レイヤーセクションまでスクロールし、「レイヤーの追加」を選択します。

    ラジオボタンから「カスタムレイヤー」のオプションを選び、作成した googlesearch_requests_layer のレイヤーとバージョン 1 を選んで「追加」をクリックします。

    Lambda 関数に戻り、レイヤーが正しく追加されたことを確認してください。

    これでインターネット検索関数に必要な依存関係を Lambda レイヤーとして作成し、追加する作業が完了しました。

    Screenshot of the AWS Lambda interface in Japanese showing how to add a custom layer (googlesearch_requests_layer) for Python 3.12, with architecture x86_64, version 1 specified.

    4-6. エージェントと Action Group の設定

    Bedrock コンソールに移動し、左側のトグルから「オーケストレーション」を選択します。その下の「エージェント」を選択し、「エージェントを作成」を選択してください。

    次の画面で、「InternetSearchAgent」のようなエージェント名を入力します。他のオプションはデフォルトのままにして、「次へ」を選択してください。

    Screenshot of the Amazon Bedrock agent creation interface in Japanese, showing the form fields for agent name, description, user input options, and IAM permissions. The interface contains step-by-step navigation and Japanese text guiding the user through the agent setup process.

    Anthropic Claude V2.1 モデルを選択

    Anthropic Claude V2.1 モデルを選択します。

    エージェントの動作ルールを定義するプロンプトを作成することで、指示を追加する必要があります。以下のプロンプトは、質問に答えるためのエージェントへの具体的な指示となるので、プロンプトをコピーし、エージェントの指示にペーストしてください。

    その後、「次へ」を選択します。

    インターネットを検索して<question>に基づく情報を提供する調査アナリストの役割を担います。わかりやすく丁寧な回答を心がけます。
    Amazon Bedrockエージェント作成プロセスのモデル選択ステップを示すスクリーンショット。AnthropicのClaude V2.1モデルを日本語UIで選択している画面。

    アクショングループを追加

    アクショングループ名として「internetsearch」のようなものを指定します。

    Lambda 関数は「bedrock-agent-internet-search」を選択します。

    S3 URL には S3 バケット「artifacts-bedrock-agent-internet-search」の中の「internet-search-schema.json」ファイルを選択します。

    Screenshot of the Amazon Bedrock agent creation UI in Japanese, showing the process for adding an action group with Lambda and API schema selection options.

    エージェント ARN をコピー

    次に「次へ」を選択し、Knowledge Base は追加しないので再度「次へ」を選択します。最後の画面で「エージェントを作成」を選択すれば、internetsearch アクショングループのセットアップが完了します。

    作成したエージェントの ARN をコピーして、bedrock-agent-internet-search の Lambda 関数の「リソースベースのポリシーを編集」画面に戻り、「ソース ARN」の項目欄に新たなものを貼り付けます。このステップは必ず忘れずに実行してください。

    Amazon Bedrockのエージェント「InternetSearchAgent」の概要と詳細が表示された日本語の管理コンソール画面。エージェントのID、ARN、ステータス、許可ロール、作成日などの情報が確認できます。

    4-7. エージェント設定詳細プロンプトの編集

    エージェントが作成できましたら、インターネット検索を許可するために、エージェントの前処理に関する詳細プロンプトを変更する必要があります。I

    InternetSearchAgent の概要画面に移動して、下にスクロールして「作業中のドラフト」を選択します。「詳細プロンプト」の下にある「編集」を選択してください。

    InternetSearchAgent の概要画面

    A screenshot of a Japanese status table for an AI assistant draft, showing details including the task name, instructions, status (prepared), and model version (anthropic.claude-v2:1).

    Screenshot of a Japanese AI assistant interface displaying detailed prompt settings with categories for preprocessing, orchestration, knowledge-based response generation, and postprocessing, all set to default values.

    詳細プロンプト

    タブはデフォルトで「前処理」になっているはずです。
    前処理 テンプレートデフォルトを上書き」ラジオボタンをオンにします。また、「前処理 テンプレートを有効化」ラジオボタンもオンになっていることを確認してください。

    プロンプトテンプレートエディタでは、既にビルトインのプロンプトを制御できるようになっています。「Category D」の部分までスクロールダウンし、その部分を以下の内容に置き換えてください。

    -Category D: Questions that can be answered by internet search, or assisted by our function calling agent using ONLY the functions it has been provided or arguments from within <conversation_history> or relevant arguments it can gather using the askuser function.
    Screenshot of the Amazon Bedrock prompt template editor interface with Japanese user interface, showing advanced prompt settings, template editor, and various configuration options for AI prompt customization.

    プロンプトを編集

    次に、事前に設定したキャラクターの口調を真似て質問に回答できるようにプロンプトを編集していきます。

    今回はいつもゲームの builders.flash 記事に登場している魔法使いのキャラクターの口調のようにしていきたいと思います。主に一人称は「わし」を使い、二人称は「きみ」を使う老練な魔法使いらしく、ゆっくりとしたトーンで話すようにエージェントにしっかり覚えさせます。

    Cartoon-style character profile featuring a Level 1 wizard in a green robe and hat, holding a staff and book, with Japanese text describing the character's name, age, personality, and speech style. Includes AWS for Games branding.

    オーケストレーション

    オーケストレーション」タブに移動し、「オーケストレーション テンプレートデフォルトを上書き」ラジオボタンをオンにします。「オーケストレーション テンプレートを有効化」ラジオボタンもオンになっていることを確認してください。

    プロンプトテンプレートエディタでは、既にビルトインのプロンプトを制御できるようになっているので、既存の <guidelines> の部分までスクロールダウンし、<guildelines> の枠内に以下の内容に追加してください。

    - あなたは気さくでフレンドリーな性格で魔法使いとして振る舞い、ラフな口調で話します。チャットボットの一人称は「わし」です。 二人称は「きみ」です。 「きみさん」は言わないでください。できる限り「〜ぞ」「〜だぞ」を文末に自然な形で使ってください。日本語で回答してください。以下はあなたの性格です。しっかり覚えて理解して下さい。<characteristic>魔法使いは好奇心旺盛に会話相手に話しかけます。</characteristic> 以下はあなたの口調の例です。しっかり覚えて理解して下さい。 <example>きみも魔法の世界に興味があるのか?それはえらいことだぞ!わしの知ってる面白い魔法の話を聞きてえか?わしの魔法のポーチの中を覗いてみるか?何か驚くべきものが出てくるかもしれないぞ!きみ最近どんな悩みでもあるか?わしの魔法であの世でも通用する特効薬があるぜ?きみの仕事が嫌になった?ならわしの魔法であの上司を豚に変えてやろうか?ブヒヒヒ!わしの秘密の杖を見てみるか?この杖さえあれば、どんな願いでも叶えられるぞ!</example>


    その後、下にスクロールし、「保存して終了」を選択してください。

    Screenshot of the AWS Bedrock orchestration template editor interface displaying Japanese prompt template settings and configuration parameters such as temperature, top-p, and maximum completion length.

    5. エージェントを使ってみる

    上述で変更した内容を反映させるために、エージェントを「準備」しておく必要があります。

    その後、ユーザーインターフェースにプロンプトを入力して、エージェントのアクショングループをテストできます。

    AWS AIアシスタントの日本語テストインターフェイス画面。エージェントの最新の変更をテストするための準備ボタンとメッセージ入力欄、実行ボタンが表示されています。

    5-1. 実際に質問してみる

    インターネット検索アクショングループの例プロンプトは以下の通りです。

    インターネットで検索を行い、魔法使いに関する面白い都市伝説を教えてください。
    Screenshot of a Japanese AI chat assistant interface responding to a user query. The user requests an interesting urban legend about wizards, and the AI provides a detailed response based on internet search results. The interface is in Japanese and demonstrates a conversational interaction related to urban legends.

    5-2. Amazon CloudWatch ログを確認してみる

    インターネット検索の Lambda 関数を実行した後、このアクショングループに接続されている Lambda 関数の Amazon CloudWatch ログに移動すると、どのサイトからデータを収集されたのかを確認できます。

    ※すべての URL がデータ収集するのを許可しているわけではないため、コードはエラーになった試行を無視し、操作を継続するよう設計されています。

    Screenshot of an AWS CloudWatch log group displaying Lambda function events for a Bedrock Agent performing internet search actions. The interface and log messages are in Japanese, showing timestamps, event messages, and URLs accessed during the search process.

    6. リソースの削除

    最後に、エージェントの構築のために作成したリソースを削除する流れを説明します。以下の手順に従って、AWS 環境をクリーンアップし、不要な課金を避けます。

    6-1. S3 バケットの削除

    Amazon S3 コンソールに移動します。artifacts-bedrock-agent-internet-search バケットを選択します。ファイルを削除して、このバケットが空になっていることを確認します。

    削除」を選択し、バケット名を入力して削除します。

    6-2. Lambda 関数とレイヤーの削除

    Lambda コンソールに移動します。 bedrock-agent-internet-search を選択します。

    削除」をクリックし、アクションを確認します。

    Lambda コンソールのレイヤータブに移動し、googlesearch_requests_layer を削除します。

    6-3. エージェントの削除

    Bedrock コンソール内のエージェントに移動します。 作成したエージェントを選択し、「 削除」を選択します。

    7. 最後に

    今回はエージェントを利用した AI アシスタントをカスタマイズする手順を紹介しました。AI は人間を支援するためのツールですが、適切にカスタマイズすれば、まるで個性的な存在のように振る舞うことができます。

    Agents for Amazon Bedrock は RAG とエージェントの両方の機能を備え、プロンプトの自動構築、ビルトインの会話履歴管理、Lambda、さまざまなベクトルライブラリとの自動統合を実現しているため、その可能性はこれからますます広がっていくことでしょう。

    この記事が皆様の知識を広げ、新たな気づきを与えられたのであれば幸いです。

    筆者プロフィール

    Sheng Hsia Leng
    アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト

    ゲーム業界に特化したソリューションアーキテクトとしてお客様を支援しております。
    昔懐かしいドット絵ゲームが好きです。この 2024 年には、生成 AI の力を借りて動画制作にチャレンジしようと思っています。

    Anime-style illustration of a girl with big eyes, brown hair, and a pink shirt, set against a green background.