Kogito を使用してアプリケーションに予測機能を追加する
このガイドでは、QuarkusアプリケーションがKogitoを使用してビジネスオートメーションを追加し、予測機能を強化する方法について説明します。
Kogitoは、よく知られたオープンソース・プロジェクトであるDrools(予測のための)から生まれた、次世代のビジネス・オートメーション・ツールキットです。Kogitoは、ビジネス・オートメーションに新しいアプローチを提供することを目的としており、主なメッセージは、ビジネス・ナレッジ(プロセス、ルール、意思決定、予測)をドメイン固有の方法で公開することです。
前提条件
このガイドを完成させるには、以下が必要です:
-
約15分
-
IDE
-
JDK 11+ がインストールされ、
JAVA_HOME
が適切に設定されていること -
Apache Maven 3.8.6
-
動作するコンテナランタイム(Docker, Podman)
-
使用したい場合は、 Quarkus CLI
-
ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること
ソリューション
次のセクションで紹介する手順に沿って、ステップを踏んでアプリを作成することをお勧めします。ただし、完成した例にそのまま進んでも構いません。
Gitリポジトリをクローンする: git clone https://github.com/quarkusio/quarkus-quickstarts.git
、または アーカイブ をダウンロードする。
このソリューションは kogito-pmml-quickstart
ディレクトリ にあります。
Mavenプロジェクトの作成
まず、新しいプロジェクトを用意します。以下のコマンドで新しいプロジェクトを作成します:
このコマンドはMavenプロジェクトを生成し、アプリケーションにビジネス・オートメーションの機能を追加するために必要な依存関係と構成をすべて備えた kogito
エクステンションをインポートします。また、KogitoがRESTサービスを公開するのに必要な resteasy-jackson
エクステンションをインポートします。
すでにQuarkusプロジェクトが設定されている場合は、プロジェクトのベースディレクトリーで以下のコマンドを実行することで、プロジェクトに kogito
エクステンションを追加することができます:
quarkus extension add 'kogito'
./mvnw quarkus:add-extension -Dextensions='kogito'
./gradlew addExtension --extensions='kogito'
これにより、 pom.xml
に以下が追加されます:
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-quarkus</artifactId>
</dependency>
implementation("org.kie.kogito:kogito-quarkus")
アプリケーションの作成
予測はPMMLモデルに基づいて評価されます。PMMLモデルの標準と仕様は こちら をご覧ください。まず、簡単なPMMLファイル: LogisticRegressionIrisData.pmml
を追加してみましょう。このファイルには LogisticRegressionIrisData
という名前の 回帰 モデルが含まれています。回帰関数を用いて sepal(がく片) と petal(花びら) の寸法からiris(アヤメ)の種類を予測しています:
<PMML xmlns="http://www.dmg.org/PMML-4_2" version="4.2">
<Header/>
<DataDictionary numberOfFields="5">
<DataField name="Sepal.Length" optype="continuous" dataType="double"/>
<DataField name="Sepal.Width" optype="continuous" dataType="double"/>
<DataField name="Petal.Length" optype="continuous" dataType="double"/>
<DataField name="Petal.Width" optype="continuous" dataType="double"/>
<DataField name="Species" optype="categorical" dataType="string">
<Value value="setosa"/>
<Value value="virginica"/>
<Value value="versicolor"/>
</DataField>
</DataDictionary>
<RegressionModel functionName="classification" modelName="LogisticRegressionIrisData" targetFieldName="Species">
<MiningSchema>
<MiningField name="Sepal.Length"/>
<MiningField name="Sepal.Width"/>
<MiningField name="Petal.Length"/>
<MiningField name="Petal.Width"/>
<MiningField name="Species" usageType="target"/>
</MiningSchema>
<Output>
<OutputField name="Probability_setosa" optype="continuous" dataType="double" feature="probability" value="setosa"/>
<OutputField name="Probability_versicolor" optype="continuous" dataType="double" feature="probability" value="versicolor"/>
<OutputField name="Probability_virginica" optype="continuous" dataType="double" feature="probability" value="virginica"/>
</Output>
<RegressionTable targetCategory="setosa" intercept="0.11822288946815">
<NumericPredictor name="Sepal.Length" exponent="1" coefficient="0.0660297693761902"/>
<NumericPredictor name="Sepal.Width" exponent="1" coefficient="0.242847872054487"/>
<NumericPredictor name="Petal.Length" exponent="1" coefficient="-0.224657116235727"/>
<NumericPredictor name="Petal.Width" exponent="1" coefficient="-0.0574727291860025"/>
</RegressionTable>
<RegressionTable targetCategory="versicolor" intercept="1.57705897385745">
<NumericPredictor name="Sepal.Length" exponent="1" coefficient="-0.0201536848255179"/>
<NumericPredictor name="Sepal.Width" exponent="1" coefficient="-0.44561625761404"/>
<NumericPredictor name="Petal.Length" exponent="1" coefficient="0.22066920522933"/>
<NumericPredictor name="Petal.Width" exponent="1" coefficient="-0.494306595747785"/>
</RegressionTable>
<RegressionTable targetCategory="virginica" intercept="-0.695281863325603">
<NumericPredictor name="Sepal.Length" exponent="1" coefficient="-0.0458760845506725"/>
<NumericPredictor name="Sepal.Width" exponent="1" coefficient="0.202768385559553"/>
<NumericPredictor name="Petal.Length" exponent="1" coefficient="0.00398791100639665"/>
<NumericPredictor name="Petal.Width" exponent="1" coefficient="0.551779324933787"/>
</RegressionTable>
</RegressionModel>
</PMML>
プロジェクトのコンパイル時に、Kogitoはファイルを読み込んで、評価に必要なクラスと、いくつかのRESTエンドポイントを生成します。
すぐに始めるには、 quickstart からPMMLファイルをコピーしてください。
アプリケーションの実行と使用
Devモードでの動作
マイクロサービスをdevモードで実行するには:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
JVMモードでの動作
「開発モード」で遊び終わったら、標準のJavaアプリケーションとして実行することができます。
まずコンパイルします:
quarkus build
./mvnw install
./gradlew build
それから以下を実行してください:
java -jar target/quarkus-app/quarkus-run.jar
ネイティブモードでの実行
同じデモをネイティブコードにコンパイルすることができます。修正は必要ありません。
これは、生成されたバイナリにランタイム技術が含まれており、最小限のリソースオーバーヘッドで実行できるように最適化されているため、本番環境にJVMをインストールする必要がないことを意味します。
コンパイルには少し時間がかかるので、このステップはデフォルトでは無効になっています。以下のコマンドでネイティブ実行可能ファイルをビルドしてみましょう:
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.package.type=native
コーヒーを飲み終わると、このバイナリは以下のように直接実行出来るようになります:
./target/kogito-pmml-quickstart-1.0.0-SNAPSHOT-runner
アプリケーションのテスト
アプリケーションをテストするには、JSONペイロードとして期待される入力を提供して、エンドポイントにリクエストを送るだけです。
curl -X POST http://localhost:8080/LogisticRegressionIrisData \
-H 'content-type: application/json' \
-H 'accept: application/json' \
-d '{ "Sepal.Length": 6.9, "Sepal.Width": 3.1, "Petal.Length": 5.1, "Petal.Width": 2.3 }'
レスポンスの中に、予測値が表示されているはずですが、それは virginica のはずです:
{
"Species": "virginica"
}
また、descriptive エンドポイントを呼び出すこともでき、その場合は OutputField の評価も提供されます:
curl -X POST http://localhost:8080/LogisticRegressionIrisData/descriptive \
-H 'content-type: application/json' \
-H 'accept: application/json' \
-d '{ "Sepal.Length": 6.9, "Sepal.Width": 3.1, "Petal.Length": 5.1, "Petal.Width": 2.3 }'
{
"correlationId": null,
"segmentationId": null,
"segmentId": null,
"segmentIndex": 0,
"resultCode": "OK",
"resultObjectName": "Species",
"resultVariables": {
"Probability_setosa": 0.04871813160275851,
"Probability_versicolor": 0.04509592640753013,
"Probability_virginica": 0.9061859419897114,
"Species": "virginica"
}
}