商业产业 Hacker News AI 2026-10-27T19:06 正文 ok 2014 words

跨电商平台对齐尺码与颜色:如何让 AI Agent 精准买到对的商品

英文标题:🔶 How to match sizes and colors across stores so AI agents can buy the right one

人类在网上挑选特定尺码和颜色的商品轻而易举,但 AI Agent 面临着各大电商平台规格命名不一、格式混乱的巨大障碍。电商数据基础设施平台 Channel3 详细阐述了其如何将非结构化的网页商品信息转化为结构化目录:通过按品类定义变体规则、解析属性值而非仅看标签、以品牌官方为基准对齐规格按钮,并将自由文本映射为标准枚举值(鞋类覆盖率超 95%)。该方案摆脱了脆弱耗时的模拟网页浏览交互,使 AI Agent 能够通过确定性 API 一次性检索全网库存并完成精准比价与下单,为智能体自主电商交易提供了底层数据支撑。
打开原文相关 3 · 机会 1
media8.4 KB media8.4 KB media118.4 KB media85.3 KB media74.4 KB media98.1 KB media55.4 KB media57.0 KB media82.1 KB media46.5 KB media101.7 KB media31.3 KB media98.3 KB

中文

假设你想买一双男款 adidas Gazelle Indoor,棕色,尺码为 10 码。

深棕/暖香草/生胶色、男码 10 码的 adidas Gazelle Indoor

作为人类,我们可以在众多零售商和专卖店中挑选,也可以在网上购买,并在一天之内拿到商品。

但如果你是一个 AI Agent,这绝非易事。Agent 必须搞清楚哪些商店有售男款 Gazelle Indoor,其中哪些有棕色,哪些库存里有 10 码,以及哪家值得信赖的零售商价格最便宜。

五家商店中相同的男码 10 码写法:adidas.com 为 10,Dick's Sporting Goods 为 M10.0/W11.0,Kith 为 10 US,KICKS CREW 为 US(M) 10,Shoebacca 为 10同一款鞋的同一尺码,在五家商店中有着不同的写法。

无论是人类还是 Agent,阅读任意单个页面都不难。真正困难的是,没有哪个页面知道其他页面的存在。Foot Locker 的“10.0”并不知道自己和 adidas 官网的“10”代表同一个尺码。必须有人来判定:所有这些按钮其实都代表着同一款鞋的同一个尺码。

这正是我们在 Channel3 所做的工作。在我们的商品目录中搜索 Gazelle Indoor,你只会得到一款鞋,而不是一堆互不相关的网页,因为我们存储的是“商品”(Product),而不是“网页”。同一件商品可以在几个方面存在差异,例如颜色和尺码;我们称之为变体(variants)。在网页上,每个变体表现为供你选择的选项(option),例如一排尺码按钮,而每个按钮就是一个取值(value)。每家商店关于该商品的页面则被称为一个列表条目(listing)。

最终,每个取值都会拥有三个版本:商店写了什么、品牌官方写了什么,以及一个供 Agent 进行过滤的固定条目。当你寻找棕色、10 码的 Gazelle Indoor 时,你就能获得销售完全匹配该商品的所有列表。我们通过四项决策来实现这一目标。

1. 由品类决定何为“变体”

两个页面何时属于同一款商品,何时属于两款不同的商品?

黑色款 Gazelle Indoor 和棕色款 Gazelle Indoor 是同一款商品的两种颜色。而 Gazelle Indoor 和 Gazelle Bold 则是两款完全不同的商品。区分它们的标准,是我们针对每个品类维护的一套规则:一份明确允许哪些属性发生变化的简短清单。

黑色 Gazelle Indoor 等于棕色 Gazelle Indoor:同一商品,颜色作为选项保留。黑色 Gazelle Indoor 不等于 Gazelle Bold:不同商品,款式类型作为选项被剔除。

一双鞋可以有不同的颜色、尺码或材质,但仍然是同一双鞋。如果改变了轮廓、鞋跟或鞋带扣设计,它就变成了另一款鞋。这份清单必须足够严格,因为标准过于宽松会导致另一种灾难:如果一块地毯在改变颜色、尺寸、形状和图案后仍然算作同一块地毯,那么没有任何东西能区分不同的地毯,世界上所有的地毯都会被合并成同一件商品。因此,每个品类都有自己的规则列表:

  • 手机: 存储容量和颜色可以变。明年的新机型则是全新的商品。
  • 戒指: 指圈尺寸和戒托金属材质可以变。不同的宝石切工则是不同的戒指。
  • 沙发: 面料和颜色可以变。三人沙发与双人沙发属于不同的商品。

为什么不能直接相信每个商户网页上的说法?因为各家商店在“一款商品的边界在哪里”这一问题上根本无法达成共识。

  • Zara 会拆分同一款商品: 同款打褶牛仔裤的中蓝色和棕色分别挂在两个页面上,彼此从未提及对方。我们会将它们归档为拥有两种颜色的同一款商品。
  • Nike 会将多款商品捆绑在一起: 男款、女款和童款 Air Jordan 1 Mid 共享同一个页面和同一组尺码选项。我们会将它们拆分成独立的商品(按版型划分),因为童款 4 码和男款 4 码是截然不同的鞋。

Zara 的打褶牛仔裤以中蓝和棕色分别显示在两个独立页面上,各自拥有独立货号两个 Zara 页面,两个商品货号,两个页面上都没有颜色切换选项。我们将它们归档为拥有两种颜色的同一款商品。

按品类制定规则,使我们能够在全网以统一的尺度划定边界。

2. 读取具体取值,而非仅看标签

这是一个单选,还是拼在一起的多个选项?

每家商店对选项标签的命名方式各不相同。有的商店干脆省略标签,只展示一排色块;有的商店将其统称为“选项”(Option),这在某页面上可能代表尺码,在另一个页面上却可能代表鞋宽。取值本身也很混乱:商店常常用斜杠、加号和破折号把词汇拼在一起。有时这是挤在一起的两个独立选择,有时则单纯是一个较长的命名。单看标签根本无法分辨,所以我们选择深入解析具体的取值。

  • 双层床:“制造商颜色/饰面:黑色”(Manufacturer Color/Finish: Black)。 标签提到了两件事,但取值只有一种颜色。我们存储为一个选项“Color/Finish”,包含三个取值:Wood、Black、White。
  • 花盆:“颜色 / 尺寸:黑色 / 72" X 15.7" X 47"”(Color / Size: Black / 72" X 15.7" X 47")。 该取值同时包含颜色和尺寸。我们将其拆分为两个选项:颜色(Color: Black)和尺寸(Size: 72" X 15.7" X 47")。
  • 剪刀:“饰面:红 + 白”(Finish: Red + White)。 虽然包含两种颜色,但属于单一的双拼色饰面。我们保持其完整性:一个选项“Finish”,包含四个取值:Cream + Forest Green、Stainless Steel + Orange、Red + White、Charcoal + Black。

三个商户选项及其最终转化结果:双层床的“颜色/饰面”保持为一个选项,包含 Wood、Black 和 White;花盆的“颜色/尺寸”被拆分为颜色(Black)和尺寸(72 x 15.7 x 47 英寸);剪刀的“饰面”保持为一个选项,包含四个双拼色取值。

标签只是参考提示,取值才是决定因素。

3. 将各页面的按钮对齐到统一集合

我们如何知道某个页面上的按钮与另一个页面上的按钮代表相同含义?

回到尺码按钮的问题。任其发展的话,同一双鞋最终会得到一堆尺码描述,如“10”、“M10.0/W11.0”、“10 US”和“US(M) 10”,它们表达的其实是同一个尺寸。每个尺码应该在统一的名称下只出现一次,因此我们必须决定采用谁的命名。我们的选择是:采用品牌的官方命名。因为品牌方是源头,其他商店只是照搬并经常加以缩写:例如,adidas 将该配色命名为“Trace Brown / Warm Vanilla / Gum”,而 Shoebacca 只写成“Brown”,尽管 Gazelle Indoor 本身不止有一种棕色。

adidas 尺码按 adidas 的写法存储,Nike 尺码按 Nike 的写法存储

不同国家/地区的尺码标准也有所差异。Maison Margiela 的鞋采用意大利尺码(如 37 码);其美国官方商店会进行换算,37 码变成了 7 码;而零售商保留了意大利尺码但书写方式各有不同:SSENSE 写成“IT 37”,Farfetch 只写“37”。三种标签,实为一个尺码。我们在各自的标准体系下读取各标签,将其在尺码对照表中对齐,并向用户/Agent 展示统一的按钮:US 7 (EU 37)。

家具类商品还涉及度量衡单位。一家店标注地毯尺寸为 5 x 8 英尺(feet),另一家店则标为 152 x 244 厘米(cm)。虽然字面完全不同,但尺寸是一致的。因此,我们将所有尺寸拆解为带单位的数值,并在比对前统一转换为同一种单位。

4. 将每个取值映射到共享词汇表

单次搜索如何匹配不同品牌对“S 码”或“棕色”的表述?

使用品牌方的词汇能够保证单款商品内部的一致性,但这并不足以支撑整个目录的检索:因为每个品牌依然有自己的话术。Nike 标记为 S,Under Armour 标记为 SM,而一位搜索“small”(小号)的顾客理应能同时看到两者。Agent 不应该去遍历搜索“S”、“SM”、“Small”等所有可能的拼写变体,它应当只需传入一个标准值。

再引入第二个品牌为例。假设想要男款棕色 10 码的顾客同样愿意接受 Nike 的 Air Force 1 '07 Suede。adidas 将该尺码写作 10;Nike 则写作 M 10 / W 11.5。在具体商品内部,我们保留品牌方的书写格式;在此之上,我们将每个取值映射到该品类对应的简明固定列表中。在该列表中,这两个尺码都被统一为 10。

颜色机制亦是如此。adidas 将其棕色命名为“Trace Brown / Warm Vanilla / Gum”,Nike 则将其棕色命名为“Cacao Wow”。我们的标准化颜色列表很精简,因此每个独特命名都必须映射到一个标准条目上,二者最终都被归为 Brown(棕色)。“Cacao Wow”这个词本身完全看不出是棕色,因此这需要逻辑判断,而不仅仅是简单的查表。

一次针对棕色运动鞋的搜索同时找到了 adidas Gazelle Indoor(Trace Brown / Warm Vanilla / Gum)与 Nike Air Force 1 '07 Suede(Cacao Wow)两个品牌,对棕色的两种叫法,由单次搜索统一涵盖。

因此,一个取值具备三个版本:页面展示商户的原始拼写(例如 Dick's 的 M10.0/W11.0);我们存储品牌的原始拼写(例如 adidas 的 10 或 Nike 的“Cacao Wow”)。这两者都是字符串(strings):可以任意填写的自由文本,均无法用于可靠过滤。而搜索过滤依赖的是第三个版本——枚举值(enum):固定列表中的一个条目,排除了所有外部变体。

每个品类都会公开其标准列表,任何人都可以调用读取。向我们的 API 请求运动鞋品类,它会返回该品类定义的所有属性及其允许的取值:

GET /v1/categories/sneakers

{ "slug": "sneakers", "attributes": [ { "slug": "color", "name": "Color", "values": ["Beige", "Black", "Blue", "Bronze", "Brown", "..."] }, { "slug": "shoe-size", "name": "Shoe size", "values": ["...", "9.5", "10", "10.5", "..."] } ] }

其中颜色包含 19 个条目(从 Beige 到 Yellow),鞋码从 0 码开始以半码递增。将任意字符串转化为这些标准条目,正是搜索过滤得以成立的关键,因为枚举值可以实现精确匹配。并非所有值都能塞进这么简短的列表,但绝大部分都可以:服装类超过 90%,鞋类超过 95%,家具类超过 75%。

五家商店对同一种配色的不同名称(adidas.com、Dick's、Kith、KICKS CREW 和 Shoebacca)被合并为一个存储名称 Trace Brown / Warm Vanilla / Gum,以及一个搜索颜色 Brown五家商店,对同一种配色有五种叫法。我们保留 adidas 的名称,并将其归类在 Brown 之下。

页面显示文本 (string) 我们的存储文本 (string) 搜索过滤依据 (enum)
Dick's 上的 adidas Gazelle Indoor: M10.0/W11.0 10 10
adidas.com 上的同款鞋: Trace Brown / Warm Vanilla / Gum Trace Brown / Warm Vanilla / Gum Brown
nike.com 上的 Nike Air Force 1 '07 LV8: M 10 / W 11.5 M 10 / W 11.5 10
nike.com 上的 Nike Air Force 1 '07 Suede: Cacao Wow Cacao Wow Brown
Dick's 上的 Under Armour HeatGear Elite 短裤: S SM Small (S)

任何人都不需要事先知道 Nike 把棕色叫作“Cacao Wow”才能搜到它。但一旦你点开这双鞋,你看到的就是这个名字,因为这正是 Nike 印在鞋盒上的字样。“Brown”用于查找这双鞋;而 Nike 的具体命名则用于购买它。

为什么这至关重要

对于 AI Agent 而言,这项基础设施决定了它究竟能真正完成商品购买,还是只能模糊地给出参考链接。要完成下单,Agent 必须锁定唯一具体的条目:这家商店、这款鞋、这个颜色、这个尺码,且有现货。当全网商店的规格值都映射到相同的标准列表时,“男款棕色 10 码”就不再是一个靠猜测的模糊概念,而是一个明确的品类和三个确定字段:

{ "query": "adidas Gazelle Indoor", "filters": { "category_ids": ["sneakers"], "gender": "male", "attributes": { "color": ["Brown"], "shoe-size": ["10"] } } }

API 返回的结果将精确涵盖所有有货商铺的男款棕色 10 码 Gazelle Indoor,并附带各自的价格和库存状态。Agent 只需挑选中意的一家直接结账。

Channel3 目录中的棕色男码 adidas Gazelle Indoor:一款包含其各种颜色和尺码的商品,旁边列出所有有售的商店及价格和库存我们目录中的同款鞋:21 种颜色、所有尺码,以及有现货的七家商店,按价格从低到高排列。

这同时决定了解答的速度和完整度。传统的网页搜索是为人设计的:它对页面进行排序,以便人类阅读前几个结果并做出决策。依赖网络搜索的 Agent 也继承了这种模式:它只能看到排在最前面的少数页面,而不是销售该鞋款的全部商店;最便宜的 10 码正品可能藏在一家根本挤不进搜索首页的商店里。此外,Agent 打开的每个页面都必须像人类一样逐一解析,点击切换颜色和尺码,每次点击都要调用一次模型,而且多次运行的答案还可能前后矛盾。

结构化数据彻底颠覆了这一切。当每个上架条目都由相同的字段描述时,Agent 不需要挑选几个网页去碰运气。它可以向全网所有条目同时发起一次查询,进行精确比对,并在每次调用时获得稳定一致的答案。

经验与启示

我们并非一开始就总结出了这些规则。每条规则都是在遭遇破坏前序假设的奇葩页面后磨砺出来的:某个选项的标签毫无意义,某个颜色属性躲在尺码列表里,或者明明是同一款商品的两个页面彼此间却毫无关联。我们现在依然无法保证 100% 正确解析所有网页,每周也都会遇到前所未见的新页面结构。

互联网最初是为了让人类逐页阅读而构建的。而我们正在构建面向 Agent 的替代目录:一个直接专为 AI Agent 打造的通用商品目录。在那里,每件商品只以同一种方式被定义一次,并关联了所有在售的商店。如果你正在构建需要精准查找并购买对的商品的 Agent,欢迎即刻与我们携手构建。

English / 原文

Say you want a pair of men's adidas Gazelle Indoor, in brown, in a size 10.

adidas Gazelle Indoor in Trace Brown / Warm Vanilla / Gum, men's 10

As people, we can pick from a multitude of retailers and stores, or buy online, and have the product in our hands in a day.

If you're an AI agent, it isn't as easy. The agent has to work out which stores sell the men's Gazelle Indoor, which of them carry the brown color, which have a size 10 in stock, and which is the cheapest retailer it can also trust.

The same men's size 10 at five stores: 10 at adidas.com, M10.0/W11.0 at Dick's Sporting Goods, 10 US at Kith, US(M) 10 at KICKS CREW, and 10 at ShoebaccaThe same shoe in the same size, as five stores write it.

Reading any one page is easy, for a human or an agent. The hard part is that no page knows the others exist. Foot Locker's “10.0” does not know it is the same as adidas's “10”. Someone has to decide that all these buttons mean the same size of the same shoe.

That is the work we do at Channel3. Search our catalog for the Gazelle Indoor and you get one shoe, not a pile of unrelated pages, because we store products, not web pages. A product can differ in a few ways, such as color and size; we call those variants. On a page, each variant shows up as an option you pick from, like a row of size buttons, and each button is a value. Each store's page for a product is a listing.

By the end, every value has three versions: what the store wrote, what the brand wrote, and one fixed entry an agent can filter on. Ask for the Gazelle Indoor in brown, size 10, and you get every listing that sells exactly that. Four decisions get us there.

1. The category decides what counts as a variant

When are two pages the same product, and when are they two different ones?

The Gazelle Indoor in black and the Gazelle Indoor in brown are one product in two colors. The Gazelle Indoor and the Gazelle Bold are two different products. What separates them is a rule we keep for each category: a short list of what is allowed to change.

Gazelle Indoor in black equals Gazelle Indoor in brown: same product, color is kept as an option. Gazelle Indoor in black does not equal Gazelle Bold: different products, type is rejected as an option.

A shoe can come in different colors, sizes or materials and still be the same shoe. Give it a different shape, heel or strap, and it becomes a different shoe. That list has to be strict, because a loose one fails the other way. If a rug could change color, size, shape and pattern and still count as the same rug, nothing would separate one rug from another, and every rug in the world would become one product. So each category gets its own list:

  • Phones: storage and color can change. Next year's model is a new product.
  • Rings: ring size and metal can change. A different stone cut is a different ring.
  • Sofas: fabric and color can change. A three-seater is a different sofa from a two-seater.

Why not take each page's word for it? Because stores don't agree on where one product ends and the next begins.

  • Zara splits one product: the same pleated jeans in mid-blue and brown sit on two pages that never mention each other. We file them as one product in two colors.
  • Nike groups several together: men's, women's and kids' Air Jordan 1 Mids share one page and one size option. We split them into separate products, one per fit, because a kids' 4 and a men's 4 are different shoes.

Zara's pleated jeans in mid-blue and brown on two separate pages, each with its own product numberTwo Zara pages, two product numbers, no color option on either. We file them as one product in two colors.

A rule per category lets us draw the line the same way everywhere.

2. Read the values, not the label

Is this one choice, or several stuck together?

Every store labels its options its own way. Some skip the label entirely and just show a row of color swatches. Others call it “Option”, which might mean size on one page and width on the next. The values get messy too: stores glue words together with slashes, plus signs and dashes. Sometimes that's two separate choices squeezed into one, and sometimes it's just a long name. The label won't tell you which, so we look at the values instead.

  • A bunk bed: “Manufacturer Color/Finish: Black”. The label names two things, but the value is one color. We store one option, Color/Finish, with three values: Wood, Black, White.
  • A planter: “Color / Size: Black / 72" X 15.7" X 47"”. The value holds a color and a size. We split it into two options: Color, Black, and Size, 72" X 15.7" X 47".
  • A pair of scissors: “Finish: Red + White”. Two colors, but one two-tone finish. We keep it whole: one option, Finish, with four values: Cream + Forest Green, Stainless Steel + Orange, Red + White, Charcoal + Black.

Three store options and every value each becomes: the bunk bed's Color/Finish stays one option with Wood, Black and White; the planter's Color / Size splits into Color (Black) and Size (72 by 15.7 by 47 inches); the scissors' Finish stays one option with four two-tone values.

The label is a hint. The values decide.

3. Match every page's buttons to one set

How do we know a button on one page means the same thing as a button on another?

Back to the size buttons. Left alone, one shoe ends up with a size list like “10”, “M10.0/W11.0”, “10 US” and “US(M) 10”, all meaning the same size. Each size should appear once, under one name, so we have to pick whose name to use. We pick the brand's. It's the original, and other stores copy it, often cut short: adidas calls this colorway “Trace Brown / Warm Vanilla / Gum”, while Shoebacca writes just “Brown”, even though the Gazelle Indoor comes in more than one shade of brown.

adidas sizes stored as adidas writes them, Nike sizes as Nike writes them

Sizes also change by country. Maison Margiela makes its shoes in Italian sizes, like a 37. Its US store converts them, so the 37 becomes a 7. Retailers keep the Italian size but write it their own way: “IT 37” at SSENSE, just “37” at Farfetch. Three labels, one size. We read each label in its own system, line them up on a size chart, and show one button: US 7 (EU 37).

Furniture adds units. One store lists a rug at 5 by 8 feet; another lists it at 152 by 244 cm. They look nothing alike, but they're the same size. So we turn every size into numbers with units, and convert them all to one unit before we compare.

4. Map every value onto a shared vocabulary

How does one search find every brand's version of “small” or “brown”?

Using each brand's words keeps each product consistent, but it doesn't make the catalog searchable: every brand still has its own words. Nike writes S, Under Armour writes SM, and a shopper who asks for “small” should see both. An agent shouldn't have to search for “S”, “SM”, “Small” and every other spelling. It should pass one value, once.

Now add a second brand. Say the shopper wanting a brown men's 10 would be just as happy with Nike's Air Force 1 '07 Suede. adidas writes that size as 10; Nike writes it as M 10 / W 11.5. Inside each product, we keep the brand's spelling. On top of that, we map each value onto one short, fixed list for its category. On that list, both sizes are simply 10.

Color works the same way. adidas calls its brown “Trace Brown / Warm Vanilla / Gum”; Nike calls its brown “Cacao Wow”. Our color list is short, so each name has to map to one entry, and both become Brown. Nothing in “Cacao Wow” says brown, so that's a judgment call, not a lookup.

One search for sneakers with color: Brown finds both the adidas Gazelle Indoor (Trace Brown / Warm Vanilla / Gum) and the Nike Air Force 1 '07 Suede (Cacao Wow)Two brands, two names for brown, one search.

So one value has three versions. The page shows the store's spelling, like Dick's M10.0/W11.0. We store the brand's spelling, like adidas's 10 or Nike's “Cacao Wow”. Both are strings : free text that can say anything, so neither can be filtered reliably. Search filters on the third version, an enum : one entry from a fixed list, and nothing outside it.

Each category publishes its lists, and anyone can read them. Ask our API for sneakers and it returns every attribute the category defines, along with its allowed values:

GET /v1/categories/sneakers

{
  "slug": "sneakers",
  "attributes": [
    { "slug": "color", "name": "Color", "values": ["Beige", "Black", "Blue", "Bronze", "Brown", "..."] },
    { "slug": "shoe-size", "name": "Shoe size", "values": ["...", "9.5", "10", "10.5", "..."] }
  ]
}

Color has 19 entries, from Beige to Yellow, and shoe size runs in half sizes from 0 up. Turning a string into one of those entries is what lets search filter on it, because an enum can be matched exactly. Not every value has a place on lists this short, but most do: over 90% of values for apparel, over 95% for shoes and over 75% for furniture.

Five stores' names for one colorway (adidas.com, Dick's, Kith, KICKS CREW and Shoebacca) become one stored name, Trace Brown / Warm Vanilla / Gum, and one search color, BrownFive stores, five names for one colorway. We keep adidas's name and file it under Brown.

What the page says (string) What we store (string) What search filters on (enum)
adidas Gazelle Indoor at Dick's: M10.0/W11.0 10 10
The same shoe at adidas.com: Trace Brown / Warm Vanilla / Gum Trace Brown / Warm Vanilla / Gum Brown
Nike Air Force 1 '07 LV8 at nike.com: M 10 / W 11.5 M 10 / W 11.5 10
Nike Air Force 1 '07 Suede at nike.com: Cacao Wow Cacao Wow Brown
Under Armour HeatGear Elite shorts at Dick's: S SM Small (S)

Nobody needs to know that Nike calls its brown “Cacao Wow” to find it. But once you open the shoe, that's the name you see, because it's what Nike printed. “Brown” is for finding the shoe; Nike's name is for buying it.

Why this matters

For an AI agent, this work decides whether it can actually buy something or only vaguely point at it. To place an order, an agent has to name one listing: this store, this shoe, this color, this size, in stock. When every store's values map onto the same lists, “a brown men's 10” isn't a guess. It's a category and three fields:

{
  "query": "adidas Gazelle Indoor",
  "filters": {
    "category_ids": ["sneakers"],
    "gender": "male",
    "attributes": { "color": ["Brown"], "shoe-size": ["10"] }
  }
}

What comes back is the brown Gazelle Indoor in a men's 10 at every store that has it, each with its price and stock. The agent picks one and checks out.

The brown men's adidas Gazelle Indoor in Channel3's catalog: one product with its colors and sizes, next to every store that sells it with price and stockThe same shoe in our catalog: 21 colors, every size, and seven stores with it in stock, cheapest first.

It also decides how fast and how complete the answer is. Web search was built for people: it ranks pages so a person can read the first few and decide. An agent using it inherits that shape. It sees the handful of pages that rank highest, not every store that sells the shoe, so the cheapest pair in a 10 can sit on a store that never makes the first page. And each page it does open has to be read the way a person reads it, clicking through colors and sizes, with a model call for every click and answers that can change from one run to the next.

Structured data turns that around. When every listing is described in the same fields, an agent doesn't pick a few pages to trust. It asks one question of every listing at once, compares them exactly, and gets the same answer every time it asks.

What we've learned

We didn't start with these rules. We wrote each one after running into pages that broke the last: an option whose label meant nothing, a color hiding in the size list, two pages that were obviously one product with nothing on either to say so. We don't get every page right yet, and new kinds of pages arrive every week.

The web was built for people to read, one page at a time. We are building the catalog agents need instead: a universal product catalog made directly for agents, where every product is described once, the same way, with every store that sells it attached. If you're building an agent that needs to find and buy the right thing, start building with us.