作者: Ezio

  • 从标签库到商品语义底座:如何为下一代电商搜索设计知识库、Graph 与向量系统

    传统电商搜索面对的通常是这样的 Query:

    男士、黑色、防水、冲锋衣。

    用户给出品类词、属性词和品牌词,搜索系统通过倒排索引、属性过滤、向量召回、个性化召回等方式找到相关商品。

    但随着 Chatbot、对话式导购和自然语言搜索逐渐进入电商,用户开始提出完全不同的问题:

    下个月要去北欧,想买一件冲锋衣,但又不要太像冲锋衣。

    这句话看起来是在搜索“冲锋衣”,实际上包含了多个相互独立、甚至看似矛盾的需求:

    • 用户希望保留冲锋衣的防风、防雨等功能;
    • 使用场景是北欧旅行;
    • 商品最好适合城市活动和日常穿着;
    • 用户不喜欢传统冲锋衣的专业户外视觉;
    • “不像冲锋衣”针对的是外观,而不是功能。

    这类 Query 已经不能简单理解为关键词匹配,也不能只依赖一个整体的语义向量。

    真正的问题是:

    搜索系统能否理解用户希望保留哪些特征、削弱哪些特征,并在商品空间中找到满足这种组合条件的商品?

    要解决这个问题,电商需要建设的不是一个更大的标签库,也不是一个单纯的向量数据库,而是一套完整的商品语义知识底座


    一、为什么继续增加标签不够

    面对复杂自然语言 Query,一种直观方案是继续给商品增加标签。

    例如针对服装商品,可以增加:

    • 防水
    • 防风
    • 城市感
    • 户外感
    • 通勤感
    • 极简感
    • 专业装备感
    • 日常感
    • 轻户外
    • 旅行适配

    这种方式短期内有效,因为标签容易过滤、排序和解释。

    但如果把它作为长期方案,会遇到几个明显的问题。

    1. 用户语言是开放集合

    用户不会严格使用平台定义的标签。

    “不要太像冲锋衣”还可能被表达成:

    • 不要像马上要去爬雪山;
    • 不要太像户外博主;
    • 别有太强的装备感;
    • 平时上班也能穿;
    • 想要防雨,但不要太专业;
    • 要有冲锋衣功能,但看起来像普通夹克。

    这些表达方式几乎无法提前穷举。

    2. 审美概念不是孤立标签

    商品为什么“看起来像冲锋衣”?

    可能是因为:

    • 外露的防水拉链;
    • 高对比拼色;
    • 宽大的专业帽檐;
    • 复杂的功能口袋;
    • 硬挺的面料;
    • 明显的户外品牌标识;
    • 专业登山式轮廓。

    这些视觉元素组合在一起,才形成“冲锋衣感”。

    因此,“冲锋衣感”不是一个简单标签,而是多个商品特征共同产生的感知结果。

    3. 标签无法自然表达关系

    标签可以表达“这件商品有防水功能”,但很难表达:

    • 这件商品功能上接近冲锋衣;
    • 视觉上更接近通勤夹克;
    • 它保留了户外性能,但弱化了专业装备感;
    • 它比另一件商品更适合城市旅行;
    • 它适合短时降雨,但不适合持续暴雨。

    这些都不是单一标签,而是关系、条件和程度。

    因此,下一代商品知识体系不能只是无限扩张的标签集合。


    二、商品 Wiki 也不能被理解成“给每件商品写百科”

    另一种思路是为商品建设类似维基百科的商品 Wiki。

    这种思路比标签库更接近正确方向,因为 Wiki 可以保存更丰富的知识,例如:

    • 商品的功能和结构;
    • 设计元素;
    • 视觉风格;
    • 适用场景;
    • 用户评价;
    • 与其他概念的关系;
    • 每个结论的证据来源。

    但对于淘宝这样的平台,如果把商品 Wiki 理解为给每个 SKU 建立一个页面,并显式记录大量商品之间的关系,同样不可行。

    假设平台有 (N) 个商品,如果任意商品之间都可能建立关系,关系规模最坏会接近:

    [ O(N^2) ]

    即使每个商品只保存一千个相似商品,在十亿级商品规模下,也会产生万亿级关系。

    更重要的是,很多商品关系并不稳定。

    例如:

    • 商品 A 是否比商品 B 更值得买,取决于价格;
    • 哪件更适合北欧,取决于月份和活动方式;
    • 哪件更不像冲锋衣,取决于用户对“冲锋衣感”的理解;
    • 哪件更适合某个用户,取决于个人偏好和历史行为。

    这些关系不应该永久存储在知识图谱中,而应该在 Query 到来后动态计算。

    因此,商品 Wiki 更准确的定义应该是:

    一套由商品事实、概念知识、商品到概念的映射、多维向量和证据系统共同组成的商品语义底座。


    三、整体架构:四类数据共同表达商品

    一套可扩展的商品语义底座,可以由四个核心部分组成:

    [ \text{商品语义底座}

    \text{商品事实库} + \text{概念知识图谱} + \text{多维向量索引} + \text{行为与实时状态} ]

    它们分别回答不同的问题。

    模块 回答的问题
    商品事实库 商品实际上是什么
    概念知识图谱 商品概念之间有什么关系
    多维向量索引 商品在语义和视觉上像什么
    用户行为系统 用户实际偏好什么
    实时状态系统 商品现在是否值得被推荐
    在线推理层 当前 Query 下哪些特征更重要

    整体数据流可以表示为:

    标题、参数、详情、图片、视频、评价、行为
                      ↓
              多模态商品理解模型
                      ↓
     ┌────────────────┼────────────────┐
     ↓                ↓                ↓
    商品事实库     概念知识图谱       多维向量索引
     └────────────────┼────────────────┘
                      ↓
               商品语义服务层
                      ↓
          Query 理解与动态召回路由
                      ↓
              多路召回与候选融合
                      ↓
           多模态精排与个性化重排
                      ↓
                 商品结果
    

    逻辑上,它是一套统一的商品知识底座。

    物理上,它一定由多个不同的存储和检索系统组成。


    四、第一层:商品事实库

    商品事实库用于保存确定、可验证、可过滤的信息。

    例如一件外套可以包含:

    • 所属 SPU 与 SKU;
    • 品牌和类目;
    • 材质;
    • 颜色;
    • 重量;
    • 防水指数;
    • 是否有帽子;
    • 是否有保暖层;
    • 面料层数;
    • 版型;
    • 尺码;
    • 价格;
    • 库存;
    • 配送信息。

    这部分信息适合使用:

    • KV 存储;
    • 列式数据库;
    • 倒排索引;
    • Bitmap 属性索引;
    • 实时特征存储。

    事实层最重要的特点是:不能只保存结论,还要保存证据和置信度。

    例如商家标题写着“防水外套”,但没有提供防水指数,用户评价中又大量提到“只能挡小雨”。

    系统不应该简单写成:

    防水:是
    

    而应该保留更完整的信息:

    商家声明:防水
    技术参数:缺失
    用户体验:适合短时小雨
    综合置信度:中
    

    否则,后续模型很容易把营销文案误认为客观事实。

    同时,稳定信息和实时信息应该分开存储。

    稳定信息包括:

    • 材质;
    • 结构;
    • 设计;
    • 功能;
    • 风格;
    • 视觉特征。

    实时信息包括:

    • 价格;
    • 库存;
    • 促销;
    • 配送时间;
    • 销量变化。

    这样可以避免价格或库存变化触发整个商品语义系统重新计算。


    五、第二层:概念知识图谱

    知识图谱的核心节点不应该是海量 SKU,而应该是相对稳定的商品概念。

    1. 概念节点

    概念图谱可以包含以下几类节点。

    商品分类

    • 外套
    • 防水外套
    • 冲锋衣
    • 硬壳
    • 软壳
    • 风衣
    • 通勤夹克

    功能概念

    • 防水
    • 防风
    • 透湿
    • 保暖
    • 耐磨
    • 轻量
    • 可叠穿

    设计元素

    • 压胶拉链
    • 隐藏拉链
    • 高对比拼色
    • 大帽檐
    • 多口袋
    • 哑光面料
    • 大 Logo
    • 直筒轮廓

    风格与审美

    • 城市感
    • 户外感
    • 极简
    • 专业装备感
    • 轻户外
    • 商务休闲
    • 日常感
    • 机能感

    使用场景

    • 北欧旅行
    • 城市步行
    • 日常通勤
    • 轻徒步
    • 高海拔登山
    • 雨天骑行

    环境条件

    • 大风
    • 持续降雨
    • 低温
    • 高湿度
    • 昼夜温差
    • 长时间户外活动

    2. 概念关系

    图谱需要表达的不只是“属于”,还包括概念之间的功能、视觉和替代关系。

    例如:

    冲锋衣
      ├── 核心功能 → 防水
      ├── 核心功能 → 防风
      ├── 常见结构 → 压胶拉链
      ├── 常见视觉 → 专业户外感
      ├── 相邻品类 → 软壳
      └── 相邻品类 → 都市防水夹克
    

    可以设计的边包括:

    • is_a:属于某个上位概念;
    • has_function:具备某项功能;
    • suitable_for:适合某种场景;
    • has_visual_cue:具有某种视觉符号;
    • causes_perception:某个元素会增强某种感知;
    • weakens_perception:某个元素会削弱某种感知;
    • similar_to:与另一个概念相似;
    • alternative_to:可作为另一个品类的替代;
    • conflicts_with:两个概念存在冲突;
    • requires:某个场景要求某种能力;
    • insufficient_for:某项能力不足以满足某场景。

    图谱中还应该保存关系强度、适用条件、来源和时效性。

    例如:

    北欧秋季旅行 → 需要防风
    
    权重:0.86
    条件:城市活动、户外步行时间较长
    来源:气候知识、旅行内容、历史购买反馈
    

    这种关系比简单标签更能支持 Query 推理。


    六、第三层:商品到概念的稀疏映射

    商品不需要与大量其他商品建立显式关系。

    更合理的方法是,让每件商品连接少量高价值概念。

    例如:

    商品 A
    ├── 冲锋衣功能       0.83
    ├── 防风             0.91
    ├── 防水             0.86
    ├── 城市通勤         0.84
    ├── 极简风格         0.81
    ├── 户外视觉         0.25
    ├── 专业登山视觉     0.14
    └── 北欧城市旅行     0.77
    

    每条映射至少应包含:

    item_id
    concept_id
    score
    confidence
    evidence_source
    model_version
    updated_at
    

    这类关系的规模约为:

    [ O(NK) ]

    其中 (N) 是商品数量,(K) 是每件商品连接的概念数量。

    只要将 (K) 控制在几十到几百以内,就比 SKU–SKU 图更容易扩展。

    商品到概念的映射,可以来自:

    • 商家结构化参数;
    • 商品标题和详情页;
    • 图片和视频理解;
    • 用户评价;
    • 人工标注;
    • 行为反馈;
    • 多模态模型推断。

    其中模型推断出的关系必须带有置信度和证据,不能被当作绝对事实。


    七、第四层:多维商品向量

    只给每件商品生成一个统一向量,无法很好地解决复杂 Query。

    因为“冲锋衣,但不要太像冲锋衣”同时表达了:

    • 功能上接近冲锋衣;
    • 视觉上远离传统冲锋衣;
    • 风格上接近城市通勤;
    • 场景上适合北欧旅行。

    如果所有信息都压缩进一个向量,功能、品类、风格和视觉很容易纠缠在一起。

    更合理的方式是,为商品生成多个语义空间中的表示:

    Item
    ├── 文本语义向量
    ├── 视觉向量
    ├── 功能向量
    ├── 风格向量
    ├── 场景向量
    ├── 材质与结构向量
    └── 用户体验向量
    

    这些向量分别承担不同职责。

    向量 表达内容
    文本语义向量 标题、参数和描述的整体含义
    视觉向量 轮廓、颜色、图案和设计语言
    功能向量 防风、防水、透气、保暖、耐磨
    风格向量 城市、极简、户外、正式、休闲
    场景向量 通勤、旅行、徒步、商务、运动
    体验向量 用户评价中的舒适、闷热、显瘦等感受

    这使得系统可以分别判断:

    功能相似度:高
    城市风格相似度:高
    专业户外视觉相似度:低
    北欧旅行适配度:高
    

    也就是说,系统不再只是寻找“最像 Query 的商品”,而是在不同语义空间中寻找满足不同方向约束的商品。


    八、标签、Graph 和向量不是替代关系

    三种表示形式各自适合解决不同问题。

    标签负责硬约束

    例如:

    • 价格低于 1500 元;
    • 防水指数高于 10000 mm;
    • 黑色;
    • 有帽子;
    • 可配送;
    • 有用户尺码。

    这类条件必须稳定、精确和可过滤。

    Graph 负责关系和推理

    例如:

    北欧旅行
    → 可能面临大风和降雨
    → 需要防风、防雨和可叠穿
    

    以及:

    不要像冲锋衣
    → 降低传统冲锋衣视觉符号
    → 少拼接、低 Logo、隐藏拉链、日常版型
    

    向量负责开放语言和模糊感觉

    用户说“不要像马上要去爬珠峰”,平台不可能为这句话提前建立标签。

    但语义模型可以把它映射到:

    • 专业装备感;
    • 高强度户外视觉;
    • 登山感;
    • 复杂功能设计。

    因此,可以把三者的职责总结为:

    标签是硬约束,Graph 是推理骨架,向量是泛化机制。


    九、复杂 Query 如何被系统处理

    仍然以这句话为例:

    下个月要去北欧,想买件冲锋衣,但不要太像冲锋衣。

    第一步:Query 结构化

    模型先把 Query 转化为 Intent Frame:

    任务:购买旅行外套
    
    时间:下个月
    地点:北欧
    
    目标:
    冲锋衣或具备冲锋衣功能的外套
    
    必须保留:
    防风、防雨、可叠穿
    
    希望增加:
    城市感、简洁、日常可穿
    
    希望降低:
    专业登山感、强户外感、传统冲锋衣外观
    
    不确定:
    具体国家、活动方式、预算、温度
    

    这里最关键的是明确区分:

    保留:冲锋衣的功能
    降低:冲锋衣的视觉
    

    第二步:Graph 展开

    概念图谱把自然语言意图转换为可执行的概念集合。

    例如:

    北欧旅行
    ├── 防风       0.95
    ├── 防雨       0.88
    ├── 可叠穿     0.76
    └── 城市步行   0.72
    
    不要像冲锋衣
    ├── 专业户外感   -0.87
    ├── 大 Logo      -0.65
    ├── 复杂拼接     -0.59
    ├── 装备感帽檐   -0.48
    ├── 城市感        0.91
    └── 极简感        0.79
    

    第三步:生成多个 Query 向量

    系统不只生成一个整体 Query Embedding,而是生成:

    Q_function
    Q_style
    Q_scene
    Q_visual_positive
    Q_visual_negative
    

    例如:

    Q_function = 防风 + 防水 + 可叠穿
    Q_scene = 北欧城市旅行
    Q_style = 城市 + 极简 + 日常
    Q_negative = 专业户外感 + 登山装备感
    

    这些向量可以通过一个 Learned Composer 生成,而不是完全依靠人工向量加减。


    十、召回系统不会消失,而是变成动态路由

    即使有了知识图谱和多向量表示,文本召回、属性召回、向量召回、个性化召回依然有价值。

    改变的是:它们不再机械地对每个 Query 运行相同配额。

    系统可以增加一个 Retrieval Router,根据 Query 意图动态决定调用哪些召回能力。

    Query Intent
         ↓
    Retrieval Router
         ├── 文本召回
         ├── 属性召回
         ├── 功能向量召回
         ├── 视觉风格召回
         ├── 场景向量召回
         ├── 图谱概念召回
         ├── 个性化召回
         └── 热门与业务兜底
    

    对于“北欧旅行但不要太像冲锋衣”的 Query,可以重点使用:

    召回方式 作用
    功能向量召回 找到具备冲锋衣功能的商品
    视觉风格召回 找到城市、简洁、日常外观
    图谱概念召回 找到软壳、都市防水夹克等替代品类
    属性召回 保证防风、防雨等基础条件
    文本召回 避免遗漏明确相关商品
    个性化召回 结合用户历史审美

    因此,未来不是取消多路召回,而是:

    从固定多路召回,转向由用户意图驱动的动态召回。


    十一、排序阶段应使用多空间打分

    候选商品生成后,可以先处理硬条件:

    • 无库存则过滤;
    • 尺码不匹配则过滤;
    • 无法配送则过滤;
    • 明确不满足防雨要求则降级;
    • 价格不符合预算则过滤或降权。

    随后进行多维打分:

    [ \begin{aligned} Score(i)= &;w_f \cdot Sim(Q_f,I_f)\ +&;w_s \cdot Sim(Q_s,I_s)\ +&;w_v \cdot Sim(Q_v,I_v)\ +&;w_c \cdot Sim(Q_c,I_c)\ +&;w_g \cdot GraphMatch(Q,i)\ +&;w_p \cdot PersonalScore(u,i)\ -&;w_n \cdot Sim(Q_{negative},I_v)\ -&;ConstraintPenalty(i) \end{aligned} ]

    其中:

    • (Q_f) 和 (I_f) 表示功能向量;
    • (Q_s) 和 (I_s) 表示风格向量;
    • (Q_v) 和 (I_v) 表示视觉向量;
    • (Q_c) 和 (I_c) 表示场景向量;
    • (Q_{negative}) 表示用户明确排斥的特征;
    • (GraphMatch) 表示概念图谱匹配程度;
    • (PersonalScore) 表示个性化偏好。

    这里不能简单地把所有正负条件提前压成一个向量。

    因为:

    “需要冲锋衣”和“不要像冲锋衣”分别在功能空间和视觉空间中成立。


    十二、商品间关系应按需计算

    在淘宝体量下,以下关系不应该永久存储:

    • 哪件更适合北欧旅行;
    • 哪件更不像冲锋衣;
    • 哪件更适合当前用户;
    • 哪件当前性价比更高;
    • 哪件在当前候选集合中更值得推荐。

    这些关系依赖:

    • 当前 Query;
    • 当前用户;
    • 当前时间;
    • 当前价格;
    • 当前库存;
    • 当前候选集合。

    因此,更合理的流程是:

    全站商品
        ↓
    倒排、属性和向量召回数千件
        ↓
    对候选商品动态计算关系
        ↓
    多模态精排
        ↓
    输出几十件结果
    

    也就是说:

    稳定关系存储在概念层,动态关系计算在候选层。


    十三、物理存储应该如何分工

    一套商品语义知识底座不应强行使用同一个数据库。

    不同数据适合不同系统:

    数据类型 推荐存储方式
    商品基本事实 KV 或列式数据库
    价格与库存 实时 KV、流式系统
    文本关键词 倒排索引
    结构化属性 Bitmap 或属性索引
    概念关系 图数据库或图计算系统
    商品到概念映射 稀疏列式表、倒排表
    多模态向量 分片 ANN 索引
    用户行为 行为图、序列特征库
    Item–Item 近邻 Top-K 邻居缓存
    排序特征 Feature Store

    逻辑上,它们共同构成商品知识库。

    工程上,它们必须被拆分成多个高性能系统。


    十四、如何建设商品知识生产流水线

    商品知识并不是一次性人工录入完成的,而是通过持续的数据处理生成。

    商品新增或更新
          ↓
    类目识别
          ↓
    文本属性抽取
          ↓
    图片与视频理解
          ↓
    评价体验提取
          ↓
    多来源信息融合
          ↓
    冲突检测
          ↓
    商品事实写入
          ↓
    商品到概念映射
          ↓
    多维向量生成
          ↓
    索引更新
    

    每个模型生成的结论都需要保存:

    • 数据来源;
    • 置信度;
    • 模型版本;
    • 生成时间;
    • 有效期;
    • 冲突状态;
    • 可追溯证据。

    否则,商品知识库很容易变成一个无法治理的模型结论堆积系统。


    十五、标签应该成为知识库的物化视图

    未来标签仍然重要,但它不应该是商品知识的唯一来源。

    更合理的关系是:

    商品图片
    + 商品参数
    + 设计元素
    + 概念图谱
    + 用户评价
            ↓
      商品语义理解
            ↓
    连续特征与概念分数
            ↓
    根据线上需求物化标签
    

    例如系统可以计算出:

    户外视觉强度:0.28
    城市感:0.83
    专业装备感:0.19
    通勤适配度:0.88
    

    线上为了快速过滤,可以物化为:

    low_outdoor_aesthetic
    high_urban_style
    commute_compatible
    

    因此,标签不再是底层知识本身,而是底层知识面向检索系统的一种高性能投影。


    十六、落地时应该从垂类开始

    这套系统不适合一开始覆盖所有类目。

    更现实的落地方式,是先选择一个同时具有强视觉、强场景和复杂审美表达的类目。

    例如:

    • 外套;
    • 女装;
    • 鞋类;
    • 家居;
    • 家装;
    • 箱包。

    第一阶段可以只建设:

    • 30~50 个功能概念;
    • 30~50 个视觉风格维度;
    • 20~30 个使用场景;
    • 文本、视觉、功能、风格四类向量;
    • 一套复杂自然语言 Query 测试集。

    第二阶段再加入:

    • Query Intent 结构化;
    • 正向和负向需求识别;
    • 动态召回路由;
    • Graph Query Expansion。

    第三阶段再引入:

    • 多模态精排;
    • 个性化语义权重;
    • 用户对风格概念的个人定义;
    • 可解释推荐。

    十七、评估指标也需要变化

    传统搜索主要关注:

    • CTR;
    • CVR;
    • GMV;
    • 停留时长;
    • 加购率。

    复杂自然语言搜索还需要增加一套新的评估指标。

    指标 评价内容
    Intent Recall 是否覆盖用户真实需求
    Hard Constraint Violation 是否违反明确硬条件
    Negative Intent Violation 是否出现用户明确不要的特征
    Preserve–Change Accuracy 是否保留该保留的、改变该改变的
    Function–Style Separation 是否区分商品功能和商品外观
    Query Reformulation Rate 用户是否需要反复改写 Query
    Explanation Grounding 推荐理由是否有事实证据
    Diversity 是否提供不同品类的合理替代
    Latency 复杂推理是否满足在线要求

    其中一个尤其重要的指标是:

    [ \text{Negative Intent Violation Rate} ]

    传统搜索主要关注用户“想要什么”。

    自然语言搜索还必须认真处理用户“明确不要什么”。


    结语

    下一代电商搜索面对的,不再只是标准化商品词,而是生活场景、功能需求、审美偏好和负向条件的混合表达。

    用户搜索的也不再只是一个类目,而是一个目标商品区域:

    冲锋衣的功能
    +
    北欧旅行的场景适配
    +
    城市外套的日常感
    -
    传统冲锋衣的专业户外视觉
    

    要支撑这种检索,平台不能只继续增加标签,也不能试图建立一个覆盖所有 SKU 关系的巨大商品图谱。

    更可行的设计是:

    商品事实使用结构化数据库保存,稳定的概念关系放入 Graph,开放语义和视觉感知放入多维向量空间,复杂的商品关系在 Query 到来后动态计算。

    在这个体系中:

    • 标签负责精确过滤;
    • Graph 负责概念推理;
    • 向量负责开放表达;
    • 多模态模型负责理解商品;
    • 动态召回负责生成候选;
    • 在线排序负责完成最终组合。

    最终,商品知识库不应该只是保存“商品有什么属性”。

    它应该帮助搜索系统理解:

    用户为什么需要这件商品、希望保留什么、希望去掉什么,以及什么商品能够以另一种方式满足同一个需求。