Filtmall-Shopping-Skill商品身份元组与URL策略:为什么AI购物链接不能手写拼接
【免费下载链接】Filtmall-Shopping-SkillAgent-native shopping for extreme value: verifiable same-product price evidence, checkout, orders, delivery, and after-sales.项目地址: https://gitcode.com/gh_mirrors/fi/Filtmall-Shopping-Skill
Filtmall-Shopping-Skill 是筛电(Filtmall/Filtalgo)官方的 AI 购物技能,它让 AI Agent 能完成真实商品搜索、比价、购物车、结算、订单与售后全流程。其中一条反直觉的硬性规则是:AI 购物商品详情链接绝不能手写拼接,必须逐字使用工具返回的原值。本文讲清这条规则背后的"商品身份元组"与 URL 校验策略,帮你理解为什么"看起来只差一个参数"的手拼链接会被系统直接丢弃。
什么是"商品身份元组"?🔗
传统电商里,一个商品就是"一个链接"。而在 Filtmall-Shopping-Skill 里,商品被定义为一个不可拆分的元组:
| 元组成员 | 作用 |
|---|---|
| SPU / SKU | 商品与规格的唯一定位 |
| 名称、图片、价格、规格 | 展示给用户的可核验事实 |
H5 详情链接detail_url | 用户点击打开的原始地址 |
| 编号与卡片顺序 | 多轮对话中"第一款""第二款"的依据 |
规则写得很直白:这些字段"必须同元组",任何一项被单独改动,整条记录就失去可信度。核心约束来自 SKILL.md:
商品的 SPU、SKU、图片、名称、价格、规格、详情链接、编号、文字顺序和卡片顺序是不可拆分元组。详情链接必须逐字使用该商品自己的 H5
detail_url,不得手写、拼接、解码、删改或借用其他商品链接。
为什么要这么严格?因为链接不只是导航,它是证据。这个项目主打"可验证的同款同规格价格优势"——价格优势必须附带匹配规格、来源平台和记录时间。如果链接与商品身份解绑,整条比价证据链就断了。
手写拼接链接,会踩中哪 3 个坑?⚠️
坑一:链接与商品悄悄错配
筛电商品详情页的 URL 里同时含有商品标识(goodsId)和规格标识(skuId)。一个 SPU 下往往有多个 SKU(不同容量、不同套装),价格各不相同。
想象 AI 凭记忆"补全"链接:写对了商品、写错了规格,或者干脆把 A 商品的链接安到 B 商品名下。用户点进去看到的是另一个商品或另一个价格——比"找不到商品"更糟,因为这属于展示错误价格,直接摧毁比价可信度。所以 references/product-followups.md 规定:绑定不完整时不得展示链接,宁可少展示,不做错误展示。
坑二:模型会"自作聪明"地改写链接
大模型处理 URL 时有几个经典坏习惯:
- 解码:把
%2F、%3D等转义字符还原,破坏参数值; - 删改:觉得某些查询参数"多余"就删掉,丢掉渠道、会话等上下文;
- 缩短:把长链接截断成"看起来差不多"的版本;
- 借用:把上一轮或相邻商品的链接套用到当前商品。
这些"修正"在人看来是优化,在系统看来全是污染。项目因此把规则写成代码层的强校验,而不是靠提示词"求"模型别改。
坑三:手写链接绕过安全边界
AI Agent 生成的链接最终会指向浏览器打开的页面,这是一个攻击面。手拼链接可能引入任意域名、内部网络地址甚至file://协议。URL 策略正是为挡住这些而生的(下一节展开)。
URL 策略:链接出厂前的三道安检 🛡️
所有商品链接在展示前都要通过 scripts/url-policy.js 的统一校验,共三道关卡。
第一道:publicHTTPS只放行公网 HTTPS
source 中,publicHTTPS会依次拒绝:
- 非
https:协议(HTTP、file://等一律出局); - URL 中携带用户名/密码、锚点、非标端口;
- 命中"不安全主机"的域名。
第二道:unsafeHost黑名单挡住内网地址
source 会拦截localhost、.local、.internal域名,以及10.*、127.*、192.168.*、169.254.*、链路本地 IPv6 等内网网段。这一步防的是 SSRF 类风险——AI 生成的链接绝不应当指向内网服务。
第三道:filtalgoProductDetail做身份绑定核验
source 是最关键的一关:
- 主机必须是筛电官方移动端域名白名单(
m.filtalgo.com等); - 路径必须是商品详情页
/pages/goods/product/detail; - URL 中的
goodsId参数必须等于该候选的 SPU 标识,skuId参数必须等于推荐规格标识。
任何一个条件不满足,返回值就是空字符串——这个链接会被静默丢弃,商品要么改用其他合格链接,要么整条不展示。这正是"元组不可拆分"的机器执行:链接里的身份参数和商品数据不一致,就不算同一个商品。
代码里如何做到"元组整体校验"?
三道安检之外,项目还在数据层做了两处配合。
水合阶段:不合格商品直接过滤
scripts/search-hydration.js 在处理搜索结果时,会为每个候选依次尝试多个来源的链接,并用boundUrl(即上面的filtalgoProductDetail)逐一核验。链接不通过、价格无效、名称缺失,三者任一不满足,该商品整体返回空,不会带着残缺字段出现在结果里。同时它还特意禁止"借用":某 SKU 缺价格时,不允许借用同商品另一个变体的价格。
结构化搜索阶段:主动重绑而不是盲信
scripts/structured-search.js 中的bindProductIdentity会解析原始链接,并显式重写goodsId与skuId两个参数,确保输出链接与当前候选严格绑定。测试文件 scripts/structured-search.test.js 里也断言了这一点:输出的detail_url必须同时含有正确的goodsId和skuId。
另外,当用户直接丢来一条筛电商品链接时,scripts/filtalgo.js 会先解析并核验链接中的双标识,再按真实 SKU 回查目录,最后把 lookup 结果重新绑定回用户提供的原始链接——即"内容以回查为准,链接以原值为准",两者都不许模型动。
新手实践清单:让 AI 购物链接保持可信 ✅
| 实践 | 说明 |
|---|---|
| 永远点击工具返回的原值链接 | 不手工复制改参、不"补全"残缺链接 |
| 绑定不完整就少展示 | 宁可说"暂无可靠详情",不展示错绑链接 |
| 多轮追问用编号而非链接片段 | "第一款"按最近一次候选顺序解释,脚本内部用真实 SKU 回查 |
| 原商品链接是只读元组 | 后续搜索返回的同商品字段不得覆盖 lookup 的原始链接 |
| 价格结论必须能溯源 | 链接、规格、价格、采集时间任一缺失,整段比价省略 |
这几条实践分别落在 references/product-search.md、references/product-followups.md 等流程参考中,模型每次执行时都要按图索骥地遵守。
相关文件导航 📁
- SKILL.md:商品身份元组与多轮约束总纲
- scripts/url-policy.js:URL 三道安检的完整实现
- scripts/search-hydration.js:搜索结果水合与"元组整体校验"
- scripts/structured-search.js:结构化搜索中的链接重绑
- scripts/filtalgo.js:用户来链接的身份解析与回查绑定
- references/product-followups.md:详情、比较与链接研究的流程规则
小结
回到标题的问题:为什么 AI 购物链接不能手写拼接?因为在这个项目里,链接不是装饰,而是商品身份元组的组成部分、比价证据链的一环、以及 Agent 与外部世界交互的安全边界。手写拼接看似省了三次工具调用,实则同时牺牲了准确性(规格错配)、诚实性(模型改写污染事实)和安全性(绕过内网黑名单)。Filtmall-Shopping-Skill 的选择是:把"信任"从提示词移到代码——链接要么逐字核验通过,要么干脆不出现。这正是"Agent 原生购物"能在推荐、结算、售后多轮对话中保持一致性的底层原因。
【免费下载链接】Filtmall-Shopping-SkillAgent-native shopping for extreme value: verifiable same-product price evidence, checkout, orders, delivery, and after-sales.项目地址: https://gitcode.com/gh_mirrors/fi/Filtmall-Shopping-Skill
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考