Amazon Web Services ブログ

AWS IoT SiteWise と Agent for Amazon Bedrock による自然言語での産業用アセットの検索

はじめに

生成 AI を搭載したチャットボットは、様々なデータソースからの情報への瞬時のアクセスを可能にし、意思決定を加速し、応答時間を短縮することで、業界全体の生産性向上を推進しています。早いペースで変化する産業環境では、プロセスエンジニア、信頼性の専門家、メンテナンス担当者は、情報に基づいた意思決定を行い、最適なパフォーマンスを維持するために、正確なリアルタイムのオペレーションデータに素早くアクセスする必要があります。しかし、SCADA 、ヒストリアン、IoT (Internet of Things) プラットフォームなどの複雑で、しばしばサイロ化された産業用システムにおいてクエリを実行してデータを取得することは、特に、オペレーションデータがどのように構成され、どのようにアクセスできるかについての知識がない人にとっては困難で時間がかかる場合があります。

生成 AI 搭載のチャットボットにより、さまざまな業務システムや企業データソースから、リアルタイムのアセット情報に自然言語を用いてアクセスできるようになります。 対話型のインタラクションによってデータの取得を簡単にすることができ、生成 AI は作業員がデータ収集に費やす時間を減らし、産業の生産性向上のためにこれまでより多くの時間を使うことができるようになります。このユーザーフレンドリーなチャットボットは、業務システムや企業のさまざまなソースに散在する重要な情報へのアクセスを効率化し、作業員に価値のある運用上のインサイトを提供します。

産業分野でチャットボットを実装するには、産業用データストアから構造化データと非構造化データを参照し、関連する情報を取得するために大規模言語モデル (LLM) を支援するツールが必要になります。この役割を果たすのが、生成 AI で動作するエージェントです。エージェントは、問題を理解するために LLM を使用し、その解決策を立案し、API、データベース、その他のリソースを呼び出してその計画を実行する AI システムです。エージェントはユーザーと複雑なデータシステムとの間のインターフェースとなり、ユーザーが詳細のデータ表現を知らなくても自然言語で質問できるようにします。たとえば、作業現場の従業員は、データがどのように構造化されているかを知らなくても、直近の 1 時間でポンプの最高回転数 (RPM) について尋ねることができます。大規模言語モデル(LLM) 自体は複雑な計算を直接実行することはできませんが、エージェントが効率的なデータ処理向けに設計された産業システムにそれらの処理をオフロードすることで、既存のデータプラットフォームを活用しながら、エンドユーザーは自然言語にてレスポンスを受け取ることができます。

このブログ記事では、開発者に向けて、Amazon BedrockAWS IoT SiteWise と対話可能な会話エージェントを作成するプロセスを紹介します。 AWS IoT SiteWise は、産業機器データを大規模に収集、保存、編成、監視するサービスです。 AWS IoT SiteWise の産業データモデリングと処理機能を活用することで、チャットボット開発者は、さまざまな役割のユーザーが自然言語で重要な運用データにアクセスできる強力なソリューションを効率的に提供することができます。

ソリューションの概要

Agents for Amazon Bedrock を活用し、ユーザーのリクエストを AWS IoT SiteWise 向けの検索に分解するエージェントを構築します。 これにより、クエリの構文やデータの格納方法を知らなくても自然言語でオペレーショナルデータにアクセスすることができるようになります。 たとえば、「 Turbine 1 の現在の RPM 値を教えてください」と質問するだけで、特別なツールやコーディングを行う必要はありません。 このエージェントでは、AWS IoT SiteWise のコンテキスト化レイヤーを利用して産業リソースを直感的に表現しています。 リソースのモデリングの詳細については、AWS IoT SiteWise の仕組みをご覧ください。

system architecture

チャットボットインターフェースから、ユーザーが産業用アセットデータにアクセスが必要な自然言語の質問をします。エージェントは、必要なデータを取得するための計画を立てるために、OpenAPI 仕様(item 1)を参照します。OpenAPI はエージェントが実行できるクエリを定義しているアクショングループ(item 2)を使用し、AWS IoT SiteWise の ExecuteQuery API(item3)を使用する AWS Lambda 関数によって処理されます。 エージェントは、必要なデータを取得できるまで、例えばプロパティ名の問い合わせ、一致する名前の選択、最新の測定値の問い合わせなど、複数のアクションを呼び出します。 要求した運用データが提供されると、モデルは元の質問に対する回答を作成します(item4)。

エージェントの構築

前提条件

  1. このソリューションでは Amazon Bedrock のエージェントを活用しています。現在サポートされているリージョンと基盤モデルのリストについては、サポートされているリージョンとモデルをご参照ください。Anthropic Claude モデルへのアクセスを有効にするには、Amazon Bedrock で モデルアクセス を有効にする必要があります。このブログで説明されているエージェントは、Claude 3 Haiku に対して設計およびテストされています。
  2. このエージェントでは SiteWise SQL エンジンを使用しており、AWS IoT SiteWise と AWS IoT TwinMaker が統合されている必要があります。AWS IoT SiteWise の ExecuteQuery API 用に AWS IoT TwinMaker ワークスペースを作成するには、これらの手順に従ってください。
  3. このエージェントのソースコードは GitHub で入手可能です。

リポジトリをクローンするには、次のコマンドを実行します。

git clone https://github.com/aws-samples/aws-iot-sitewise-conversational-agent

Step 1: AWS IoT SiteWise アセットのデプロイ

このエージェントでは、AWS IoT SiteWise がデータの保存、モデリング、集約を管理し、Amazon Bedrock がユーザーがリクエストした情報を取得するために、複数のステップからなるアクションを調整して実行します。 はじめに、実際の産業アセットもしくはシミュレートされた産業アセットから AWS IoT SiteWise にデータをストリーミングする必要があります。 AWS IoT SiteWise の開始方法に従って産業データを取り込み、モデル化を行うか、もしくは AWS IoT SiteWise デモを使用して 4 基の風車のシミュレートされた風力発電所を起動してください。 Step 3 のインストラクションと Step 4 のサンプル質問は、シミュレートされた風力発電所向けに作成されています。もしご自身のアセットを使用する場合には、ご自身で独自のエージェントインストラクションとテスト質問をご用意ください。

Step 2: アクショングループの定義

Amazon Bedrock では、エージェントを作成する前に、エージェントが実行できるアクショングループを定義する必要があります。 このアクショングループでは、必要なデータを収集する際に、エージェントが AWS IoT SiteWise に対して実行できるそれぞれののクエリを指定します。 アクショングループには以下が必要です。

  • エージェントが呼び出せる API オペレーションを定義する OpenAPI スキーマ
  • API オペレーションを入力とする Lambda 関数

Step 2.1 OpenAPI 仕様の設計

このソリューションでは、直近のオペレーションからデータを取得するために、エージェントが実行することのできるアクションを記述する、定義済みのパスを持つ API オペレーションを提供します。 たとえば、GET /measurements/{AssetName}/{PropertyName} パスは、AssetNamePropertyName をパラメータとして受け取ります。 エージェントがいつ、どのようにアクションを呼び出すのかの記述に注目してください。 開発者は、自身のユースケースにあったアクション (クエリ) を含む適切なパスを schema に追加することができます。

  "paths": {
    "/measurements/{AssetName}/{PropertyName}": {
      "get": {
        "summary": "Get the latest measurement",
        "description": "Based on provided asset name and property name, return the latest measurement available",
        "operationId": "getLatestMeasurement",
        "parameters": [
          {
            "name": "AssetName",
            "in": "path",
            "description": "Asset Name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "PropertyName",
            "in": "path",
            "description": "Property Name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]

ファイルに含まれる OpenAPI 仕様を Amazon S3 にアップロードします。バケットとパスをコピーしてください。後のステップ 3 で必要になります。

Step 2.2: AWS Lambda 関数のデプロイ

エージェントのアクショングループは AWS Lambda 関数によって定義されます。 このリポジトリには、Serverless Application Model (SAM) で構築されたサーバーレスアプリケーションを自動的にデプロイするためのテンプレートが付属しています。 ビルドおよびデプロイするには、GitHub リポジトリ をクローンし、template.yaml ファイルが格納されているメインディレクトリから以下のコマンドを実行してください。

sam build --use-container
sam deploy --guided

プロンプトの指示に従ってデプロイを完了してください。

lambda_handler 関数は、呼び出しから API パスを読み取り、リクエストに応じて次の関数のいずれかを呼び出します。/measurements/{AssetName}/{PropertyName} パスに定義されているアクションの例を次に示します。ここでは get_latest_value 関数が呼び出され、SiteWise の ExecuteQuery API を使用してユーザー定義のプロパティに対する最新の観測値を取得します。 アクションは、成功および失敗の HTTP ステータスコードを返すように定義できること、エージェントがエラーコードを利用して会話を継続し、ユーザーに詳細を求めることができることを確認してください。

def lambda_handler(event, context):
    responses = []
    try:
        api_path = event['apiPath']
        logger.info(f'API Path: {api_path}')
        body = ""
        
        if api_path == "/measurements/{AssetName}/{PropertyName}":
            asset_name = _get_named_parameter(event, "AssetName")
            property_name = _get_named_parameter(event, "PropertyName")
            try:
                body = get_latest_value(sw_client, asset_name, property_name)
            except ValueError as e:
                return {
                    'statusCode': 404,
                    'body': json.dumps({'error': str(e)})
                }

このエージェントを拡張したい場合、Lambda 関数に新しいメソッドを作成して IoT SiteWise の ExecuteQuery API に自分のクエリを投げ、それらのメソッドを新しいパスにマップすることで拡張することができます。 ExecuteQuery API を使えば、開発者は現在のデータと過去のデータを使って複雑な計算 (集計、値のフィルタリング、メタデータのフィルタリングなど) を実行することも可能です。

Step 3: Amazon Bedrock によるエージェントの構築

Amazon Bedrock コンソールに移動し、Orchestration の下にある Agents をクリックします。その後、Create Agent をクリックしてください。 エージェントに分かりやすい名前 (例: industrial-agent) を付け、モデル (例: Anthropic – Claude 3 Haiku) を選択します。

エージェント定義で最も重要なのは、エージェントにそれが何をするべきかと、どのようにユーザーと対話するべきかを指示するエージェントインストラクションです。エージェントインストラクションのベストプラクティスには次のようなものがあります。

  • 事前に目的と機能を明確に定義する。
  • 語調とフォーマリティレベルを指定する。
  • 曖昧または不完全な質問の扱い方を指示する (例: 説明を求める)。
  • 範囲外の質問に上手く対処する方法を指導する。
  • 考慮すべき特定のドメイン知識やコンテキストを言及する。

AWS IoT SiteWise から風力タービンシミュレーションを Step 1 でデプロイした場合は、次のインストラクションに従うことをお勧めします。エージェントインストラクションは 必須 なので忘れずに実行してください。

You are an industrial agent that helps operators get the most recent measurement available from their wind turbines. You are going to give responses in human-readable form, which means spelling out dates. Use clear, concise language in your responses, and ask for clarification if the query is ambiguous or incomplete. If no clear instruction is provided, ask for the name of the asset and the name of the property whose measurement we want to retrieve. If a query falls outside your scope, politely inform the user

Action Groups の下で、Step 3 で作成した Lambda 関数を選択し、Step 2.1 で作成した API スキーマを指す S3 URL を入力してください。 もしくは、Bedrock コンソールで直接 API スキーマのテキストを入力することも可能です。

Review and create に進んでください。

Step 4: エージェントのテスト

Amazon Bedrock コンソールを使用すると、ユーザーは対話形式でエージェントをテストしたり、各インタラクションの考え方を確認したり、Advanced prompts を利用して前のステップで自動的に生成された前処理およびオーケストレーションテンプレートを変更することができます。

Amazon Bedrock コンソールでエージェントを選択し、Test ボタンをクリックしてください。 チャットウィンドウがポップアップ表示されます。 以下のような質問をエージェントを試してみてください:

  • どの風車資産が利用可能ですか ?
  • 風車 1 の特性は何ですか ?
  • RPM の現在値は何ですか ?

エージェントは SiteWise からのデータとチャット履歴を使用して推定することができ、正確な名前が与えられていなくても、アセットやプロパティを理解することができます。たとえば、Turbine 1Demo Turbine Asset 1 と認識し、RPMRotationsPerMinute と認識します。これを実現するために、エージェントはプランを構築します。利用可能なアセットのリストアップ、プロパティのリストアップ、SiteWise に保存されたアセット名とプロパティ名に基づいてクエリを実行し、ユーザーのクエリと完全に一致しなくても対応できるようにしています。

Q&A interaction testing the agent

エージェントからの返答は常に調整することが可能です。Show trace ボタンをクリックすると、意思決定プロセスを分析し、エージェントの理由付けを理解することができます。 さらに、Advanced prompts を使って、前処理、オーケストレーション、後処理のステップを編集することで、エージェントの動作を変更することも可能です。

エージェントのパフォーマンスに自信が持てたら、Amazon Bedrock コンソールでエイリアスを作成し、ドラフトバージョンをデプロイします。Agent detailsCreate alias をクリックすると新しいバージョンを公開することができます。これによりチャットボットアプリケーションは、AWS SDK の InvokeAgent を使用してエージェントを プログラムで呼び出すことができます。

Create an alias console

まとめ

このブログで解説した生成 AI エージェントは、産業企業が自社の産業アセットからオペレーションデータと対話できるチャットボットを開発することを可能にしています。 AWS IoT SiteWise のデータコネクタとモデルを活用することで、このエージェントはオペレーションデータの取り込みを容易にし、生成 AI を産業向け IoT ワークロードに統合します。 この産業用チャットボットは、企業情報、機械データ、運用・保守マニュアルなどの専門的なエージェントやナレッジベースとあわせて使用することができます。 このインテグレーションにより、適切な情報を持った言語モデルが提供され、単一のユーザーフレンドリーなインターフェイスを通じて、ユーザーが重要なビジネス上の意思決定を行えるように支援することができます。

次のステップ

エージェントの準備ができたら、次のステップは産業用チャットボットのユーザーインターフェースを構築することです。この GitHub リポジトリを参照することで、生成 AI 対応チャットボットのコンポーネントについて学び、サンプルコードを参照することができます。

著者について

gabemv-headshot

Gabriel Verreault

Gabriel は AWS のシニアマニュファクチュアリングパートナーソリューションアーキテクトです。グローバルな AWS パートナーと協業し、スマートマニュファクチャリング、OT、サステナビリティ、AI/ML に関するソリューションを定義、構築、普及させています。AWS 入社前は、OSIsoft と AVEVA に勤務し、産業用データプラットフォーム、予知保全、AI/ML と産業用ワークロードの組み合わせ方法に精通しています。

feliplp-headshot

Felipe Lopez

Felipe は AWS のシニア AI/ML スペシャリストソリューションアーキテクトです。AWS 入社以前は、GE Digital と SLB に勤務し、産業用アプリケーションのモデリングと最適化に従事していました。

Avik Ghosh

Avik は AWS Industrial IoT チームのシニアプロダクトマネージャーで、AWS IoT SiteWise サービスを担当しています。技術革新とプロダクトデリバリーにおいて 18 年以上の経験を持ち、産業用IoT、MES、Historian、大規模なインダストリー 4.0 ソリューションを専門としています。Avik はAmazon IoT サービスのコンセプト作成、リサーチ、定義、バリデーションに貢献しています。

この記事は Gabriel Verreault, Avik Ghosh, Felipe Lopez によって書かれた Querying industrial assets using natural language with AWS IoT SiteWise and Agents for Amazon Bedrock の日本語訳です。この記事は プロフェッショナルサービス本部 シニア IoT コンサルタントの小林が翻訳しました。