Media > AI活用ユースケース > 営業 > 印刷会社の営業が、新しい見積の依頼に近い過去の受注を、紙・加工・部数・判型の仕様から探し、当時の原価の内訳と仕様の違いを並べる

印刷会社の営業が、新しい見積の依頼に近い過去の受注を、紙・加工・部数・判型の仕様から探し、当時の原価の内訳と仕様の違いを並べる

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

得意先から届いた見積の依頼から、判型・ページ数・紙・色数・加工・部数の仕様を取り出し、紙の厚さや加工の書き方をそろえたうえで、過去の受注から仕様の近い案件を探します。 当時の受注金額と原価の内訳、仕様の違い、受注の時期を並べ、営業が見積を組む材料にします。

サマリー
生成AI
Azure OpenAI Service/Claude/Gemini
AIサービス
Azure AI/Google Vertex AI/OpenSearch
対象業界
その他/広告/製造
対象部門
営業
対象業務
情報検索/比較検討
主な課題
判断に時間がかかる/属人化している/情報が見つからない
AIで行う処理
検索(RAG)
主な効果
判断支援/属人化解消/検索時間短縮
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
RAG・個別開発(大)
人間の確認
条件付き
現在工数
70h/月
AI導入後
20h/月
想定削減
71%
年間削減
600h
モデル条件による試算値です。実在企業の実績ではありません。

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

導入前(Before)
  1. 得意先からのメールとPDFの仕様書を読み、仕様を見積の表計算に書き写す
  2. 基幹の仕組みで、品目と判型で過去の受注を絞る
  3. 紙の銘柄や加工の名前で探し、書き方を変えて探し直す
  4. 当たった案件を1件ずつ開き、ページ数・部数・加工が近いかを見る
  5. 近い案件の原価の内訳を見て、紙代を今の値段で置き換える
  6. 見積を組み、上長の確認を経て得意先に出す
導入後(After)
  1. 自動毎晩、基幹の仕組みから受注の記録を取り込み、紙の厚さと加工の書き方をそろえて索引に入れる
  2. 人営業が、得意先からのメールの本文とPDFの仕様書の文を画面に貼り、「近い案件を探す」を押す
  3. 自動Claude が、品目・判型・ページ数・紙・色数・加工・部数・納期を取り出し、足りない仕様を挙げる
  4. 人営業が取り出した仕様を見て、違っていれば直す
  5. 自動OpenSearch が、品目と判型で絞り、紙・加工・ページ数で並べ、部数と時期の近さで点数を掛ける
  6. 自動候補ごとに、依頼との仕様の違いと、当時の原価の内訳、受注の時期を並べる
  7. 人営業が近い案件を選び、紙代を今の値段で置き換えて見積を組む
各工程の詳しい説明を読む
  1. 得意先からのメールとPDFの仕様書を読み、仕様を見積の表計算に書き写す
  2. 基幹の仕組みで、品目と判型で過去の受注を絞る
  3. 紙の銘柄や加工の名前で探し、書き方を変えて探し直す
  4. 当たった案件を1件ずつ開き、ページ数・部数・加工が近いかを見る
  5. 近い案件の原価の内訳を見て、紙代を今の値段で置き換える
  6. 見積を組み、上長の確認を経て得意先に出す

(a)書き方の違いで当たらない。 3番目が時間を食います。「マットPP」で引くと「PP(マット)」と書かれた案件が漏れ、 紙の厚さを kg で引くと g/m² で書かれた案件が漏れます。

(b)近さの見方が人によって違う。 ページ数が同じで部数が5倍の案件と、部数が同じで加工が1つ違う案件の、どちらを参考にするかは営業次第です。同じ依頼でも、営業によって見積の金額が違います。

(c)昔の原価をそのまま使う。 3年前の案件の紙代を今の値段に直し忘れると、その分だけ利益が削れます。 紙の値段が何度も改定された時期の案件ほど危ない。

(d)工務の担当に聞く件数が多い。 探せない営業は工務の担当に聞きます。工務の担当の仕事が、営業の探しものの手伝いで止まります。

(e)部数ごとに探し直す。 「3,000部・5,000部・10,000部で」と頼まれると、部数ごとに近い案件が違います。同じ探しものを3回くり返し、そのたびに書き方を変えて引き直します。

  1. 【自動】 毎晩、基幹の仕組みから受注の記録を取り込み、紙の厚さと加工の書き方をそろえて索引に入れる
  2. 【人】 営業が、得意先からのメールの本文とPDFの仕様書の文を画面に貼り、「近い案件を探す」を押す
  3. 【自動】 Claude が、品目・判型・ページ数・紙・色数・加工・部数・納期を取り出し、足りない仕様を挙げる
  4. 【人】 営業が取り出した仕様を見て、違っていれば直す
  5. 【自動】 OpenSearch が、品目と判型で絞り、紙・加工・ページ数で並べ、部数と時期の近さで点数を掛ける
  6. 【自動】 候補ごとに、依頼との仕様の違いと、当時の原価の内訳、受注の時期を並べる
  7. 【人】 営業が近い案件を選び、紙代を今の値段で置き換えて見積を組む

7番目を人が行うのは、見積の金額が営業の判断だからです。 この構成は過去の案件を並べるだけで、金額は計算しません。 当時の原価から今の見積を作るには、紙の値段の改定、外注先の変更、得意先との取引の条件を知っている営業の判断が要ります。

4番目の確かめを入れるのは、仕様書の書き方が得意先ごとに違うからです。 「A4 8P」が8ページなのか、4枚の両面なのかは、得意先の書き方を知っている営業が確かめます。

部数が複数ある依頼では、5番目と6番目が部数の数だけくり返されます。 営業の画面には部数ごとに候補の一覧が並び、部数によって参考にする案件が変わることが、そのまま見えるようにします。 小さい部数では刷版と準備の費用が、大きい部数では紙代が原価の中心になるからです。

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

構成図
基幹の仕組み(受注の記録:仕様・受注金額・原価の内訳・外注先)
   ▼【トリガー】毎晩の取り込み
AWS Lambda ── 紙の厚さを坪量にそろえる、加工の呼び方をそろえる
   ▼
Amazon OpenSearch Service
   │   区分:品目・判型・色数・紙の種類(keyword)
   │   数値:ページ数・坪量・部数(対数)・受注日(range、decay)
   │   加工:nested(加工の区分・面・外注先)
   ▼【人】営業が依頼の文を貼る
AWS Lambda
   ├──▶ Claude(Amazon Bedrock)── 依頼の文から仕様を取り出す(構造化出力)
   ├──▶【人】仕様を確かめる
   ├──▶ OpenSearch ── 品目・判型で絞り、紙・加工で並べ、部数・時期で点数を掛ける
   ▼
近い案件の一覧(仕様の違い・原価の内訳・受注の時期)──【人】見積を組む
役割想定する製品代替候補
検索基盤Amazon OpenSearch Service(function_score の decay、nested、range)Azure AI Search、Vertex AI Search(Agent Search)
生成AIClaude(Amazon Bedrock の Converse API、構造化出力)Azure OpenAI(Microsoft Foundry)、Gemini API
連携AWS Lambda(取り込み、依頼の文の取り出しと検索の呼び出し)AWS Step Functions
保管Amazon S3(取り込んだ受注の記録の写し、依頼と候補の記録)社内のファイルサーバー

基幹の仕組みと見積の表計算には、この構成から書き込みません。 受注の記録を読むだけで、見積は営業がいつもの表計算で組みます。候補の原価の数字を見積に自動で写す経路は作りません。

近さの点数は、function_score の減衰(decay)の関数で作ります。 公式のドキュメントでは、gauss・exp・linear の3つの曲線があり、数値・日付・位置の項目に使えます。origin(基準の値)、offset(満点のままの幅)、scale(減り方の幅)、decay(offset+scale の距離での点数、既定0.5)で形を決めます。部数と受注日の近さを、この曲線で点数にします。

ただし、減衰の関数には落とし穴があります。 公式のドキュメントでは、項目が文書に無いとき、減衰の関数は1(満点)を返します。 部数や受注日の欄が空の古い記録が、いちばん近い案件として上に来ます。exists の条件で、欄の埋まった記録だけを対象にします。

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

Step1

処理の起点を決める

起点は2つあります。毎晩の取り込みと、営業のボタンです。

毎晩の取り込みは、基幹の仕組みからその日に原価が確定した受注を書き出して索引に足します。原価が確定していない受注は入れません。 見積の金額だけで原価の無い記録は、見積の材料になりません。

ボタンは、営業が依頼の文を画面に貼った後に押します。部数が複数ある依頼(3,000部・5,000部・10,000部の見積)は、部数ごとに探して並べます。 部数で原価の内訳の割合が大きく変わるからです。

Step2

入力データを集める

データ中身取得元
見積の依頼得意先からのメールの本文、PDFの仕様書の文営業が貼る
受注の記録受注番号、得意先の業種、品目、判型、ページ数、紙の銘柄と厚さ、色数(表・裏)、加工、部数、受注金額、原価の内訳(用紙・刷版・印刷・加工・外注・配送)、外注先、受注日基幹の仕組み
紙の表紙の銘柄、紙の種類(コート・マット・上質など)、連量と坪量の対応工務の担当で作る表
加工の表加工の呼び方と区分(「PP」「PP貼り」「グロスPP」→ PP・グロス)工務の担当で作る表

質を決めるのは、紙の表です。 紙の厚さは、連量(決まった寸法の紙1,000枚の重さ、kg)と坪量(1平方メートルあたりの重さ、g/m²)の2つの書き方があり、連量は紙の寸法(四六判・菊判など)によって同じ紙でも値が変わります。 工務の担当が、銘柄と寸法ごとに坪量への換算を表にし、取り込みですべて坪量にそろえます。

原価の内訳は、項目を分けたまま持ちます。 合計だけでは、紙代を今の値段で置き換えられません。

Step3

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

取るものどこからどう取るか
同じ品目・判型の案件受注の索引bool の filter に term(品目、判型)
ページ数の近い案件受注の索引filter に range(依頼のページ数の前後)
紙・色数の近い案件受注の索引should に term(紙の種類、色数)と range(坪量の前後)
加工の重なる案件受注の索引should に nested(加工の区分ごと)、inner_hits で当たった加工
部数・時期の近さ受注の索引function_score の gauss(部数の対数、受注日)

索引の主な項目は次のとおりです。

PUT /print_jobs
{ "mappings": { "properties": {
    "job_no":       { "type": "keyword" },
    "product":      { "type": "keyword" },
    "size":         { "type": "keyword" },
    "pages":        { "type": "integer" },
    "paper_type":   { "type": "keyword" },
    "paper_gsm":    { "type": "float" },
    "paper_brand":  { "type": "keyword" },
    "colors":       { "type": "keyword" },
    "qty":          { "type": "integer" },
    "qty_log10":    { "type": "float" },
    "ordered_on":   { "type": "date" },
    "processes": { "type": "nested", "properties": {
      "kind":   { "type": "keyword" },
      "side":   { "type": "keyword" },
      "vendor": { "type": "keyword" } } },
    "cost": { "properties": {
      "paper": { "type": "integer" }, "plate": { "type": "integer" },
      "press": { "type": "integer" }, "finishing": { "type": "integer" },
      "outsourced": { "type": "integer" }, "delivery": { "type": "integer" } } },
    "order_amount": { "type": "integer" }
} } }

部数は対数(qty_log10)でも持ちます。 3,000部と6,000部の違いと、30,000部と60,000部の違いは、原価の構造の上では同じくらいの違いです。部数のまま近さを測ると、大きな部数の案件ほど近さが厳しくなります。 対数にすれば、「倍・半分」を同じ幅で扱えます。

探す形は次のとおりです(依頼は A4・16ページの冊子、5,000部)。

POST /print_jobs/_search
{ "query": { "function_score": {
    "query": { "bool": {
      "filter": [
        { "term":  { "product": "booklet" } },
        { "term":  { "size": "A4" } },
        { "range": { "pages": { "gte": 12, "lte": 20 } } },
        { "exists": { "field": "qty_log10" } },
        { "exists": { "field": "ordered_on" } } ],
      "should": [
        { "term":  { "paper_type": "matte_coated" } },
        { "range": { "paper_gsm": { "gte": 115, "lte": 140 } } },
        { "term":  { "colors": "4/4" } },
        { "nested": { "path": "processes",
            "query": { "term": { "processes.kind": "pp_matte" } },
            "inner_hits": {} } },
        { "nested": { "path": "processes",
            "query": { "term": { "processes.kind": "saddle_stitch" } } } } ] } },
    "functions": [
      { "gauss": { "qty_log10": { "origin": 3.7, "offset": 0.1, "scale": 0.3 } } },
      { "gauss": { "ordered_on": { "origin": "now", "offset": "180d", "scale": "730d" } } } ],
    "score_mode": "multiply",
    "boost_mode": "multiply" } },
  "size": 10 }

qty_log10 の origin は依頼の部数の対数(5,000部なら約3.7)です。 scale の0.3は部数でおよそ2倍・半分にあたり、そこで点数が半分になります。受注日は半年までは満点、そこから2年で半分にします。

加工は nested で持ちます。 公式のドキュメントでは、物の配列は各項目の値が平らにまとめて持たれ、どの値が同じ物のものかが分からなくなります。 nested にすると各物が別の隠れた文書として持たれます。「マットPPを表紙の片面に」と「グロスPPを両面に」のように、加工の区分と面の組み合わせを崩さずに探すためです。 nested の検索は親の文書を返すので、inner_hits で当たった加工を画面に出します。

Step4

AIへ渡す前に整形する

  1. 紙の厚さを坪量にそろえる … 紙の表で、連量(kg)と寸法から坪量(g/m²)を引きます。表に無い銘柄は paper_gsm を入れず、印を付けます
  2. 紙の種類をそろえる … 銘柄から、コート・マットコート・上質・特殊紙などの区分を引きます
  3. 加工の呼び方をそろえる … 加工の表で、呼び方を区分と面に分けます(「表紙のみマットPP」→ pp_matte・cover)
  4. 判型と品目をそろえる … 「A4」「210×297」を同じ値に、「パンフ」「会社案内」を品目の区分に当てます
  5. 部数の対数を足す … qty_log10 を計算して入れます
  6. 原価が確定していない記録を外す … 原価の内訳が空の受注は取り込みません
  7. 依頼の文を整える … 得意先の担当者の名前と電話番号は、Claude に渡す前に伏せます

1番目を軽く見ないでください。 坪量が入らない記録は、紙の厚さの range に当たらず、紙の近さで点数が上がりません。表に無い銘柄の一覧を毎月出し、工務の担当が表に足します。

Step5

AIに処理させる

AIの仕事は、依頼の文から探すための仕様を取り出すことだけです。 探すのも、近さを測るのも、原価を並べるのも、規則と索引の仕事です。

させることさせないこと
品目・判型・ページ数・色数を取り出す書かれていない仕様を補うこと
紙の銘柄と厚さを、書かれたまま取り出す連量と坪量の換算
加工を、書かれたまま取り出し、加工の表の区分に当てる表に無い区分を作ること
部数を、すべての数量ごとに取り出す部数を1つにまとめること
足りない仕様を挙げる(紙の指定が無い、加工の面が分からない)見積の金額や単価を出すこと

「換算をさせない」が、いちばん大事な線です。 連量から坪量への換算は紙の寸法によって変わり、AIがもっともらしい値を出すと、表の換算と食い違ったときに追えません。 換算は前処理の表だけで行います。

「見積の金額を出さない」も明記します。 依頼の文に「前回と同じくらいで」と書かれていても、金額は営業が決めます。

Step6

指示内容を固定する

あなたは印刷会社の営業を手伝う立場です。
得意先からの見積の依頼の文から、過去の案件を探すための仕様を取り出してください。
書かれていることだけを使い、推測で補わないでください。

【取り出すもの】
- product: 品目を【品目の区分】のどれかに当てる。決められなければ "unknown"
- size: 仕上がりの判型(書かれたまま)
- pages: ページ数。書かれていなければ null
- colors: 色数(表/裏)。書かれていなければ null
- paper: 紙の銘柄と厚さを、書かれた表記のまま("マットコート 110kg" など)
- processes: 加工を【加工の区分】に当て、面(表紙・本文・片面・両面)も書く
- quantities: 部数をすべて。複数あれば配列で
- due: 納期(書かれたまま)
- missing: 探すのに足りない仕様

【厳守事項】
- 紙の厚さを換算しないでください。kg を g/m² に、g/m² を kg に直さないでください。
- 書かれていない紙・色数・加工を、品目からの一般論で補わないでください。
  例:冊子だから中綴じ、とは決めないでください。missing に入れてください。
- 「8P」「8頁」は8ページとしてください。
  「4枚両面」のような書き方は、ページ数に直さず missing に書いてください。
- 金額、単価、値引きを書かないでください。
  依頼の文に前回の金額が書かれていても、取り出さないでください。
- 加工の面が書かれていなければ、面を "unspecified" にしてください。

【品目の区分】{product_list}
【加工の区分】{process_list}
【依頼の文】{request_text}

「冊子だから中綴じと決めない」を明記しないと、AIは品目から加工を補います。 16ページの冊子なら中綴じが多いのは確かですが、無線綴じで頼まれていれば原価がまったく違います。 書かれていない加工は、営業が得意先に確かめることにします。

Step7

出力形式を固定する

Bedrock の Converse API の outputConfig.textFormat に JSON スキーマを渡し、次の形で受け取ります。

{
  "product": "flyer | leaflet | brochure | booklet | envelope | ... | unknown",
  "size": "",
  "pages": null,
  "colors": null,
  "paper": { "as_written": "" },
  "processes": [ { "kind": "pp_matte | pp_gloss | saddle_stitch | perfect_bind | foil | die_cut | ...",
                   "side": "cover | body | one_side | both_sides | unspecified" } ],
  "quantities": [0],
  "due": "",
  "missing": [""]
}

公式のドキュメントでは、Converse API の outputConfig.textFormat に JSON スキーマを渡すと応答がスキーマに沿い、enum が使えます。product と processes.kind を enum で閉じ、表に無い区分が返らないようにします。 数値の範囲の制約には対応していないので、ページ数と部数の値の確かめは Lambda で行います。

1つ目の理由は、仕様の項目がそのまま検索の条件になることです。 product と size は filter、paper は前処理の表で坪量にして range、processes は nested の条件になります。

2つ目は、quantities を部数ごとの検索に分けられることです。 配列の数だけ、qty_log10 の origin を変えて探します。

3つ目は、missing がそのまま得意先への確認になることです。

画面に出す候補の一覧は、検索の結果から Lambda が作ります。

列中身
案件受注番号、得意先の業種、受注日
仕様品目、判型、ページ数、紙、色数、加工、部数
依頼との違い規則で書き出した違い(「部数:依頼の1.6倍」「加工:グロスPP(依頼はマットPP)」)
原価の内訳用紙・刷版・印刷・加工・外注・配送と合計、受注金額
時期の注意受注日と、その後の紙の値段の改定の有無

「時期の注意」の列が、この一覧でいちばん大事な列です。 紙の値段の改定の日を工務の担当が表にしておき、受注日より後に改定があれば「紙代は改定前の値段」と印を付けます。

Step8

システムへ連携する

つなぎ先方式内容
基幹の仕組み受注の記録の書き出し(毎晩、読み取りのみ)受注の索引の元
Amazon OpenSearch ServiceLambda からの索引への登録と検索受注の索引
Amazon BedrockConverse API(Claude)依頼の文からの取り出し
営業の画面社内の画面依頼の文の貼り付け、仕様の確かめ、候補の一覧

見積の表計算とはつなぎません。 候補の原価を見積に写すのは営業の手です。写す手間を残すのは、今の値段に置き換える判断をその場で必ず通すためです。

Step9

人が確認する

  1. 取り出した仕様を見る … 特にページ数、加工の面、部数を確かめます
  2. missing を得意先に聞く … 紙の指定が無い、加工の面が分からない、などを確かめます
  3. 時期の注意を見る … 紙の値段の改定の前の案件なら、紙代を今の値段で置き換えます
  4. 外注先を見る … 加工の外注先が今も同じかを確かめます

3番目を省かないでください。 一覧の原価は当時の原価です。今の見積に使えるのは、仕様の近さと原価の構造で、金額そのものではありません。

Step10

例外に対処する

起きること対応
品目が unknown検索をせず、営業に品目を選んでもらう
近い案件が0件ページ数の範囲を広げ、次に紙・加工の should だけで探す。広げたことを一覧に書く
紙の銘柄が表に無い紙の種類だけで探し、表への追加を工務の担当に頼む
部数の欄が空の記録exists の条件で検索から外れる。取り込みの記録に件数を出す
加工の面が unspecified面を条件にせず、区分だけで探す
構造化出力が返らない営業が仕様を画面の項目で入れて検索だけを使う
依頼の文に複数の品目がある品目ごとに分けて探す

4行目は、減衰の関数の性質によるものです。 項目が無いと満点になるので、条件で外さなければ、部数の分からない古い記録が上に並びます。

Step11

記録を残す

  • 検索ごとの、依頼の文(伏せたもの)、取り出した JSON、営業が直した箇所
  • 検索の条件と、広げた条件
  • 候補の一覧と、営業が参考にした案件
  • 最終の見積の金額と、その後の受注の結果(受注・失注)

最後の行を残すのは、参考にした案件と見積の結果を結び付けるためです。 同じ案件を参考にして失注が続くなら、その案件の原価の構造が今に合っていない可能性があります。

04実装レベルの3段階

最小構成:表計算で紙の厚さと加工の書き方をそろえ、仕様で絞る / 書き方の違いの吸収
半自動化:上記+OpenSearch に受注の記録を入れ、営業が仕様を入れて近さの順に探す画面を作る / 近い案件の検索と並べ替え
本格構成:上記+依頼の文から仕様を取り出し、部数ごとに探して、仕様の違いと時期の注意まで並べる / 依頼の文から候補の一覧まで

半自動化で、1件14分が8分程度になります。 書き方を変えて探し直す時間は無くなりますが、依頼の文から仕様を書き写す作業と、候補と依頼の違いを見比べる作業が残ります。本格構成で4分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の画面を1か月使うと、営業がどの仕様の違いを許して参考にしているかが記録から分かります。それに合わせて減衰の幅を直してから依頼の文の取り出しを足すほうが、近さの順が営業の感覚に合います。

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

前提値(モデル条件)
対象人数
12 名
月間件数
300 件
1件あたり現在時間
14 分
1件あたり導入後時間
4 分
現在  300件 × 14分 ÷ 60 = 70 時間/月
導入後 300件 × 4分 ÷ 60 = 20 時間/月
月間削減時間
50h
削減率
71%
年間削減時間
600h
年間金額換算(時間単価3,200円)
192万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

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

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

AI活用について相談する

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

向いている
  1. チラシ・パンフレット・冊子・封筒などを受注する商業印刷の会社で、営業が見積を組むときに過去の似た案件の原価を参考にしており、受注の記録が基幹の仕組みにデータで残っている場合。見積の依頼が毎月数百件あり、似た案件を探せるのが経験の長い営業と工務の担当に限られている場合。紙の値上がりや加工の外注先の変更で、昔の単価のままでは見積が合わなくなっている場合。AWS を使える担当か委託先がいる場合。
向いていない
  1. 受注の品目が数種類に限られ、単価表だけで見積が組める場合(単価表から概算を出す構成のほうが向きます)。受注の記録が紙の伝票だけで、仕様と原価がデータになっていない場合。月の見積の依頼が数十件の規模。なお、見積の金額を決めること、値引きの判断、納期の約束は、この構成では代替できません。過去の近い案件を探して並べるまでです。

07最小構成で試す方法

  1. 先月、過去の案件を参考に見積を組んだ依頼から20件を選ぶ
  2. 営業に、それぞれどの過去の案件を参考にしたかを書き出してもらう
  3. 基幹の仕組みから受注の記録を表計算に書き出し、紙の厚さを坪量にそろえた列と、加工の呼び方をそろえた列を足す
  4. 20件の依頼の文を手元のAIサービスに貼り、仕様を取り出させる
  5. 取り出した仕様で表計算を絞り込み、営業が参考にした案件が残るかを見る

2番目の書き出しは必ず先に済ませてください。 営業が参考にした案件が答えで、それと比べないと「近い」の意味が決まりません。4番目では、紙の厚さを換算していないか、書かれていない加工を補っていないかを最優先で見ます。

出てきた内容判断
参考にした案件が絞り込みに残ったOpenSearch の索引に進む
書かれていない加工を補った指示の書き方で直る。構成は有効
過去の記録の紙の厚さがそろわない紙の表の整備が先。 工務の担当と表を作る

3行目が出ても、失敗ではありません。 営業が似た案件を探すのに時間がかかっていた理由が、1つ分かったということです。そろわない記録の数を数え、紙の表の整備にどれだけかかるかの見積にします。

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

問題対策
部数の欄が空の古い記録が上に来る減衰の関数は項目が無いと満点。 exists の条件で外す
部数の大きい案件ほど近さが厳しい部数を対数で持ち、対数で減衰させる
加工の区分と面の組み合わせが崩れる加工を nested にする。普通の配列は値が平らにまとめられる
どの加工で当たったか分からないinner_hits を付ける
紙の厚さで当たらない連量を坪量にそろえる。換算は表だけで行い、AIにさせない
AIが書かれていない加工を補う指示で禁じ、missing に入れさせる
昔の原価をそのまま使う受注日と紙の値段の改定の表から「時期の注意」を出す
原価が確定していない記録が混ざる原価の内訳が空の受注は取り込まない

上の3行が、この構成の失敗のほとんどです。 どれも候補が出てしまうので、画面を見ただけでは気づけません。索引を作ったら、部数の欄を空にした記録を1件入れ、それが上に来ないことを必ず確かめてください。 部数が依頼の10倍の案件を入れて、上位に来ないことも同じように確かめます。

減衰の幅は、一度決めて終わりではありません。 紙の値段が大きく動いた年の後は、受注日の幅を狭めて新しい案件を強く寄せるほうが合うことがあります。幅を変えたら、営業が参考にした案件の順位が下がっていないかを、第8章の20件で毎回確かめます。

下の2行も、早いうちに効いてきます。 昔の原価で組んだ見積は、受注しても利益が出ません。時期の注意の列は、最初から作ります。

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

この構成で扱うデータ: 得意先からの見積の依頼(仕様、部数、納期)、過去の受注の仕様・受注金額・原価の内訳・外注先です。得意先ごとの受注金額と原価は、会社の利益の構造そのものです。

  1. 原価の一覧を社外に出さない … 候補の一覧は営業と工務の担当だけが見られるようにします。得意先に出す見積に、他の得意先の案件の情報を書きません
  2. 得意先の名前を一覧に出さない … 候補には得意先の業種だけを出し、名前は受注番号から基幹の仕組みで引くようにします
  3. 依頼の文から個人の情報を外す … 得意先の担当者の名前と電話番号は、Claude に渡す前に伏せます
  4. 見積の金額は営業が決める … この構成は過去の案件を並べるだけです。値引き、納期の約束は営業と上長が決めます
  5. 外注先の単価を外に出さない … 外注の原価は外注先との取り決めによるもので、一覧を見られる人を絞ります
  6. 依頼の文の仕様書を学習や再配布に使わない … 得意先の仕様書は、その見積のために預かったものです。検索の記録に残すのは取り出した仕様と伏せた文までにし、PDFの原本は営業のいつもの置き場に残します

誤りが起きた場合のリスクは、昔の原価や仕様の違う案件の原価で見積を組み、赤字の受注をすることです。 時期の注意、仕様の違いの書き出し、金額を自動で写さないことの3つで防ぎます。

10まず何から始めるか

1週目:紙と加工の書き方を集める

基幹の仕組みから受注の記録を書き出し、紙の銘柄と厚さ、加工の呼び方の一覧を作ります。数の多い順に、工務の担当が区分に当てます。

2週目:20件で試す

第8章のとおり、表計算で書き方をそろえた列を足し、20件で営業が参考にした案件が残るかを見ます。

3週目:紙の値段の改定の表を作る

紙の値段の改定の日と、改定の対象の紙の種類を表にします。この表が「時期の注意」の列の元になります。 仕入先からの改定の知らせを、誰がいつこの表に書き足すかも決めます。表の更新が遅れると、改定の後の見積で改定前の案件に印が付きません。

4週目:索引を作る

OpenSearch に受注の索引を作り、営業が仕様を入れて近さの順に探す画面を作ります。この時点では依頼の文の取り出しは使いません。

2か月目: 依頼の文からの取り出しと、部数ごとの検索を足します。3か月目以降: 営業が参考にした案件が候補の上位5件に入った割合を毎月数え、1件14分が何分になったかを実測します。その割合が営業の感覚に合うところで落ち着いた時点で、この構成は完成です。


11関連ユースケース

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

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

技術仕様確認日:2026-10-15/最終更新:2026-10-23
確認した内容情報源確認日
減衰の関数(gauss・exp・linear)が数値・日付・位置の項目に使えること。origin・offset・scale・decay(既定0.5)の意味。日付の origin の既定が now であること。項目が文書に無いとき減衰の関数が1を返すこと。score_mode と boost_mode の既定が multiply であることOpenSearch: Function score query2026-10-15
物の配列が平らにまとめて持たれ、同じ物の中の値の組が分からなくなること。nested の各物が別の隠れた文書として持たれることOpenSearch: Nested field type2026-10-15
nested の検索が親の文書を返し、inner_hits で当たった物を返せることOpenSearch: Nested query2026-10-15
range で gte・gt・lte・lt を使って範囲を指定できることOpenSearch: Range query2026-10-15
Converse API の outputConfig.textFormat で JSON スキーマに沿った出力が得られ、enum が使えること。数値の minimum・maximum などの制約に対応していないことAWS: Structured outputs(Amazon Bedrock)2026-10-15

見積の金額、値引き、納期の約束は、営業と上長が決めてください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。

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

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

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

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