小売店が毎週集める競合店のチラシを読み取り、商品・規格・売価を自社の商品マスタに対応づけて、自社の売価との差が大きい商品を売価担当へ出す
各店が毎週集める競合店のチラシを読み取り、商品・規格・売価を自社の商品マスタに対応づけます。自社の売価との差が大きい商品は、チラシの期間が始まる前に売価担当へ一覧で出します。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 小売
- 対象部門
- マーケティング/営業
- 対象業務
- データ入力・転記/比較検討
- 主な課題
- データ分析に時間がかかる/入力作業が多い/判断に時間がかかる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各店の担当が、競合店のチラシを手に入れる
- チラシを見ながら、気になった商品の商品名と売価を表に写す
- 写した商品が自社のどの商品に当たるかを、商品マスタで探す
- 自社の売価を引き、差を計算する
- 表を本部へ送る
- 本部の売価担当が、各店の表をまとめて、差の大きい商品を選ぶ
- 売価を合わせるかを部門のバイヤーと話し、決める
- 人各店の担当がチラシをスキャンするか、競合のサイトで公開されたPDF・画像を保存し、店コードと競合店名を付けて取込フォルダに置く
- 自動Azure AI Document Intelligence のレイアウトモデルが、文字と段落、位置、信頼度を返す
- 自動中継の処理が、売価の数字を中心に近くの段落を寄せ、商品ごとのブロックにする
- 自動Azure OpenAI が、ブロックごとに商品名・メーカー・規格・売価・売り方の条件を項目にする
- 自動中継の処理が、売価を1個あたりの税込の価格にそろえ、商品マスタから候補を5つまで引く
- 自動Azure OpenAI が、候補の中から当たる商品を選ぶか、「当たる商品なし」とする
- 自動自社の売価との差を計算し、部門ごとの基準を超えた商品を一覧にする
- 人本部の担当が、対応づけに自信のない行と、差の大きい行を確かめる
- 人売価担当が一覧を見て、合わせるかをバイヤーと決める
各工程の詳しい説明を読む
- 各店の担当が、競合店のチラシを手に入れる
- チラシを見ながら、気になった商品の商品名と売価を表に写す
- 写した商品が自社のどの商品に当たるかを、商品マスタで探す
- 自社の売価を引き、差を計算する
- 表を本部へ送る
- 本部の売価担当が、各店の表をまとめて、差の大きい商品を選ぶ
- 売価を合わせるかを部門のバイヤーと話し、決める
(a)写す手間が大きい。 80品のうち何を写すかは担当の判断で、写す量は店によって10品から60品まで違います。 忙しい週ほど少なくなり、見落としの多い週が、競合が力を入れた週と重なることがあります。
(b)規格が抜ける。 「牛乳 158円」とだけ写すと、1,000mlなのか900mlなのか、どのメーカーかが分かりません。本部で比べようとしても、比べる相手が決まりません。
(c)売り方の条件が抜ける。 「お一人様2点限り」「日曜日限り」「アプリ会員価格」。条件の付いた価格を条件なしの価格と比べると、差を大きく見積もります。
(d)気づくのが遅い。 写す、探す、計算する、送る、まとめる。売価担当の手に届くのは週の半ばで、競合の目玉の商品に手を打てるのは次の週になります。
- 【人】 各店の担当がチラシをスキャンするか、競合のサイトで公開されたPDF・画像を保存し、店コードと競合店名を付けて取込フォルダに置く
- 【自動】 Azure AI Document Intelligence のレイアウトモデルが、文字と段落、位置、信頼度を返す
- 【自動】 中継の処理が、売価の数字を中心に近くの段落を寄せ、商品ごとのブロックにする
- 【自動】 Azure OpenAI が、ブロックごとに商品名・メーカー・規格・売価・売り方の条件を項目にする
- 【自動】 中継の処理が、売価を1個あたりの税込の価格にそろえ、商品マスタから候補を5つまで引く
- 【自動】 Azure OpenAI が、候補の中から当たる商品を選ぶか、「当たる商品なし」とする
- 【自動】 自社の売価との差を計算し、部門ごとの基準を超えた商品を一覧にする
- 【人】 本部の担当が、対応づけに自信のない行と、差の大きい行を確かめる
- 【人】 売価担当が一覧を見て、合わせるかをバイヤーと決める
8番目が、この設計の分かれ目です。 確かめるのは全品ではなく、対応づけに迷った行と、差が基準を超えた行だけです。 全品を人が見る設計にすると、②の時間がほとんど減りません。
9番目は、これまでどおり人が決めます。 差が大きいことと、合わせるべきことは別です。競合が原価を割って売っている目玉の商品に、すべて合わせる必要はありません。
02今回想定するシステム構成
競合店のチラシ(紙をスキャン/公開されたPDF・画像) │ 店コード、競合店名、チラシの期間を付けて保存 ▼【トリガー】取込フォルダへの保存 Azure Functions(中継の処理) ▼ Azure AI Document Intelligence(レイアウトモデル prebuilt-layout) │ 段落・行・単語、位置(polygon)、信頼度 ▼ Azure Functions ── 売価の数字を中心に段落を寄せ、商品ごとのブロックにする ▼ Azure OpenAI(Microsoft Foundry) ── 構造化出力 ① │ 商品名/メーカー/規格/売価の数字/売り方の条件/税の表示 ▼ Python ── 1個あたりの税込の価格にそろえ、商品マスタから候補を引く ▼ Azure OpenAI ── 構造化出力 ②(候補から当たる商品を選ぶ/なし) ▼ Python ── 自社の売価との差、部門ごとの基準で振り分け ▼ 差の一覧(チラシの切り抜き付き) ──【本部の担当が確認 → 売価担当が判断】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(レイアウトモデル) | Google Document AI |
| 生成AI | Azure 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どうやって実装するのか
処理の起点を決める
各店の担当が、チラシを取込フォルダに保存したことを起点にします。 紙のチラシは店のスキャナで読み、競合が自社のサイトで公開しているものは PDF や画像を保存します。ファイル名は「店コード_競合店コード_チラシの開始日」にします。サイトから保存するときは、そのサイトの利用の条件を確かめます。
保存をきっかけに Azure Functions が動きます。 読み取り、ブロックの組み立て、項目化、対応づけを1枚ずつ進め、チラシ1枚の処理が終わったら、その店の担当と本部の担当に件数を知らせます。
本部の一覧は、毎朝9時にまとめて作り直します。 同じ競合店のチラシを近くの2店が集めることがあるので、競合店とチラシの開始日が同じものは1枚にまとめ、二重に数えません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| チラシの画像・PDF | 表と裏。店コード、競合店名、チラシの期間 | 取込フォルダ |
| 読み取り結果 | 段落・行・単語、位置(polygon)、単語ごとの信頼度 | Document Intelligence(レイアウトモデル) |
| 商品マスタ | 商品コード、商品名、メーカー名、内容量と単位、入数、部門、税率の区分 | 基幹システムから書き出したCSV |
| 自社の売価 | 商品コードごとの通常の売価と、チラシの期間に重なる自社の特売の売価 | 基幹システムから書き出したCSV |
| 税率の一覧 | 税率の区分ごとの税率と、適用の期間 | 本部で用意する一覧 |
| 部門ごとの基準 | 差を「大きい」とする率と金額(例:青果は15%かつ30円以上) | 売価担当が決める |
| 対応づけの記録 | 過去に人が確かめた「チラシの書き方 → 自社の商品コード」 | この構成が育てる表 |
質を決めるのは、いちばん下の表です。 競合のチラシの書き方は、毎週ほぼ同じです。一度人が確かめた対応づけを残しておけば、次の週からはその表で引けます。 AIに毎回選ばせるのは、表に無いものだけにします。
税率の一覧に適用の期間を持たせるのは、税率が変わることがあるためです。 国税庁は、令和9年4月1日から2年間、飲食料品の消費税率が引き下げられ、総額表示の特例が設けられるとしています。税率を計算の中に書き込まず、一覧から引く形にしておきます。
データの取得方法を決める
読み取りは、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 と位置で分けて、そのページ全体の条件として持ちます。
AIへ渡す前に整形する
- 形式の確認 … レイアウトモデルは PDF と、JPEG/JPG、PNG、BMP、TIFF、HEIF の画像を受け付けます
- 画像のサイズの確認 … 50×50から10,000×10,000ピクセルの間に収めます。大判のチラシは、この範囲で解像度を落としすぎないように縮めます
- 小さな字の確認 … 1024×768の画像で12ピクセルが下限です。規格の字がこれを下回るチラシは、表と裏を半分ずつに分けて読みます
- パスワードの確認 … パスワードでロックされた PDF は、提出の前にロックを解除する必要があります
- ページの分け方 … 表と裏を別のページにし、ページごとに期間の帯を読みます
- 重複の検知 … 同じ競合店・同じ開始日のチラシが届いていれば、後のものを重複として扱います
3番目を軽く見ないでください。 売価の大きな数字は読めても、その下の「400g」「4個入」が読めないと、対応づけができず、比べられない商品が増えます。 半分に分けて読むのは手間ですが、規格が読めることのほうが大切です。
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 にし、チラシの切り抜きを見て人が決めます。 存在しない安値が一覧に載ると、売価担当が不要な値下げを検討することになります。
指示内容を固定する
あなたはスーパーマーケットの本部で、競合店のチラシの読み取り結果を
商品ごとの項目にする立場です。
渡すのは、チラシの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 のほうがずっと害が小さいからです。
出力形式を固定する
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あたりなどで参考の比較 | 一覧の別の欄(参考) |
check | no_match、unclear、mixed、対応づけの記録に無い初めての対応づけ | 本部の担当の確認 |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 取込フォルダ | Azure Functions のトリガー | チラシの保存を検知する |
| Azure AI Document Intelligence | API呼び出し(レイアウトモデル) | 段落・単語・位置・信頼度 |
| Azure OpenAI | API呼び出し(構造化出力) | ブロックの項目化と、候補からの対応づけ |
| 商品マスタ・売価のCSV | 毎朝の書き出しを読む | 候補の絞り込みと売価の差 |
| 差の一覧 | Python の出力(SharePoint のリスト) | 部門ごと、差の大きい順 |
| Teams | 毎朝の通知 | big_gap の件数と一覧へのリンク |
一覧の各行には、チラシの切り抜きを付けます。 ブロックの boundingRegions で画像を切り抜き、行の横に並べます。売価担当は、元のチラシを開かずに、書かれていた文字を自分の目で確かめられます。
基幹システムの売価には書き込みません。 合わせると決めた商品の売価変更は、これまでどおりの手順で入れます。
人が確認する
- 本部の担当が
checkの行を片付ける … 切り抜きを見て、自社の商品コードを選ぶか「当たる商品なし」とします。選んだ結果は対応づけの記録に残し、次の週から自動で引けるようにします - 本部の担当が
big_gapの行の対応づけを確かめる … 差が大きい行ほど、対応づけの誤りを疑います - 売価担当が一覧を見て判断する … 合わせるか、別の商品で対抗するか、何もしないかを、部門のバイヤーと決めます
- 判断の結果を一覧に残す … 何をしたかを残し、翌週の比べ方に活かします
2番目を省かないでください。 差が極端に大きい行の多くは、規格の違いか対応づけの誤りです。本当の目玉の商品かどうかは、切り抜きを見れば数秒で分かります。
最初の1か月は、check が多く出ます。 対応づけの記録がたまるにつれて減り、競合のチラシの書き方が毎週ほぼ同じなら、2か月目には大きく減る想定です。 第10章の1件12分は、記録がたまった後の数字です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 画像のサイズが範囲外 | 50×50から10,000×10,000ピクセルに収めて再投入 |
| 小さな字が読めない | 表と裏を半分に分けて読み直す。読めなければ unclear |
| パスワード付きの PDF | 提出の前にロックを解除する必要がある。解除できなければ紙を使う |
| ブロックに2つの商品が混ざる | mixed。人が切り抜きで分ける |
| 売価の桁がかすれている | unclear。補わない |
| 税の表示が無い | unknown。税込とみなさず、人が確かめる |
| 「○円引き」「○%引き」で売価が書かれていない | 自社の売価との比べ方が決まらないので conditional |
| 同じ競合店のチラシが2店から届く | 競合店と開始日でまとめ、二重に数えない |
| Document Intelligence や Azure OpenAI が応答しない | 取込フォルダに残し、やり直す |
6行目は、総額表示の決まりと関わります。 国税庁は、事業者が消費者にあらかじめ価格を表示する場合は税込価格を表示する義務があり、チラシ広告もその表示に含まれるとしています。それでも、本体価格を大きく書き税込価格を小さく添えるチラシは多く、小さい方が読めなかったときに大きい方を税込とみなすと、差を誤って見積もります。
記録を残す
- チラシの画像と、店コード・競合店名・チラシの期間・取り込んだ日時
- レイアウトモデルが返したJSONの全文
- ブロックの組み立ての結果と、各ブロックの切り抜き
- Azure OpenAI の2回の出力の全文
- 1個あたりの税込の価格の計算に使った税率の一覧の行と、端数の扱い
- 対応づけの記録(チラシの書き方、自社の商品コード、確かめた人と日付)
- 一覧の行ごとの判定と、売価担当の判断
5つ目を残すのは、比べ方を後から説明できるようにするためです。 「競合が10円安い」が、どの税率でどう計算した結果かが分からないと、バイヤーとの話し合いで数字の根拠を示せません。
04実装レベルの3段階
最小構成は、読み取りの具合を確かめるための段階です。 月160枚には使えません。 半自動化で、1枚45分が25分程度になります。 写す作業は無くなりますが、対応づけと差の計算が手で残ります。本格構成で12分になり、この段階が本記事の想定です。 差が大きいのは、対応づけが、80品のそれぞれで商品マスタを探す作業だからです。 段階を飛ばさないでください。 半自動化の表を1か月見ると、読みにくい競合店のチラシと、ブロックが崩れやすい紙面の作りが先に分かります。そこを直してから対応づけを足すほうが、check の行が少なく始められます。
05工数削減シミュレーション
導入後 160件 × 12分 ÷ 60 = 32 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 10店舗以上のスーパーマーケット・ドラッグストアで、各店が近くの競合店のチラシを毎週集め、店長や本部の担当が売価を手で表に写している場合。写した表と自社の売価を比べる作業が追いつかず、競合の目玉の商品に気づくのが週の後半になっている場合。商品マスタにメーカー名と内容量の列がそろっている場合。Microsoft Azure を使える場合。
- 競合店が1〜2店で、店長がチラシを見ればすぐ判断できる場合。競合の売価を店頭の巡回でしか集めておらず、チラシを使っていない場合。商品マスタの商品名が略称ばかりで、メーカーや内容量の列が無い場合。なお、売価をいくらにするか、競合に合わせるかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先週の競合店のチラシを2枚選ぶ
- Document Intelligence Studio でレイアウトモデルにかけ、売価と規格の小さな字がどこまで読めるかを見る
- 商品のまわりの文字を手で切り出し、手元のAIサービスの画面に貼って、「商品名・メーカー・規格・売価の数字・税の表示・売り方の条件を表にしてください。計算はしないでください」と指示する
- 出てきた表の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ガバナンス上の注意点
この構成で扱うデータ: 競合店が公開しているチラシと、自社の商品マスタと売価です。個人の情報は含みません。
- 自社の売価のデータを外へ出しすぎない … Azure OpenAI に渡すのは、候補の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技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
レイアウトモデル(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)についてのご相談はこちらから。
