古着のリユース店の本部が、客の「90年代っぽい、ゆったりめ、緑系」のような言い方から全店の在庫を探し、取り置きと店間の移動の候補を返す
客の「90年代っぽい、ゆったりめ、緑系の柄シャツ」のような言い方を、ブランド・アイテム・年代・色・サイズ・雰囲気の条件に読み替え、全店の古着の在庫から近いものを探します。実寸・状態・店舗を在庫の記録のまま並べ、取り置きと店間の移動の候補を返します。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/小売
- 対象部門
- 営業
- 対象業務
- 問い合わせ対応/情報検索
- 主な課題
- 問い合わせが多い/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 対応スピード向上/属人化解消/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店舗のスタッフから問い合わせを受け、ブランド・アイテム・年代・色・サイズ・雰囲気の希望をメモする
- 在庫の管理の仕組みをブランドとアイテムで引き、出なければ表記を変えて引き直す
- 出てきた在庫を1点ずつ開き、写真と説明文で色と雰囲気を、実寸でサイズを確かめる
- 合いそうなものを、店舗と管理番号と価格でまとめて店舗のスタッフに返す
- 客が気に入れば、在庫のある店舗に電話して取り置きを頼むか、店間の移動を頼む
- 見つからなければ「全店にありません」と返す
- 人本部の担当か店舗のスタッフが、客の言い方のメモを画面に貼り、検索のボタンを押す
- 自動生成AIが言い方から、ブランド・アイテム・年代・色・サイズの言い方を書かれたまま取り出し、雰囲気の言葉を検索の文にまとめる
- 自動Lambda が、サイズの言い方を本部の換算の表で実寸の幅にし、色の言い方を色の系統の表で色の群にする
- 自動OpenSearch が、語と実寸の検索と、説明文の雰囲気の近さの検索を hybrid で組み合わせて全店の在庫を引く
- 自動候補ごとに、実寸・色の群・状態のランク・店舗を規則で照らし、取り置きか店間の移動かの候補を付ける
- 自動生成AIが、候補を在庫の記録のまま並べ、外れた条件を書いた一覧を作る
- 人担当者が写真で確かめて客に伝え、取り置き・移動の依頼を在庫のある店舗の店長に回して承認を得る
各工程の詳しい説明を読む
- 店舗のスタッフから問い合わせを受け、ブランド・アイテム・年代・色・サイズ・雰囲気の希望をメモする
- 在庫の管理の仕組みをブランドとアイテムで引き、出なければ表記を変えて引き直す
- 出てきた在庫を1点ずつ開き、写真と説明文で色と雰囲気を、実寸でサイズを確かめる
- 合いそうなものを、店舗と管理番号と価格でまとめて店舗のスタッフに返す
- 客が気に入れば、在庫のある店舗に電話して取り置きを頼むか、店間の移動を頼む
- 見つからなければ「全店にありません」と返す
(a)客の言い方で在庫が引けない。 2番目で、「リーバイス」「Levi's」「LEVIS」のような表記の違いは選択肢で吸収できても、「ゆったりめ」「緑系」「古着っぽい」は在庫の管理の仕組みの検索では引けません。 担当者は該当しそうなアイテムを全部出し、写真で選ぶことになります。
(b)サイズの言い方と実寸が合わない。 3番目で、客の「W32くらい」と、ヴィンテージのジーンズのタグのサイズと実寸は一致しないことがあります。表記サイズで絞ると実寸が合う在庫が外れ、実寸を1点ずつ見ると時間がかかります。
(c)他店の在庫の傾向を知っているのが2名だけ。 1番目から4番目の速さは、担当者によって大きく違います。2名が休みの日は、問い合わせの返事が翌日に回ります。
(d)取り置きと移動のやり取りが電話。 5番目で、在庫のある店舗が接客中だと電話がつながりません。つながるまでのあいだに、その1点が店頭で売れてしまうことがあります。
- 【人】 本部の担当か店舗のスタッフが、客の言い方のメモを画面に貼り、検索のボタンを押す
- 【自動】 生成AIが言い方から、ブランド・アイテム・年代・色・サイズの言い方を書かれたまま取り出し、雰囲気の言葉を検索の文にまとめる
- 【自動】 Lambda が、サイズの言い方を本部の換算の表で実寸の幅にし、色の言い方を色の系統の表で色の群にする
- 【自動】 OpenSearch が、語と実寸の検索と、説明文の雰囲気の近さの検索を hybrid で組み合わせて全店の在庫を引く
- 【自動】 候補ごとに、実寸・色の群・状態のランク・店舗を規則で照らし、取り置きか店間の移動かの候補を付ける
- 【自動】 生成AIが、候補を在庫の記録のまま並べ、外れた条件を書いた一覧を作る
- 【人】 担当者が写真で確かめて客に伝え、取り置き・移動の依頼を在庫のある店舗の店長に回して承認を得る
3番目を表で行うのは、サイズと色の読み替えを誰がしても同じにするためです。 「W32くらい」を実寸のウエストの何cmから何cmと読むか、「緑系」にオリーブとカーキを含めるかは、本部が決める決まりです。 AIに数値を決めさせると、問い合わせごとに幅が変わります。
7番目の承認を店長に回すのは、取り置きと移動がその店の売場を減らすからです。 移動した1点は、移動のあいだどの店頭にも並びません。本部が決めて動かすと、店舗の売上の計画が崩れます。
02今回想定するシステム構成
在庫の管理の仕組み(1点ごとの登録・説明文・実寸・店舗) ▼【トリガー】1時間ごとの取り込み(入荷・売約・移動の反映) AWS Lambda ── ブランドの表記・色の群・実寸の項目をそろえる ▼ Amazon OpenSearch Service │ 取り込みのパイプライン:text_embedding(説明文 → ベクトル) │ └─ ML Commons のコネクタ ──▶ Amazon Bedrock(Titan Text Embeddings V2) │ 在庫の索引:ブランド・アイテム・年代の見立て・色の群・実寸・状態・店舗・説明文・ベクトル ▼【人】担当者が言い方を貼る AWS Lambda ├──▶ Claude(Amazon Bedrock)── 言い方を条件と雰囲気の文に読み替える ├──▶ 換算の表・色の系統の表 ── 実寸の幅・色の群 ├──▶ OpenSearch ── hybrid(語と実寸/雰囲気の近さ)+ normalization の検索のパイプライン ├──▶ 規則で取り置き/店間の移動の候補を付ける ├──▶ Claude(Amazon Bedrock)── 記録のまま候補を並べる ▼ 担当者の画面 ──【人】写真で確かめて回答/店長に取り置き・移動の承認を依頼
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(hybrid、normalization-processor、text_embedding、kuromoji) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed(Amazon Bedrock) |
| 生成AI | Claude(Amazon Bedrock の Converse API、構造化出力) | Azure OpenAI(Microsoft Foundry)、OpenAI API |
| 連携 | AWS Lambda(取り込み、読み替えと検索の呼び出し、販売の状態の照会) | AWS Step Functions |
| 保管 | Amazon S3(取り込みの写し、問い合わせと候補と承認の記録) | 社内のファイルサーバー |
在庫の管理の仕組みには、この構成から書き込みません。 取り置きと移動の登録は、承認した店長がいつもの画面で行います。
説明文のベクトルは、OpenSearch Service から Bedrock の埋め込みのモデルを呼んで作ります。 AWS の公式ページでは、OpenSearch Service の ML のコネクタで SageMaker AI と Bedrock につなげられ、OpenSearch Service に Bedrock を呼ばせるための IAM のロールを作り、_plugins/_ml/connectors/_create でコネクタを作る手順が示されています。意味の検索に使うモデルを登録するときは model_config が要り、無いと「Model config is null」のエラーで索引が作れないとされています。
埋め込みのモデルは、Titan Text Embeddings V2 を想定します。 AWS の公式ページでは、このモデルは最大8,192トークン(5万文字)を受け、既定で1,024次元のベクトルを出し、英語に最適化されたうえで、日本語を含む多言語に対応するとされています(100を超える言語はプレビューとの表記)。古着の説明文は短い日本語なので、まず自社の説明文で近さの順が使えるかを第8章の方法で確かめます。
日本語の説明文を語で引くために、kuromoji を使います。 AWS の公式ページでは、OpenSearch Service のドメインには Japanese(kuromoji)と ICU の解析のプラグインが全ドメインに含まれるとされています。
03どうやって実装するのか
処理の起点を決める
起点は2つあります。1時間ごとの在庫の取り込みと、担当者の検索のボタンです。
在庫の取り込みは、在庫の管理の仕組みから入荷・売約・移動が変わった在庫を書き出し、索引を更新します。古着は1点ものなので、売れた服が候補に出続けると、そのまま「あります」と答えてしまいます。 1時間の間に売れた服に備えて、回答の前に販売の状態だけは在庫の管理の仕組みに照会します。
取り込みのたびに、説明文の変わっていない在庫までベクトルを作り直さないようにします。 OpenSearch の公式のドキュメントでは、text_embedding の処理に skip_existing の設定があり、true にすると、同じ ID の文書の入力の文が変わっておらずベクトルが既にあれば、モデルを呼ばずに既存のベクトルを写すとされています。ドメインの版でこの設定が使えるかを確かめ、使えなければ Lambda の側で説明文の変わった在庫だけを送ります。
検索のボタンは、本部の担当か店舗のスタッフが客の言い方を貼った後に押します。店舗のスタッフが直接使えるようにすれば、本部に回す前に全店を探せます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 問い合わせ | 客の言い方のままのメモ(店舗で聞いたこと、メッセージの本文) | 担当者・スタッフが貼る |
| 在庫 | 管理番号、ブランド、アイテム、年代の見立て、色、表記サイズ、実寸、素材、状態のランク、価格、店舗、説明文、写真のURL、販売の状態 | 在庫の管理の仕組み |
| ブランドの表記の表 | 「Levi's」「リーバイス」「LEVIS」などの表記と、そろえた名前 | 本部で作る表 |
| サイズの換算の表 | アイテムごとの、客の言い方(「W32」「L」「ゆったりめ」)と実寸の幅 | 本部で作る表 |
| 色の系統の表 | 「緑系」に入る色(グリーン、オリーブ、カーキ、モスなど) | 本部で作る表 |
| 店間の移動の決まり | 移動便の曜日、移動する最低の価格、取り置きの日数 | 本部で作る表 |
質を決めるのは、説明文です。 雰囲気の近さで探せるのは、説明文に雰囲気が書かれている服だけです。「Tシャツ 黒 L」としか書かれていない服は、雰囲気の検索では上に来ません。 入荷の登録で、素材の感じ・シルエット・色の出方を一言書く決まりを作ることが、この構成の土台です。
客の名前と連絡先は、生成AIに渡しません。 取り置きのための連絡先は、店舗の顧客の台帳で持ちます。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| ブランド・アイテム・語で合う服 | 在庫の索引 | hybrid の1つ目:bool(brand の term、description の match) |
| 雰囲気の近い服 | 在庫の索引 | hybrid の2つ目:neural(description_vector に雰囲気の文を渡す) |
| 実寸の幅・色の群・売れていないもの | 在庫の索引 | hybrid の filter(range と terms を bool にまとめる) |
| 2つの点数をまとめる | 検索のパイプライン | normalization-processor(min_max と arithmetic_mean、重みを付ける) |
2つの探し方は、hybrid の問い合わせでまとめます。 OpenSearch の公式のドキュメントでは、hybrid の問い合わせは複数の問い合わせの点数を1つにまとめるもので、句は最大5つ、文書はどれか1つの句に合えば結果に入り、点数は検索のパイプラインでまとめられます。filter はすべての句にかかり、1つの問い合わせの形で渡す必要があるので、複数の条件は bool にまとめます。
点数のまとめ方は、normalization の処理で決めます。 公式のドキュメントでは、語の検索とベクトルの検索は点数の尺度が違うため、normalization-processor が句ごとに点数をそろえてからまとめます。min_max は句ごとに0〜1にそろえ、arithmetic_mean は weights で句ごとの重みを付けられます。注意が要るのは、片方の句にしか出てこなかった服は、もう片方の点数が0として平均に入り、点数が半分になることです。
PUT /_search/pipeline/clothing-hybrid
{ "phase_results_processors": [ { "normalization-processor": {
"normalization": { "technique": "min_max" },
"combination": { "technique": "arithmetic_mean",
"parameters": { "weights": [0.4, 0.6] } } } } ] }
GET /stock/_search?search_pipeline=clothing-hybrid
{ "query": { "hybrid": {
"filter": { "bool": { "filter": [
{ "term": { "stage": "available" } },
{ "term": { "item": "open_collar_shirt" } },
{ "terms": { "color_group": ["green"] } },
{ "range": { "chest_cm": { "gte": 58, "lte": 66 } } } ] } },
"queries": [
{ "bool": { "should": [
{ "match": { "description": "70s 柄 レーヨン" } } ] } },
{ "neural": { "description_vector": {
"query_text": "70年代風の総柄で、ゆったりした落ち感のある開襟シャツ",
"model_id": "{model_id}", "k": 50 } } } ] } } }
重みは、雰囲気の句を少し重くしています。 雰囲気の言葉で探すことがこの業務の目的だからです。ただし、重みは最初から決め打ちせず、第8章の30件で語の句だけ・雰囲気の句だけ・両方の順位を比べてから決めます。
AIへ渡す前に整形する
- ブランドの表記をそろえる … ブランドの表記の表で、在庫の登録のブランドをそろえた名前にします
- 色を色の群にする … 在庫の色を色の系統の表で群(
green、blueなど)にし、1点に複数の群を持たせてよいことにします - 実寸を数値の項目にする … 着丈・身幅・肩幅・袖丈、ウエスト・股下・わたりを、それぞれ数値の項目にします。測っていない項目は入れません
- 説明文のベクトルを作る … 取り込みのパイプラインの
text_embeddingで、説明文からdescription_vectorを作ります - 問い合わせから個人の情報を外す … 客の名前・電話番号・メッセージのアカウント名は、Claude に渡す前に伏せます
3番目で、測っていない実寸に0や表記サイズからの推定値を入れないでください。 入れると、range の絞り込みで外れるか、合わない服が残ります。実寸の無い服は絞り込みで外れるので、件数が少ないときだけ実寸の条件を外した検索をもう一度行い、「実寸の記録なし」と印を付けて出します。
AIに処理させる
AIの仕事は2つです。 客の言い方を条件と雰囲気の文に読み替えることと、規則で照らした候補を在庫の記録のまま並べることです。
| させること | させないこと |
|---|---|
| ブランド・アイテム・年代・色・サイズの言い方を書かれたまま取り出す | サイズの言い方を実寸の数値にすること |
| 雰囲気の言葉を、説明文に近い書き方の検索の文にまとめる | 書かれていない希望を足すこと |
| 候補を在庫の記録のまま並べ、外れた条件を書く | 年代を「90年代のものです」と言い切ること |
| 年代は「スタッフの見立て」と書く | 本物かどうか、価値があるかに触れること |
| 取り置き・移動の候補を、規則の結果のまま書く | 移動させるかどうかを決めること |
「年代を言い切らない」「本物かどうかに触れない」が、この構成でいちばん大事な線です。 年代の見立ては、タグの形や縫製から店のスタッフが判断したもので、客に「90年代の本物です」と伝われば、それは店の保証になります。 AIの下書きがその言い方をすれば、確かめた人がいないまま店の約束が生まれます。
指示内容を固定する
1回目(言い方の読み替え)の指示です。
あなたは古着のリユース店の本部で、客からの在庫の問い合わせを整理する立場です。
【問い合わせ】から、在庫を探すための条件を取り出してください。
【取り出すもの】
- brand / item / era_words(年代の言い方。書かれたまま)
- color_words: 色の言い方。書かれたまま(「緑系」「くすんだ青」など)
- size_words: サイズの言い方。書かれたまま(「W32くらい」「ゆったりめ」など)
- mood_query: 雰囲気の言葉を、古着の説明文に近い書き方の1文にまとめたもの
- must: 客が「絶対」「でないとだめ」と言った条件の名前
【厳守事項】
- サイズの言い方を cm やインチの数値に直さないでください。書かれたまま写してください。
- 色の言い方を特定の色の名前に決めないでください。
- 問い合わせに書かれていない希望(ブランド・価格・年代)を足さないでください。
- mood_query には、問い合わせに無い年代やブランドを入れないでください。
- 客の年齢・性別・好みの理由を推し量って書かないでください。
【問い合わせ】{inquiry_text}
2回目(候補の並べ方)の指示です。
あなたは古着のリユース店の本部で、全店の在庫の候補を担当者に示す立場です。
【候補】は在庫の記録と、条件との照らし合わせと、取り置き・移動の候補です。
【書き方】
- 候補ごとに、管理番号・店舗・ブランド・アイテム・色・表記サイズ・実寸・状態のランク・価格を、
在庫の記録のまま書いてください。
- 年代は「スタッフの見立て:70s」のように書いてください。
- 外れた条件(色の群が違う、実寸が幅の外、実寸の記録なし)をはっきり書いてください。
- 取り置き・移動の候補は、規則の結果のまま書いてください。
【厳守事項】
- 「90年代のものです」「本物です」「ヴィンテージとして価値があります」と書かないでください。
- 在庫の記録に無い実寸・状態・素材を書かないでください。
- 状態を「きれい」「美品」などと評価しないでください。
- 移動の日数や取り置きの期限を、規則の結果に無いのに約束しないでください。
【問い合わせの条件】{conditions}
【候補】{candidates}
「サイズの言い方を数値に直さない」を明記しないと、AIは「W32」をウエスト81cmと書きます。 ヴィンテージのジーンズはタグと実寸が違うことが多く、その換算は本部の表で決めるべきものです。AIが決めた数値で絞ると、表で決めた幅と食い違い、同じ問い合わせで結果が変わります。
出力形式を固定する
Bedrock の Converse API の outputConfig.textFormat に JSON スキーマを渡し、2回目は次の形で受け取ります。
{
"inquiry_no": "",
"candidates": [
{ "stock_no": "",
"store": "",
"listed": { "brand": "", "item": "", "color": "", "tag_size": "",
"measurements": "", "grade": "", "price": "" },
"era_by_staff": "",
"unmatched": ["color_group | measurement_out | measurement_missing"],
"action": "hold_at_store | transfer_to_store | visit_suggested" }
],
"summary_for_staff": ""
}
AWS の公式ページでは、outputConfig.textFormat に JSON スキーマを渡すと応答がスキーマに沿い、enum が使えます。すべての object に additionalProperties: false が要り、数値の minimum・maximum には対応していません。unmatched と action は Lambda の規則の結果をそのまま渡して写させ、AIには決めさせません。
action | 規則 |
|---|---|
hold_at_store | 客の行く店舗に在庫がある。取り置きの日数は店間の移動の決まりの表のとおり |
transfer_to_store | 別の店舗にあり、価格が移動する最低の価格以上で、次の移動便に間に合う |
visit_suggested | 別の店舗にあり、上の条件に合わない。客にその店舗への来店を案内する |
1つ目の理由は、listed を在庫の記録と照合できることです。 listed の値が記録と同じかを Lambda で確かめ、違えば一覧を出さずに作り直します。 記録に無い実寸を書いた一覧は、ここで止まります。
2つ目は、action で店長に回す依頼の形が決まることです。 取り置きと移動の依頼を、店舗・管理番号・理由の決まった形で店長に送れます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 在庫の管理の仕組み | 変わった在庫の書き出し(1時間ごと)、販売の状態の照会(読み取りのみ) | 在庫の索引の元、売約の確かめ |
| Amazon OpenSearch Service | Lambda からの登録・検索、取り込みと検索のパイプライン | 在庫の索引、ベクトル、hybrid の検索 |
| Amazon Bedrock(Titan Text Embeddings V2) | OpenSearch の ML のコネクタ | 説明文と雰囲気の文のベクトル |
| Amazon Bedrock(Claude) | Converse API | 読み替えと候補の並べ方 |
| 担当者の画面 | 社内の画面 | 言い方の貼り付け、候補と写真、店長への依頼 |
検索のときの雰囲気の文のベクトルも、OpenSearch が同じモデルで作ります。 neural の問い合わせに model_id を渡すと、渡した文からベクトルを作って近い文書を探します。索引のときと検索のときで同じモデルを使うことが前提で、モデルを替えたら全在庫のベクトルを作り直します。
人が確認する
- 読み替えを見る … サイズと色の言い方が書かれたまま取り出され、表で正しく幅と群になっているかを確かめます
- 写真で確かめる … 候補の写真を開き、色の出方と雰囲気が客の言い方に合うかを見ます
- 客に伝える … 年代は見立てとして伝え、本物かどうかの質問には店舗のスタッフが答えます
- 店長の承認を得る … 取り置きと移動は、在庫のある店舗の店長に依頼し、承認を得てから客に約束します
- 実寸の記録なしの候補は、店舗に測ってもらう … 客に勧める前に実寸を確かめます
4番目を省かないでください。 店長が知らないうちに店頭の1点が取り置かれると、その店で同じ服を見ていた別の客に売れなくなります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 候補が0件 | 実寸の条件を外し、次に色の群を外して引き直し、外した条件を書いて示す |
| 候補が多すぎる(20件を超える) | 上位10件を出し、店舗ごとの件数を添える |
| 実寸の記録が無い在庫 | 実寸の条件を外した検索でだけ出し、「実寸の記録なし」と印を付ける |
| 説明文が短く雰囲気の句に出ない | 語の句だけで出る。説明文の書き足しの候補として記録する |
| 候補が売約済み・取置き中 | 回答の前の照会で売約済みは外し、取置き中は印を付けて残す |
| 埋め込みのモデルが応答しない | 語の句だけで検索し、「雰囲気の検索なし」と画面に出す |
| 構造化出力が返らない | 候補の一覧と取り置き・移動の候補だけを出し、並べ方は担当者が読む |
4行目の記録が、入荷の登録の決まりを直す材料になります。 雰囲気の句に出てこない服が多い店舗は、説明文の書き方が短いということです。
記録を残す
- 問い合わせごとの、言い方(個人の情報を伏せたもの)、1回目の JSON、表で読み替えた実寸の幅と色の群
- 検索の条件、hybrid の重み、候補と規則の結果、2回目の JSON と照合の結果
- 担当者が写真で外した候補と理由
- 取り置き・移動の依頼と、店長の承認の結果、客の購入の有無
担当者が写真で外した候補は、重みと説明文を見直す材料にします。 雰囲気の句で上に来たのに外された服が多いなら、重みが雰囲気の句に寄りすぎているか、説明文が実物と違っています。
04実装レベルの3段階
半自動化で、1件18分が11分程度になります。 引き直しと実寸の見比べは減りますが、雰囲気に合うかを写真で1点ずつ見る作業が残ります。本格構成で7分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化を1か月使うと、どの言い方で見つからなかったかが記録に残ります。サイズの換算の表と色の系統の表をそこで固めてから雰囲気の検索を足すほうが、どちらの句が効いたのかを見分けられます。
05工数削減シミュレーション
導入後 300件 × 7分 ÷ 60 = 35 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 古着を十数店舗で販売し、1点ものの在庫を全店で数万点以上持っているリユース店のチェーン。入荷のときに店舗のスタッフがブランド・年代・実寸・状態・説明文を登録しているのに、客の言い方(年代の雰囲気、ゆったりめ、色の系統)では在庫の検索に当たらず、他店の在庫を探すのが本部の詳しい担当の記憶と電話に頼っている場合。取り置きや店間の移動の依頼を、電話とメッセージで店舗とやり取りしている場合。AWS を使える担当か委託先がいる場合。
- 1店舗だけで、スタッフが店の在庫を把握している場合。在庫の登録がブランドと価格だけで、実寸や説明文が無い場合(先に入荷の登録の決まりを作ります)。新品の衣料品を扱い、品番と色・サイズのコードで在庫を引ける場合。なお、その服が何年代のものか、本物か、状態の評価、価格の決定は、この構成では代替できません。在庫の記録から客の言い方に近い服を探し、記録のまま並べるまでです。
07最小構成で試す方法
- 先月の問い合わせから30件を選ぶ(見つかったもの、見つからなかったものを混ぜる)
- それぞれについて、実際に客に勧めた服の管理番号を書き出す
- 在庫を表計算に書き出し、実寸と説明文の列があることを確かめる
- 30件の言い方を手元のAIサービスに貼り、「ブランド・アイテム・年代・色・サイズの言い方を書かれたまま取り出し、雰囲気の言葉を説明文に近い1文にまとめてください。サイズを数値に直さないでください」と指示する
- 取り出した条件で表計算を引き、実際に勧めた服が見つかるかを見る
- 見つからなかったものについて、説明文に雰囲気の言葉が書かれていたかを見る
6番目が、雰囲気の検索を入れる価値があるかの判断になります。 雰囲気は書かれていたのに語が違って引けなかった服が多ければ、ベクトルの検索が効きます。
| 出てきた内容 | 判断 |
|---|---|
| 勧めた服の多くが見つかり、語の違いで引けなかった服がある | OpenSearch の hybrid の索引に進む |
| サイズを数値に直した・色を決めた | 指示の書き方で直る。構成は有効 |
| 説明文が短く、雰囲気の言葉がほとんど無い | 入荷の登録の決まりが先 |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 片方の句にしか出ない服の点数が半分になる | arithmetic_mean の性質として知っておき、重みを30件で決める |
| 雰囲気の句で実寸の合わない服が上に来る | 実寸と色の群は hybrid の filter で絞る |
| 実寸の無い服が絞り込みで消える | 件数が少ないときだけ実寸の条件を外して引き直し、印を付ける |
| 取り込みのたびに全在庫のベクトルを作り直す | skip_existing か、説明文の変わった在庫だけを送る |
| モデルの登録で索引が作れない | 登録に model_config を入れる |
| AIがサイズを数値に直す | 指示で禁じ、換算は本部の表で行う |
| AIが年代を言い切る・本物と書く | 指示で禁じ、「スタッフの見立て」と書かせる |
上の3行は、検索の側の失敗のほとんどです。 雰囲気は並べ方に使い、外せない条件は絞り込みで守ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 客の問い合わせ(好み、サイズ、ときに名前や連絡先)、全店の在庫の記録です。体のサイズは、客にとって人に知られたくない情報のことがあります。
- 問い合わせから個人の情報を外す … 客の名前・電話番号・メッセージのアカウント名は、Claude に渡す前に伏せます
- 客のサイズを索引に残さない … 問い合わせのサイズは検索の条件として使うだけで、客ごとの記録として OpenSearch に入れません
- 年代と真贋を保証しない … 一覧の年代は見立てとして書き、本物かどうかの質問には店舗のスタッフが答えます
- 状態と価格はAIに評価させない … 状態のランクと価格は在庫の記録のままです
- 取り置きと移動は店長が承認する … 本部や AI が店舗の在庫を動かしません
- 索引への接続を限る … OpenSearch のドメインには、Lambda と本部・店舗の担当だけが接続できるようにします
誤りが起きた場合のリスクは、在庫があるのに「全店にありません」と答えること、年代や本物かどうかを保証したように伝わること、客の好みやサイズが外へ出ることの3つです。 語と雰囲気を組み合わせた検索、見立てとしての書き方、個人の情報を伏せることの3つで防ぎます。
10まず何から始めるか
1週目:在庫の登録を見る
全在庫を書き出し、説明文の長さ、実寸の埋まり方、色の書き方のばらつきを見ます。説明文の短い店舗と、実寸の空の多いアイテムを洗い出します。
2週目:30件で試す
第8章のとおり、先月の問い合わせ30件で、勧めた服が見つかるか、語の違いで引けなかった服がどれだけあるかを見ます。サイズを数値に直していないかを最優先で見ます。
3週目:表を作る
サイズの換算の表、色の系統の表、店間の移動の決まりの表を作ります。入荷の登録で説明文に一言を書く決まりを、店舗と決めます。
4週目:索引を作る
OpenSearch に在庫の索引を作り、ブランドの表記と実寸の幅、色の群で全店を引けるようにします。この時点では、雰囲気の検索と読み替えは使いません。
2か月目: ML のコネクタと説明文のベクトル、hybrid の検索を足し、30件で重みを決めます。3か月目以降: 読み替え、取り置き・移動の候補と店長への依頼を足し、「全店にありません」と答えた件数、写真で外した候補、取り置きからの購入の件数を毎月数えます。詳しい2名がいない日の回答の件数が、いる日と同じくらいになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| OpenSearch Service のドメインに Japanese(kuromoji)と ICU の解析のプラグインが全ドメインに含まれること | AWS: Plugins by engine version in Amazon OpenSearch Service | 2026-10-26 |
OpenSearch Service の ML のコネクタで SageMaker AI と Bedrock につなげられること。IAM のロールと _plugins/_ml/connectors/_create。意味の検索に使うモデルの登録に model_config が要ること | AWS: Amazon OpenSearch Service ML connectors for AWS services | 2026-10-26 |
| Titan Text Embeddings V2 が最大8,192トークン(5万文字)を受け、既定で1,024次元を出すこと。英語に最適化され、日本語を含む多言語に対応すること(100超の言語はプレビュー) | AWS: Amazon Titan Text Embeddings models | 2026-10-26 |
hybrid の問い合わせが複数の問い合わせの点数をまとめること。句が最大5つで、どれか1つに合えば結果に入ること。filter が全句にかかり、1つの問い合わせの形で渡すこと | OpenSearch: Hybrid query | 2026-10-26 |
normalization-processor が句ごとに点数をそろえてまとめること。min_max、arithmetic_mean と weights。片方の句にしか出ない文書の点数が半分になること | OpenSearch: Normalization processor | 2026-10-26 |
text_embedding の処理が文の項目からベクトルを作ること。field_map。skip_existing で入力が変わらない文書のモデルの呼び出しを省けること | OpenSearch: Text embedding processor | 2026-10-26 |
Converse API の outputConfig.textFormat で JSON スキーマに沿った出力が得られ、enum が使えること。additionalProperties: false が要ること。数値の minimum・maximum に対応しないこと | AWS: Structured outputs(Amazon Bedrock) | 2026-10-26 |
その服の年代、本物かどうか、状態の評価、価格は、店舗のスタッフが服を見て判断してください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1853)についてのご相談はこちらから。
