【デジタルツイン×生成AIによる製造業DX!】AWS IoT TwinMaker Samples のクッキー工場バージョン3(CookieFactoryV3)を試してみた 〜その3 AI アシスタント設定編〜

2024.01.29

こんにちは、CX 事業本部製造ビジネステクノロジー部の若槻です。

ここまでのエントリでは、AWS IoT TwinMaker Samples の CookieFactoryV3 の環境構築とダッシュボード操作確認を行いました。

上記の実装だけでも AWS IoT TwinMaker のデモとしては十分な内容なのですが、今回はここまでの実装に対して下記の公式ブログで紹介されている、Amazon Bedrock を利用した AI アシスタントを設定するチュートリアルを試してみます。

設定イメージ(上記ブログより引用)としては、次のように Amazon Bedrock 上のモデルを利用した「Cookie Factory AI Assitant Module」をローカルで構成し、ユーザーのプロンプト入力、ダッシュボード上の表示および Amazon S3 上の設備マニュアルをコンテキストデータとしてチャット UI で応答を行うというものです。

ちなみに今回行うのは AI アシスタントの設定のみで、詳細な仕様理解は別の記事で行う予定です。

試してみた

実際に Cookie Factory AI Assitant Module を実装して AI アシスタントを設定してみます。基本的には前述の公式ブログ内の手順に則れば良いのですが、チュートリアルの実施環境として AWS Cloud9 環境の利用が推奨されていますが、Cloud9 環境上だと Vite で起動したアプリケーションにアクセスできない問題 が発生していたので、その点も加味した手順を記載します。

リポジトリのクローン

まだの場合は、AWS IoT TwinMaker Samples のリポジトリをローカルにクローンし、プロジェクトルートに移動します。

git clone https://github.com/aws-samples/aws-iot-twinmaker-samples.git
cd aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3

環境変数の設定

AWS 上に構築済みの TwinMaker ワークスペースの ID と AWS リージョンを環境変数に設定します。

export AWS_REGION=us-east-1
export WORKSPACE_ID=CookieFactoryV3

pnpm のインストール

パッケージマネージャー pnpm をインストールします。

npm install -g pnpm

pnpm は本来であれば後続手順の assistant/install.sh 実行時にインストールされます(21 行目)が、私の環境では別途明示的にインストールする必要がありました。

依存関係のインストール

assistant ディレクトリに移動し、install.sh を実行します。これにより AI アシスタントに必要な依存関係がインストールされます。

cd <PROJECT_ROOT>/assistant
./install.sh

Pipenv 環境の起動

次のように Pipenv 環境を起動します。

pip install pipenv
pipenv --python 3
pipenv install
pipenv shell

これにより src/workspaces/cookiefactoryv3/assistant/Pipfile で定義されている langchain などのモジュールにインストール可能とします。

Anthropic Claude のアクセス権の有効化

Amazon Bedrock の基盤モデルである Anthropic 社の Claude への us-east-1 でのアクセス権を有効化します。有効化をリクエストしてから有効化が完了するまで若干の時間を要します。

この Claude へのアクセスがローカルから LangChain 経由で行われます。

AWS CLI の認証

AI Assitant Module が Amazon Bedrock にアクセスできるように、AWS CLI で認証を行います。

AI Assitant Module の起動

assistant ディレクトリの run.sh を実行します。

./run.sh

すると http://localhost:8000/ で AI アシスタントのチャット UI が起動します。

ただしこの UI は利用しません。プロンプトで何かを入力しても次のようなエラーとなりますが、ここでは無視して構いません。

Error raised by bedrock service: An error occurred (ExpiredTokenException) when calling the InvokeModel operation: The security token included in the request is expired

また、http://localhost:8000/ の画面は閉じても構いません。モジュール自体はバックグラウンドで引き続き起動します。

ダッシュボードの起動、AI アシスタントの確認

dashboard ディレクトリに移動し、npm run dev を実行してダッシュボードアプリケーションを起動します。

cd <PROJECT_ROOT>/dashboard
npm run dev

ダッシュボードでクッキー工場のデジタルツインが表示されたら、上部の[Run event simulation]をクリックします。

クッキーの形の異常が検出されたというイベントがシミュレーションされます。[Acknowledge]をクリックします。

Cookie Shape Anomaly Detected
Alarm rule: The number of deformed cookies exceeded 11 per 5 minutes.

すると AI アシスタントのチャット UI が開きます。[Run Issue Diagnosis]をクリックします。

問題の分析と原因の推測の結果が応答として表示されました。

Initial Diagnosis
Summary of the issue
An alarm triggered at 3:21 PM on Nov. 2nd, indicating an anomaly in cookie shape on the production line where more than 11 deformed cookies were produced within a 5 minute period.

Potential root causes
Issues with cookie dough extruder: Worn parts could be causing uneven dough flow resulting in misshapen cookies.

Problems with conveyor belt: An uneven or slipping conveyor belt could cause cookies to deform before entering the oven.

Oven temperature fluctuations: Inconsistent oven temperatures across belts/zones may result in uneven baking and cookie deformation.

Dough ingredient inconsistencies: Variations in dough ingredient ratios/qualities could impact the shape-retaining properties of the dough.

Improper dough mixing: Inadequate or too vigorous mixing could develop structural flaws in the dough affecting cookie shape.

The line operators may want to inspect the extruder, conveyor belt and oven conditions/recordings to identify potential issues causing the deformed cookies. It may also help to check dough ingredients and mixing processes. Resolving mechanical or process problems should help reduce deformed cookie counts.

応答の中の[Show in 3D]をクリックします。

すると左側の 3D コンポーザー内で原因となる箇所への自動フォーカスが行われます。この挙動はかっこいいですね。

トラブルシュート

./run.sh 実行時に ModuleNotFoundError が発生する

assistant/run.sh 実行時に次のような ModuleNotFoundError が発生する場合。

$ ./run.sh
$ Traceback (most recent call last):
  File "/opt/homebrew/bin/chainlit", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/chainlit/cli/__init__.py", line 154, in chainlit_run
    run_chainlit(target)
  File "/opt/homebrew/lib/python3.11/site-packages/chainlit/cli/__init__.py", line 55, in run_chainlit
    load_module(config.run.module_name)
  File "/opt/homebrew/lib/python3.11/site-packages/chainlit/config.py", line 282, in load_module
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/bedrock.py", line 14, in <module>
    import langchain
ModuleNotFoundError: No module named 'langchain'

Python モジュールのインストールが行われていないか、PATH が通っていない可能性があります。私の場合は「Pipenv 環境の起動」の対応で解決しました。

./run.sh 実行時に AccessDeniedException が発生する

assistant/run.sh 実行時に次のように ModuleNotFoundError が発生する場合。

$ ./run.sh
$ Traceback (most recent call last):
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/bin/chainlit", line 8, in <module>
    sys.exit(cli())
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/cli/__init__.py", line 153, in chainlit_run
    run_chainlit(target)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/cli/__init__.py", line 47, in run_chainlit
    load_module(config.run.module_name)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/config.py", line 247, in load_module
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "app/bedrock.py", line 21, in <module>
    from lib.router import LLMRouterChain, MultiRouteChain, create_routes
  File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/router.py", line 20, in <module>
    from .tools.view import ViewChain
  File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/tools/view.py", line 21, in <module>
    from ..llm import get_bedrock_text, get_processed_prompt_template
  File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/llm.py", line 76, in <module>
    response = bedrock.list_foundation_models()
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/botocore/client.py", line 535, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/botocore/client.py", line 980, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the ListFoundationModels operation: User: arn:aws:iam::XXXXXXXXXXXX:user/cm-wakatsuki.ryuta is not authorized to perform: bedrock:ListFoundationModels with an explicit deny in an identity-based policy

AWS CLI での認証が正常に行われていない可能性があります。私の場合は「AWS CLI の認証」の対応で解決しました。

チャット UI でのプロンプト入力時に AccessDeniedException が発生する

ダッシュボードアプリでのチャット UI でのプロンプト入力時に次のような AccessDeniedException が発生する場合。

Error raised by bedrock service: An error occurred (AccessDeniedException) when calling the InvokeModel operation: You don't have access to the model with the specified model ID.

Amazon Bedrock の基盤モデルである Anthropic Claude への us-east-1 でのアクセス権が有効化されていない可能性があります。私の場合は「Anthropic Claude のアクセス権の有効化」の対応で解決しました。

おわりに

AWS IoT TwinMaker Samples のクッキー工場バージョン 3(CookieFactoryV3)を試してみたの「その3」として、AI アシスタント設定をしてみました。環境起因のトラブルに苦しめられましたが、なんとか AI アシスタントを動かせるところまで漕ぎ着けられました。

「デジタルツイン」と「生成 AI」という 2 つの技術トレンドを組み合わせたアプリケーションのデモを簡単に試せるのは熱いですね。ちなみに今回のデモは下記ブログで紹介されている通り、AWS re:Invent 2023 の Expo でデモ展示もされていました。

このようなソリューションが製造現場に導入されることにより、工場などのデジタルツインによる可視化と AI アシスタントによる自然言語での対話 UI が組み合わさることにより、熟練でない作業者でもより簡単に製造現場の状況の把握や問題への洞察が可能になり、製造業の生産性の向上につながるのではないでしょうか。

今回は最低限の動作確認を行っただけでしたが、次回は詳細な仕様について理解を行っていきたいと思います。

以上