リフォームの問い合わせを受けたときに、過去の施工事例から住まいと工事内容の近い事例を探し、提案と概算の根拠を事例番号付きで示す
リフォームの問い合わせと現地調査のメモから、構造・築年数・工事内容が近い過去の施工事例を探します。当時の工事の内容、工種別の金額、起きた追加工事を事例番号付きで並べ、提案と概算の根拠にします。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 不動産/建設
- 対象部門
- 営業
- 対象業務
- 情報検索/比較検討
- 主な課題
- 営業フォローが追いつかない/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/対応スピード向上/属人化解消
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 問い合わせと現地調査のメモを読み、建物の条件(戸建て・マンション、構造、築年数)と工事内容を確かめる
- 工事台帳で、同じ工事の種類の過去の現場を探す。見つからなければ先輩に聞く
- 見つかった現場の見積書を開き、工種別の金額を確かめる
- 写真のフォルダを開き、施工前後の状態と追加工事の有無を読む
- 提案の内容と概算の幅を決め、店長に相談する
- 顧客に提案と概算を伝え、詳しい見積の作成に進む
- 人営業が問い合わせの内容と現地調査のメモを検索画面に貼る
- 自動Claude API が建物の種類・構造・築年数・工事の種類・面積や数量・要望を取り出す
- 人営業が取り出された条件を画面で確かめ、直す
- 自動Amazon OpenSearch Service が、建物の種類と工事の種類で絞ったうえで、事例の説明の近さで過去の事例を検索する
- 自動同じ絞り込みで、工事金額の分布(25・50・75%点)と追加工事の理由の件数を集計する
- 自動上位の事例について、工事の内容・工種別の金額・追加工事・施工の年を事例番号付きで取り出す
- 自動Claude API が、提案の論点と概算の根拠を、事例番号と集計の数字を付けて並べる
- 人営業が根拠の事例を開いて読み、提案と概算の幅を決める
各工程の詳しい説明を読む
- 問い合わせと現地調査のメモを読み、建物の条件(戸建て・マンション、構造、築年数)と工事内容を確かめる
- 工事台帳で、同じ工事の種類の過去の現場を探す。見つからなければ先輩に聞く
- 見つかった現場の見積書を開き、工種別の金額を確かめる
- 写真のフォルダを開き、施工前後の状態と追加工事の有無を読む
- 提案の内容と概算の幅を決め、店長に相談する
- 顧客に提案と概算を伝え、詳しい見積の作成に進む
(a)探す範囲が狭い。 工事台帳で引けるのは工事の種類と顧客名です。「築年数と構造が近く、同じように在来浴室から替えた現場」は探せません。 結局、自分か先輩が担当した現場だけを見ることになります。
(b)概算の幅を説明できない。 1件の事例の金額を基に概算を出すと、顧客に「なぜこの金額か」と聞かれたときに答えられません。 見積を出した後で大きく変わると、信頼を失います。
(c)追加工事が提案に入らない。 写真の説明に残った追加工事の記録は、次の提案の前に読まれていません。 解体後に土台の交換が必要になり、顧客に追加の費用を伝えて揉める、ということが繰り返されます。
(d)古い事例の金額をそのまま使う。 5年前の事例の金額は、材料費と労務費が上がった今とは違います。事例の年を見ずに金額を写すと、低すぎる概算になります。
(e)返事が遅れる。 調べものに時間がかかり、現地調査から提案まで1週間以上空くことがあります。 その間に、顧客は他社の提案を受け取ります。
- 【人】 営業が問い合わせの内容と現地調査のメモを検索画面に貼る
- 【自動】 Claude API が建物の種類・構造・築年数・工事の種類・面積や数量・要望を取り出す
- 【人】 営業が取り出された条件を画面で確かめ、直す
- 【自動】 Amazon OpenSearch Service が、建物の種類と工事の種類で絞ったうえで、事例の説明の近さで過去の事例を検索する
- 【自動】 同じ絞り込みで、工事金額の分布(25・50・75%点)と追加工事の理由の件数を集計する
- 【自動】 上位の事例について、工事の内容・工種別の金額・追加工事・施工の年を事例番号付きで取り出す
- 【自動】 Claude API が、提案の論点と概算の根拠を、事例番号と集計の数字を付けて並べる
- 【人】 営業が根拠の事例を開いて読み、提案と概算の幅を決める
5番目が、この設計の分かれ目です。 金額の分布は、検索基盤の集計で出します。 AIに「だいたいいくらか」と聞くと、渡された数件の金額から答えます。分布はプログラムが出し、AIはその数字を読むだけにします。
7番目で出すのは「根拠」で、「金額」ではありません。 「近い事例28件の工事金額は25%点から75%点までの幅。そのうち9件で解体後に土台の補修を追加(事例番号)」のように並べます。概算の幅を決めるのは営業です。
02今回想定するシステム構成
工事台帳 工種別の見積書 写真の説明 │ 事例番号で1件の事例にまとめる ▼ AWS Lambda ── Claude API(写真の説明から追加工事の理由を取り出す) ▼ Amazon Bedrock(Titan Text Embeddings V2)── 事例の説明文の埋め込み ▼ Amazon OpenSearch Service ── 事例の索引 ▲ │ 検索 検索画面 ──【トリガー】営業が問い合わせとメモを貼る ▼ Claude API ── 建物の条件と工事内容を取り出す ▼【人】条件の確認 OpenSearch ├── ハイブリッド検索(kuromoji の match + k-NN、全体の filter) ├── percentiles 集計で工事金額の分布 └── terms 集計で追加工事の理由の件数 ▼ Claude API ── 提案の論点と概算の根拠(事例番号付き) ▼ 検索画面 ──【人】営業が提案と概算の幅を決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(ハイブリッドクエリ、percentiles・terms 集計) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed、OpenAI の埋め込みモデル |
| 生成AI | Claude API(条件の取り出し、追加工事の理由の取り出し、論点の整理) | Azure OpenAI(Microsoft Foundry)、Gemini API |
| 連携 | AWS Lambda(事例の取り込み、検索画面とのつなぎ) | AWS Step Functions |
| 保管 | Amazon S3(見積書と写真の写し) | 社内のファイルサーバー |
工事台帳と見積のソフトには、この構成から書き込みません。 完工した現場の記録を読み取るだけで、見積はこれまでどおり見積のソフトで作ります。
土台になるのは、現場ごとに1件の文書にまとめた索引です。 工事台帳の建物の条件、見積書の工種別の金額、写真の説明から取り出した追加工事の記録を、事例番号で1つの文書にまとめてから索引に入れます。 検索のたびに3か所から集めるのではなく、入れる時点で1つにします。
検索はハイブリッドクエリで、絞り込みは全体の filter で行います。 ハイブリッドクエリには最大5つの検索を入れられ、全体の filter は1つの検索の形で書き、複数の条件は bool にまとめます。 この全体の filter は OpenSearch 3.0 で入った機能で、各検索の実行中にかかり、条件に合う文書だけが点数を付けられます。Amazon OpenSearch Service は 3.5・3.3・3.1 などに対応しています。
点数の合わせ方は、検索パイプラインの正規化の処理で決めます。 既定は min_max で正規化し、arithmetic_mean で合わせる形で、検索ごとの重みを合計1.0で指定できます。片方の検索にしか出なかった文書は、もう片方の分が0として平均されるため、点数が半分になります。 言葉の一致と説明の近さの両方に出る事例が上に来る、という並びになります。
金額の分布は percentiles 集計で出します。 既定では1・5・25・50・75・95・99%点を返し、percents で返す点を選べます。この集計は近似の計算です。 件数の少ない絞り込みでは、分布ではなく事例の金額の一覧を見せます(第7章の例外処理)。
03どうやって実装するのか
処理の起点を決める
営業が現地調査の後に、問い合わせの内容と調査のメモを検索画面に貼り、「近い事例を探す」を押したときに動かします。 問い合わせの段階で、カタログを送れば済むものや、工事の対象外のものも混ざります。現地調査に進んだものだけを対象にします。
もう1つの起点は、完工の締めです。 工事が終わり、最終の金額が確定した現場を、毎週の締めのあとに索引に足します。追加工事の記録は完工までに写真の説明に書かれるので、完工の時点で取り込めばそろいます。
見積の段階の金額は入れません。 入れるのは、追加工事を含めて確定した最終の金額です。見積の金額と最終の金額の差が、追加工事の大きさになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 問い合わせとメモ | 住まいの説明、困りごと、現地調査で見た寸法と状態 | 検索画面 |
| 事例の文書 | 事例番号、建物の種類・構造・築年数(施工時)、工事の種類、数量(面積・台数)、使った製品の区分、工種別の金額、最終の金額、施工の年 | 事例の索引(OpenSearch) |
| 追加工事の記録 | 理由の区分(土台の腐朽・下地の劣化・配管の老朽化など)、追加の金額、分かった時点 | 写真の説明から取り出して事例の文書に入れる |
| 事例の説明文 | 建物の条件・工事の内容・経緯を200字程度にまとめた文。埋め込みの元 | 取り込み時に作る |
| 掲載の同意 | 施工事例として他の顧客に写真を見せてよいかの印 | 工事台帳 |
質を決めるのは、3行目です。 金額だけの索引なら、見積のソフトの検索と大差がありません。追加工事が付いているから、提案の前に読む意味があります。
5行目の掲載の同意は、写真を見せる範囲を決めます。 検索の結果は社内で使いますが、顧客への提案に写真を載せられるのは、同意のある事例だけです。 同意の無い事例は、金額と経緯の根拠としてだけ使います。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 近い事例 | 事例の索引 | ハイブリッドクエリ(説明文の match + 説明文の埋め込みの knn)、上位10件 |
| 金額の分布 | 事例の索引 | 同じ filter で percentiles(最終の金額と、数量あたりの金額) |
| 追加工事の件数 | 事例の索引 | 同じ filter で terms(追加工事の理由の区分) |
| 見積書と写真 | S3 | 上位の事例の写しへのリンク |
集計と検索は、同じ filter で行います。 上位10件と集計の母数が違うと、「上位の事例はどれも百万円台なのに、分布の中央値はもっと高い」という読みにくい結果になります。 filter には建物の種類・工事の種類・施工の年(直近5年)を入れます。
検索の形は、次のようになります。
POST /reform-cases/_search?search_pipeline=case-hybrid
{
"size": 10,
"_source": ["case_id", "summary", "building_type", "structure", "building_age",
"work_type", "quantity", "cost_by_trade", "final_amount",
"extra_works", "completed_on", "photo_consent"],
"query": {
"hybrid": {
"queries": [
{ "match": { "summary": "在来浴室 タイル ユニットバス 木造 寒い 段差" } },
{ "knn": { "summary_vector": { "vector": [0.0], "k": 30 } } }
],
"filter": {
"bool": {
"filter": [
{ "term": { "building_type": "detached" } },
{ "term": { "work_type": "bath_conventional_to_unit" } },
{ "range": { "building_age": { "gte": 15, "lte": 35 } } },
{ "range": { "completed_on": { "gte": "now-5y" } } }
]
}
}
}
}
}
集計は別の問い合わせで、size を0にして件数と分布だけを取ります。
{
"size": 0,
"query": { "bool": { "filter": [ "(検索と同じ条件)" ] } },
"aggs": {
"amount_pct": { "percentiles": { "field": "final_amount", "percents": [25, 50, 75] } },
"extra_reasons": { "terms": { "field": "extra_works.reason", "size": 10, "missing": "none" } }
}
}
terms 集計の missing を指定すると、項目が空の事例を1つのバケットにまとめて数えられます。 追加工事が無かった事例の件数がそのまま出るので、「28件のうち19件は追加工事なし」と読めます。 指定しないと、追加工事が無い事例は数えられません。
AIへ渡す前に整形する
- 事例の文書へのまとめ … 工事台帳・見積書・写真の説明を、事例番号で1つにします
- 工事の種類の区分へのそろえ … 「浴室改修」「UB交換」「お風呂リフォーム」を
bath_conventional_to_unit(在来から)とbath_unit_to_unit(ユニットからの交換)のように、元の状態で分けた区分にします - 追加工事の理由の取り出し … 写真の説明の文から、Claude API で理由の区分・金額・分かった時点を取り出します
- 金額の確定値の確認 … 最終の金額が無い事例は索引に入れません。見積の金額だけの事例を混ぜると、分布が下にずれます
- 数量あたりの金額 … 外壁の塗装の㎡あたり、床の張り替えの㎡あたりのように、数量で割った金額をプログラムで出して持たせます
- 個人を特定する情報の除去 … 顧客の氏名・住所・電話番号は入れず、地域は市区町村までにします。写真の説明に書かれた表札や近所の情報も取り除きます
- 事例の説明文と埋め込み … 建物の条件・工事の内容・経緯を200字程度の文にし、Titan Text Embeddings V2 で埋め込みを作ります
2番目が、検索の質を決めます。 「ユニットバスの交換」と一言で書かれた事例でも、在来の浴室からの工事は、解体と土台・配管の工事を含み、金額も追加工事の起きやすさも違います。 元の状態で区分を分けないと、条件の違う事例が同じ分布に入ります。
埋め込みのモデルは、日本語の対応を確かめてから選びます。 Titan Text Embeddings V2 は英語に最適化され、日本語を含む多言語に対応するとされています(100を超える言語はプレビュー)。言語をまたぐ問い合わせは結果が劣るとされているので、事例の説明文と問い合わせはどちらも日本語でそろえます。
AIに処理させる
させるのは3つです。問い合わせから検索の条件を取り出すこと、写真の説明から追加工事の理由を取り出すこと、検索と集計の結果から提案の論点を並べることです。
| させること | 中身 |
|---|---|
| 条件の取り出し | 建物の種類・構造・築年数、工事の種類(元の状態を含む)、数量、要望、気にしている点 |
| 追加工事の取り出し | 写真の説明の文から、理由の区分・追加の金額・分かった時点 |
| 論点の整理 | 工事の範囲、製品の選び方、工期、追加工事の可能性について、事例と集計から読み取れること |
| 根拠の付与 | 論点ごとに根拠の事例番号と、集計の数字 |
| 問い合わせとの違い | 要望が、近い事例の工事内容と違う点 |
| させないこと | 理由 |
|---|---|
| 概算の金額を決める | 営業と積算の担当が、現地の状態と今の単価で決める |
| 分布の計算 | 検索基盤の集計で出す |
| 古い事例の金額の補正 | 「今なら1割高い」のような推定を書かせない |
| 建物の劣化の診断 | 現地調査と専門の担当が判断する |
| 根拠の無い事例の引用 | 検索結果に無い事例番号を示さない |
3行目を「させない」に置くのが、この設計で大事なところです。 古い事例の金額を見せると、AIは親切に「物価の上昇を考えると」と補正します。その補正には根拠がありません。 施工の年を必ず添えて見せ、今の単価で積み直すのは積算の担当の仕事にします。
指示内容を固定する
あなたは住宅リフォーム会社の営業部で、提案を作る営業のために、
過去の施工事例から提案の論点と概算の根拠を整理する立場です。
金額を決めないでください。決めるのは営業と積算の担当です。
【やること】
1. 問い合わせの条件と、検索で見つかった過去の事例を読んでください。
2. 次の論点ごとに、過去の事例から読み取れることを書いてください。
工事の範囲/製品の選び方/工期/追加工事の可能性
3. 各論点に、根拠にした事例番号(case_id)を必ず付けてください。
4. 金額の幅を書くときは、渡された集計の値(25・50・75%点)をそのまま使い、
集計に使った件数を添えてください。
5. 追加工事は、渡された理由ごとの件数をそのまま使ってください。
6. 問い合わせの要望が、近い事例の工事内容と違う点を挙げてください。
【厳守事項】
- 金額を自分で計算・補正しないでください。平均を出さないでください。
- 古い事例の金額を、今の金額に直して書かないでください。施工の年を添えてください。
- 検索結果に無い事例番号を示さないでください。
- 建物の劣化や構造について、診断や断定を書かないでください。
「解体後に確認が要る」と書くだけにしてください。
- 問い合わせに書かれていない条件を推測しないでください。「記載なし」としてください。
- 集計の件数が10件未満の論点は、confidence を low にしてください。
【問い合わせの条件】{inquiry}
【検索結果(事例の文書、上位10件)】{cases}
【集計(同じ絞り込みでの金額の分布と追加工事の件数)】{aggregations}
「平均を出さない」を明記しないと、上位10件の金額の平均を書きます。 集計の値を渡していても、手元の事例のほうが具体的なので、そちらで計算したくなります。
「解体後に確認が要る、と書くだけ」を書くのは、診断を防ぐためです。 追加工事の件数を渡すと、AIは「この家も土台が傷んでいる可能性が高い」と書きます。現地を見ていないAIに、その家の状態は分かりません。 書けるのは、似た事例で何件起きたかまでです。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。
{
"inquiry": {
"building_type": "", "structure": "", "building_age": "",
"work_type": "", "quantity": "", "requests": [], "concerns": []
},
"issues": [
{
"topic": "scope | product | duration | extra_work",
"finding": "",
"evidence_cases": [],
"counts_used": "",
"confidence": "high | low",
"differs_from_request": ""
}
],
"amount_basis": {
"p25": "", "p50": "", "p75": "", "sample_size": "", "years": ""
},
"consented_cases": []
}
1つ目の理由は、論点ごとに根拠の事例番号を照らせることです。 evidence_cases の番号が検索結果に含まれているかを、プログラムで確かめます。 含まれていない番号があれば、その論点は表示しません。
2つ目は、amount_basis を集計の値と照らせることです。 AIが写した25・50・75%点と件数が、集計の結果と一致するかをプログラムで確かめます。一致しなければ、集計の値で上書きして表示します。
3つ目は、consented_cases で提案に載せられる事例が分かることです。 掲載の同意がある事例だけを並べ、提案書に写真を載せるときは、この一覧から選びます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 検索画面 | 社内のWeb画面(タブレットでも使う) | 問い合わせの貼り付け、条件の確認、論点と根拠の表示 |
| Claude API | Messages API の構造化出力 | 条件・追加工事の取り出し、論点の整理 |
| Amazon Bedrock | Titan Text Embeddings V2 の呼び出し | 説明文の埋め込み |
| Amazon OpenSearch Service | 検索パイプラインを指定した _search、集計 | 近い事例と分布 |
| 工事台帳 | 毎週の完工の締めのあとに書き出し | 建物の条件・工事の概要・最終の金額 |
| 見積のソフト・写真のフォルダ | 完工の締めで Lambda が読む | 工種別の金額と写真の説明 |
人が確認する
- 条件を確かめる … 検索の前に、取り出された建物の条件と工事の種類を見ます。元の状態(在来かユニットか)が違うと、結果がまるごと外れます
- 根拠の事例を開く … 論点に付いた事例のうち、少なくとも上位の2〜3件は見積書と写真を開いて読みます
- 施工の年を見る … 金額の幅を顧客に伝える前に、事例の年を確かめ、今の単価での積算を担当に頼みます
- 追加工事の伝え方を決める … 件数を顧客にどう伝えるかは、営業が現地の状態を見て決めます
- 提案と概算を記録する … 顧客に伝えた概算の幅と、根拠にした事例番号を残します
2番目を省かないでください。 論点の整理は要約です。同じ在来浴室の交換でも、2階の浴室か、窓の位置を変えたかは、写真を見ないと分かりません。
目標は、180件をならして1件8分です。 条件の確認に2分、根拠を読むのに4分、提案のメモを作るのに2分という見込みです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 近い事例が無い(珍しい工事・建物) | 「近い事例なし」と出し、築年数の幅や工事の種類を広げた結果を別に出す |
| 集計の件数が10件未満 | 分布を出さず、事例ごとの金額と施工の年の一覧を出す。confidence を low に |
| 事例番号が検索結果に無い | その論点を表示しない。ログに残す |
| AIの金額が集計と一致しない | 集計の値で上書きし、ログに残す |
| 工事の種類が取り出せない | 検索に進まず、営業に選んでもらう |
| 最終の金額が台帳に無い事例 | 索引に入れない。完工の締めの漏れとして経理に知らせる |
| 写真の説明に追加工事の記録が無い | 「記録なし」として扱い、「追加工事なし」と区別する |
構造化出力が refusal や max_tokens で終わる | 受け付けずに再実行する |
7行目の区別が、分布の信頼を左右します。 説明を書かない担当の現場が「追加工事なし」に数えられると、起きやすさが実際より低く見えます。 取り込みの段で、説明の無い事例を印で分けます。
記録を残す
- 問い合わせと取り出した条件、営業が直した条件
- 検索の条件(
filter、重み)と、上位の事例番号と点数 - 集計の結果(分布と件数)
- Claude API の出力と、使った指示の版
- 表示しなかった論点と理由
- 顧客に伝えた概算の幅と、最終の見積の金額
最後の行が、次の検索の質を上げます。 概算の幅と最終の見積が残れば、概算がどれくらい外れたかを、工事の種類ごとに見直せます。
04実装レベルの3段階
半自動化で、1件20分が12分程度になります。 探す時間はほぼ消えますが、写真の説明から追加工事を読み取る作業が手作業で残ります。本格構成で8分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化で1か月使うと、区分に入らない工事と、説明の無い現場の多い担当が分かります。そこを直してから自動の取り込みを足します。
05工数削減シミュレーション
導入後 180件 × 8分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 水回り・内装・外装・断熱などの住宅リフォームを年に数百件以上請け負う地域のリフォーム会社や工務店、住宅の管理会社のリフォーム部門で、過去の施工事例が工事台帳・工種別の見積書・写真のフォルダに分かれて残っている場合。営業が問い合わせのたびに「前に似た家でやった工事」を先輩に聞いたり、写真のフォルダを開いたりして提案と概算を作っている場合。AWS を社内で使っているか、使い始められる場合。
- 年間の施工が数十件で、営業が過去の工事をすべて覚えていられる場合。工事台帳に建物の条件(構造・築年数・面積)や工種別の金額が残っておらず、写真だけがある場合(先に台帳の整備が要ります)。概算をAIに決めさせて、そのまま顧客に出したい場合。なお、見積の金額の決定、建物の劣化の診断、構造に関わる工事の可否の判断は、この構成では代替できません。
07最小構成で試す方法
- 過去3年の完工の現場から、件数の多い工事の種類(浴室・キッチン・外壁・床)ごとに20件ずつ選ぶ(追加工事があった現場を必ず含める)
- 1件ずつ、建物の条件・工事の内容・最終の金額・追加工事を1行にまとめた表を作る
- 先月の問い合わせから10件を選ぶ
- 手元のAIサービスに表と問い合わせを渡し、「この問い合わせに近い過去の事例を表から選び、工事の範囲と追加工事の可能性について、根拠の事例番号付きで論点を挙げてください。金額を計算・補正しないでください」と指示する
- 出てきた論点を、そのとき営業が実際に作った提案と、店長が指摘した点と比べる
| 出てきた内容 | 判断 |
|---|---|
| 店長が指摘した点が論点に出た | 索引と集計の仕組みづくりに進む |
| 表の金額の平均を出した | 指示と後段の照合で直る。構成は有効 |
| 工事の書き方がばらばらで比べられない | 工事の種類の区分を先に決める |
3行目が出ることは珍しくありません。 それは失敗ではなく、元の状態で区分を分ける作業が要るということが分かったということです。
試すときは、若手とベテランの両方に論点を見てもらってください。 若手が「これなら先輩に聞かずに済んだ」と言える論点がいくつあるか、ベテランが「これが足りない」と言う論点が何か。後者が、事例の文書に足すべき項目です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが上位の事例の金額の平均を出す | 集計の値を渡し、照合して上書きする |
| 在来とユニットの交換が同じ分布に入る | 工事の種類を元の状態で分ける |
| 検索と集計の母数が違う | 同じ filter で行う |
| 見積の金額だけの事例で分布が下にずれる | 最終の金額のある事例だけを入れる |
| 追加工事の「記録なし」が「なし」に数えられる | 説明の無い事例を印で分ける |
| 古い事例の金額がそのまま伝わる | 施工の年を必ず添え、今の単価で積算し直す |
| 片方の検索にしか出ない事例の点数が半分になる | 正規化の仕様として理解し、重みを調整する |
| 件数が少なく分布が当てにならない | 10件未満は分布を出さず一覧にする |
| 同意の無い写真が提案書に載る | consented_cases からだけ選ぶ |
| 写真の説明に個人の情報が残る | 取り込み時に取り除く |
上の3行が、この構成の失敗のほとんどです。 どれも「金額の幅」をどこで、どの母数で出すかの問題です。数えるのは検索基盤、読むのはAI、決めるのは人、という分担を守ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の住まいの条件と工事の金額、施工前後の写真、追加工事の経緯です。顧客の家の中の写真は、住所と結び付くと強い個人情報になります。
- 索引に顧客を特定する情報を入れない … 氏名・住所・電話番号は入れず、地域は市区町村までにします。写真の説明から表札や近所の情報を取り除きます
- 写真を見せる範囲を同意で分ける … 他の顧客への提案に写真を載せるのは、掲載の同意がある事例だけにします
- 外部の生成AIに渡す範囲を絞る … 渡すのは事例の文書と問い合わせの条件だけです。写真そのものは渡しません
- 概算は人が決めて記録する … 顧客に伝えた幅と根拠の事例番号を残し、後から説明できるようにします
- 見積の作り方は法令に沿う … 建設業法第20条は、工事の種別ごとの材料費・労務費などの内訳と、工程ごとの作業と日数を書いた見積書(材料費等記載見積書)を作るよう努めることを求め、記載する材料費等の額が通常必要と認められる額を著しく下回ってはならないとしています。過去の事例の安い金額を、そのまま今の見積に使わないでください
誤りが起きた場合のリスクは、根拠の無い概算で顧客に期待させることと、顧客の家の情報が他の顧客に見えることの2つです。 前者は集計の照合と人の確認で、後者は同意と取り込みの処理で防ぎます。
10まず何から始めるか
1週目:工事の種類と追加工事の区分を決める
営業と工事の担当で、工事の種類を元の状態で分けた区分と、追加工事の理由の区分を決めます。過去の台帳の書き方を集め、どの区分に当たるかの表を作ります。
2週目:80件で試す
工事の種類ごとに事例を選び、条件と結末を1行にまとめた表を作ります。先月の問い合わせ10件で論点を挙げさせ、店長が当時指摘した点と比べます。
3週目:事例の文書を作る
工事台帳の書き出しと、見積書・写真の説明を事例番号でつなぎます。最終の金額が無い現場と、説明の無い現場を洗い出し、工事の担当と埋めます。
4週目:索引と検索をつなぐ
OpenSearch に事例の索引を作り、ハイブリッド検索と集計を同じ filter で行うところまで作ります。この時点では論点の整理を出さず、近い事例と分布だけを見ます。
2か月目: 論点の整理と、事例番号・集計の照合を足します。3か月目以降: 完工の締めでの自動の取り込みを足し、1件20分が何分になったかを実測します。入社2年目の営業が、先輩に聞く前に近い事例と追加工事の起きやすさを根拠付きで説明できるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ハイブリッドクエリの検索が最大5つで、全体の filter は1つの検索の形で書き複数条件は bool にすること、最上位のクエリとして使うこと | OpenSearch: Hybrid query | 2026-10-14 |
全体の filter が OpenSearch 3.0 で入り、各検索の実行中にかかって条件に合う文書だけが点数を付けられること | OpenSearch: Hybrid search with pre-filtering | 2026-10-14 |
正規化の既定が min_max、合わせ方の既定が arithmetic_mean、重みは合計1.0で指定すること、片方の検索にしか出ない文書の点数が半分になること | OpenSearch: Normalization processor | 2026-10-14 |
percentiles 集計が近似の計算であること、既定で1・5・25・50・75・95・99%点を返し percents で選べること | OpenSearch: Percentiles aggregation | 2026-10-14 |
terms 集計の size の既定が10、missing で項目が空の文書をバケットにまとめられ、既定では数えないこと | OpenSearch: Terms aggregation | 2026-10-14 |
| Amazon OpenSearch Service が OpenSearch 3.5・3.3・3.1 などに対応していること | AWS: What is Amazon OpenSearch Service? | 2026-10-14 |
| Titan Text Embeddings V2 が英語に最適化され、日本語を含む多言語に対応すること(100を超える言語はプレビュー)、言語をまたぐ問い合わせは結果が劣ること | AWS: Amazon Titan Text Embeddings models | 2026-10-14 |
構造化出力を output_config.format で指定すること、refusal・max_tokens で終わるとスキーマに合わないことがあること | Claude: Structured outputs | 2026-10-14 |
| 建設業法第20条(工事の種別ごとの材料費・労務費等の内訳と工程ごとの作業・日数を記載した材料費等記載見積書を作成するよう努めること、材料費等の額が通常必要と認められる額を著しく下回ってはならないこと) | e-Gov 法令API: 建設業法 | 2026-10-14 |
見積の金額、建物の状態の診断、工事の可否は、営業・積算・工事の担当が現地の状態に基づいて判断してください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1439)についてのご相談はこちらから。
