IoTクラウド基盤アーキテクトの森⽥です。お客様のIoTサービスを実現するAWSアーキテクチャの検討、提案、構築を行っています。
IoTデータの利用の幅を広げ、専門家以外でもデータを活用できる環境づくりを目指して、AWS IoT TwinMakerとMatterportを連携したデジタルツインを推進しています。生成系AIを組み合わせることで、更にデータから洞察を得やすくなるのではないかと考え、検証を進めています。
検証内容
Matterportのデジタルツインと生成系AIを組み合わせた設備管理ソリューションのデモを作成しました。 実施できることは以下のとおりです。
• よくある質問を選んで質問をする
• 対象の設備を選択して、自由に質問する
• 設備管理者情報やメンテナンス履歴を問い合わせる
• 設備を選択せずに自由入力で問い合わせる
• 回答が存在しない質問の場合には汎用的に動画を表示する
※3D空間は工場設備ですが、IoTデータはAWS提供の風力タービンのシミュレーションデータを使用しています。表記上のズレが発生していますが、検証用途ということでご容赦ください。
AWSアーキテクチャ
以下のようなAWS構成で検証しました。
検証時点では、AWS IoT SiteWiseに対してSQLで検索できなかったので、Amazon S3にエクスポートした後、Amazon Auroraにデータを登録しました。
デモの作成に当たって検証した内容を一部ご紹介いたします。
IoTで収集したデータに対する質問
生成系AIの活用方法の一つとして、プログラムコードの生成が挙げられます。PythonやJavaのコードだけでなく、SQLの生成も可能です。AWSからもAmazon RedshiftのクエリエディタでSQLを生成できるようになるという発表がありました。
Amazon Q の生成系 SQL が Amazon Redshift クエリエディタで利用可能に (プレビュー版)
IoTデータに対して以下のような質問ができるSQL生成を検証しました。
- 2023年6月の風速の平均値は?
- 回転数が最後に30を超えたのはいつですか?
生成系AIによるSQLの生成
AWSが公開しているAmazon Bedrock Workshopのコード生成の章で、SQLを生成する方法が紹介されています。
Claude 2を使用して以下のプロンプトを送信します。テーブルの構造とSQLを生成させたい自然言語を与えるだけのシンプルな構成です。
AnyCompany has a database with a table named sales_data containing sales records. The table has following columns:
- date (YYYY-MM-DD)
- product_id
- price
- units_sold
Can you generate SQL queries for the below:
- Identify the top 5 best selling products by total sales for the year 2023
- Calculate the monthly average sales for the year 2023
実行結果は以下のようになりました。
Here are the SQL queries to answer the questions:
1. Identify the top 5 best selling products by total sales for the year 2023:
```sql
SELECT product_id, SUM(price * units_sold) AS total_sales
FROM sales_data
WHERE date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 5;
```
2. Calculate the monthly average sales for the year 2023:
```sql
SELECT
EXTRACT(MONTH FROM date) AS month,
AVG(price * units_sold) AS avg_monthly_sales
FROM sales_data
WHERE date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY month
ORDER BY month;
```
The first query aggregates total sales per product for the year 2023, orders the results by descending sales, and limits to the top 5 products.
The second query extracts the month from the date, calculates the average monthly sales, groups by month and orders chronologically to calculate the average sales per month for 2023.
AnyCompany has a database with a table named sales_data containing sales records. The table has following columns:
- date (YYYY-MM-DD)
- product_id
- price
- units_sold
Can you generate SQL queries for the below:
- Identify the top 5 best selling products by total sales for the year 2023
- Calculate the monthly average sales for the year 2023
意外と簡単にSQLが生成できることが分かりました。
AWS IoT SiteWiseのコールドストレージのデータ構造
今回の検証では、AWS IoT SiteWiseのクイックスタートデモで取り込んだデータをCold階層に出力した上で、Amazon Athenaで抽出し以下のような構成のテーブルを作成しました。(Cold階層のスキーマについてはこちらを参照ください。)
フィールド名 | 説明 |
---|---|
assetId | アセットID |
assetName | アセットの名前 |
assetPropertyId | アセットプロパティID |
assetPropertyName | アセットプロパティの名前 |
timeInSeconds | 値取得の時刻 |
count | 現在の時間間隔における指定された変数のデータポイントの総数 |
average | 現在の時間間隔における指定された変数値の平均 |
min | 現在の時間間隔における指定された変数の最小値 |
max | 現在の時間間隔における指定された変数の最大値 |
sum | 現在の時間間隔における指定された変数値の合計 |
IoTデータに対するSQL生成
Amazon Bedrock Workshopのプロンプトを参考に、以下のプロンプトを送信します。試行錯誤の結果、生成されるSQLの精度を上げるためルールを追加しました。
日本語と英語が混在していますが、特に問題なく認識してくれました。
当社には、IoTデータを含むaggテーブルを持つデータベースがあります。
aggテーブルは以下の項目があります
- assetId : The ID of the asset.
- assetName : The name of the asset.
- assetPropertyId : The ID of the asset property.
- assetPropertyName : The name of the asset property.
- timeInSeconds: The timestamp date, in seconds, in the Unix epoch format.
- count : The total number of data points for the given variables over the current time interval.
- average: The mean of the given variables' values over the current time interval.
- min: The minimum of the given variables' values over the current time interval.
- max: The maximum of the given variables' values over the current time interval.
- sum: The sum of the given variables' values over the current time interval.
<rule>
- 平均や最大値、最小値を取得する場合は、avg()やmax()、min()といったSQLの組み込み関数を使用してください。
- 日付はto_unixtime(TIMESTAMP '2023-01-01 00:00:00')のように変換してください。
- SQL文は<sql>タグで囲んで出力してください。
- 回答は<sql>タグのみとし、不要な出力は行わないでください。
</rule>
Can you generate SQL queries for the below:
- アセット名が'Demo Turbine Asset 1'の'Wind Speed'プロパティの2023年6月の平均値は?
- アセット名が'Demo Turbine Asset 3'の'Wind Speed'プロパティの値が最後に20を超えたのはいつですか?
生成結果は次のとおりです。
<sql>
SELECT avg(average)
FROM agg
WHERE assetName = 'Demo Turbine Asset 1'
AND assetPropertyName = 'Wind Speed'
AND timeInSeconds BETWEEN to_unixtime(TIMESTAMP '2023-06-01 00:00:00') AND to_unixtime(TIMESTAMP '2023-06-30 23:59:59');
</sql>
<sql>
SELECT MAX(timeInSeconds)
FROM agg
WHERE assetName = 'Demo Turbine Asset 3'
AND assetPropertyName = 'Wind Speed'
AND max > 20;
</sql>
どちらも期待通りのSQLが生成されました。
自然言語での入力に備える
SQLの生成ができることは分かりましたが、アセット名やプロパティ名を正確に伝える必要があります。実際の利用シーンを想定すると、利用者が正確に指示をしてくれるほうが稀なはずです。利用者に負担をかけず、正確にSQLを生成するための方法を検討しました。
アセット名に対するアプローチ
IoT TwinMakerとMatterportを連携したデジタルツインでは、それぞれのアセットに対してマーカーを付与することができますので、マーカーを選択させることでどのアセットに対する質問なのかを絞らせるアプローチを取りました。下の画像では、それぞれのエアタンクの前に青いマーカーをセットしています。
利用者はそれぞれのアセットの正確な名称が分からなくても、「この設備」という指定が可能です。
プロパティに対するアプローチ
プロパティについては、存在するプロパティをリストアップしてユーザーに選択させることも可能ですが、もう少し柔軟な質問ができるように、利用者の自然言語での質問からプロパティを抽出するアプローチを検討します。
アセットを選択した後に利用者が質問したい内容を想定します。
- 2023年6月の風速の平均は?
- 最後に回転数が30を超えたのはいつ?
データベース上のプロパティ名は「Wind Speed」「RotationsPerMinute」ですが、上記の質問からこれらのプロパティ名を抽出するプロンプトを検討しました。
Amazon Bedrockの管理画面には使用方法を紹介したExamplesがあります。この中の「Information extraction」を参考に検討を進めました。
Information extractionのプロンプトは、会議の文字起こしから重要なポイントを要約して抽出するものでした。
“トピックは例示したものから抽出すること”などを条件として追加し、以下のようなプロンプトを作成しました。
I'm going to give you a customer inquiry and ask you to extract topics.
topicは以下のいずれかである必要があります。
<topics>
RotationsPerMinute
Torque (KiloNewton Meter)
Wind Direction
Wind Speed
</topics>
Your task is to extract topics, being sure to answer the following
- topicが含まれる場合は、<topic>タグで出力してください。
- トピックの単語は表記ゆれをすることがあります。
- 会話の中にトピックの単語を含まない場合は、トピックの会話ではないと判断してください。
- <topic>には、会話をしているトピックの単語を、表記ゆれのない形で格納してください。
- トピックが会話の中に含まれない場合、または設定したトピックについての会話ではない場合は、<topic>にNONEを格納してください
Here is customer inquiry :
- 2023年6月の風速の平均は?
実行結果はこちらです。
<topic>Wind Speed</topic>
他の質問も試しました。
• 回転数が最後に30を超えたのはいつですか?
<topic>RotationsPerMinute</topic>
期待通りの回答です。
• 先月メンテナンスを担当したのは誰ですか?
<topic>NONE</topic>
こちらも、存在するプロパティに対する質問ではないので期待通りの回答です。
プロパティ名が取得できなかった場合はIoTデータに対する問い合わせではないため、別のデータソースから回答を生成させる仕組みが必要になります。
これらのアプローチで、アセット名とプロパティ名を正確に指定することができますので、SQL生成の精度を上げることができました。
まとめ
現在検証を進めているIoT TwinMakerとMatterportを連携したデジタルツインへの生成系AIの適用について、一部をご紹介しました。
生成系AIは様々なシーンでの活用が期待されていますが、具体的にどう活かすのか、自社の業務に活用できるのかは、実際に適用してみないと分かりません。我々の取り組みもまだまだ検証段階で、各社、試行錯誤しながら手探りで進めている今のタイミングから検証をスタートすることが重要であると考えています。
富士ソフトではIoTシステム開発にも多くの実績があり、生成系AI活用の検証を進めています。ぜひ富士ソフトまでお問い合わせください。
Amazon Bedrock導入ソリューションについて、詳しくはこちら
Amazon Bedrock導入ソリューション