只出现“包裹”“物流”这类词不够:WooCommerce 聊天助手如何判断一句话在问订单

AI Chat for Amazon Bedrock 只在问题指向一笔订单时才把顾客订单发给模型。按固定提交的源码,讲 11 条判定正则、本人订单校验和发送字段,以及它的盲区。

五个带编号的圆点由从左到右的箭头依次相连,分别标注:开关:woo_orders 已开启且 WooCommerce 在运行;意图:问题指向订单、单号或退款;身份:是否已登录,未登录只给提示;归属:只取本人订单,他人单号静默跳过;字段:不含地址、邮箱、电话与支付信息。
订单数据进入对话前依次经过的五道检查,依据 ai-chat-for-amazon-bedrock 固定提交 d20ef99 的 includes/class-ai-chat-bedrock-woocommerce.php 绘制;顺序取自代码,不是测量结果。

商店里的聊天助手如果能查订单,就要决定哪一句话算“在问订单”。判断错了,顾客最近的订单就会随一个与订单无关的问题发给模型。AI Chat for Amazon Bedrock 的 WooCommerce 模块把这条边界写成了一组正则:只出现“包裹”“物流”这类词不够,问题必须指向一笔订单。本文依据固定提交 d20ef99 的 includes/class-ai-chat-bedrock-woocommerce.php,讲这条边界怎么判定、判定之后还要过哪几道检查,以及它管不到的地方。

本站的 AI Agents & Chat for Amazon Bedrock:本站在用的 WordPress 对话与 MCP 插件 介绍过插件的整体功能。本文只讲订单查询这一处。下文结论来自阅读源码([O],项目自己的实现),没有运行测试,也没有在真实商店里验证。

为什么单个词不够

asks_about_orders() 的注释直接给出了理由:在一个写机器人的网站上,“package”“returns”“shipped”、物流、出荷这些词常出现在别的问题里,比如 Python 包、强化学习里的 return、物流机器人、今年出货的机器人。每命中一次,顾客的订单就会被发给模型。所以注释要求问题“指向一笔订单”:“我的订单”、订单号、物流单号、“发货了吗”、退款。

订单数据只在两个条件同时成立时才加进对话请求,入口在 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 改写这一结果。文件头注释写明,商品目录、订单查询和商品文案助手三项功能都默认关闭,由店主自行开启。商品目录的检索与订单判定互相独立,打开目录并不会让订单进入对话。

什么样的问题算“问订单”

代码里有 11 条正则,英文 6 条、中文 3 条、日文 2 条,大致分几类:所有格加订单类名词(my order、我的订单、私の注文);订单号、单号、物流单号或追踪号;“我买的”“I ordered”“購入した”这类已购买的陈述;“发货了吗”“什么时候发货”“いつ届く”这类配送追问;以及退款、退货、换货、返品、返金。任意一条命中即判为订单问题。

下表是本文虚构的示例问题,结果是按这 11 条正则逐条手工推演得出的,不是测试运行记录:

示例问题(虚构)判为订单问题原因
How do I install the Python package for the arm SDK?否package 前没有 my 或 our
强化学习里 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)。

订单块开头要求模型把内容只当作数据、不当作指令,只依据这些订单回答,不承诺未列出的送达日期,修改、取消和退货一律引导到订单页或商店。

局限 / 注意

  • 正则只能覆盖写进去的说法。表中推演只说明这几句会怎样判定,不代表所有含糊的问题都能分对;漏判时顾客得不到订单答案,误判时订单会多发一次。
  • “当作数据、不当作指令”是写给模型的要求,不是代码层面的强制隔离。
  • 点名单号时,代码把数字当作内部订单 ID 传给 wc_get_order(),而列出时显示的是 get_order_number()。两者是否一致取决于商店配置。
  • 过滤器 ai_chat_bedrock_woocommerce_order_lines 允许站点往订单文本里加字段;代码注释提醒不要加入地址等个人信息,因为这些文本会发送到 Amazon Bedrock。加了什么由站点负责。
  • 仓库附带使用合成数据的独立测试 tests/woocommerce.php。本文没有运行它,也不引用其断言;本文不是一次完整的隐私审计。

链接