0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pentaho(ETL)でバイナリデータを扱ってみる

Last updated at Posted at 2025-07-04

はじめに

Pentahoはテキストデータを扱うことが多いですが、バイナリデータも扱えます。
本記事ではPentahoでバイナリデータ(画像)を読み取り、生成AIと組み合わせて画像処理をさせてみました。

やってみたこと

Pentahoで領収書の画像を読み取り、生成AIに登録番号・金額・費目を回答させ、結果をファイル出力します。
image.png

前提環境

  • Azure OpenAI Service (使用モデル: GPT-4o)
  • Pentaho 10.2

実装例

Pentahoでの実装例は以下になります。生成AIはREST APIを使用して呼び出します。
image.png

それぞれの部品について説明します。

1. 画像ファイル名取得

[ファイル名取得]部品を使って、領収書の画像があるファイル名のリスト(test.jpg, test2.jpg)を取得します。
[ファイルとディレクトリ]にディレクトリを入力し、[検索文字列]にファイル名の抽出条件を正規表現で記載します。この例では拡張子.jpgのファイル名を取得しています。
image.png

image.png

2.画像をロード

[計算]部品を使って、画像を読み込みます。

"計算"という名前からは想像しにくいですが、[計算]部品にはファイル全体を読み込む機能があります。

image.png

3. 画像をbase64エンコード

[Javaスクリプト]部品を使って、生成AIに渡せるように読み込んだ画像データをbase64エンコードします。

[Javaスクリプト]部品ではJavaのAPIも呼び出せるため、Javaのbase64エンコードAPIを活用してエンコードします。

image.png

スクリプト部分
var base64 = java.util.Base64.getEncoder().encodeToString(bin);

4. 生成AIに渡すパラメーター

[データグリッド]部品を使用して、生成AIを呼び出すときに渡すapi-keyとapi-versionを設定します。

[データグリッド]部品は定数など、決まった値を設定する場合に便利です。

  • [メタ]タブ
    image.png

  • [データ]タブ
    image.png

5. マージ結合

[マージ結合]部品を使って、生成AIに渡すパラメーターを各画像データの行に追加します。

[フィールド(結合1)]、[フィールド(結合2)]を空欄にすることですべての行にパラメーターが追加されます。

image.png

6. 選択/名前変更

[選択/名前変更]部品を使用して、必要な列のみを残します。

  • [選択フィールド]タブ
    image.png

7. 生成AIへのメッセージを作成

[Javaスクリプト]部品を使用して、生成AIに渡すJSONメッセージを作成します。
image.png

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を呼び出します。

  • [全般]タブ
    image.png

Location Forward (HTTPのステータスコードが300台) が発生する場合は、Forward先のURLを指定してください。

  • [ヘッダー]タブ
    api-keyをヘッダとして指定します。
    image.png

  • [パラメーター]タブ
    api-versionをパラメーターとして指定します。
    image.png

9. 生成AIの応答を取り出す

[JSON Input]部品を使用して、生成AIから呼び出し時に指定したJSONの部分を取り出します。

[JSON Input]部品はファイルからの読み込みの他に、前の部品で取得したJSONデータの解析もできます。

  • [ファイル]タブ
    image.png

  • [フィールド]タブ
    パスはJSON Pathで指定します。今回は$.choices[*].message.contentになります。
    image.png

10. 応答を解析

前の部品と同様、[JSON Input]部品を使用して、登録番号・金額・費目を取り出します。

  • [ファイル]タブ
    image.png

  • [フィールド]タブ
    image.png

    JSON Pathは以下のようになります。

    名称 パス
    登録番号 $.registration_number
    金額 $.price
    費目 $.expense_item

11. 選択/名前変更 2

[選択/名前変更]部品を使用して、必要な列のみを残します。
image.png

次のテキストファイル出力でも出力する列を選択できるのでこの部品は無くても構いません。

12. テキストファイル出力

[テキストファイル出力]部品を使って、画像処理結果をファイルに書き込みます。

  • [ファイルタブ]
    ファイルの出力先を指定します。
    image.png

  • [全般]タブ
    区切り文字はデフォルトだと;ですので、,に変更します。また、文字コードをUTF-8にします。
    image.png

  • [フィールド]タブ
    出力する列を設定します。まず、[フィールドを取得]をクリックします。
    image.png

    前の部品から渡される列情報が入力されます。

    short_filename列の長さが500に設定されています。このままだと、500文字の固定長で出力されるので、長さの値を削除します。

    (変更前)
    image.png
    (変更後)
    image.png

実行結果

このデータ変換を実行すると以下のようになり、正しく画像処理が行われました。
image.png

最後に

Pentahoでバイナリデータを扱う例をご紹介しました。base64変換の他に16進変換も可能で、いろいろ応用できると思います。

その他

製品の改良により予告なく記載されている仕様が変更になることがあります。

他社商品名、商標等の引用に関する表示

  • Azure は、マイクロソフトグループの企業の商標です。
  • Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Pentahoは、Hitachi Vantara LLCの商標または登録商標です。
  • HITACHIは,株式会社 日立製作所の商標または登録商標です。
  • その他記載の会社名,製品名などは,それぞれの会社の商標もしくは登録商標です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?