Media > AI活用ユースケース > マーケティング > 小売店が毎週集める競合店のチラシを読み取り、商品・規格・売価を自社の商品マスタに対応づけて、自社の売価との差が大きい商品を売価担当へ出す

小売店が毎週集める競合店のチラシを読み取り、商品・規格・売価を自社の商品マスタに対応づけて、自社の売価との差が大きい商品を売価担当へ出す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

各店が毎週集める競合店のチラシを読み取り、商品・規格・売価を自社の商品マスタに対応づけます。自社の売価との差が大きい商品は、チラシの期間が始まる前に売価担当へ一覧で出します。

サマリー
生成AI
Azure OpenAI Service/Claude/Gemini
AIサービス
Azure AI/Google Document AI
連携・自動化
Google Apps Script/Python
対象業界
小売
対象部門
マーケティング/営業
対象業務
データ入力・転記/比較検討
主な課題
データ分析に時間がかかる/入力作業が多い/判断に時間がかかる
AIで行う処理
読み取り(OCR)
主な効果
判断支援/工数削減/機会損失防止
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
条件付き
現在工数
120h/月
AI導入後
32h/月
想定削減
73%
年間削減
1,056h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 各店の担当が、競合店のチラシを手に入れる
  2. チラシを見ながら、気になった商品の商品名と売価を表に写す
  3. 写した商品が自社のどの商品に当たるかを、商品マスタで探す
  4. 自社の売価を引き、差を計算する
  5. 表を本部へ送る
  6. 本部の売価担当が、各店の表をまとめて、差の大きい商品を選ぶ
  7. 売価を合わせるかを部門のバイヤーと話し、決める
導入後(After)
  1. 人各店の担当がチラシをスキャンするか、競合のサイトで公開されたPDF・画像を保存し、店コードと競合店名を付けて取込フォルダに置く
  2. 自動Azure AI Document Intelligence のレイアウトモデルが、文字と段落、位置、信頼度を返す
  3. 自動中継の処理が、売価の数字を中心に近くの段落を寄せ、商品ごとのブロックにする
  4. 自動Azure OpenAI が、ブロックごとに商品名・メーカー・規格・売価・売り方の条件を項目にする
  5. 自動中継の処理が、売価を1個あたりの税込の価格にそろえ、商品マスタから候補を5つまで引く
  6. 自動Azure OpenAI が、候補の中から当たる商品を選ぶか、「当たる商品なし」とする
  7. 自動自社の売価との差を計算し、部門ごとの基準を超えた商品を一覧にする
  8. 人本部の担当が、対応づけに自信のない行と、差の大きい行を確かめる
  9. 人売価担当が一覧を見て、合わせるかをバイヤーと決める
各工程の詳しい説明を読む
  1. 各店の担当が、競合店のチラシを手に入れる
  2. チラシを見ながら、気になった商品の商品名と売価を表に写す
  3. 写した商品が自社のどの商品に当たるかを、商品マスタで探す
  4. 自社の売価を引き、差を計算する
  5. 表を本部へ送る
  6. 本部の売価担当が、各店の表をまとめて、差の大きい商品を選ぶ
  7. 売価を合わせるかを部門のバイヤーと話し、決める

(a)写す手間が大きい。 80品のうち何を写すかは担当の判断で、写す量は店によって10品から60品まで違います。 忙しい週ほど少なくなり、見落としの多い週が、競合が力を入れた週と重なることがあります。

(b)規格が抜ける。 「牛乳 158円」とだけ写すと、1,000mlなのか900mlなのか、どのメーカーかが分かりません。本部で比べようとしても、比べる相手が決まりません。

(c)売り方の条件が抜ける。 「お一人様2点限り」「日曜日限り」「アプリ会員価格」。条件の付いた価格を条件なしの価格と比べると、差を大きく見積もります。

(d)気づくのが遅い。 写す、探す、計算する、送る、まとめる。売価担当の手に届くのは週の半ばで、競合の目玉の商品に手を打てるのは次の週になります。

  1. 【人】 各店の担当がチラシをスキャンするか、競合のサイトで公開されたPDF・画像を保存し、店コードと競合店名を付けて取込フォルダに置く
  2. 【自動】 Azure AI Document Intelligence のレイアウトモデルが、文字と段落、位置、信頼度を返す
  3. 【自動】 中継の処理が、売価の数字を中心に近くの段落を寄せ、商品ごとのブロックにする
  4. 【自動】 Azure OpenAI が、ブロックごとに商品名・メーカー・規格・売価・売り方の条件を項目にする
  5. 【自動】 中継の処理が、売価を1個あたりの税込の価格にそろえ、商品マスタから候補を5つまで引く
  6. 【自動】 Azure OpenAI が、候補の中から当たる商品を選ぶか、「当たる商品なし」とする
  7. 【自動】 自社の売価との差を計算し、部門ごとの基準を超えた商品を一覧にする
  8. 【人】 本部の担当が、対応づけに自信のない行と、差の大きい行を確かめる
  9. 【人】 売価担当が一覧を見て、合わせるかをバイヤーと決める

8番目が、この設計の分かれ目です。 確かめるのは全品ではなく、対応づけに迷った行と、差が基準を超えた行だけです。 全品を人が見る設計にすると、②の時間がほとんど減りません。

9番目は、これまでどおり人が決めます。 差が大きいことと、合わせるべきことは別です。競合が原価を割って売っている目玉の商品に、すべて合わせる必要はありません。

02今回想定するシステム構成

構成図
競合店のチラシ(紙をスキャン/公開されたPDF・画像)
   │  店コード、競合店名、チラシの期間を付けて保存
   ▼【トリガー】取込フォルダへの保存
Azure Functions(中継の処理)
   ▼
Azure AI Document Intelligence(レイアウトモデル prebuilt-layout)
   │   段落・行・単語、位置(polygon)、信頼度
   ▼
Azure Functions ── 売価の数字を中心に段落を寄せ、商品ごとのブロックにする
   ▼
Azure OpenAI(Microsoft Foundry) ── 構造化出力 ①
   │   商品名/メーカー/規格/売価の数字/売り方の条件/税の表示
   ▼
Python ── 1個あたりの税込の価格にそろえ、商品マスタから候補を引く
   ▼
Azure OpenAI ── 構造化出力 ②(候補から当たる商品を選ぶ/なし)
   ▼
Python ── 自社の売価との差、部門ごとの基準で振り分け
   ▼
差の一覧(チラシの切り抜き付き) ──【本部の担当が確認 → 売価担当が判断】
役割想定する製品代替候補
OCRAzure AI Document Intelligence(レイアウトモデル)Google Document AI
生成AIAzure OpenAI(Microsoft Foundry)(ブロックの項目化と、候補からの対応づけ)Claude API、Gemini API
差異計算Python(税込・1個あたりへのそろえ、候補の絞り込み、売価の差の計算)Google Apps Script
連携Azure Functions(取込フォルダの監視、ブロックの組み立て、一覧の出力)Azure Logic Apps
保管Azure Blob Storage(チラシの画像と切り抜き)社内のファイルサーバー

商品マスタと売価のデータは、新しく足すものではありません。 基幹システムから毎朝書き出したCSVを読みます。この構成から基幹システムの売価を書き換えることはしません。

土台は、Document Intelligence のレイアウトモデルです。 テキスト、テーブル、選択マーク、文書の構造を抽出し、段落ごとに境界の polygon を、単語ごとに confidence を返します。日本語(ja)は印刷されたテキストの対応言語に入っています。チラシは表ではないので、表の抽出ではなく、段落と位置を使います。

入力の条件のうち、この題材で効くのは2つです。 画像のサイズが50×50から10,000×10,000ピクセルの間であること、抽出するテキストの最小の高さが1024×768ピクセルの画像で12ピクセルであることです。チラシの規格や条件は小さな字で書かれることが多く、解像度が足りないと、売価は読めても規格が読めません。

03どうやって実装するのか

Step1

処理の起点を決める

各店の担当が、チラシを取込フォルダに保存したことを起点にします。 紙のチラシは店のスキャナで読み、競合が自社のサイトで公開しているものは PDF や画像を保存します。ファイル名は「店コード_競合店コード_チラシの開始日」にします。サイトから保存するときは、そのサイトの利用の条件を確かめます。

保存をきっかけに Azure Functions が動きます。 読み取り、ブロックの組み立て、項目化、対応づけを1枚ずつ進め、チラシ1枚の処理が終わったら、その店の担当と本部の担当に件数を知らせます。

本部の一覧は、毎朝9時にまとめて作り直します。 同じ競合店のチラシを近くの2店が集めることがあるので、競合店とチラシの開始日が同じものは1枚にまとめ、二重に数えません。

Step2

入力データを集める

データ中身取得元
チラシの画像・PDF表と裏。店コード、競合店名、チラシの期間取込フォルダ
読み取り結果段落・行・単語、位置(polygon)、単語ごとの信頼度Document Intelligence(レイアウトモデル)
商品マスタ商品コード、商品名、メーカー名、内容量と単位、入数、部門、税率の区分基幹システムから書き出したCSV
自社の売価商品コードごとの通常の売価と、チラシの期間に重なる自社の特売の売価基幹システムから書き出したCSV
税率の一覧税率の区分ごとの税率と、適用の期間本部で用意する一覧
部門ごとの基準差を「大きい」とする率と金額(例:青果は15%かつ30円以上)売価担当が決める
対応づけの記録過去に人が確かめた「チラシの書き方 → 自社の商品コード」この構成が育てる表

質を決めるのは、いちばん下の表です。 競合のチラシの書き方は、毎週ほぼ同じです。一度人が確かめた対応づけを残しておけば、次の週からはその表で引けます。 AIに毎回選ばせるのは、表に無いものだけにします。

税率の一覧に適用の期間を持たせるのは、税率が変わることがあるためです。 国税庁は、令和9年4月1日から2年間、飲食料品の消費税率が引き下げられ、総額表示の特例が設けられるとしています。税率を計算の中に書き込まず、一覧から引く形にしておきます。

Step3

データの取得方法を決める

読み取りは、Azure Functions からレイアウトモデル(prebuilt-layout)を呼ぶだけです。

取るもの応答のどこから何に使うか
段落の文字と位置paragraphs[] の content と boundingRegions商品ごとのブロックの材料
行と単語、信頼度pages[].lines[]・pages[].words[] の content・polygon・confidence売価の数字の特定と、読み取りの自信の判定
段落の役割paragraphs[] の role(title・sectionHeading など)チラシの見出しや期間の書かれた帯を、商品のブロックから外す
ページの大きさpages[] の width・height位置の距離の計算

ブロックの組み立ては、位置で行います。 チラシの売価は大きな数字で書かれ、商品名と規格はその上か左に小さく書かれます。単語の polygon の高さが大きい数字を売価の候補とし、その周りの一定の距離にある段落を寄せて1つのブロックにします。 どの段落がどの売価に属するか迷うときは、両方のブロックに入れて「迷い」の印を付け、次の段で AI に選ばせます。

チラシの期間は、ブロックの外にある帯から読みます。 「10/8(水)〜10/10(金)」のような期間の帯や、「日曜日限り」のような見出しは、role と位置で分けて、そのページ全体の条件として持ちます。

Step4

AIへ渡す前に整形する

  1. 形式の確認 … レイアウトモデルは PDF と、JPEG/JPG、PNG、BMP、TIFF、HEIF の画像を受け付けます
  2. 画像のサイズの確認 … 50×50から10,000×10,000ピクセルの間に収めます。大判のチラシは、この範囲で解像度を落としすぎないように縮めます
  3. 小さな字の確認 … 1024×768の画像で12ピクセルが下限です。規格の字がこれを下回るチラシは、表と裏を半分ずつに分けて読みます
  4. パスワードの確認 … パスワードでロックされた PDF は、提出の前にロックを解除する必要があります
  5. ページの分け方 … 表と裏を別のページにし、ページごとに期間の帯を読みます
  6. 重複の検知 … 同じ競合店・同じ開始日のチラシが届いていれば、後のものを重複として扱います

3番目を軽く見ないでください。 売価の大きな数字は読めても、その下の「400g」「4個入」が読めないと、対応づけができず、比べられない商品が増えます。 半分に分けて読むのは手間ですが、規格が読めることのほうが大切です。

Step5

AIに処理させる

させるのは2つです。 1つは、ブロックの文字を商品の項目にすること。もう1つは、プログラムが引いた候補の中から当たる商品を選ぶことです。

1回目に写す項目当たるものの例判断できないときの扱い
商品名「国産若鶏もも肉」「○○ヨーグルト」書かれたとおり
メーカー・産地「○○乳業」「北海道産」書かれていなければ空
規格「400g」「4個入」「100gあたり」「1パック」書かれたとおり。 数と単位を分けない
売価の数字大きく書かれた数字と、小さく添えた数字数字のまま。計算しない
税の表示「税込」「本体価格」「税抜」書かれていなければ unknown
売り方の条件「2個で」「会員価格」「お一人様2点限り」「日曜日限り」「○円引き」書かれたとおり、種類の印を付ける
2回目にさせること判断できないときの扱い
候補の5つから、メーカー・内容量・入数が合うものを1つ選ぶどれも合わなければ no_match
内容量だけが違う同じ系統の商品なら、その候補を選び spec_diff の印を付ける―

規格を数と単位に分けさせないのは、計算をプログラムに残すためです。 「4個入(1個100g)」を AI が「400g」に直すと、4個パックと400gの1個の商品が同じに見えてしまいます。 分けるのは、決まった書き方を読むプログラムの仕事にし、読めないものは人に回します。

させないこと理由
税込・1個あたりの価格の計算税率の一覧と売り方の条件でプログラムが行う
売価の数字の補い読めない桁を埋めると、存在しない安値が生まれる
候補に無い商品の推測候補はプログラムが引く。外から足さない
売価を合わせるべきかの判断売価担当とバイヤーが決める
競合の原価や利益の推測根拠が無い。一覧に載せない

2行目がいちばん起きやすい失敗です。 「1□8円」のように1桁がかすれた売価を、AIは前後から「198円」と読みたがります。かすれた桁は unclear にし、チラシの切り抜きを見て人が決めます。 存在しない安値が一覧に載ると、売価担当が不要な値下げを検討することになります。

Step6

指示内容を固定する

あなたはスーパーマーケットの本部で、競合店のチラシの読み取り結果を
商品ごとの項目にする立場です。
渡すのは、チラシの1つの商品のまわりにある文字と、そのページの条件です。
書かれている文字だけを使ってください。推測で埋めないでください。

【やること】
1. product_name:商品名を書かれたとおりに写す
2. maker_or_origin:メーカー名か産地。書かれていなければ空
3. spec_text:規格(内容量、入数、単位)を書かれたとおりに写す
4. price_numbers:売価として書かれた数字を、大きい順にすべて写す
5. tax_label:tax_included / tax_excluded / both / unknown
6. conditions:売り方の条件を書かれたとおりに並べ、それぞれに種類を付ける
   multi_buy / member / limit_per_customer / day_limited / discount / other

【厳守事項】
- 計算をしないでください。税込への換算も、1個あたりへの換算もしないでください。
- かすれて読めない桁があれば、その数字を unclear に入れ、補わないでください。
- 規格を数と単位に分けたり、別の書き方に直したりしないでください。
- ブロックに2つの商品が混ざっているときは、mixed を true にしてください。
- 売価を合わせるべきか、競合が安いかどうかは書かないでください。

【ページの条件】{page_conditions}
【このブロックの文字】{block_text}

「計算をしない」を最初に置くのは、AIが親切に計算するからです。 「本体98円」を「税込105.84円」とし、「2個で300円」を「1個150円」とします。計算そのものが正しくても、どの税率を使ったか、端数をどう扱ったかが記録に残りません。 計算はプログラムに寄せ、税率の一覧のどの行を使ったかを残します。

2回目の指示は、候補から選ぶことだけに絞ります。 「候補の中に、メーカー・内容量・入数がすべて合うものが無ければ no_match にしてください。名前が似ているだけで選ばないでください」と書きます。似た名前の別の商品を選ぶより、no_match のほうがずっと害が小さいからです。

Step7

出力形式を固定する

Azure OpenAI の構造化出力を使います。 response_format に json_schema を指定し、strict を true にします。1回目は次の形です。

{
  "product_name": "○○ヨーグルト プレーン",
  "maker_or_origin": "○○乳業",
  "spec_text": "400g",
  "price_numbers": ["138", "149"],
  "tax_label": "both",
  "conditions": [
    { "text": "お一人様2点限り", "kind": "limit_per_customer" }
  ],
  "unclear": [],
  "mixed": false
}

2回目は、{ "match": "商品コード または no_match", "spec_diff": false, "reason": "メーカーと内容量が一致" } の形で受け取ります。

1つ目の理由は、計算の段に渡す形が決まることです。 price_numbers と tax_label と conditions がそろっていれば、プログラムは「本体138円・税込149円」の組を読み分け、1個あたりの税込の価格を、税率の一覧のどの行で出したかを残せます。

2つ目は、kind を列挙の値に固定できることです。 条件の種類が決まっていれば、member や day_limited の付いた価格を、通常の比べ方から外して別の欄に出せます。

3つ目は、項目が必ずそろうことです。 公式は、構造化出力ではすべてのフィールドを required にし、additionalProperties を false にするよう求めています。書かれていなかった項目も空や unknown で必ず返るので、読み落としと区別できます。

行の判定条件行き先
big_gap対応づけが確かで、差が部門の基準を超える売価担当の一覧
within対応づけが確かで、差が基準内記録のみ
conditional会員価格・日限り・点数制限などの条件付き一覧の別の欄(参考)
spec_diff内容量が違う。100gあたりなどで参考の比較一覧の別の欄(参考)
checkno_match、unclear、mixed、対応づけの記録に無い初めての対応づけ本部の担当の確認
Step8

システムへ連携する

つなぎ先方式内容
取込フォルダAzure Functions のトリガーチラシの保存を検知する
Azure AI Document IntelligenceAPI呼び出し(レイアウトモデル)段落・単語・位置・信頼度
Azure OpenAIAPI呼び出し(構造化出力)ブロックの項目化と、候補からの対応づけ
商品マスタ・売価のCSV毎朝の書き出しを読む候補の絞り込みと売価の差
差の一覧Python の出力(SharePoint のリスト)部門ごと、差の大きい順
Teams毎朝の通知big_gap の件数と一覧へのリンク

一覧の各行には、チラシの切り抜きを付けます。 ブロックの boundingRegions で画像を切り抜き、行の横に並べます。売価担当は、元のチラシを開かずに、書かれていた文字を自分の目で確かめられます。

基幹システムの売価には書き込みません。 合わせると決めた商品の売価変更は、これまでどおりの手順で入れます。

Step9

人が確認する

  1. 本部の担当が check の行を片付ける … 切り抜きを見て、自社の商品コードを選ぶか「当たる商品なし」とします。選んだ結果は対応づけの記録に残し、次の週から自動で引けるようにします
  2. 本部の担当が big_gap の行の対応づけを確かめる … 差が大きい行ほど、対応づけの誤りを疑います
  3. 売価担当が一覧を見て判断する … 合わせるか、別の商品で対抗するか、何もしないかを、部門のバイヤーと決めます
  4. 判断の結果を一覧に残す … 何をしたかを残し、翌週の比べ方に活かします

2番目を省かないでください。 差が極端に大きい行の多くは、規格の違いか対応づけの誤りです。本当の目玉の商品かどうかは、切り抜きを見れば数秒で分かります。

最初の1か月は、check が多く出ます。 対応づけの記録がたまるにつれて減り、競合のチラシの書き方が毎週ほぼ同じなら、2か月目には大きく減る想定です。 第10章の1件12分は、記録がたまった後の数字です。

Step10

例外に対処する

起きること対応
画像のサイズが範囲外50×50から10,000×10,000ピクセルに収めて再投入
小さな字が読めない表と裏を半分に分けて読み直す。読めなければ unclear
パスワード付きの PDF提出の前にロックを解除する必要がある。解除できなければ紙を使う
ブロックに2つの商品が混ざるmixed。人が切り抜きで分ける
売価の桁がかすれているunclear。補わない
税の表示が無いunknown。税込とみなさず、人が確かめる
「○円引き」「○%引き」で売価が書かれていない自社の売価との比べ方が決まらないので conditional
同じ競合店のチラシが2店から届く競合店と開始日でまとめ、二重に数えない
Document Intelligence や Azure OpenAI が応答しない取込フォルダに残し、やり直す

6行目は、総額表示の決まりと関わります。 国税庁は、事業者が消費者にあらかじめ価格を表示する場合は税込価格を表示する義務があり、チラシ広告もその表示に含まれるとしています。それでも、本体価格を大きく書き税込価格を小さく添えるチラシは多く、小さい方が読めなかったときに大きい方を税込とみなすと、差を誤って見積もります。

Step11

記録を残す

  • チラシの画像と、店コード・競合店名・チラシの期間・取り込んだ日時
  • レイアウトモデルが返したJSONの全文
  • ブロックの組み立ての結果と、各ブロックの切り抜き
  • Azure OpenAI の2回の出力の全文
  • 1個あたりの税込の価格の計算に使った税率の一覧の行と、端数の扱い
  • 対応づけの記録(チラシの書き方、自社の商品コード、確かめた人と日付)
  • 一覧の行ごとの判定と、売価担当の判断

5つ目を残すのは、比べ方を後から説明できるようにするためです。 「競合が10円安い」が、どの税率でどう計算した結果かが分からないと、バイヤーとの話し合いで数字の根拠を示せません。

04実装レベルの3段階

最小構成:チラシを Studio で読み、切り出した文字を手でAIの画面に貼って表にさせる / 1枚ごとの項目化
半自動化:上記+取込フォルダからレイアウトモデルと Azure OpenAI を呼び、全商品を表に書き出す / 読み取りと項目化
本格構成:上記+税込・1個あたりへのそろえ、商品マスタとの対応づけ、部門ごとの基準での振り分けと毎朝の一覧 / 対応づけと売価の差の一覧化

最小構成は、読み取りの具合を確かめるための段階です。 月160枚には使えません。 半自動化で、1枚45分が25分程度になります。 写す作業は無くなりますが、対応づけと差の計算が手で残ります。本格構成で12分になり、この段階が本記事の想定です。 差が大きいのは、対応づけが、80品のそれぞれで商品マスタを探す作業だからです。 段階を飛ばさないでください。 半自動化の表を1か月見ると、読みにくい競合店のチラシと、ブロックが崩れやすい紙面の作りが先に分かります。そこを直してから対応づけを足すほうが、check の行が少なく始められます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
15 名
月間件数
160 件
1件あたり現在時間
45 分
1件あたり導入後時間
12 分
現在  160件 × 45分 ÷ 60 = 120 時間/月
導入後 160件 × 12分 ÷ 60 = 32 時間/月
月間削減時間
88h
削減率
73%
年間削減時間
1,056h
年間金額換算(時間単価2,500円)
264万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 10店舗以上のスーパーマーケット・ドラッグストアで、各店が近くの競合店のチラシを毎週集め、店長や本部の担当が売価を手で表に写している場合。写した表と自社の売価を比べる作業が追いつかず、競合の目玉の商品に気づくのが週の後半になっている場合。商品マスタにメーカー名と内容量の列がそろっている場合。Microsoft Azure を使える場合。
向いていない
  1. 競合店が1〜2店で、店長がチラシを見ればすぐ判断できる場合。競合の売価を店頭の巡回でしか集めておらず、チラシを使っていない場合。商品マスタの商品名が略称ばかりで、メーカーや内容量の列が無い場合。なお、売価をいくらにするか、競合に合わせるかの判断は、この構成では代替できません。

07最小構成で試す方法

  1. 先週の競合店のチラシを2枚選ぶ
  2. Document Intelligence Studio でレイアウトモデルにかけ、売価と規格の小さな字がどこまで読めるかを見る
  3. 商品のまわりの文字を手で切り出し、手元のAIサービスの画面に貼って、「商品名・メーカー・規格・売価の数字・税の表示・売り方の条件を表にしてください。計算はしないでください」と指示する
  4. 出てきた表の30品について、本部の担当が自社の商品を手で対応づけ、売価の差を出す

2枚は必ずやってください。 つなぎ込む前に、規格の字が読めるか、売価と商品の組が正しく取れるかを確かめます。

出てきた内容判断
規格まで読め、売価との組も合ったブロックの組み立てと対応づけに進む
AIが税込や1個あたりを計算した指示の書き方で直る。構成は有効
規格の小さな字が読めないスキャンの解像度と、半分に分けて読む手順が先
2つの商品の文字が混ざるブロックの組み立ての距離の決め方を見直す

3行目は、珍しくありません。 チラシの規格は、新聞の本文より小さい字で書かれることがあります。読み取りの問題に見えますが、多くはスキャンの設定で解決します。

08実装時につまずきやすいポイント

問題対策
名前が似ているだけの商品に対応づける候補から選ばせ、メーカー・内容量・入数が合わなければ no_match
AIが税込や1個あたりを計算する指示で禁じ、計算はプログラムで税率の一覧から行う
かすれた桁を補って存在しない安値を作るunclear にし、切り抜きで人が決める
規格の小さな字が読めない1024×768で12ピクセルが下限。半分に分けて読む
2つの商品の文字が1つのブロックに混ざるmixed にし、距離の決め方を競合ごとに調整する
本体価格を税込とみなすtax_label が unknown なら人が確かめる
会員価格や日限りの価格を通常の価格と比べるconditional として別の欄に出す
税率が変わる時期に計算がずれる税率の一覧に適用の期間を持たせる
同じチラシを2店が取り込む競合店と開始日でまとめる
差の大きい商品にすべて合わせようとする判断は売価担当とバイヤー。原価を割る売価に注意する

上の3行が、この構成の失敗のほとんどです。 どれも、AIが「それらしく整える」ことから起きます。整えるのはプログラムと人の仕事にし、AIには書かれた文字を写させるだけにします。

運用が始まってから効いてくるのは、下の2行です。 同じチラシの二重の取り込みは、近くの2店が同じ競合店を見ているときに毎週起き、差の一覧に同じ商品が2行並ぶと、売価担当が一覧を信用しなくなります。 差の大きい商品にすべて合わせようとする動きは、一覧が便利になるほど強まります。一覧の見出しに「判断の材料であって、値下げの指示ではない」と書いておくだけでも違います。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 競合店が公開しているチラシと、自社の商品マスタと売価です。個人の情報は含みません。

  1. 自社の売価のデータを外へ出しすぎない … Azure OpenAI に渡すのは、候補の5品の商品名・メーカー・内容量・入数だけです。自社の売価と原価は渡さず、差の計算はプログラムで行います
  2. 競合のサイトから集めるときは利用の条件を守る … 公開されているチラシでも、自動で大量に取りに行くことを禁じているサイトがあります。各店の担当が見て保存する範囲にとどめます
  3. 競合と売価の情報をやり取りしない … 集めるのは公開されたチラシだけです。競合店の担当者と売価について連絡を取ることは、この構成の範囲外です
  4. 合わせるときは原価を割り込まないかを見る … 公正取引委員会の不当廉売の考え方では、正当な理由がないのに、供給に要する費用を著しく下回る対価で継続して供給し、他の事業者の事業活動を困難にさせるおそれがあるものが不当廉売とされ、可変的性質を持つ費用を下回る価格は、供給に要する費用を著しく下回る対価と推定されるとしています。差の一覧は値下げの指示ではありません
  5. 一覧を、店長や担当者の評価に使わない … 集めたチラシの枚数で人を比べると、読みにくいチラシが集まらなくなります

誤りが起きた場合のリスクは、存在しない安値に合わせて値下げすることと、本当の目玉の商品を見落とすことの2つです。 前者は unclear と切り抜きで防ぎ、後者は全品を読む設計で防ぎます。

10まず何から始めるか

1週目:部門ごとの基準を決める

売価担当が、部門ごとに「差が大きい」とする率と金額を決めます。あわせて、商品マスタのメーカー名・内容量・入数の列の空きを洗い出します。

2週目:2枚で試す

先週のチラシを2枚選び、Studio でレイアウトモデルにかけます。規格の小さな字が読めるか、売価と商品の組が取れるかを最優先で見ます。

3週目:取り込みの手順をそろえる

各店のスキャナの解像度をそろえ、ファイル名の付け方を決めます。競合のサイトから保存するときの利用の条件も、本部で確かめて各店に伝えます。

4週目:取込フォルダから項目の表までをつなぐ

Azure Functions で取込フォルダを見張り、レイアウトモデルと Azure OpenAI を呼んで、全商品の項目を表に書き出すところまで作ります。この時点では対応づけをせず、表を本部の担当が見ます。

2か月目: 税込・1個あたりへのそろえと、商品マスタとの対応づけを足し、差の一覧を毎朝出します。3か月目以降: 対応づけの記録がたまったところで、1枚45分が何分になったかを実測します。check の行が1枚あたり数行に減り、チラシの期間が始まる前に一覧が売価担当に届くようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-07/最終更新:2026-10-07
確認した内容情報源確認日
レイアウトモデル(prebuilt-layout)がテキスト、テーブル、選択マーク、文書の構造を抽出し、段落の content と boundingRegions、単語の polygon と confidence、段落の role(title・sectionHeading など)を返すこと。PDF と JPEG/JPG、PNG、BMP、TIFF、HEIF を受け付けること。画像のサイズが50×50から10,000×10,000ピクセル、テキストの最小の高さが1024×768の画像で12ピクセルであること。パスワード付きの PDF は提出の前に解除が必要なことMicrosoft Learn: ドキュメント レイアウト分析2026-10-07
レイアウトモデルの印刷されたテキストの対応言語に日本語(ja)が入っていることMicrosoft Learn: 読み取りとレイアウトのドキュメント分析の言語とロケールのサポート2026-10-07
構造化出力で response_format に json_schema と strict: true を指定すること。すべてのフィールドを required にし、additionalProperties を false にする必要があること。enum が使えることMicrosoft Learn: Azure OpenAI で構造化出力を使用する方法2026-10-07
事業者が消費者にあらかじめ価格を表示する場合に税込価格の表示が義務付けられ、チラシ広告も表示媒体に含まれること。令和9年4月1日から2年間、飲食料品の消費税率が引き下げられ、総額表示の特例が設けられること国税庁: No.6902「総額表示」の義務付け2026-10-07
不当廉売が、正当な理由がないのに供給に要する費用を著しく下回る対価で継続して供給し、他の事業者の事業活動を困難にさせるおそれがあるものとされること。可変的性質を持つ費用を下回る価格が、供給に要する費用を著しく下回る対価と推定されること公正取引委員会: 不当廉売に関する独占禁止法上の考え方2026-10-07

売価をいくらにするか、競合に合わせるかは、売価担当と部門のバイヤーが決めてください。 本記事は各製品と国税庁・公正取引委員会の公式ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0717)についてのご相談はこちらから。

AI活用について相談する
目次