見出し画像

カスタマインでOpenAI召喚!した後の処理

モノづくり開発企業」にてDX推進を担当しているnamiokaです🚀

Customine(カスタマイン) Advent Calendar 2024』18日目です!


▶OpenAIを呼び出す”やること”

みんな大好きChatGPT。現在、カスタマインでOpenAIを扱える”やること”は下記の2種あります。(同内容でJob Runner版もあります。)
OpenAI を呼び出してテキストを生成する
OpenAI を画像付きで呼び出してテキストを生成する

8日目の記事でほりさんがコミカルな使い方をしていましたね。

サポートサイトでも詳しく設定方法が書いてあるので、本当に簡単にGPTくんを呼び出すことが出来ます。(むしろ初めてだと、OpenAI API発行のほうが分かりづらいと思う)。
よって、本記事ではカスタマインでOpenAIを呼び出した後の処理について着目してみます。

▶返ってくる値は文字列

OpenAIを呼び出して返ってくる値はひとつの文字列です。
例えば、メール文の作成や議事録の要約であれば、そのまま文字列複数行に値を入れてしまえば問題ありません。
しかし、名刺画像から情報を読み取りたいといったケースでは、読み取った文字列を各フィールド(会社名、氏名、メールアドレス、など)に振り分けたくなりますよね?
そこで、アプローチを3つ考えました。

▶文字列を振り分ける

名刺画像の読み取りを例とします。
方向性としては出力を構造化して分解となります。

①何度もGPTくんを呼び出す方法【お手軽】

ひとまず「OpenAI を画像付きで呼び出してテキストを生成する」で名刺画像からいい感じに情報を読み取ってもらいます。
#メッセージ(プロンプト)例

名刺の画像から、会社名、部署、氏名、メールアドレスの情報を読み取ってください。
出力は下記のフォーマットにしてください。

会社名:(読み取った会社名)
部署:(読み取った部署)
名前:(読み取った名前)
メールアドレス:(読み取ったメールアドレス)

続いて「OpenAI を呼び出してテキストを生成する」にて、名刺画像からの出力を更に分解してもらい、その結果をフィールドにセットします。
#メッセージ(プロンプト)例

以下の名刺画像読み取り結果から会社名の値だけを抽出してください。
余計な情報は含めないでください。

#名刺画像読み取り結果
${画像からの出力}

あとは分解したいフィールド毎に同様な設定を繰り返していけばOKです。
Smart at AI」で言うところのプロンプトチェーン的なアプローチですね。

  • メリット:全部GPTくんにお任せで簡単

  • デメリット:フィールド毎に設定するのが面倒。フィールドが多ければその分処理も時間がかかる。

GPTくんを酷使する

②出力を配列にする【は、実はできない】

フィールド毎の設定は面倒すぎるので、
名刺からの出力を配列にして各フィールドに振っていくアプローチが思いつくと思います。
配列に関する解説は5日目matanki153さんの記事がありましたね!

まず「OpenAI を画像付きで呼び出してテキストを生成する」で名刺画像からいい感じに配列で出力してもらいます。

名刺の画像から、会社名、部署、氏名、メールアドレスの情報を読み取ってください。
出力は下記のように配列にしてください。
各要素の順番は遵守してください。

["会社名", "部署", "名前", "メールアドレス"]

あとは呼び出したアクション番号が仮に1ならば、

  • $1[0] ←会社名の値

  • $1[1] ←部署の値

のように、各フィールドにマッピングしてレコード更新で楽勝!
・・・とは行きませんでした。
GPTくんが一生懸命配列にしてくれたとしても、カスタマイン側では配列風の文字列として認識されてしまうようです。

サポートに泣きついたところ「正規表現を用いてフィールドの値を置換する」で文字列から抽出できるよと案内をいただきました。(正規表現のサポートはできないけど)。オーケーオーケー俺にはGPTくんがいる。

◇最終的なアプローチ

  1. 正規表現をシンプルにしたいので、GPTからの出力はカンマ区切りにする

    •  例)会社名,部署,名前,メールアドレス

  2. 「正規表現を用いてフィールドの値を置換する」はフィールド値しか扱えないので、ひとまずカンマ区切りのままで各フィールドにセット

  3. 正規表現で置換

    • 例)部署なら2番目なので (?:[^,],){1}([^,])

正規表現はGPTくん作ってくれたので自分では解説できないですが一応動きました。

  • メリット:カスタマインのやることを利用する正攻法?

  • デメリット:結局これもフィールド毎に設定する羽目になる。正規表現苦手

③最終兵器

はい、もうこれしか思いつかない。

JSを使うとなると色んなアプローチがあると思いますが、例えば
・GPTからの出力はカンマ区切りにする
・JavaScript を実行する

// カンマ区切りの文字列を配列変換
let str = customine[アクション番号]; // 「OpenAI を画像付きで呼び出してテキストを生成する」のアクション番号
let arr = str.split(",").map(item => item.trim());
console.log(arr);
return arr;

これで無事配列になるので、$1[0]等で各フィールドにマッピングしてレコード更新可能となります。

  • メリット:アクションがすっきりする

  • デメリット:最終兵器なのでご利用は最小限に

▶終わりに

  • 最後の方、雑になってしまいすみません

  • プロンプト頑張ればそれなりに精度の高い読み取りは可能です

  • OpenAI呼び出しで配列等構造化データで読み取れるオプション欲しいです

  • RAGも対応できたら嬉しい(カスタマインならレコード取得は簡単なので、それをOpenAIにいい感じに投げられないですかね)

以上。すごくないkintoneアドカレも同日投稿でした!こっちもカスタマイン使用しています🧩

▶追記:RAGも「できまぁす!」

さっそくつっきーさんからコメントが・・・

す、すげえ・・・。これ、もはや何でもできちゃうやつじゃない!?
後で試してみよう!


いいなと思ったら応援しよう!