Amazon Q Businessでスマート工場を構築する「Building a smart factory with Amazon Q Business」に参加しました
はじめに
今回はre:Invent2024のセッション「Building a smart factory with Amazon Q Business」に参加してみたので紹介します!
概要
Learn how to build and deploy an AI assistant that seamlessly integrates with AWS services, enabling interaction with your industrial data in real time. Imagine an assistant that can answer questions like “What is the OEE for this line?” or compose maintenance requests. This workshop walks through the process of deploying an API to interface with industrial IoT services and creating a custom plugin in Amazon Q Business. Coding experience isn’t required, but some API design and industrial automation knowledge is helpful. Leave this workshop with a functional AI assistant that can be tailored to your factory’s needs. You must bring your laptop to participate.
[翻訳]
AWSサービスとシームレスに統合し、産業データとリアルタイムに対話できるAIアシスタントの構築と導入方法をご紹介します。このラインのOEEは何ですか?"のような質問に答えたり、メンテナンスリクエストを作成できるアシスタントを想像してみてください。このワークショップでは、産業用IoTサービスとのインターフェイスにAPIをデプロイし、Amazon Q Businessでカスタムプラグインを作成するプロセスを説明します。コーディングの経験は必須ではありませんが、API設計や産業オートメーションの知識があれば役に立ちます。このワークショップでは、工場のニーズに合わせた機能的なAIアシスタントを作ることができます。参加にはノートパソコンが必要です。
ワークショップに使用したドキュメント:https://catalog.workshops.aws/smart-factory-amazon-q/en-US/00-joining-the-workshop
自分なりに要約
モノを作る工場では色々な種類の情報が様々な方法で保管されています。
以下は一例です。
- 機器のデータ(IoT SiteWise)
- 作業の情報(SAPなどの社内システム)
- 機器のマニュアル(PDF化されたメンテナンスマニュアルなど)
目的のデータへアクセスする手段はあるけど、そこに辿り着くまでが大変だったり、データとドキュメントの関係性を理解して新しい洞察を得るのはなかなか大変な作業です。
そんな大変なことを優秀なAIアシスタント(Amazon Q Business)を使って解決しようぜ!というのがこのセッションの概要です。
こんな人におすすめ
すでにIoT SiteWiseや社内システムにデータが保管されているけど、データへのアクセス経路が散らばっている。
そんな人はAmazon Q を使って1つのインターフェイスから自然言語を使ってデータの分析や機器ドキュメントと組み合わせた洞察が得られるんじゃんないかと思います。
また、ワークショップではAPIとAmazon Qを連携するなど、多少ITの知識も必要なため
構築はITの方向け、実際に利用するのは現場の機器担当者の方や機器をメンテナンスするエンジニアの方向けなのかなと思います。
シナリオ
ビジネスシナリオを簡単に要約すると、
醸造所があり、そこには複数の工程と、それぞれ制御するシステムが存在します。
課題として、複数のシステムを行き来する必要があったり、システムごとに操作方法が異なるなど、情報へのアクセス効率が悪いという課題があります。
この課題に対して、1つのインターフェースで複数のシステムにアクセスできるAIアシスタントを構築するというのが本セッションのシナリオです。
今回の醸造所の工程は以下の図のようになっており、各工程ごとにシステムが異なることが想定されています。
以下は今回使用したアーキテクチャです。
データソースにはIoT SiteWise(機器データ)、作業指示システム、S3(機器ドキュメント類)が使用されており、IoT SiteWise、作業指示システムとの連携はAPI Gateway経由で行われています。
やっみた
まずはIoT SiteWiseに機器のデータが用意されていることを確認しておきます。
工程毎のアセットが用意されていますね。
API Gatewayの動作確認
1つ目のAPI Gatewayは、IoT SiteWiseから目的のアセットのデータを取得するLambda関数を呼び出すように設計されています。
2つ目のAPI Gatewayは、SAPのような社内システムと連携してSOPを作成するように設計されています。
1つ目のAPI Gatewayの動きを確認してみます。
まずはAPI Gatewayに渡すアセットIDをコピーします。
コピーしたアセットIDをAPI Gatewayに渡してテストします。
アセットの情報が得られました。が、、、このレスポンスでは読みづらいですね。
次に2つ目のAPI Gatewayを確認します。
今回は装置IDがMaltMillについて、年1のメンテナンスとキャリブレーションを行う指示書を作成します。
{
"equipmentId": "MaltMill",
"requestDescription": "Annual maintenance and calibration"
}
以下のようなレスポンスが返ってきて、SOPが追加されたことが確認できました。
"message": "Work order 16605 has been submitted for equipment MaltMill at 2024-12-0400:55:46.331827Z with the following request: Annual maintenance and calibration"
APIを叩くことで欲しい情報が得られることが分かりました。
しかし問題点もいくつかあります。
まずAPIによって返されたJSONが読みづらいですね。
これでは別途、情報を見やすくするためのアプリが必要だったり、特定の情報だけを抜き取る必要がありそうです。
また、情報を取得するインターフェイス(ここではAPI Gateway)がバラバラで、情報へのアクセス効率が悪いです。
そこで、全てのデータへ共通のインターフェイスからアクセスできるようにしつつ、返ってきた内容を簡単に活用できるように自然言語で会話ができるAIチャット(Amazon Q Business)を使います。
Amazon Q アプリケーションの作成
Amazon Q BusinessにはIAM Identity Center(IDC)が必要です。
今回はすでに作成されているユーザーとグループを使用します。
実際にはメンテナンスを行うユーザー用のグループ、プロセス用のグループなど、実務に合わせたグループが必要になりそうです。
次にAmazon Qで新しいアプリケーションを作成します。
名前にmy-smart-factory-assistantを入力して作成します。
Quick start userにはAllUserを指定します。
実際にはこのアプリケーションを操作できるグループ or ユーザーを指定するとよさそうです。
Createをクリックするとアプリケーションがデプロイされるので、発行されるURLを控えておきます。
データソースの追加
次にデータソースとしてS3を設定します。
S3には以下のデータが入っています。
標準操作手順 (SOP)ドキュメント: 醸造設備のメンテナンス手順、安全プロトコル、および操作ガイドラインを詳述した技術ドキュメント。これらは、メンテナンスチームが設備のさまざまな問題のトラブルシューティングに使用します。
醸造レシピ: 原料、温度、タイミング、テクニックなど、さまざまな種類のビールを醸造するための詳細な手順と仕様。当社のプロセスエンジニアリングチームは、これらのドキュメントを活用して醸造業務を監視し、高品質の醸造を保証します。
Amazon Q BusinessのデータソースとしてS3を登録していきます。
まずはデータソースと接続するためのリトリーバー(検索システム)を設定します。
リトリーバーはAmazon Qのネイティブ機能を使います。
インデックスのプロビジョニングにはスターターを選択します。
Amazon Qはネイティブ機能としてRAGを構築できるのが便利ですね。
またS3内のドキュメントにアクセス制御 (ACL) 情報を追加することもできます。
例えば特定のメンテナンスマニュアルにアクセスできるユーザーが限られている場合などに使えそうですね。
今回はアクセス制御情報が書かれたファイルが EQ/documents_acl.json
に保存されているため、こちらのS3ファイルパスを取得しておきます。
データソースを追加します。
マニュアル類が保管されたS3パスと、先ほど取得したACLのファイルパスを入力します。
フィルターパターンには Data/
を入力して追加します。
これでData配下のオブジェクトのみフィルタリングします。
Frequency(頻度)をオンデマンドにしてデータソースを追加します。
これでデータソースの追加ができました。
プラグインの追加
次にIoT SiteWiseや作業指示システムと連携するためのAmazon Qのプラグインを作成します。
まずはPluginからAdd Pluginをクリックします。
次にCreate custom pluginをクリックします。
カスタムプラグイン用のAPIスキーマはワークショップ用に用意されてものを使うので、「Define with in-line OpenAPI schema editor」を選択して、以下のyamlを入力します。
IoT SiteWise用 APIスキーマ
openapi: 3.0.1
info:
title: SiteWiseQuery
description: API for querying AWS IoT SiteWise data, providing access to assets, asset overviews, and property values.
version: 1.5.3
servers:
- url: # REPLACE ME WITH THE OUTPUT FROM CloudFormation - example https://abcdef123.execute-api.us-west-2.amazonaws.com/prod
description: Production API Gateway endpoint
paths:
/assets:
get:
operationId: listAllAssets
summary: List all assets
description: Retrieves a list of all assets across all models in the IoT SiteWise system. Use this to get an overview of available assets.
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
assets:
type: array
items:
type: object
properties:
assetName:
type: string
assetId:
type: string
modelName:
type: string
example:
assets:
- assetName: "MaltMill100"
assetId: "6f0bd267-b227-4ebb-a50c-75397cbb51f9"
modelName: "MaltMill"
- assetName: "BottleLine401"
assetId: "7ca9e918-63f2-4e89-823e-df6d6159c20e"
modelName: "BottleLine"
/asset:
get:
operationId: getAssetPropertyValues
summary: Get overview and current values of properties for an asset
description: Retrieves a comprehensive overview of a specific asset, including its current property values. Use this function to answer questions about the current values of any properties of an asset and to list all properties of that asset. For example, if someone asks about the temperature, OEE, pressure, etc. (what would be a property), use this and to get the current value. If you need the asset_id before the call, you can first call listAllAssets
parameters:
- name: asset_id
in: query
required: true
schema:
type: string
description: The unique identifier of the asset
example: "6670c18f-be54-42c6-b642-5d6649fbb0da"
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
assetName:
type: string
assetId:
type: string
status:
type: string
properties:
type: array
items:
type: object
properties:
name:
type: string
id:
type: string
dataType:
type: string
currentValue:
type: string
example:
assetName: "Roaster100"
assetId: "6670c18f-be54-42c6-b642-5d6649fbb0da"
status: "ACTIVE"
properties:
- name: "Temperature"
id: "0dbf2ca6-68bb-4ac6-9991-d74595f60bad"
dataType: "DOUBLE"
currentValue: "99.89"
- name: "State"
id: "246f55aa-c67f-45ca-a9bd-02a2fa5ca478"
dataType: "STRING"
currentValue: "Running"
/property:
get:
operationId: getHistoricalPropertyValue
summary: Get historical or aggregated property values
description: Retrieves the value of a specific property for an asset. Can return historical, or aggregated data based on the 'type' parameter. Use this to answer question about property value in the last hour, averages, maximum and minimum.
parameters:
- name: asset_id
in: query
required: true
schema:
type: string
description: The unique identifier of the asset
example: "6670c18f-be54-42c6-b642-5d6649fbb0da"
- name: property_id
in: query
required: true
schema:
type: string
description: The unique identifier of the property
example: "0dbf2ca6-68bb-4ac6-9991-d74595f60bad"
- name: type
in: query
required: true
schema:
type: string
enum: [historical, aggregated]
description: The type of data to retrieve (historical, or aggregated)
example: "historical"
- name: start_time
in: query
required: false
schema:
type: string
description: The start time for historical or aggregated data. Use relative time like -1h (an hour ago), -1d (a day ago)
example: "-1h"
- name: end_time
in: query
required: false
schema:
type: string
description: The end time for historical or aggregated data. Uses relative time, 'now' (current), '-1h' for an hour ago
example: "now"
- name: resolution
in: query
required: false
schema:
type: string
description: The time resolution for aggregated data (e.g., '1h' for hourly)
example: "1h"
- name: aggregate_types
in: query
required: false
schema:
type: string
description: Comma-separated list of aggregate types (e.g., 'AVERAGE,MINIMUM,MAXIMUM')
example: "AVERAGE,MINIMUM,MAXIMUM"
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
asset:
type: string
property:
type: string
dataType:
type: string
value:
type: object
description: The structure depends on the 'type' parameter (historical, or aggregated)
examples:
historical:
summary: Historical values
value:
asset: "Roaster100"
property: "Temperature"
dataType: "DOUBLE"
startTime: "2024-09-19T19:16:08.024039+00:00"
endTime: "2024-09-19T20:16:08.024043+00:00"
historicalData:
- value: 99.84
timestamp: "2024-09-19T19:16:32+00:00"
quality: "GOOD"
- value: 102.99
timestamp: "2024-09-19T19:19:22+00:00"
quality: "GOOD"
aggregated:
summary: Aggregated values
value:
asset: "Roaster100"
property: "Temperature"
dataType: "DOUBLE"
startTime: "2024-09-18T20:17:11.280303+00:00"
endTime: "2024-09-19T20:17:11.280306+00:00"
resolution: "1h"
aggregatedData:
- timestamp: "2024-09-19T19:00:00+00:00"
values:
AVERAGE: 280.84
MINIMUM: 99.73
MAXIMUM: 489.28
APIスキーマは生成AIアシスタントがAPIの機能と構造を理解する目的で作成します。
urlの部分はIoT SiteWise用に作成されたAPI Gatewayのurlに書き換えます。
これでプラグインを作成します。
次に、作業指示システム用のプラグインも同様に作成します。
作業指示システム用のAPIスキーマは以下のyamlを入力します。
作業指示システム用 APIスキーマ
openapi: 3.0.1
info:
title: WorkOrder
description: API for creating and managing work orders in a manufacturing environment
version: 1.0.0
servers:
- url: https://{apiId}.execute-api.{region}.amazonaws.com/prod #replace with the WorkOrderApiEndpoint output from the infra-workorder-stack CFN stack
paths:
/submitWorkOrder:
post:
summary: Submit a new work order
description: |
Create a new work order for equipment maintenance or repair. Use this operation when an employee needs to report an issue with a piece of equipment or schedule routine maintenance.
This API will generate a unique 5-digit work order number, record the submission time, and return a confirmation message with the details.
operationId: createWorkOrder
security: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- equipmentId
- requestDescription
properties:
equipmentId:
type: string
description: Name of the equipment to be serviced. For example Boiler 123.
requestDescription:
type: string
description: Detailed description of the maintenance or repair request, including the issue and any relevant observations
example:
equipmentId: "Boiler 123"
requestDescription: "Annual maintenance and calibration for boiler"
responses:
'201':
description: Work order created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/WorkOrderResponse'
example:
workOrderNumber: "22592"
equipmentId: "Boiler 123"
requestDescription: "Annual maintenance and calibration for boiler"
submissionDatetime: "2024-08-26T21:13:00.338225Z"
message: "Work order 22592 has been submitted for Boiler 123 at 2024-08-26T21:13:00.338225Z with the following request: Annual maintenance and calibration for boiler"
headers:
Content-Type:
schema:
type: string
description: The MIME type of the response body
example: application/json
'400':
description: Bad request due to invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
WorkOrderResponse:
type: object
properties:
workOrderNumber:
type: string
description: Unique 5-digit identifier for the created work order
equipmentId:
type: string
description: Identifier of the equipment for which the work order was created
requestDescription:
type: string
description: Description of the maintenance or repair request
submissionDatetime:
type: string
format: date-time
description: Date and time when the work order was submitted, in ISO 8601 format with microsecond precision
message:
type: string
description: Confirmation message with work order details, including the work order number, equipment ID, submission time, and request description
ErrorResponse:
type: object
properties:
error:
type: string
description: Detailed error message describing the issue
こちらも先ほどと同様に、urlの部分はAPI Gatewayのurlに置き換えます。
これで必要なプラグインができました。
AI アシスタント
準備ができたので、AIアシスタントを使ってみましょう。
まずは作成したアプリケーションにアクセスします。
作成したIoT SiteWise用のプラグインを選択します。
以下の質問をしてみます。
List the current assets available
"現在利用可能なアセットのリストを出して"
Based on the API response, here are the current assets available in the IoT SiteWise system:
Mashing
Roasting
BeerStorage
Fermentation
Brewing
IrvinePlant
BottleLine401
Breweries
Bottling
Fermenter100
MashTun100
BrightTank302
BrightTank301
Roaster100
MaltMill100
BoilKettle100
BoilKettle200
IoT SiteWiseのデータを元に利用可能なアセットの一覧が出力されました。
次に、機器に問題が発生した場合を想定してAIアシスタントに尋ねてみます。
Boil Kettle 100 is having problems. What is the process?
"ボイルケトル100に問題が発生しています。何が起きてますか?"
Based on the property values retrieved for the BoilKettle100 asset, here are some key details about its current status and process:
The kettle is currently in 'Holding' status, with the inlet and outlet valves closed.
The temperature is at 212°C (boiling point for wort).
The level is at 56.68%, indicating it contains wort.
The HoldTime is set to 480 seconds (8 minutes), suggesting it is holding the wort at boiling temperature for that duration as part of the brewing process.
The OEE (Overall Equipment Effectiveness) is at 100%, indicating it is operating at full effectiveness.
Let me know if you need any other details about the BoilKettle100 asset's properties or process to troubleshoot the issue you mentioned.
BoilKettle100のプロパティ値を元に現在のステータスや機器の設定値、機器状況、稼働率などが回答されています。
このように機器データやドキュメントなど、散らばった関連データから素早く分析したい場合はとても良いアシスタントになってくれそうです。
ここから先は時間の都合上、私は確認できなかったのでワークショップのドキュメントより回答を拝借しています。
プラグインをWorkOrderに変更して以下の文章をリクエストします。
During the last brewing cycle, there were some inconsistent heating and longer-than-usual boil times for BoilKettle200. There's also a minor leak observed at the bottom valve connection.
"最後の醸造サイクルにおいて、BoilKettle200に関して加熱が不安定で、通常よりも沸騰時間が長くなる現象が発生しました。また、底部のバルブ接続部で小さな漏れも確認されています。"
以下の回答が得られました。
During the last brewing cycle, there were inconsistent heating and longer-than-usual boil times observed for BoilKettle200. There is also a minor leak detected at the bottom valve connection. Please inspect the heating elements, temperature sensors, pressure valve, seals/gaskets, and electrical components. Repair or replace any faulty parts as needed.
加熱エレメント、温度センサー、圧力バルブ、シール/ガスケット、および電気部品を点検、必要に応じて交換・修理して下さい
。という内容のSOPが作成されています。
これは最新の機器データから発生している現象を推測し、その処置として可能性の高い部品の交換や修理をドキュメントから見つけ出しています。
これはおそらく人間がやっても同じことができますが、現在のデータから機器状況を判断して可能性のある故障やメンテナンスを予測、そして関連する部品をドキュメントから探し出す。という手間が発生します。
この作業をAIアシスタントが即座に実行してくれることで作業効率がかなり上がるのではないかと思います。
おわりに
機器の使用者や機器のメンテナンスを行う方々は、日々いろいろな情報源を元に機器を触っていると思います。
それは仕組み化された手順、知識、経験など今まで通りのやり方でもできると思います。
しかし、電子化が進み、情報量もどんどん多くなっていく一方、必要な人材を確保したり育成するのも難しくなっています。
そこで今回のAIアシスタントはAIをモノ作りに組み込み、作業を効率化できる良い例だと思いました。