– AI ManiaX –

“Thinking with AI, building with AI.”

機械学習のscikitを使って、CADデータから作業指示データが推論できるか実験してみた

なぜこの実験をしようと思ったか

CADデータを元に加工作業を行う現場には、熟練者の頭の中にしか存在しない知識がある。

「この部品はこの順番で削る」「この材質にはこの工具を使う」——そういった判断は、長年の経験から来るものであり、マニュアルには書かれていない。

では、その判断をAIに学習させることはできるか。そのための入力データとして、CAD(設計データ)と過去の作業指示データのペアが使えないか——そういう問いから、この実験は始まった。


やったこと

データの準備

今回使ったデータは2種類だ。

① 形状データ(STEPファイル) 部品の3D形状を定義したCADファイル。加工の各工程ごとに、形状がどう変化したかを記録した途中形状データも用意した。

② 作業指示データ(JSON) 過去の加工プログラムをJSON化したもの。どの工具を使い、どの順番で、どんな切削条件で加工したかという情報が入っている。

この2つをペアにして、「この形状変化にはこの作業指示が対応する」という教師データを作った。

形状特徴の抽出

STEPファイルをPythonで解析し、以下の特徴量を抽出した。

  • 面数・エッジ数
  • 円筒面の直径リスト
  • 面取りの数
  • バウンディングボックス(X/Y/Z方向の寸法)

これらを固定長ベクトルに変換し、工程間の差分(Δ面数・追加された円筒径など)も特徴量として加えた。

scikitで類似検索

scikit-learnのコサイン類似度を使って、新しいCADデータが来たとき、過去のペアデータの中から最も似た形状変化を検索し、対応する作業指示を推奨値として出力する仕組みを作った。

python

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 形状ベクトルで類似検索
scores = cosine_similarity([query_vec], db_vecs)[0]
top_k = np.argsort(scores)[::-1][:3]

結果:動いた。ただし、誤判定した。

動作確認として、ある工程のCADデータを投入したところ、類似度1.0000という結果が出た。しかし推奨された作業指示は別の工程のものだった。

なぜか。

同じ部品の加工途中には、形状が同一に見える工程が複数存在する。外形の削り出しが終わった状態と、内径加工が終わった状態が、特徴量ベクトルとして区別できないケースがあるのだ。

形状は「何が出来上がっているか」を表すが、「次に何をすべきか」は表さない。


気づき:「意図」のメタデータが鍵だった

誤判定の原因を分析すると、一つの結論に至った。

形状データは必要条件だが、十分条件ではない。

正解率を上げるために有効だったのは、以下の情報を検索キーに加えることだった。

  • 加工フェーズ(荒加工か、仕上げか)
  • 品番(どの部品か)
  • 工程番号(何番目の工程か)

これらは「形状」ではなく「意図」の情報だ。加工フェーズが分かれば、検索空間が一気に絞られ、正解率が大幅に改善する見込みが立った。

言い換えると、AIに渡すべきなのは「どう見えるか」だけでなく「何をしようとしているか」だということだ。


スモールスタートから複数部品への拡張設計

今回は1部品・1プログラムという最小単位で実験した。これは意図的な選択だった。

複数部品から始めると、「なぜ誤判定するのか」の原因が見えにくくなる。1部品で構造的な問題を特定してから拡張する方が、設計の精度が上がる。

複数部品に拡張する際の設計思想はシンプルだ:

1部品:    JSON + scikit(メモリ上で完結)
数十部品:  SQLite + numpy(ファイルベースDB)
数百部品〜: ベクトルDB(OpenSearch等)

段階的にスケールさせ、各段階で精度評価をする。一気にインフラを作らない。


展望

今回の実験で見えてきたことがある。

推論の精度は、データの量よりデータの構造化の質で決まる。形状・材質・フェーズ・品番——これらを正しく紐づけて蓄積できた側が、推論精度で圧倒的な優位に立つ。

今回はscikitによる類似検索で概念実証したが、ここに生成AIを組み合わせることで、推論の柔軟性はさらに上がるだろう。