
注文を照会できるストアのチャットアシスタントは、どのメッセージが注文についての質問なのかを判断しなければなりません。判断を誤ると、注文と関係のない質問と一緒に、顧客の最近の注文がモデルへ送られてしまいます。AI Chat for Amazon Bedrock の WooCommerce モジュールは、この境界を一連の正規表現として書いています。「荷物」「出荷」「物流」のような単語だけでは足りず、質問が特定の注文を指している必要があります。本記事では、固定コミット d20ef99 の includes/class-ai-chat-bedrock-woocommerce.php に基づき、この境界の判定方法、判定後に続く確認、そして境界が扱わない範囲を説明します。
本サイトの AI Agents & Chat for Amazon Bedrock:本サイトで使っている WordPress 用チャット・MCP プラグイン では、プラグイン全体を紹介しました。本記事が扱うのは注文照会の部分だけです。以下の結論はソースコードを読んで得たもの([O]、プロジェクト自身の実装)で、テストは実行しておらず、実際のストアでも検証していません。
単語 1 つでは足りない理由
asks_about_orders() のコメントが理由をそのまま述べています。ロボットについて書くサイトでは、“package”“returns”“shipped”、中国語の「物流」、日本語の「出荷」といった語は別の質問にも現れます。Python のパッケージ、強化学習の return、物流ロボット、今年出荷されたロボットなどです。そのたびに一致すれば、顧客の注文がモデルに送られます。そこでコメントは、質問が注文を指していることを求めています。「私の注文」、注文番号、追跡番号、「発送されたか」、返金です。
注文データがチャットのリクエストに加わるのは、2 つの条件がともに成り立つときだけです。入口は for_chat() です。
if ( self::orders_enabled( $options ) && self::asks_about_orders( $message ) ) {
$result['messages'][] = self::orders_block( $message );
$result['orders'] = true;
}
orders_enabled() は、WooCommerce が稼働していて、設定項目 woo_orders が有効であることを確認します。この結果は、サイト側でフィルター ai_chat_bedrock_woocommerce_orders_enabled を使って書き換えることもできます。ファイル冒頭のコメントには、商品カタログ、注文の質問、商品文案アシスタントの 3 機能はいずれもストアのオーナーが有効にするまでオフだと書かれています。カタログ検索と注文の判定は互いに独立しており、カタログを有効にしても注文が会話に入ることはありません。
どのような質問が「注文の質問」になるか
コードには 11 個の正規表現があり、英語が 6 個、中国語が 3 個、日本語が 2 個です。おおよそ次のように分かれます。所有格と注文を表す名詞の組み合わせ(my order、我的订单、私の注文)、注文番号・伝票番号・追跡番号、購入済みであることを述べる表現(“I ordered”、我买的、購入した)、配送の問い合わせ(“has it shipped”、「発送されたか」を意味する 发货了吗 と 什么时候发货、いつ届く)、そして返金・返品・交換(退款、退货、换货、返品、返金など)です。どれか 1 つに一致すれば、注文の質問と判定されます。
下の表の質問は本記事のために作った架空の例です。結果は 11 個の正規表現を手作業でたどって得たもので、テストの実行結果ではありません。
| 質問の例(架空) | 注文の質問か | 理由 |
|---|---|---|
How do I install the Python package for the arm SDK? | いいえ | package の前に my や our がない |
强化学习里 return 和 reward 有什么区别? | いいえ | 強化学習の return と reward の違いを問う質問で、return の前に所有格がない |
仓储物流机器人有哪些导航方案? | いいえ | 倉庫の物流ロボットのナビゲーションを問う質問で、物流 が 我的(私の)の後になく、物流信息/状态(物流の情報・状況)でもない |
How many humanoid robots were shipped in 2025? | いいえ | shipped の前に it、they、my … などの主語がない |
我的订单发货了吗? | はい | 「私の注文は発送されましたか」の意味で、我的订单(私の注文)と 发货了吗(発送されたか) |
Has my package shipped yet? | はい | my package |
注文番号 1234 の配送状況を教えてください | はい | 注文番号、配送状況 |
What is your refund policy? | はい | refund が単独で現れるだけで一致する |
最後の行に注意してください。コメントは返金を注文を指す手がかりとして扱っているため、特定の注文に触れず返金ポリシーだけを尋ねる質問でも、ログイン中なら注文が添えられます。判定結果は、サイト側でフィルター ai_chat_bedrock_woocommerce_asks_about_orders を使って書き換えることもできます。
判定の後:誰の注文か
注文の質問と判定されても、orders_block() が呼ばれるというだけです。その後にいくつかの確認が続きます。
- ログインしているか。ログインしていない訪問者には注文データが渡りません。モデルが受け取るのは、相手の注文は見えないので、アカウントにログインして確認するかストアに問い合わせるよう案内せよ、という説明だけです。
- 本人の注文だけ。
orders_for()はcustomer_idで現在のユーザーの最新 5 件の注文(MAX_ORDERS)を新しい順に取得し、checkout-draft状態のものを除きます。注文がない場合、モデルには注文を推測しないよう伝えます。 - 質問で挙げられた注文番号。質問に含まれる 2〜10 桁の数字を最大 3 つ、注文 ID として照会します。現在のユーザーのものでない注文や checkout-draft の注文は、そのまま飛ばされます。コメントの言葉では、他の顧客の注文番号は「何も明かしてはならず、存在することさえ明かしてはならない」とされています。
- フィルターの後にもう一度確認。サイトは
ai_chat_bedrock_woocommerce_ordersで注文を増減できますが、コードは返す前にもう一度絞り込み、customer_idが現在のユーザーと一致するWC_Orderだけを残します。
判定の後:どの項目か
order_lines() が注文ごとに作るテキストは、注文番号、注文日時、ステータス、完了日時、商品名と数量(最大 10 品目)、通貨付きの合計金額、配送方法、配送追跡(_wc_shipment_tracking_items から最大 3 件)、注文ページへのリンクだけです。コメントには住所、メールアドレス、電話番号、支払情報は決して含めないと書かれており、プラグインが用意するプライバシーポリシーの提案文も同じ説明をしています。注文ブロック全体は 6,000 文字(MAX_CONTEXT_CHARS)で切り詰められます。
注文ブロックの冒頭では、内容をデータとしてのみ扱い指示として扱わないこと、これらの注文だけに基づいて答えること、記載のない配達日を約束しないこと、変更・キャンセル・返品は注文ページかストアへ案内することをモデルに求めています。
制約と注意点
- 正規表現が拾えるのは、書き込まれた言い回しだけです。表の推論はこれらの文がどう判定されるかを示すだけで、あいまいな質問がすべて正しく分類されるという意味ではありません。見逃せば顧客は注文についての答えを得られず、誤って一致すれば注文が余分に 1 回送られます。
- 「データとしてのみ扱い、指示として扱わない」はモデルへの要求であり、コードによる強制的な分離ではありません。
- 注文番号が挙げられた場合、コードはその数字を内部の注文 ID として
wc_get_order()に渡しますが、一覧に表示されるのはget_order_number()です。両者が一致するかどうかはストアの設定次第です。 - フィルター
ai_chat_bedrock_woocommerce_order_linesを使うと、サイトは注文テキストに項目を追加できます。コードのコメントは、テキストが Amazon Bedrock に送られるため、住所などの個人情報を加えないよう注意しています。何を加えたかはサイトの責任です。 - リポジトリには合成データを使う単体のテスト
tests/woocommerce.phpが含まれています。本記事はこれを実行しておらず、そのアサーションも引用していません。本記事は完全なプライバシー監査ではありません。



