シール・ラベルの印刷会社の営業が、新しい見積の依頼に近い過去の見積を素材・糊・寸法・部数・納期から OpenSearch で探し、出した単価と受注・失注を並べる
シールやラベルの見積の依頼を、素材・糊・寸法・形状・色数・加工・部数・納期に読み替え、受注と失注を含む過去の見積から近い案件を探します。案件ごとに、最初と最後に出した単価、抜き型の扱い、受注か失注かを並べます。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 広告/製造
- 対象部門
- 営業
- 対象業務
- 情報検索/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/書類作成に時間がかかる
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/品質標準化/対応スピード向上
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 営業が依頼のメールと仕様書を読み、素材・糊・寸法・形状・色数・加工・部数・納期を書き出す
- 似た案件を思い出し、見積の仕組みで得意先の名前か見積の番号から引く
- 思い出せなければ、見積の一覧を書き出して表計算で素材と寸法を絞り、目で探す
- 見つけた見積の版を開き、最後に出した単価と、抜き型を新しく作ったかを確かめる
- 部数・加工・納期の違いを見て単価を上げ下げし、見積を作って返す
- 人営業が依頼のメールと仕様書の文を画面に貼り、検索のボタンを押す
- 自動生成AIが依頼から、素材・糊・寸法・形状・色数・加工・部数・納期を書かれたまま取り出し、素材と糊を決められた区分から選ぶ
- 自動Lambda が寸法を mm の数に、部数を枚数に、納期を営業日の数にそろえる
- 自動OpenSearch が素材・糊・形状で絞り、寸法と部数の幅で絞り、見積の時期の近さで並べ、見積の番号ごとにまとめる
- 自動OpenSearch が見積ごとに、最初の版と最後の版を返す
- 自動Lambda が見積ごとに、依頼と違う項目(加工・色数・納期・抜き型の扱い)を記録から並べる
- 自動生成AIが見積ごとの単価・結果・違う点を記録のまま並べた表を作る
- 人営業が表を見て、抜き型の扱いと部数の違いを確かめ、今回の単価を決めて見積を作る
各工程の詳しい説明を読む
- 営業が依頼のメールと仕様書を読み、素材・糊・寸法・形状・色数・加工・部数・納期を書き出す
- 似た案件を思い出し、見積の仕組みで得意先の名前か見積の番号から引く
- 思い出せなければ、見積の一覧を書き出して表計算で素材と寸法を絞り、目で探す
- 見つけた見積の版を開き、最後に出した単価と、抜き型を新しく作ったかを確かめる
- 部数・加工・納期の違いを見て単価を上げ下げし、見積を作って返す
(a)近い見積を探すのが記憶頼み。 2番目は、似た案件を担当した営業ほど早く終わります。他の営業が出した見積は、存在を知らなければ探せません。
(b)同じ得意先に、営業ごとに違う単価が出る。 得意先の担当が替わったり、別の部署から依頼が来たりすると、前に別の営業が出した単価を知らずに、違う単価を出すことがあります。 得意先から「前は違う値だった」と言われて気づきます。
(c)抜き型の扱いの取り違え。 4番目で、過去の単価が既存の型を使ったものだと気づかずに今回の単価を決めると、新しく型が要る今回の見積から型代が抜けます。
(d)版の多い見積で最後の単価を間違える。 3回出し直した見積で2回目の単価を見てしまうと、値引きした後の単価より高い単価で見積を出し、比べられて失注します。
- 【人】 営業が依頼のメールと仕様書の文を画面に貼り、検索のボタンを押す
- 【自動】 生成AIが依頼から、素材・糊・寸法・形状・色数・加工・部数・納期を書かれたまま取り出し、素材と糊を決められた区分から選ぶ
- 【自動】 Lambda が寸法を mm の数に、部数を枚数に、納期を営業日の数にそろえる
- 【自動】 OpenSearch が素材・糊・形状で絞り、寸法と部数の幅で絞り、見積の時期の近さで並べ、見積の番号ごとにまとめる
- 【自動】 OpenSearch が見積ごとに、最初の版と最後の版を返す
- 【自動】 Lambda が見積ごとに、依頼と違う項目(加工・色数・納期・抜き型の扱い)を記録から並べる
- 【自動】 生成AIが見積ごとの単価・結果・違う点を記録のまま並べた表を作る
- 【人】 営業が表を見て、抜き型の扱いと部数の違いを確かめ、今回の単価を決めて見積を作る
5番目で最初と最後の版を並べるのは、値引きの幅を見るためです。 最初に出した単価と最後に出した単価の差は、その得意先とその仕様で、どこまで値を下げて交渉したかの記録です。最後の単価だけを見ると、最初から最後の単価で出してしまいます。
8番目で単価を決めるのは営業です。 画面に出るのは過去の見積の単価と結果だけで、「今回は〜円がよい」という提案は出しません。 紙やフィルムの今の仕入れの値、工場の混み具合、得意先との取引の続き方を合わせて決めるのは営業です。
02今回想定するシステム構成
見積の仕組み(見積の番号・版・仕様・部数・単価・抜き型・結果) 抜き型の台帳(型の番号・形状・寸法) ▼【トリガー】毎晩の書き出し(新しい版・結果の確定) AWS Lambda ── 寸法・部数・納期を数にそろえ、素材と糊を区分にする ▼ Amazon OpenSearch Service │ 見積の版の索引:見積の番号(keyword)・版・素材・糊・形状・幅と高さ(mm) │ 色数・加工・部数・納期(営業日)・単価・抜き型の扱い・結果・見積の日 ▼【人】営業が依頼を貼る AWS Lambda ├──▶ Claude(Amazon Bedrock)── 依頼を仕様に読み替える ├──▶ OpenSearch ── 絞り込み+時期の近さ(function_score)+見積の番号でまとめる(collapse・inner_hits) ├──▶ 違う項目を並べる ├──▶ Claude(Amazon Bedrock)── 見積ごとの単価・結果・違う点の表 ▼ 営業の画面 ──【人】単価を決めて見積を作る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(bool の filter、range、function_score の gauss、collapse と inner_hits) | Azure AI Search、Vertex AI Search(Agent Search) |
| 生成AI | Claude(Amazon Bedrock の Converse API、構造化出力) | Azure OpenAI(Microsoft Foundry)、OpenAI API |
| 連携 | AWS Lambda(取り込み、仕様のそろえ、違う項目の作成、検索の呼び出し) | AWS Step Functions |
| 保管 | Amazon S3(取り込みの写し、依頼と候補と決めた単価の記録) | 社内のファイルサーバー |
見積の仕組みには、この構成から書き込みません。 見積書は、営業がいつもの見積の画面で作ります。
Amazon OpenSearch Service は、AWS のクラウドで OpenSearch のクラスターを立てて動かすための管理されたサービスです。 AWS の公式ページでは、OpenSearch Service のドメインは OpenSearch のクラスターと同じ意味とされています。索引に得意先の名前は入れず、得意先のコードだけを持ちます(第13章)。
03どうやって実装するのか
処理の起点を決める
起点は2つあります。毎晩の見積の版の取り込みと、営業の検索のボタンです。
取り込みは、前の日までに出した見積の版と、受注・失注が確定した見積を書き出し、索引に加えます。版は1つずつ別の文書にし、見積の番号を共通に持たせます。 結果が確定したら、同じ見積の番号のすべての版の結果の項目を書き換えます。
検索のボタンは、営業が依頼のメールと仕様書の文を貼った後に押します。素材と糊の区分の表は、営業と工場の担当が月に1回見直します。 新しい素材や糊を扱い始めたときは、区分を足した日から検索に使います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 見積の依頼 | 得意先のメールの本文、仕様書の文 | 営業が貼る |
| 見積の版 | 見積の番号、版の番号、得意先のコード、素材、糊、形状、幅と高さ、色数、加工、部数と単価、納期、見積の日 | 見積の仕組み |
| 抜き型の扱い | 新しく作る/既存の型を使う、型代(単価と別か込みか)、型の番号 | 見積の仕組み・抜き型の台帳 |
| 結果 | 受注/失注/回答なし、確定の日、失注の理由のメモ | 見積の仕組み |
| 区分の表 | 「透明PET」「クリアPET」→pet_clear、「冷凍糊」「冷食用」→freezer などの表 | 営業と工場で作る表 |
質を決めるのは、抜き型の扱いの項目です。 型代が単価に込みなのか別なのか、既存の型を使ったのかが記録に無い見積は、単価を比べられません。記録に無い見積は、抜き型の扱いを unknown として持ち、画面で必ず目立たせます。
結果が「回答なし」の見積も索引に入れます。 得意先から返事が無かった見積は、受注でも失注でもありません。失注に数えると、その単価では取れなかったように見えてしまいます。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 素材・糊・形状が同じ版 | 見積の版の索引 | filter の term(material・glue・shape) |
| 寸法と部数が近い版 | 見積の版の索引 | filter の range(width_mm・height_mm・qty) |
| 見積の時期の近さ | 見積の版の索引 | function_score の gauss(quoted_on) |
| 見積ごとに1件にまとめる | 見積の版の索引 | collapse(quote_no) |
| 最初の版と最後の版 | 見積の版の索引 | collapse の inner_hits(rev の昇順と降順) |
見積の番号ごとのまとめは collapse で行います。 OpenSearch の公式のドキュメントでは、collapse は検索の結果を項目の値でまとめ、まとめごとに上位の文書だけを返すとされています。まとめる項目は keyword か数値の型で、doc values が有効で、文書ごとに値が1つである必要があり、値が複数ある文書があると検索が拒まれるとされています。quote_no は必ず keyword で1つの値にします。
まとめた見積の中の版は、inner_hits で取り出します。 公式のドキュメントでは、inner_hits で各まとめを広げられ、並べ方の違う複数の inner_hits を指定した例が示されています。版の番号の昇順で取ったものを first_rev、降順で取ったものを last_rev とします。
GET /label_quotes/_search
{
"size": 10,
"_source": ["quote_no", "rev", "customer_code", "material", "glue", "shape",
"width_mm", "height_mm", "colors", "finish", "qty", "unit_price",
"lead_days", "die", "result", "quoted_on"],
"query": { "function_score": {
"query": { "bool": {
"filter": [
{ "term": { "material": "pet_clear" } },
{ "term": { "glue": "strong" } },
{ "term": { "shape": "rounded_rect" } },
{ "range": { "width_mm": { "gte": 50, "lte": 70 } } },
{ "range": { "height_mm": { "gte": 30, "lte": 50 } } },
{ "range": { "qty": { "gte": 2500, "lte": 20000 } } } ] } },
"functions": [
{ "gauss": { "quoted_on": { "origin": "now", "offset": "90d", "scale": "365d" } } } ] } },
"collapse": {
"field": "quote_no",
"inner_hits": [
{ "name": "first_rev", "size": 3, "sort": [ { "rev": "asc" } ] },
{ "name": "last_rev", "size": 3, "sort": [ { "rev": "desc" } ] } ] }
}
ここで、公式のドキュメントの2つの注意を踏まえます。 1つは、応答の総件数(hits.total)はまとめる前の文書の数で、まとめの数は示されないことです。画面に「近い見積 〜件」と出すときは、hits.total を使わず、返ってきたまとめの数を数えます。もう1つは、collapse は集計の結果を変えないことです。版ごとに文書があるので、集計で受注の数を数えると版の数だけ重なります。受注と失注の数は、まとめた結果から Lambda が数えます。
寸法と部数の幅は、range で決めます。 部数は今回の半分から2倍まで、寸法は前後10mmを既定にし、候補が少なければ営業が画面で幅を広げます。range の幅は検索の条件として画面に出し、どこまで広げて見たかを残します。
AIへ渡す前に整形する
- 寸法を mm にそろえる … 「60×40」「W60 H40」「6cm×4cm」を幅と高さの mm の整数にします
- 部数を枚数にそろえる … 「5千枚」「5,000」「5K」を 5000 にします。ロールで「1巻1,000枚×5巻」とあれば総数を 5000 にし、巻き数は別に持ちます
- 納期を営業日の数にする … 依頼の日から希望の納期までの営業日の数を
lead_daysにします - 素材と糊を区分にする … 区分の表で
pet_clear・woodfree・yupo、strong・removable・freezerなどにします。表に無い言葉は区分を空にして残します - 抜き型の扱いを区分にする …
new_die_separate(新しく作り型代は別)、new_die_included(型代込み)、existing_die(既存の型)、unknown - 部数ごとの単価を分けて持つ … 1つの見積に複数の部数の段があるときは、段ごとに別の文書にし、
qtyとunit_priceを1つずつ持たせます
6番目で段ごとに文書を分けるのは、range で部数を絞るためです。 部数を配列で持つと、5,000枚の段の単価と10,000枚の段の単価のどちらが当たったのかが分からなくなります。見積の番号と版の番号と部数の段の組を、文書の番号にします。 inner_hits の size は部数の段の数(3など)にし、同じ版の段をまとめて取り出したうえで、今回と比べる段は Lambda が版の番号と部数の近さで選びます。
5番目の unknown を空のまま比べないことが、第3章の(c)を防ぎます。 抜き型の扱いが分からない見積は、単価が近くても比べてよいかが決まりません。
AIに処理させる
AIの仕事は2つです。 依頼を仕様に読み替えることと、見積ごとの単価・結果・違う点を記録のまま並べた表を作ることです。
| させること | させないこと |
|---|---|
| 素材・糊・寸法・形状・色数・加工・部数・納期を書かれたまま取り出す | 書かれていない素材や糊を、用途から推し量ること |
| 素材と糊を、決められた区分から選ぶ | 単価を計算すること、部数の違いで単価を割り戻すこと |
| 見積ごとに、最初と最後の単価・結果・違う点を表にする | 今回の単価を提案すること |
| 書かれていない仕様をまとめ、得意先に聞き返す項目にする | 失注の理由を推し量ること |
今回の単価を提案させないのが、この構成でいちばん大事な線です。 過去の単価を渡せば、生成AIは部数の違いを割り戻した単価を返します。その単価には、今の素材の値も、型代も、工場の混み具合も入っていません。 画面に単価が出れば、依頼の多い日ほどその数字が見積に写ります。
用途から素材を推し量らせないのも同じ理由です。 「冷凍食品のラベル」と書かれていても、冷凍向けの糊を使うかは得意先の仕様です。推した区分で引くと、別の糊の見積を根拠にすることになります。
指示内容を固定する
1回目(依頼の読み替え)の指示です。
あなたはシール・ラベルの印刷会社の営業で、見積の依頼を整理する立場です。
【依頼】から、過去の見積を探すための仕様を取り出してください。
【取り出すもの】
- material: 素材。【素材の区分】から1つ選ぶ。選べなければ空
- glue: 糊。【糊の区分】から1つ選ぶ。選べなければ空
- size_raw: 寸法。書かれたまま(「60×40の角丸」など)
- shape_raw: 形状。書かれたまま
- colors_raw: 色数。書かれたまま(「4色+白」など)
- finish_raw: 加工。書かれたまま(「ラミネート」「箔押し」など)
- qty_raw: 部数。書かれたまま。複数あればすべて
- due_raw: 納期。書かれたまま
- missing: 書かれていない項目の名前
【厳守事項】
- 素材や糊が書かれていなければ空にしてください。用途から推し量らないでください。
- 寸法・部数は単位を直さず、書かれたまま写してください。計算しないでください。
- 単価や金額について、何も書かないでください。
- 得意先の会社名・担当者名は写さないでください。
【素材の区分】{materials}
【糊の区分】{glues}
【依頼】{request_text}
2回目(見積の表)の指示です。
あなたはシール・ラベルの印刷会社で、営業に過去の見積を示す立場です。
【見積】は過去の見積の最初の版と最後の版の記録です。
【違う項目】はシステムが作ったものです。
【書き方】
- 見積ごとに、見積の番号・素材・糊・寸法・部数・最初の単価・最後の単価・
抜き型の扱い・結果を、記録の値のまま書いてください。
- 【違う項目】は、文言を変えずにそのまま書いてください。
- 抜き型の扱いが unknown の見積は「型の扱い不明。単価の比べ方に注意」と書いてください。
- 最後に、得意先に聞き返す項目をまとめてください。
【厳守事項】
- 単価を計算しないでください。差・割合・部数での割り戻しを書かないでください。
- 今回の単価を提案しないでください。
- 失注の理由を、記録のメモに無い形で書かないでください。
【依頼の仕様】{conditions}
【見積】{quotes}
【違う項目】{differences}
「部数での割り戻しを書かない」を入れているのは、部数の違う見積が並ぶと、AIが自分で1枚あたりに直そうとするからです。 割り戻しは、版代や型代が部数で薄まる分を無視した計算になります。比べ方は営業が決めることなので、AIの文には入れません。
出力形式を固定する
Bedrock の Converse API の outputConfig.textFormat に JSON スキーマを渡し、2回目は次の形で受け取ります。
{
"request_no": "",
"conditions": { "material": "", "glue": "", "width_mm": 0, "height_mm": 0,
"qty": [0], "lead_days": 0 },
"quotes": [
{ "quote_no": "", "first_unit_price": 0, "last_unit_price": 0, "qty": 0,
"revisions": 0,
"die": "new_die_separate | new_die_included | existing_die | unknown",
"result": "won | lost | no_reply | open",
"differences": [""] } ],
"ask_back": [""]
}
AWS の公式ページでは、Converse API の outputConfig.textFormat に JSON スキーマを渡すと応答がスキーマに沿い、enum が使えるとされています。すべての object に additionalProperties: false が要り、数値の minimum・maximum は使えません。 抜き型の扱いと結果は enum で縛ります。
1つ目の理由は、AIが返した単価を索引の値と照合できることです。 quote_no ごとに、first_unit_price と last_unit_price が first_rev と last_rev の _source の値と一致するかを Lambda が確かめます。違えば索引の値で置き換え、置き換えたことを記録します。
2つ目は、differences を Lambda の文と照合できることです。 違う項目は次の規則で作り、1字でも違えば表を作り直します。
| 比べる項目 | 違うときの文 |
|---|---|
die | 抜き型の扱いが違います(今回:〜/記録:〜) |
finish | 加工が違います(今回:〜/記録:〜) |
colors | 色数が違います(今回:〜/記録:〜) |
lead_days | 納期の営業日が違います(今回:〜/記録:〜) |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 見積の仕組み | 毎晩の書き出し(読み取りのみ) | 見積の版と結果 |
| 抜き型の台帳 | 毎晩の書き出し(読み取りのみ) | 型の番号と形状・寸法 |
| Amazon OpenSearch Service | Lambda からの登録・検索 | 見積の版の索引、まとめと版の取り出し |
| Amazon Bedrock | Converse API(Claude) | 読み替えと見積の表 |
| 営業の画面 | 社内の画面 | 依頼の貼り付け、見積の表、決めた単価の記録 |
抜き型の台帳は、今回の依頼の形と寸法に合う既存の型があるかを示すためにも使います。 型があるかを確かめるのは工場の担当で、画面には「台帳に近い型あり(型の番号)」とだけ出します。
人が確認する
- 読み替えを見る … 素材・糊・寸法・部数が、依頼のとおりに取り出されているかを確かめます
- 抜き型の扱いを見る … 今回の依頼で型を新しく作るか、既存の型を使うかを工場の担当と確かめます
- 結果を読み分ける … 受注の単価と失注の単価を分けて見ます。回答なしは結果として数えません
- 同じ得意先の見積を見る … 得意先のコードが同じ見積があれば、前に出した単価との違いを説明できるかを確かめます
- 単価を決めて残す … 見た見積の番号と、単価を決めた理由を残します
4番目を省かないでください。 第3章の(b)は、ここで防ぎます。同じ得意先に前と違う単価を出すなら、その理由を見積に添えられるようにしておきます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 素材や糊が区分に読み替えられない | 区分を空にし、営業が区分を選んでから引く |
| 近い見積が0件 | 寸法と部数の幅を広げた件数と、形状の条件を外した件数を示す |
抜き型の扱いが unknown | 単価を出したうえで「型の扱い不明」と目立たせる |
| 結果が未確定の見積 | open として出し、受注・失注の数に入れない |
| 版の番号が抜けている | 最初と最後の版をそのまま出し、版の数を画面に出す |
| AIの単価が索引と合わない | 索引の値で置き換え、置き換えたことを記録する |
| 構造化出力が返らない | まとめた見積の一覧と違う項目だけを出し、表は営業が見る |
記録を残す
- 依頼ごとの、依頼の文(得意先の名前を伏せたもの)、1回目の JSON、営業が直した箇所
- 検索の条件(
rangeの幅を含む)、まとめた見積、違う項目と照合の結果 - AIの単価を索引の値で置き換えた記録
- 営業が決めた単価と、見た見積の番号、単価を決めた理由
- 区分の表を見直した日と担当
4つ目は、受注・失注が確定したときに見直す材料になります。 決めたときに見た見積と、今回の結果を並べられます。
04実装レベルの3段階
半自動化で、1件20分が12分程度になります。 近い見積の探し出しと版の確かめはほぼなくなりますが、抜き型と加工の違いの見比べが残ります。本格構成で8分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化を1か月使うと、どの素材の言葉が区分の表に無いか、抜き型の扱いが空の見積がどれだけあるかが残ります。記録を整えてから本格構成に進むほうが、単価の比べ方が確かになります。
05工数削減シミュレーション
導入後 360件 × 8分 ÷ 60 = 48 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 食品・日用品・化粧品などのシールやラベルを受注生産し、素材・糊・寸法・型抜きの組み合わせが案件ごとに違うため、単価表だけでは見積が組めない印刷会社。見積の依頼が毎月数百件あり、過去の見積は見積の仕組みに残っているのに、近い案件を探して単価をそろえるのが営業ごとの記憶に頼っている場合。同じ得意先に営業ごとに違う単価を出してしまった経験がある場合。AWS を使える担当か委託先がいる場合。
- 仕様が数通りに決まっていて、単価表だけで見積が組める場合。過去の見積に素材・糊・寸法・部数が項目として残っておらず、品名と金額しか無い場合(先に見積の記録を整えます)。見積の依頼が月に数十件で、営業が全部の案件を覚えている場合。なお、今回の単価を決めること、原価の計算、得意先との価格の交渉は、この構成では代替できません。過去の見積から近い案件を探し、記録のまま並べるまでです。
07最小構成で試す方法
- 先月の見積の依頼から30件を選ぶ(透明フィルム・上質紙・冷凍向けの糊・異形の型抜きを混ぜる)
- それぞれについて、営業が当時参考にした過去の見積と、決めた単価を書き出す
- 過去の見積を表計算に書き出し、素材と糊の区分の列、寸法の数の列、抜き型の扱いの列を足す
- 30件の依頼を手元のAIサービスに貼り、「素材・糊・寸法・部数・納期を書かれたまま取り出してください。推し量らず、単価を書かないでください」と指示する(得意先の名前は伏せてから貼ります)
- 取り出した仕様で表計算を絞り、見積の番号ごとに最後の版を選んで、当時の営業が参考にした見積が出てくるかを見る
- 抜き型の扱いの列が空の見積がどれだけあるかを数える
6番目で空が多ければ、見積の記録の整え方が先です。
| 出てきた内容 | 判断 |
|---|---|
| 当時の見積が見つかり、最初と最後の単価も並べられた | OpenSearch の索引に進む |
| 素材や糊を推し量った・単価を書いた | 指示の書き方で直る。構成は有効 |
| 仕様が項目になっていない見積が多い | 見積の記録の整備が先 |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 同じ見積の版が何行も上に来る | collapse で見積の番号ごとにまとめる |
collapse が拒まれる | まとめる項目を keyword で1つの値にし、doc values を有効にする |
| 「近い見積 〜件」の数が多すぎる | hits.total はまとめる前の数。まとめの数を数える |
| 受注の数が版の数だけ重なる | collapse は集計を変えない。数はまとめた結果から数える |
| 型代込みの単価と既存の型の単価を比べる | 抜き型の扱いを区分で持ち、違う項目として必ず出す |
| 回答なしを失注に数える | 結果を4つに分け、回答なしは数えない |
| AIが部数で割り戻した単価を書く | 割り戻しを書かせない。照合で止める |
上の4行は、collapse の決まりから来る失敗です。 どれも画面の件数や数の見え方が変わるだけで、エラーにはなりません。第8章の30件で、件数と受注の数が見積の仕組みと合うかを必ず見てください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 得意先からの見積の依頼と仕様書、過去の見積の単価と結果です。単価と値引きの幅は、得意先ごとの取引の条件そのもので、外に出せない情報です。
- 得意先の名前を外す … 索引には得意先のコードだけを持ち、Claude には得意先の名前・担当者名を渡しません
- 単価を決めさせない … 画面に出すのは過去の見積の記録と違う項目までです。単価を決めるのは営業です
- 画面を見られる人を限る … 得意先ごとの単価と値引きの幅は、営業部の中だけで見られるようにします。OpenSearch のドメインには、Lambda と営業の画面だけが接続できるようにします
- 得意先の仕様書を外に出さない … 仕様書には、得意先の発売前の商品名やデザインが書かれていることがあります。読み替えに要る仕様の文だけを渡し、デザインのデータは渡しません
- 数字を作らせない … AIの単価は索引の値と照合し、違えば置き換えます
- 決めた根拠を残す … 見た見積の番号と、単価を決めた理由を残します
誤りが起きた場合のリスクは、抜き型の扱いの違う単価で見積もること、版の途中の単価を最後の単価と取り違えること、AIの文の単価を根拠にすることの3つです。 抜き型の区分と違う項目、collapse と inner_hits の最初と最後の版、索引の値との照合で防ぎます。
10まず何から始めるか
1週目:見積の記録を見る
過去の見積を書き出し、素材・糊・寸法・部数・抜き型の扱いが空の見積を数えます。直近2年の見積に、抜き型の扱いの区分を付けます。
2週目:30件で試す
第8章のとおり、先月の依頼30件で、当時の営業が参考にした見積が出てくるかを見ます。素材や糊を推し量っていないか、単価を書いていないかを最優先で見ます。
3週目:区分の表と文書の単位を決める
素材と糊の区分の表を、営業と工場の担当で作ります。版ごと、部数の段ごとに文書を分ける形を決め、索引の項目を固めます。
4週目:索引を作る
OpenSearch に見積の版の索引を作り、絞り込みと collapse で最初と最後の版を出せるようにします。この時点では、違う項目と見積の表は使いません。
2か月目: 違う項目の規則、見積の表と照合、決めた単価の記録を足します。3か月目以降: 近い見積が0件だった依頼の数、抜き型の扱いが不明で出た見積の数、同じ得意先に違う単価を出した件数を毎月数えます。新しい営業が、ベテランと同じ見積を見て単価を決め、その理由を残せた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
collapse が検索の結果を項目の値でまとめ、まとめごとに上位の文書だけを返すこと。まとめる項目が keyword か数値で doc values が有効、文書ごとに値が1つである必要があり、複数あると拒まれること。inner_hits で並べ方の違う複数の取り出しができること。総件数がまとめる前の数であること。集計の結果を変えないこと | OpenSearch: Collapse search results | 2026-10-28 |
減衰関数(gauss など)が日付の項目に使え、日付の origin の既定が now で、offset・scale で点数を決めること | OpenSearch: Function score query | 2026-10-28 |
range の gte・lte などで項目の値の範囲を問えること | OpenSearch: Range query | 2026-10-28 |
bool の filter の句が一致するかだけを決めて点数に加わらないこと | OpenSearch: Boolean query | 2026-10-28 |
| Amazon OpenSearch Service が AWS のクラウドで OpenSearch のクラスターを立てて動かすための管理されたサービスで、ドメインがクラスターと同じ意味であること | AWS: What is Amazon OpenSearch Service? | 2026-10-28 |
Converse API の outputConfig.textFormat で JSON スキーマに沿った出力が得られ、enum が使えること。additionalProperties: false が要ること。数値の minimum・maximum に対応しないこと | AWS: Structured outputs(Amazon Bedrock) | 2026-10-28 |
今回の単価、原価の計算、得意先との価格の交渉は、営業と工場の担当、自社の決まりに沿って判断してください。 本記事は上記の資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2172)についてのご相談はこちらから。
