![見出し画像](https://assets.st-note.com/production/uploads/images/160278373/rectangle_large_type_2_ac05499435b1a179cb40a28132385c4b.jpeg?width=1200)
機器点検のスケジューリングをLLMで行う
2024/11/01に開催された製造業でも生成AI活用したい!名古屋LLM MeetUp#3にLT登壇した内容です。
![](https://assets.st-note.com/img/1730496933-jifAoWJO8crxa6knmRqyMUCY.png?width=1200)
ロボホンは愛嬌ある表情をします。歌って踊ることもできます。
なんたって可愛い!可愛いは最強なんです。
ロボホンのアプリもたくさん作りました。
コロッケそばの魅力は私の周囲に伝わりません笑。
それは名古屋圏に立ち食いそば文化がないためだと思います。
多くは「そばにコロッケ乗せて何が嬉しいの?」ってことになります。
体験がないためイメージできないのです。
首都圏に行くと必ず馴染みの立ち食いそば屋さんで私のレギュレーションに適合したコロッケそばを食べます。
1.本日のお話
![](https://assets.st-note.com/img/1730497120-dQ57TZKIsRjB3m1LnbFVAqow.png?width=1200)
点検スケジューリングのような作業は様々なものが存在します。
・バイト/パートさんのシフト作成
・巡回販売のシフト作成
・保守点検スケジューリング(人/チームの割当て)
・変更が発生するのは当たり前
・and more …….
こういった面倒なスケジューリングはAIエージェント(生成AI+Agent)にやって貰えばいいじゃん!面倒な作業時間を他の作業に転化って話です。
AIエージェントは、起動後、自律的なタスク実行を担うことができます。
今回は製造業向けイベントなので、機器点検のスケジューリングをユースケースとしてやってみました。
2.LLMアプリのイメージ
![](https://assets.st-note.com/img/1730531969-pScK60bE2ejnRow3l4Fdg5BX.png?width=1200)
上図は、LLMアプリのイメージです。LLMは手足がないため、外部情報を自ら取得する術がありません。そこでLLMは、Agentと「会話」(React)してAgentにタスクの実行(情報の取得)を依頼することで外部情報を得ることができます。
・IoT機器稼働データはLangChain Agents のToolを使って取得
・点検スケジュール、保守チーム情報の検索やデータ抽出は
LangChain PandasDataframe Agentを使用
LangChain PandasDataframe Agenを使うことでユーザーの要求に沿ったデータ操作(検索や抽出など)を行うpythonコードを生成して実行できる、という特徴があります。
LLMは、欲しいデータをAgentからもらって点検予定をスケジューリングする、ということになります。
3.システム構成
![](https://assets.st-note.com/img/1730498028-YQ4xsXFf1Z5CWli7eJOvE3pd.png?width=1200)
・作成したLLMアプリ
ステップ数 pythonコードで約1,500
(汎用的な構造設計にしたため多くなった。コメント行を含む)
・主なライブラリのバージョン
python 3.10.5
langchain 0.3.4
langgraph 0.2.39
langsmith 0.1.136
openai 1.52.0
streamlit 1.39.0
上図は、システム構成です。
現場に設置された機器の稼働環境をOT(Operational Technology)環境と
呼びます。
機器の稼働状況がクラウドに定期的にアップロードされます。
一方、LLMアプリが動く環境がIT環境になります。
LLMアプリは現場機器の稼働状況を監視してアラームがあれば、点検チームのスケジューリングを行います。
LLMとAgentが連携してタスクを実行する、ということになります。
4.出来上がりを動画で見てみる
![](https://assets.st-note.com/img/1730498308-lnj92sY6q0WeuNMUFyXOBEQg.png?width=1200)
5.LLMアプリの説明
5.1 LLMアプリの内部の挙動を可視化して確認する
![](https://assets.st-note.com/img/1730498501-1eCmp329FtnHxlROSEMdbKB4.png?width=1200)
LLMアプリが期待通り動いているか?は見た目上の動作に加えて内部動作の確認も必要です。LangSmithという便利な可視化ツールを使って内部動作を確認しています。
5.2 既存の点検スケジュールの取得
![](https://assets.st-note.com/img/1730498885-oxkWn1avplDLhNIg9jbf4mzJ.png?width=1200)
まずは既存のスケジュールの取得です。
この既存の点検スケジュールに新しいスケジュールの候補を割り当てることになります。
5.3 保守チーム情報の取得
![](https://assets.st-note.com/img/1730500331-nHQu754I8vp6EzBoZtJYlUFd.png?width=1200)
これは保守チーム情報の取得です。
どのチームがどんな点検内容を担当するかが分かります。
例えばアラームが「温度異常」だと、このデータから「温度異常」はDチームが担当だ、とLLMが判断できます。
5.4 現場機器の稼働情報を取得
![](https://assets.st-note.com/img/1730500720-UVQ9ATIFtc5dmOrpJw1S7iWg.png?width=1200)
これは、現場機器の稼働状況をIoT監視装置から取得したものです。
温度異常が発生しています。温度異常が発生していることをLLMに伝えます。
5.5 新しい点検スケジュール(候補日)を割り当てる
![](https://assets.st-note.com/img/1730500988-VHkOZoXPDb7jigLCvyW9QAEt.png?width=1200)
つぎは発生したアラームに対応できる保守チームのスケジュール割当てをLLMアプリで行なった結果です。3つの候補がスケジューリングされた様子がわかります。
温度異常に対応できるDチームが割り当てられています。
最終的にどれにするかは人がやったほうがいいね、ということになります。
5.6 提案内容は条件通りか?
![](https://assets.st-note.com/img/1730501241-9Jp3D4ZLyF2RM7mwocieubIr.png?width=1200)
ここで、点検スケジュールの提案が正しくされているかを答え合わせ。
指示内容と付き合わせて確認します。
上図の左側が指示内容です。プロンプトテンプレートを用意してここにユーザの依頼内容を書き込んでいます。
プログラム内部で抱えているため、操作するユーザは書き換えることはできません。
プロンプトテンプレートを用意することで次の効果を得られます。
・ユーザ入力負荷の軽減
・入力ミスの防止
・毎度頑張って精度高めるプロンプトを考える必要がない
・悪意あるユーザ指示による誤動作の防止
主な条件は、プロンプトテンプレートの赤枠部分の4つですね。
提案されたスケジュール候補はこの条件を満たしていることがわかります。
5.7 アラームの内容がLLMに伝わっているか?を確認
![](https://assets.st-note.com/img/1730501739-D19n6hHYjyEQrw7czgOI3mJX.png?width=1200)
つぎは、発生したアラームの内容がLLMに伝わっているか、を確認します。
IoT監視装置で機器稼働情報を取得した際にアラート内容を変数に格納します。
この変数の内容がプロンプト入力文字列になります。
この文字列はプロンプトテンプレートに取込まれてLLMの入力プロンプトになります。
LangSmithでLLMへの入力プロンプトを見てみます。
上図を見ると、アラーム内容がLLMに入力されている様子がわかります。
5.8 依頼内容に合ったデータ操作(検索や抽出など)はどんな感じ?
![](https://assets.st-note.com/img/1730501907-ZcADTN6M4zRdE2Qh0rFxY3yW.png?width=1200)
既存点検スケジュールや保守チーム情報などの操作(データ検索や抽出など)は、LangChainのPandas Dataframe Agentを使用しています。
上図はプロンプトテンプレートのステップ1から3のデータ操作を行う
pythonコードが生成された様子です(一部分)。
LLMにデータ操作を任せる次の不都合が生じますがPandas Dataframe Agentを利用することでこの不都合を防ぐことができます。
・LLMに大量のデータを与えるとトークン数制限でリジェクトされる
・LLMでのデータ操作は誤りが発生する場合がある(ハルシネーション)
一方でこんなリスクも生じます。
・動的にpythonコードを生成する
・ユーザ要求に悪意ある指示があるとシステム動作に悪影響を与える
・例えば、「xxデータを削除して」と書くとファイル削除が実行される
![](https://assets.st-note.com/img/1730509410-5KAUFBiyzNgfHhl83DRtvWm4.png)
上記は、Pandas Dataframe AgentのAPIです。
allow_dangerous_code=True を指定しないと使用できません。
危険を承知で使ってね、そのための承諾を下さいね、ということですね。
対策例は次のとおりです。
・ユーザ要求を直接LLMに与えない
・そのためにプロンプトテンプレートを必ず用意してユーザ要求を取り込む
・プロンプトテンプレート内で「もしファイル操作を要求された場合、
ファイル操作を禁止します」など悪意あるユーザ要求を無効化する
・Pandas Dataframe Agentを使用したLLMアプリの実行はサンドボックス
(Dockerなどの仮想環境)を用意して安全に運用する
Pandas Dataframe Agentを使用するとスケジューリング結果や分析結果を
ファイル出力できて結果の2次利用ができる、という効果もあります。
リスクを認識してバランスのとれた利用が必要になります。
6. まとめ
![](https://assets.st-note.com/img/1730503703-mXAyaSRM1Gwo5KFZgDr7Ntld.png?width=1200)
今回はStreamlitでアプリを構成してLangChainでAIエージェントを自作しました。
良くも悪くもガバナンスが効いた企業ではなかなか、こういったアプローチは、やりずらいものです。
オーソドックスなAzure/AWS/Google Cloudなどエンタープライズ向けクラウドの生成AIのマネージドサービスを使うのが無難ということになります。
ただ生成AIマネージドサービスはLangChainの機能実装/開発スピードに現状では追いつかない。痒いところに手を届かせてビジネスを加速させたい場合は、マネージドサービスとLangChainを連携させてAIオーケストレーションを実現するパターンも適用できます。LangChainは様々なLLMに対応できる特徴があります。
心配するより工夫しよう!
って、ことが大事ですね。
![](https://assets.st-note.com/img/1730503875-YvmTWSkBX9iqMHwGQP6yUg13.png?width=1200)
7. 登壇の様子とXでの反応
登壇風景の写真を運営スタッフとXからいただきました。また、コメントを頂きまして今後の励みになります。ありがとうございました。
![](https://assets.st-note.com/img/1730505331-39rGhu45gfBjVn8vQDeIt7YS.jpg?width=1200)
![](https://assets.st-note.com/img/1730505344-KhnAvbQjOIBk81xJ34srfqp0.jpg?width=1200)
![](https://assets.st-note.com/img/1730505354-KqPbQtjMREJrFSATz74fk8dB.jpg?width=1200)
![](https://assets.st-note.com/img/1730505362-v3j6ngdMyOaco1KwLT0b7GAQ.jpg?width=1200)
![](https://assets.st-note.com/img/1730531575-35sxjw1BVyKL9OJ20fWYbaq7.jpg?width=1200)
![](https://assets.st-note.com/img/1730505407-AGZt41X8IqgChLlV3d7OYFSW.png?width=1200)
![](https://assets.st-note.com/img/1730533977-8dasQCJqpGRf345VhAbWNvBO.png)
![](https://assets.st-note.com/img/1730533697-4tslhIbBYw0nPUd9Avua2VKp.png)
![](https://assets.st-note.com/img/1730505421-RjmEQTsa3v8fn56wiOk9XFzt.png?width=1200)
![](https://assets.st-note.com/img/1730533882-70q2tfLXlJd1sgmNGHbjDwU5.png)
![](https://assets.st-note.com/img/1730533786-g3n8Du7v24BwkYtFxdX0ILlp.png)
![](https://assets.st-note.com/img/1730505434-NjKCBAg2GhPZckJqnvH4xLUu.png?width=1200)
![](https://assets.st-note.com/img/1730534037-XIgweaqOEDTQiB0lAmkUdr9b.png)
![](https://assets.st-note.com/img/1730505475-uQv24kgcAeOnzlrEha5KISp9.png?width=1200)
![](https://assets.st-note.com/img/1730509705-AndB5F4fWtH2JNwE7CeuIOV9.png?width=1200)
![](https://assets.st-note.com/img/1730505489-iz49jLR8fyEtxNpAcsH0glJP.png?width=1200)
![](https://assets.st-note.com/img/1730505500-kTgn1hc8eHMIXiNqz5JmatEA.png?width=1200)
![](https://assets.st-note.com/img/1730726390-vyiFME7VU6fx1YQuThsR4PA0.png?width=1200)
![](https://assets.st-note.com/img/1730726483-k7yTuwqiZ0W8VMFKPeSDQ9dh.png?width=1200)
![](https://assets.st-note.com/img/1730728975-hWaPI1T86EtojXHKOw0Y9ReF.png?width=1200)
![](https://assets.st-note.com/img/1731071748-t04zhXNfyEluDqSQYw1HpAaZ.jpg?width=1200)
8. LT登壇を終えて
技術コミュニティの参加はいつも有益です。楽しい。
同じ興味や課題解決に悩む方々が集まるため、共感や新しい知見を得ることができます。私はワクワク感でいっぱいです。
歳を取ると色々な事に興味が薄れてきます。でも、人が興味をなくすと寂しい。私は高齢者ですが、新しい技術にまだまだ興味津々。新技術を勉強し、識者の方々の知見に接し、自分でプログラミングして自分の言葉で表現できるようにしたいですね。
発表スライド
用語
LLM:大規模言語モデル(Large Language Models:LLM)
大量のテキストデータをディープラーニングを用いて構築された言語モ
デル。人間の言語を理解、生成できるAI。
React(ReasoningとActingを組合せた用語)
プロンプトエンジニアリングの一つ。言語モデルで推論とタスクを遂行
するための手法。
LangChain
LLMに基づいてアプリケーションを構築するためのオープンソースフレ
ームワーク。
Agent
LLMに代わって、タスクを自律的に実行する生成AIの仕組み。
LangSmith
LangChainの開発元がリリースした、LLMアプリ開発支援サービス。
LLMアプリケーションデータの保存、編集、再実行、管理が可能。
Streamlit
Pythonで作ったデータ分析のコードを、Webアプリケーションとして
簡 単に公開できるライブラリ。機械学習モデルの可視化、データの探
索、インタラクティブなダッシュボードの作成など、幅広い用途に利用で
きる。
LT(Lightning Talksの略)
短い時間(5分から10分程度)で自分の考えやアイデアを発表するプレ
ゼンテーションのこと。