料理レシピ画像から、指定した項目のテキストを自動で抽出&リスト化【Dify × Make】
小売に勤めて13年目のujapaです。
このお題、生成AIの力を借りてノーコードでできました。
今回は抽出結果をGoogleスプレッドシートに自動で書き込めるようにしました。
なぜ、料理レシピのテキストが必要?
この料理レシピ、実は食品メーカーさまと一緒に作ったものです。正確には、共同で参画する一般社団法人で作成しました。その過去作をもっと柔軟にアップデートして有効利用していきたいと思ったからです。
完全に外注だったので1種類あたりでXXXXX円(結構高い)のコストがかかっています。
それなのに、商品画像やデザイン面で古くなって使えないものがあるのはとてももったいない。
そしてデザイン更新にあたっては、例えばCanvaの一括作成機能で作成できればなぁと。SNSやイベントに合わせてデザイン変えられるし、商品写真や栄養成分が変わってもサッと対応できそう。
名前リストなどをアップして、一瞬でパーソナライズされたデザインを作れるようになりました。
— Canva 公式(キャンバ) (@CanvaJapan) October 10, 2022
結婚式招待状、席札、宛名もあっという間に完成!現時点では、アップロードした画像のみを一括作成に使えます。
対象プラン:Pro、Teams pic.twitter.com/1DoLcCnxtW
そのためには、まず、必要な項目のリストが必要です。
わざわざ料理レシピ画像からテキスト抽出するの?
「レシピの画像があるなら、デザインを作った時の元データも持ってるでしょ?それ使えばええやん」って思いますよね。
本当におっしゃる通り!
けど、ちゃんと手元にあるのは8割くらいなんです。残りは前任者のメール履歴のどこかに埋没…😅完成した画像だけは揃ってるんですが……。
今回自動化で得たものは、効率化で生み出される余剰時間というよりも、過去資産の有効活用機会です。
DifyのLLMで読み取り、Googleスプレッドシートに記録
LLMノードの出力をそのままMakeのWebhooksにつなぐだけ
ここはまさに盲点であり、重要なポイントでした。
最初は先人の記事を調べてたのですが、JSON形式への変換、パラメータ抽出ノードの設定、JSONのパースなど様々な手法が提示されていて、どの状況で何が必要なのか理解するのに時間がかかりそうでした。前提知識が不足していると、適切な質問を考えることすら難しいと痛感。
しかし、どうやらMakeのWebhooksは、送られてきたデータを自動で解析する機能を持っているらしい、という発見がありました。ならば、「JSON形式で出力してほしい」とLLMノードに指示すればいい感じに整形してくれて、それを丸ごとMakeに渡すだけで自動でいい感じに分解してくれるんじゃないかと考えました。
結果は、期待通り!
料理レシピ画像からテキストを抽出するプロンプト
【指示】
あなたは無数の料理レシピを見てきたプロの編集者かつ、史上最強のOCRエンジンです。
画像内に表示されたレシピに関する情報を読み取り、所定のJSON形式で構造化出力してください。
---
【出力フォーマット(JSON形式)】
{
"category": "",
"sales_copy": "",
"dih_name": "",
"ingredients": "",
"step": "",
"energy": "",
"protein": "",
"company": ""
}
---
【抽出ルール】
各項目は以下の条件に従って、画像から抽出すること:
- category
- 「主菜」、「副菜」、「主食+主菜」などの種類のこと。
- sales_copy
- recipe_nameの近くにあるキャッチコピー
- dish_name
- このレシピカード画像の料理名
- ingredients
- 材料のブロックにある項目群
- step
- 作り方。各ステップ内にも番号がありますが、それは前ステップを指す指示語でしかないので留意してください。「※」などから始まる注釈も、「作り方」のブロックに含まれているものは抽出。
- energy
- 「XX kcal」の数値のみ(単位は除く)
- protein
- たんぱく質「XX g」の数値のみ(単位は除く)
- company
- 日本語の企業名。ロゴ・デザインや企業名の領域を見つけたら、多角的に検討して実在社名を検索。
---
【制約事項(厳守ルール)】
- 出力項目は上記8項目に限定し、それ以外の情報は抽出しない
- 該当項目が画像内に存在しない場合は "該当なし" を記載する
- 判読できない文字は "X" に置き換える
- company項目以外、画像内に明示されたテキスト情報のみを対象とし、補完・推測・意訳・省略は行わない
プロンプト作成自体も生成AIで
おんぶにだっことはまさにこのこと。生成AIを活用すると、自分だけでは到底辿り着けないようなアウトプットに到達できるのは、本当に素晴らしいですね。
ただ、実際にレシピ画像を読み込ませてみると最初はなかなかきれいにテキストが抽出されず、かなり苦戦しました(上記のプロンプトは14代目です)。
例えば、どこからともなくカレー粉が現れて味の決め手になったり、なぜか器に塩を盛りつけらたり、きゅうりスライスのはずがなぜか千切りになったりしました。
意図と背景をChatGPTにフィードバックしながら、プロンプト改良のポイントを教えてもらいつつ、試行錯誤を繰り返しました。
入力画像側の工夫
他にも厄介だったのが、人間でも目を凝らさないと読み取れないような、番号が入れ子になった複雑なレシピカードも存在していたことです。
しかし、そんな「目を凝らす」ような状況からふと思いつき、小さい画像や欄外の余白が大きな画像については、拡大してスクリーンショットを撮り、それをワークフローに流すということをやってみました。
これが効果覿面。劇的に改善するケースがありました。
人間の仕事は目的と責任を持つこと
さて、無事にリストが作成されても油断は禁物です。ほとんどはうまくいきましたが、100%の精度にはなりませんので目視は必要です。
作り方項目以外にも、企業ロゴからの社名読み取りをたまに間違えていました。
社内用の生成AIチャットに同じプロンプトでやると失敗しないので何かLLMの設定や精度に違いがあるのかもしれません(今回LLMノードで選択したのは4o-mini)。
また、リストの構造について、一般社団法人のボスからは「面白いなぁ。けど、材料とか作り方は1行ずつ分解して出力しなくていいの?」とのコメントあり。
試してみると材料欄の小見出しが本当に多様でやや面倒でしたが、一応分解したリストも作れそうでした。ただ、目的に立ち返ると、今回はCanvaの一括作成を目指した整形ですので、現在の形式としています。
まとめ
- アップロード画像からテキストを抽出し、Googleスプレッドシートへの書き込みまでをノーコードで自動化
- DifyのLLMノードに「JSON形式で出力してほしい」と指示してMakeに渡せば、Webhooksは自動で構造分析
- プロンプトだけでなく、入力画像の拡大で精度向上
- 最後は人間が目的と責任を持つ
お読みいただきありがとうございました!