新しい購入依頼を受けたときに、過去の購買仕様書・見積書・発注記録から類似品を探し、単価・仕入先・納期を根拠の書類付きで並べる
新しい購入依頼が届くと、過去の購買仕様書・見積書・発注記録から仕様の近い品目を探し、購入実績の単価・仕入先・納期を、根拠の書類付きで並べます。購買担当者は見積を依頼する前に、似た物の相場と買えた先を知ったうえで動けます。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 医療/建設/製造
- 対象部門
- 生産/購買
- 対象業務
- 情報検索/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/属人化解消/検索時間短縮
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 購入依頼の依頼書と図面を開き、材質・大きさ・加工・数量を読む
- 生産管理システムで、品名と材質の部分一致で過去の発注を探す
- 候補の発注番号から、ファイルサーバーの仕様書と見積書を開き、仕様が近いかを読み比べる
- 近いものの単価・仕入先・発注日から納入日までの日数を、手元の表に書き出す
- 見つからないときは、その分野を長く担当している購買担当者に聞く
- 書き出した表を見て、見積を依頼する仕入先を決める
- 自動前日に納入が済んだ発注記録を生産管理システムから取り出し、発注番号でひも付く仕様書と見積書をファイルサーバーから探す
- 自動Claude が仕様書と見積書から、材質・大きさ・加工・表面処理・公差の等級などの仕様の項目を取り出す
- 自動発注日から納入日までの日数と、数量帯を計算し、発注1行を1件の「購買カード」として検索基盤に登録する
- 人購買担当者が購入依頼の依頼書と仕様書を検索画面に入れる
- 自動Claude が依頼から仕様の項目を取り出し、担当者が画面で確かめる
- 自動品名・材質の語の一致と、仕様の文の近さを組み合わせたハイブリッド検索で、類似品の購買カードを最大50件集める
- 自動集めたカードの範囲で、数量帯と仕入先ごとに単価と納期の分布を集計する
- 自動Claude が上位10件について、依頼との違いを1文ずつ書く
- 人購買担当者が根拠の仕様書と見積書を開いて確かめ、見積を依頼する仕入先を決める
各工程の詳しい説明を読む
- 購入依頼の依頼書と図面を開き、材質・大きさ・加工・数量を読む
- 生産管理システムで、品名と材質の部分一致で過去の発注を探す
- 候補の発注番号から、ファイルサーバーの仕様書と見積書を開き、仕様が近いかを読み比べる
- 近いものの単価・仕入先・発注日から納入日までの日数を、手元の表に書き出す
- 見つからないときは、その分野を長く担当している購買担当者に聞く
- 書き出した表を見て、見積を依頼する仕入先を決める
(a)品目コードが違うと実績が引けない。 特注品は寸法が1か所違えば別の品目コードです。似た物の実績はあるのに、コードでは辿れません。 品名の部分一致は、依頼者の付けた名前の揺れに負けます。
(b)単価の相場が分からないまま見積を取る。 調べる時間がない月は、過去の実績を見ずに、いつもの仕入先に見積を依頼します。 出てきた見積が高いのか安いのかを判断する材料がないまま、発注に進むことがあります。
(c)数量と時期が混ざる。 書き出した表に、試作の5個の単価と量産の500個の単価、8年前と昨年の単価が並びます。どれを相場と見るかは、担当者の勘になります。
(d)覚えている人に聞くしかない。 「その形なら前にあの板金屋に出した」という記憶は、長く担当している人の頭の中にあります。その人が休むと、調べる手段ごと止まります。
取り込み(毎晩)
- 【自動】 前日に納入が済んだ発注記録を生産管理システムから取り出し、発注番号でひも付く仕様書と見積書をファイルサーバーから探す
- 【自動】 Claude が仕様書と見積書から、材質・大きさ・加工・表面処理・公差の等級などの仕様の項目を取り出す
- 【自動】 発注日から納入日までの日数と、数量帯を計算し、発注1行を1件の「購買カード」として検索基盤に登録する
検索(購入依頼のたび)
- 【人】 購買担当者が購入依頼の依頼書と仕様書を検索画面に入れる
- 【自動】 Claude が依頼から仕様の項目を取り出し、担当者が画面で確かめる
- 【自動】 品名・材質の語の一致と、仕様の文の近さを組み合わせたハイブリッド検索で、類似品の購買カードを最大50件集める
- 【自動】 集めたカードの範囲で、数量帯と仕入先ごとに単価と納期の分布を集計する
- 【自動】 Claude が上位10件について、依頼との違いを1文ずつ書く
- 【人】 購買担当者が根拠の仕様書と見積書を開いて確かめ、見積を依頼する仕入先を決める
5番目が、この設計の分かれ目です。 依頼から取り出した仕様の項目が違っていれば、その後の検索も集計もすべて外れます。依頼書の読み違いは、担当者が画面で1回見れば直せます。 ここを飛ばして検索に進む作りにはしません。
7番目をAIにさせないのも、意図してのことです。 単価の中央値を生成AIに計算させると、それらしい数字が出ますが、根拠の発注番号まで辿れません。 集計は検索基盤に任せ、AIには渡しません。
02今回想定するシステム構成
【取り込み】生産管理システム(前日に納入済みの発注) ▼【トリガー】毎晩の定時実行 AWS Lambda ── 発注番号で仕様書・見積書を探し、本文を抜く ▼ Claude API(構造化出力)── 仕様の項目を取り出す ▼ AWS Lambda ── 納期の日数と数量帯を計算 ▼ Amazon Titan Text Embeddings V2 ── 仕様の文を埋め込み ▼ Amazon OpenSearch Service(購買カードの索引) 【検索】購買担当者の検索画面(依頼書・仕様書) ▼ Claude API(構造化出力)── 依頼から仕様の項目を取り出す ▼【人】項目を確かめる Amazon OpenSearch Service ── ハイブリッド検索で類似品を集める ▼ Amazon OpenSearch Service ── 集めたカードの範囲で単価・納期を集計 ▼ Claude API ── 上位10件の「依頼との違い」 ▼ 購買担当者が根拠を確認 → 見積依頼へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(ハイブリッド検索と集計) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed、OpenAI の埋め込みモデル |
| 生成AI | Claude API(構造化出力。仕様の項目の取り出しと違いの1文) | OpenAI API、Gemini API |
| 連携 | AWS Lambda(取り込み、計算、問い合わせの処理) | AWS Step Functions |
| 保管 | Amazon S3(仕様書と見積書の本文の写し) | 既存のファイルサーバー |
| 基幹 | 既存の生産管理システム(発注記録) | ― |
検索の中心は、OpenSearch のハイブリッドクエリです。 公開されているドキュメントでは、ハイブリッドクエリは複数のクエリの関連度のスコアを1つのスコアに組み合わせるもので、組み合わせには検索パイプラインを使います。サブクエリは最大5つで、filter は1つのクエリとしてすべてのサブクエリに適用されます。
単価と納期の分布は、集計(アグリゲーション)で出します。 OpenSearch の集計には、合計・最小・最大・平均などを数値の項目で計算するメトリクス集計、条件で結果を分けるバケット集計、集計の結果を次の集計に渡すパイプライン集計の3種類があります。集計は検索の結果の範囲で動き、文書そのものが要らないときは size を0にします。
仕様の項目の取り出しには、Claude の構造化出力を使います。 JSON スキーマに沿った応答が制約付きのデコードで保証され、スキーマに合わない応答をやり直す必要がありません。 ただし、数値の minimum や maximum のような制約はスキーマに書けず、SDK が説明文に移して手元で検証する形になります。
03どうやって実装するのか
処理の起点を決める
取り込みと検索で、起点が2つあります。
取り込みは、毎晩の定時実行にします。 前日に納入が済んだ発注だけを取り込むのは、納期の日数は納入日が決まって初めて計算できるからです。 発注の時点で取り込むと、納期の欄が空のカードが増え、集計の結果が揺れます。発注取消になったものは取り込みません。
過去10年分の約18万行は、別に一括で取り込みます。 このときは仕様書や見積書が見つからない発注が出ます。見つからなかった発注も、発注記録だけのカードとして登録し、「書類なし」の印を付けます。 単価と納期は使えますが、仕様の比べ方が粗くなることを画面で示します。
検索は、購買担当者が購入依頼を検索画面に入れたときに動きます。 依頼のメールに付いてきた依頼書と仕様書をそのまま入れる形にし、依頼者に新しい書式を求めません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 発注記録 | 発注番号、品目コード、品名、仕入先、数量、単価、通貨、発注日、納入日、取消の有無 | 生産管理システム |
| 購買仕様書 | 材質、寸法、加工、表面処理、公差の等級、検査の条件 | ファイルサーバー(発注番号のフォルダ) |
| 見積書 | 仕入先、見積番号、見積日、数量ごとの単価、型代や段取り費などの別建ての費用 | ファイルサーバー |
| 購買カード | 取り込み時に作る。上記をまとめ、納期の日数と数量帯を足したもの | 検索基盤 |
| 購入依頼(検索時) | 図面番号、品名、材質、数量、希望納期、仕様書 | 検索画面 |
| 数量帯の区切り | 品目の分類ごとに「同じ数量帯」とみなす範囲 | 購買部が決める設定表 |
質を決めるのは、いちばん下の設定表です。 板金品なら1〜9個・10〜99個・100個以上、切削品なら1〜4個・5〜49個・50個以上のように、段取りの費用が単価に効く境目は品目の分類で違います。 区切りは購買部が決め、AIには決めさせません。
見積書の別建ての費用は、単価と分けて持ちます。 型代や段取り費を単価に含めて見積る仕入先と、別に立てる仕入先があります。分けずに単価だけを比べると、型代を別に立てた仕入先が安く見えます。
データの取得方法を決める
発注記録は生産管理システムから CSV で取り出します。仕様書と見積書は、発注番号のフォルダにある PDF と Excel から本文を抜きます。 スキャンした画像だけの古い見積書は、この構成の対象外にします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 単価・数量・通貨・発注日・納入日 | 発注記録 | 集計の対象。納期の日数の計算 |
| 仕様の項目 | 仕様書(なければ見積書の品名と摘要) | 類似品の比べ方と、絞り込み |
| 別建ての費用 | 見積書 | 単価と分けて表示する |
| 仕様の文 | 仕様書の本文 | 埋め込みによる近さ |
単価は、発注記録の値を正とします。 見積書の単価と発注の単価が違うことはよくあります。値引きの交渉が入った、数量が変わった、という理由です。相場として並べるのは実際に発注した単価で、見積書の単価は参考として横に出します。
検索は2回に分けて問い合わせます。 1回目はハイブリッドクエリで類似品のカードを集めます。サブクエリは、品名・材質・加工の語の一致と、仕様の文の埋め込みによる近さの2つにし、filter で品目の分類と、取消の発注を外す条件を掛けます。2回目に、1回目で集めたカードの発注番号で絞った問い合わせに集計を付けます。 ハイブリッドクエリのドキュメントには集計についての記載がないため、2回に分けておくのが確実です。
集計は、次の形で組みます。
| 集計 | 種類 | 中身 |
|---|---|---|
| 数量帯で分ける | バケット集計(terms) | 数量帯の項目で分ける |
| 仕入先で分ける | バケット集計(terms) | 数量帯の中で、仕入先ごとに分ける |
| 単価の分布 | メトリクス集計(percentiles) | 仕入先ごとの単価の分布 |
| 納期の分布 | メトリクス集計(percentiles) | 仕入先ごとの納期の日数の分布 |
| 最新の発注日 | メトリクス集計(max) | 仕入先ごとの最後に買った日 |
2回目の問い合わせは、たとえば次の形になります。
{
"size": 0,
"query": { "bool": { "filter": [ { "terms": { "po_no": ["1回目で集めた発注番号"] } } ] } },
"aggs": {
"by_qty_band": {
"terms": { "field": "qty_band" },
"aggs": {
"by_supplier": {
"terms": { "field": "supplier", "size": 30 },
"aggs": {
"price": { "percentiles": { "field": "unit_price_jpy", "percents": [25, 50, 75] } },
"lead_days": { "percentiles": { "field": "lead_time_days", "percents": [50] } },
"last_po": { "max": { "field": "po_date" } }
}
}
}
}
}
}
percents を指定しないと、既定で7つの百分位が返ります。 画面に出すのは中央値と四分位の3つで足りるので、絞って指定します。
terms の既定のバケットの数は10です。 仕入先が10社を超える分類では、size を広げておかないと11社目以降が集計から黙って落ちます。 また、シャードが複数あるときの件数は近似で、doc_count_error_upper_bound と sum_other_doc_count で落ちた分を確かめられます。
AIへ渡す前に整形する
- 通貨と単位の統一 … 単価は円に、数量は個・枚・m・kg のどれかにそろえます。外貨の単価は発注日の社内換算レートで円にし、元の通貨と値も残します
- 納期の日数の計算 … 納入日から発注日を引きます。分納のものは最後の納入日で計算し、分納の印を付けます
- 数量帯の付与 … 設定表に従って、発注の数量に数量帯を付けます
- 品名の正規化 … 全角と半角、「ブラケット」と「ブラケット」などをそろえます。言い換えの表(「取付金具」と「ブラケット」など)は購買部が作ります
- 埋め込みの対象を絞る … 仕様の文だけを埋め込みます。単価・数量・寸法の数値は埋め込まず、数値の項目として持ちます
- キーワードの項目を持たせる … 仕入先、数量帯、品目の分類は
keywordの項目にします
6番目を忘れると、集計が動きません。 ドキュメントでは、既定では text の項目では集計できないとされ、keyword の項目を持たせることが勧められています。仕入先名を本文と同じ text の項目にしてしまうと、仕入先ごとの単価が出せません。
AIに処理させる
AIの仕事は3か所です。取り込み時と検索時の仕様の項目の取り出し、検索結果の違いの1文です。
| 場面 | させること |
|---|---|
| 取り込み | 仕様書と見積書から、材質・寸法・加工・表面処理・公差の等級・検査の条件、別建ての費用を取り出す |
| 検索 | 購入依頼の依頼書と仕様書から、同じ項目を取り出す |
| 検索 | 上位10件について、依頼と違う仕様の項目を1文で書く(「材質が SS400 ではなく SUS304」など) |
| させないこと | 理由 |
|---|---|
| 単価の相場や目標価格の提示 | 集計の結果を見て担当者が決める。根拠の辿れない数字が交渉に使われる |
| 見積を依頼する仕入先の推薦 | 品質・取引の状況は発注記録に出ない。担当者が決める |
| 古い単価の物価補正 | 補正のしかたは社内で決めること。古いという事実だけを示す |
| 書かれていない仕様の補完 | 公差の等級が書かれていなければ空のまま。一般的な等級で埋めない |
| 単価の集計 | 検索基盤の集計に任せる |
1行目がいちばん起きやすい失敗です。 違いの1文を書かせると、「以上から、単価は1,200円前後が妥当です」と最後に添えてきます。その一文は根拠の発注番号を持たないまま、仕入先との交渉に持ち込まれます。
指示内容を固定する
仕様の項目の取り出し(取り込み時と検索時で共通):
あなたは製造業の購買部で、仕様書から仕様の項目を整理する担当です。
渡された本文だけを根拠にしてください。推測で埋めないでください。
【取り出す項目】
- 品名(本文の表記をそのまま)
- 品目の分類:切削品 / 板金品 / 溶接品 / 樹脂成形品 / 治具 / その他
- 材質(JIS の記号などを本文のとおり)
- 寸法:外形の縦・横・高さ(mm)、板厚(mm)
- 加工:穴あけ / 曲げ / 溶接 / タップ / 研削 など、本文にあるもの
- 表面処理、公差の等級、検査の条件
- 見積書の場合:数量ごとの単価、型代・段取り費など別建ての費用
【厳守事項】
- 書かれていない項目は null にしてください。
一般的な値や、似た品目の値で埋めないでください。
- 寸法の単位が書かれていない値は、値を入れたうえで unit_missing に項目名を書いてください。
- 図面番号だけが書かれていて寸法が無い場合は、寸法を null にし、
drawing_only を true にしてください。
- 単価の妥当性や相場について書かないでください。
違いの1文(検索時):
あなたは購買担当者の調査を助ける担当です。
【購入依頼の仕様】{request_spec}
【類似品の購買カード(上位10件)】{cards}
【書くこと】
各カードについて、購入依頼と違う仕様の項目を1文で書いてください。
違いが無ければ「仕様の項目に違いなし」と書いてください。
【厳守事項】
- 単価・相場・目標価格について書かないでください。
- 仕入先を推薦しないでください。
- カードに無い仕様に触れないでください。
- 「書類なし」の印のあるカードは、その旨を書いてください。
取り出しの指示は、取り込み時と検索時で同じものを使います。 片方だけを直すと、同じ仕様書から違う項目が取り出され、検索で引けなくなります。 指示を直したときは、過去のカードも取り出し直すかを決めます。
「単価について書かない」を違いの1文の指示に入れないと、ほぼ毎回、最後に相場の一言を添えてきます。 禁じるだけでなく、出力に円や「単価」の語が含まれていたら、その1文を捨てる照合を後段に置きます。
出力形式を固定する
取り出しは、構造化出力で次の形のJSONにします。
{
"item_name": "",
"category": "machined | sheet_metal | welded | molded | jig | other",
"material": "",
"dimensions_mm": { "length": null, "width": null, "height": null, "thickness": null },
"processes": [""],
"surface_treatment": null,
"tolerance_grade": null,
"inspection": null,
"quote_lines": [ { "qty": null, "unit_price": null } ],
"extra_costs": [ { "type": "tooling | setup | other", "amount": null } ],
"unit_missing": [""],
"drawing_only": false
}
1つ目の理由は、寸法を数値の項目として索引に入れられることです。 dimensions_mm は OpenSearch の数値の項目にし、filter の範囲指定(板厚が依頼の±1mm、など)に使います。 自由文で受け取ると単位と書き方がそろわず、範囲で絞れません。
2つ目は、category を決まった値に限れることです。 構造化出力の enum で6つに絞ると、集計の terms で分ける項目が揺れません。 依頼者によって「板金」「シートメタル」と書き方が違っても、区分は1つになります。
3つ目は、extra_costs を単価と分けて持てることです。 型代を別に立てた見積を、単価だけで安いと読み違えることを防ぎます。
画面に返す一覧は、次の形にします。
| 数量帯 | 仕入先 | 件数 | 単価(中央値/範囲) | 納期の日数(中央値) | 最後に買った日 | 根拠 |
|---|---|---|---|---|---|---|
| 10〜99個 | 仕入先A | 7 | 集計の値 | 集計の値 | 2026-05 | 発注番号・仕様書・見積書 |
根拠の列から、発注番号ごとに仕様書と見積書を1クリックで開けるようにします。 集計の値は percentiles の結果で、ドキュメントでは百分位の計算は近似とされています。 件数の少ない仕入先は中央値ではなく、発注そのものを並べて見せます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 生産管理システム | 毎晩の CSV の取り出し | 前日に納入が済んだ発注記録 |
| ファイルサーバー | Lambda からの読み取り | 発注番号のフォルダの仕様書と見積書 |
| Amazon S3 | Lambda から読み書き | 本文の写し |
| Claude API | Lambda からの呼び出し(構造化出力) | 仕様の項目の取り出しと、違いの1文 |
| Amazon Titan Text Embeddings V2 | Lambda からの呼び出し | 仕様の文の埋め込み |
| Amazon OpenSearch Service | 索引への登録、ハイブリッド検索、集計 | 購買カードの検索と単価・納期の分布 |
生産管理システムには書き込みません。 見積依頼や発注は、これまでどおり購買担当者が生産管理システムで行います。この構成が出すのは、見積を依頼する前の調べものの結果までです。
人が確認する
- 依頼から取り出した仕様を確かめる … 検索の前に、材質・寸法・数量を画面で見ます。
unit_missingとdrawing_onlyの付いた項目を優先します - 上位の根拠を開く … 見積の依頼先を決める前に、上位数件の仕様書と見積書を開き、本当に似た物かを図面で確かめます
- 数量帯と年を見る … 依頼の数量と同じ数量帯の行を見ます。最後に買った日が古い行は、相場ではなく「買えた先」の手がかりとして読みます
- 見積依頼先は担当者が決める … 集計の結果に出ない品質や取引の状況を加えて決めます
1件9分を目安にします。 仕様の確認、根拠の数件の確認、一覧を見て依頼先を決める時間です。一覧の中央値だけを見て見積の目安にする運用にはしません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 発注番号に仕様書・見積書が無い | 発注記録だけのカードにし「書類なし」の印 |
| 仕様書がスキャンの画像だけ | 本文を取り出せないので「書類なし」と同じ扱い。読み取りは別の作業へ |
| 依頼に寸法が無く図面番号だけ | drawing_only。担当者が図面から寸法を入れてから検索する |
| 類似品が0件 | 品目の分類の絞り込みを外して再検索し、それでも0件なら「過去の実績なし」と表示 |
| 仕入先が10社を超える | terms の size を広げる。sum_other_doc_count が0でなければ画面に警告 |
| 外貨の発注 | 社内換算レートで円にし、元の通貨と値を併記 |
| 分納・一部取消の発注 | 最後の納入日で納期を計算し印を付ける。取消分は数量から引く |
| 違いの1文に単価や相場の語が出た | その1文を捨て、「違いの説明なし」として表示 |
上から2行目までが、一括取り込みの初めの大半を占めます。 古い発注ほど書類が欠けています。書類のない発注も単価と納期は使えるので、捨てずに印を付けて残します。
記録を残す
- 取り込んだ発注番号と、ひも付けた書類、取り込んだ日時
- Claude が返した仕様の項目のJSON
- 検索のたびの購入依頼の仕様と、担当者が画面で直した項目
- ハイブリッド検索の候補、集計の結果、違いの1文と捨てた1文
- 担当者が開いた根拠の書類と、見積を依頼した仕入先
3つ目で「直した項目」を残すのは、取り出しの精度を測るためです。 材質の読み違いが多ければ指示を、寸法が drawing_only ばかりなら依頼書の書式を直します。
最後の行は、半年後に効いてきます。 一覧で上位に出た仕入先と、実際に見積を依頼した仕入先が毎回違うなら、仕様の比べ方が担当者の見方と合っていません。
04実装レベルの3段階
最小構成では、1つの分類しか扱えません。 表を手で作るので、確かめるための段階です。 半自動化で、項目による絞り込みまでは自動になります。 ただし文章の近さが無いので、品名の揺れや、書き方の違う似た仕様は拾えません。 本格構成との差はここで、本記事の想定は本格構成です。
05工数削減シミュレーション
導入後 200件 × 9分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 加工品・板金品・治具・特注の部材など、図面や仕様書で買う品目が多く、同じ物ではないが似た物を繰り返し買っている製造業・建設業・医療機器メーカーの購買部門。10年分前後の発注記録が生産管理システムにあり、購買仕様書と見積書がファイルサーバーに残っている場合。見積依頼の前に「前に似た物をいくらで、どこから、何日で買ったか」を調べるのに時間がかかり、経験の長い購買担当者の記憶に頼っている場合。
- 買う物の大半がカタログ品や単価契約のある標準品で、品目コードで過去の単価が引ける場合(UC-0165 のような仕分けで足りる)。発注記録と仕様書・見積書がひも付けられず、どの見積がどの発注になったかが分からない場合。年に数十件しか新しい品目を買わない場合。なお、どの仕入先に見積を依頼し、いくらで発注するかの判断は購買担当者に残ります。
07最小構成で試す方法
- 板金品だけに絞り、過去3年分の発注記録から200行と、その仕様書・見積書を選ぶ
- 200行をスプレッドシートにし、材質・寸法・加工・数量帯の列を手で埋める
- 最近の購入依頼を20件選び、当時、担当者が参考にした過去の発注を聞き取る
- 20件の依頼それぞれについて、手元のAIサービスに200行の表と依頼書を貼り、「仕様の近い行を10行選び、依頼と違う項目を1文ずつ書いてください。単価については書かないでください」と頼む
- 選ばれた10行を数量帯と仕入先で並べ替え、単価の範囲を表計算で出し、当時の参考と突き合わせる
20件は必ず、長く担当している購買担当者と一緒に見てください。 仕様の項目で選ぶことが、その人の記憶と合っているかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者が思い当たる発注が選ばれる | 取り込みと検索基盤の構築に進む |
| 仕様は近いのに、担当者が「加工が違う」と言う | 仕様の項目が足りない。 加工の区分を足して試し直す |
| 違いの1文に単価の一言が混ざる | 指示の書き方と後段の照合で直る。構成は有効 |
2行目が出ることは珍しくありません。 失敗ではなく、担当者が暗黙に見ていた仕様が1つ分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 違いの1文に相場や目標価格が混ざる | 指示で禁じ、単価や円の語を含む1文を捨てる |
| 数量帯を分けずに単価を並べる | 試作と量産の単価が混ざる。数量帯で先に分ける |
仕入先名を text の項目にする | 既定では集計できない。keyword の項目を持たせる |
| 仕入先が11社以上で一部が消える | terms の既定は10。size を広げ、sum_other_doc_count を見る |
| 寸法を仕様の文と一緒に埋め込む | 数値は数値の項目にして範囲で絞る |
| 見積書の単価を相場として並べる | 発注の単価を正とし、見積の単価は参考にする |
| 型代を単価に含めた見積と含めない見積を比べる | 別建ての費用を分けて持つ |
| 取り込みと検索で取り出しの指示が違う | 同じ仕様書から違う項目が出る。指示を1つにする |
| 古い単価をAIが補正する | 補正させない。最後に買った日を横に出す |
上の2行が、この構成の失敗のほとんどです。 どちらも「単価を1つの数字で見せたい」という同じ誘惑から出発しています。数量帯と仕入先と年で分けた分布を、根拠の発注番号付きで見せるかどうかで、交渉に使えるかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先ごとの見積単価と発注単価、仕入先の名前、自社の図面と仕様書です。見積単価は仕入先から信頼して受け取った情報で、自社の原価の情報でもあります。
- 単価を見られる人を購買部に限る … 検索画面と索引は購買部の利用者だけに開きます。依頼元の生産技術部や設計部には、仕様の比べ方は見せても、単価の列は見せない設計にします
- 見積単価を外部へ出さない … 違いの1文の生成に渡すのは仕様の項目だけにし、単価と仕入先名は Claude に渡しません。 違いの1文に単価は要りません
- 図面の扱いを決める … 仕様書に顧客の図面が含まれる場合は、その顧客との取り決めで外部のサービスに渡せるかを確かめます。渡せない顧客の品目は、仕様の項目を担当者が手で入れる運用に分けます
- 発注先の判断をAIに寄せない … この構成が出すのは、過去の購入実績の事実までです。どの仕入先に見積を依頼し、いくらで発注するかは購買担当者が決めます
誤りが起きた場合のリスクは、似ていない物の単価を相場と見て交渉することと、単価が見るべきでない人に見えることの2つです。 前者は担当者の根拠の確認と数量帯の分け方で、後者は検索画面の利用者の制限と、生成AIに単価を渡さない設計で防ぎます。
10まず何から始めるか
1週目:仕様の項目と数量帯の区切りを決める
1つの品目の分類(たとえば板金品)を選び、長く担当している購買担当者と一緒に、比べるときに見ている仕様の項目と、数量帯の区切りを決めます。
2週目:200行と20件の依頼で試す
その分類の発注から200行を選んで項目を埋め、最近の依頼20件で近い行を選ばせます。担当者が思い当たる発注と合っているか、違いの1文に単価が混ざらないかを見ます。
3週目:取り出しの指示を作る
同じ仕様書と見積書を Claude の構造化出力で読ませ、手で埋めた200行と比べます。null にすべき値を埋めていないかを最優先で見ます。
4週目:毎晩の取り込みを始める
前日に納入が済んだ発注から、購買カードをためます。この時点では検索は項目の絞り込みと並べ替えだけにします。
2か月目: OpenSearch Service の索引を作り、埋め込みとハイブリッド検索、数量帯と仕入先の集計を足します。3か月目以降: 過去10年分を分類ごとに一括で取り込み、違いの1文と照合を足します。見積を依頼する前に一覧を見ることが購買部の手順に入り、「前に似た物をどこに出したか」という問い合わせが減った時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ハイブリッドクエリが複数のクエリの関連度のスコアを1つに組み合わせ、検索パイプラインを使うこと。サブクエリが最大5つで、filter が1つのクエリとして全サブクエリに適用されること | OpenSearch Documentation: Hybrid query | 2026-10-06 |
集計にメトリクス・バケット・パイプラインの3種類があること。集計が検索の結果の範囲で動くこと。文書が要らないときに size を0にすること。既定では text の項目で集計できず、keyword の項目が勧められること | OpenSearch Documentation: Aggregations | 2026-10-06 |
terms の既定のバケットの数が10であること。複数のシャードでは件数が近似で、doc_count_error_upper_bound と sum_other_doc_count が返ること | OpenSearch Documentation: Terms aggregation | 2026-10-06 |
percentiles が数値の項目の百分位を推定し、既定で7つの百分位(1・5・25・50・75・95・99)を返し、percents で返す百分位を指定できること。計算が近似であること | OpenSearch Documentation: Percentiles aggregation | 2026-10-06 |
| Titan Text Embeddings V2 の入力が最大8,192トークンまたは50,000文字、出力が既定1,024次元であること。英語に最適化され、日本語が多言語対応の一覧に含まれること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-06 |
構造化出力が制約付きのデコードで JSON スキーマに沿った応答を保証すること。enum が使えること。数値の minimum・maximum がスキーマで使えず、SDK が説明文に移して手元で検証すること | Claude Docs: Structured outputs | 2026-10-06 |
どの仕入先に見積を依頼し、いくらで発注するかは、購買担当者が根拠の書類を確かめたうえで決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0439)についてのご相談はこちらから。
