はじめに
Pentahoはテキストデータを扱うことが多いですが、バイナリデータも扱えます。
本記事ではPentahoでバイナリデータ(画像)を読み取り、生成AIと組み合わせて画像処理をさせてみました。
やってみたこと
Pentahoで領収書の画像を読み取り、生成AIに登録番号・金額・費目を回答させ、結果をファイル出力します。
前提環境
- Azure OpenAI Service (使用モデル: GPT-4o)
- Pentaho 10.2
実装例
Pentahoでの実装例は以下になります。生成AIはREST APIを使用して呼び出します。
それぞれの部品について説明します。
1. 画像ファイル名取得
[ファイル名取得]部品を使って、領収書の画像があるファイル名のリスト(test.jpg, test2.jpg)を取得します。
[ファイルとディレクトリ]にディレクトリを入力し、[検索文字列]にファイル名の抽出条件を正規表現で記載します。この例では拡張子.jpgのファイル名を取得しています。
2.画像をロード
[計算]部品を使って、画像を読み込みます。
"計算"という名前からは想像しにくいですが、[計算]部品にはファイル全体を読み込む機能があります。
3. 画像をbase64エンコード
[Javaスクリプト]部品を使って、生成AIに渡せるように読み込んだ画像データをbase64エンコードします。
[Javaスクリプト]部品ではJavaのAPIも呼び出せるため、Javaのbase64エンコードAPIを活用してエンコードします。
var base64 = java.util.Base64.getEncoder().encodeToString(bin);
4. 生成AIに渡すパラメーター
[データグリッド]部品を使用して、生成AIを呼び出すときに渡すapi-keyとapi-versionを設定します。
[データグリッド]部品は定数など、決まった値を設定する場合に便利です。
5. マージ結合
[マージ結合]部品を使って、生成AIに渡すパラメーターを各画像データの行に追加します。
[フィールド(結合1)]、[フィールド(結合2)]を空欄にすることですべての行にパラメーターが追加されます。
6. 選択/名前変更
[選択/名前変更]部品を使用して、必要な列のみを残します。
7. 生成AIへのメッセージを作成
[Javaスクリプト]部品を使用して、生成AIに渡すJSONメッセージを作成します。
Javaスクリプト部分は以下のようになります。
API バージョン 2024-08-01-preview
から応答をJSON形式にできるようです。構造化出力
response_format
で返してほしいJSON書式を指定します。
messages.content.text
がいわゆるプロンプトになります。
//Script here
var myurl = "data:image/jpeg;base64," + base64
var myobj = {
"model":"gpt-4o",
//生成AIからの応答の書式をJSONにする。
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "invoice",
"strict": true,
"schema": {
"type": "object",
"properties": {
"registration_number": {
"type": "string"
},
"price": {
"type": "integer"
},
"expense_item": {
"type": "string"
}
},
"required": [
"registration_number",
"price",
"expense_item"
],
"additionalProperties": false
}
}
},
"messages": [
{
"role": "system",
"content": "You are a helpful assistant designed to output JSON."
},
{
"role": "user",
"content": [
{
"type": "text",
//プロンプト
"text": "領収書に記載されている次の項目をJSON書式に従って教えてください。金額は数字のみ教えてください。費目はカタログから選んでください。 " +
"### 項目 " +
"登録番号 金額 費目 " +
"### カタログ " +
"食費 交通費 日用品費 教育費 光熱費"
},
{
"type": "image_url",
"image_url": {
"url": myurl
}
}
]
}
]
}
var jsonString = JSON.stringify(myobj);
8. 生成AIのよびだし
[REST Client]部品を使用して生成AIを呼び出します。
Location Forward (HTTPのステータスコードが300台) が発生する場合は、Forward先のURLを指定してください。
9. 生成AIの応答を取り出す
[JSON Input]部品を使用して、生成AIから呼び出し時に指定したJSONの部分を取り出します。
[JSON Input]部品はファイルからの読み込みの他に、前の部品で取得したJSONデータの解析もできます。
10. 応答を解析
前の部品と同様、[JSON Input]部品を使用して、登録番号・金額・費目を取り出します。
-
JSON Pathは以下のようになります。
名称 パス 登録番号 $.registration_number 金額 $.price 費目 $.expense_item
11. 選択/名前変更 2
次のテキストファイル出力でも出力する列を選択できるのでこの部品は無くても構いません。
12. テキストファイル出力
[テキストファイル出力]部品を使って、画像処理結果をファイルに書き込みます。
実行結果
このデータ変換を実行すると以下のようになり、正しく画像処理が行われました。
最後に
Pentahoでバイナリデータを扱う例をご紹介しました。base64変換の他に16進変換も可能で、いろいろ応用できると思います。
その他
製品の改良により予告なく記載されている仕様が変更になることがあります。
他社商品名、商標等の引用に関する表示
- Azure は、マイクロソフトグループの企業の商標です。
- Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
- Pentahoは、Hitachi Vantara LLCの商標または登録商標です。
- HITACHIは,株式会社 日立製作所の商標または登録商標です。
- その他記載の会社名,製品名などは,それぞれの会社の商標もしくは登録商標です。