一张图片胜过 1.5 倍的文字:我们从产品搜索 embeddings 基准测试中学到了什么
作者来自 Sofia Vasileva我们对 5,000 个真实产品进行了两种 embedding 模型的基准测试结果发现将图片与文本结合使用比单独使用其中任何一种的效果最高可提升 50%。以下是测试数据以及最终胜出的模型。立即亲自体验用于 Search AI 的向量搜索使用这个用于 Search AI 的自助式动手学习。你现在可以开始免费的云试用或者立即在你的本地机器上体验 Elastic。一张图片胜过 1.5 倍的文字我们从产品搜索 embeddings 基准测试中学到了什么将图片和文本结合为一个embedding比单独使用任意一种效果都更好而且差距并不小。在我们的测试中将图片和文本的 embeddings 取平均后正确产品排在第一名的次数最高达到仅使用图片 embeddings 的 1.5 倍。我们使用两个 Jina embedding 模型 ——jina-clip-v2和jina-embeddings-v5-omni-small—— 对 5,000 个真实的英语和德语服装及鞋类产品进行了基准测试以了解哪种模型以及哪种索引策略真正能够在电子商务搜索中胜出。较旧、更加专一的 Contrastive Language–Image预训练CLIP 风格模型击败了较新、更通用的模型这并不是我们预期的结果。本文将介绍测试数据、测试方法以及我们建议你如何利用这些结果。jina-clip-v2 与 jina-embeddings-v5-omni-small有什么不同多模态 embedding模型通过在同一个高维空间中为不同类型的输入生成具有代表性的语义向量来工作。我们使用了两种能够完成这项工作的模型特性jina-clip-v2jina-embeddings-v5-omni-small架构双编码器独立的文本塔 图片塔单一共享骨干网络 冻结编码器参数量约 8.65 亿约 17.4 亿embedding 维度10241024最大输入512×512 图片8k token 文本32k token语言覆盖广泛的多语言支持约 100 种语言模态处理文本 ↔ 图片对齐专门设计通过投影器支持文本、图片、音频和视频jina-clip-v2是一个 CLIP 风格的双编码器一个文本塔Jina XLM-RoBERTa5.61 亿参数和一个独立的图片塔EVA02-L143.04 亿参数总参数量约为 8.65 亿。这两个塔分别进行训练但经过联合微调以便输出到同一个语义空间。它生成 1024 维 embeddings支持最大 512×512 的图片和最长 8k token 的文本并提供广泛的多语言支持。它专门针对文本到图片、图片到文本以及文本到文本匹配进行了设计。jina-embeddings-v5-omni-small的覆盖范围更广。它在jina-embeddings-v5-text模型的基础上进行了扩展通过将冻结的视觉编码器和音频编码器连接到冻结的文本骨干网络使其支持图片、音频和视频。这些编码器通过跨模态投影器cross-modal projectors连接这些投影器是经过训练的小型网络层用于将各个编码器的输出映射到文本模型的embedding 空间。这些投影器是模型中唯一接受额外训练的部分。最终得到的模型生成 1024 维 embeddings支持最长 32ktoken的输入上下文并覆盖约 100 种语言。它以非对称方式对查询和文档进行编码查询使用retrieval.query任务而文档使用retrieval.passage。这两个模型之间存在一个重要的功能差异jina-clip-v2实际上是两个独立训练并协同工作的模型而jina-embeddings-v5-omni-small使用一个共享的骨干网络为它支持的所有媒体类型生成 embeddings。所有模态都会映射到同一个共享向量空间。从理论上讲它能够处理文本、图片、音频或视频也能够将不同媒体类型的内容组合为一个输入并生成一个涵盖所有数据的 embedding。不过在使用jina-embeddings-v5-omni-small时有两个重要的注意事项将图片和文本组合到同一个输入中是该模型已知的一个弱点此外Jina API 每次请求只允许用户对一种模态生成 embedding。从理论上讲它能够创建联合的图片和文本向量但在实际使用中你无法通过 API 实现这一点而且无论如何也不建议这样做。我们使用的电子商务产品数据集在本文中我们下载了 Kaggle 上的Fashion Product Images数据集。该数据集包含约 44,000 条来自真实时尚零售商的产品目录记录每条记录都包含一张高分辨率图片和结构化元数据。我们仅使用了Apparel服装和Footwear鞋类两个类别约 30,600 个产品并使用固定的随机种子从中抽样了 5,000 个产品。对于每个产品数据集包含三类记录每个产品都有一张 1800×2400 的 JPEG 图片背景干净简洁。元数据包含gender、masterCategory、subCategory、articleType、baseColour、season、year、usage和productDisplayName等标签。一组附加信息包含Neckline、Pattern、Sleeve Length、Fit和Fabric等标签以及一段英文自由文本描述。例如编号为 #13885 的商品标注为“Scullers Men Check Black Shirts”附带一张产品图片见下图以及如下描述“黑白格纹衬衫由 100% 棉制成全长纽扣门襟长袖纽扣袖口。”我们如何生成搜索查询我们生成测试查询时没有使用 AI语言模型而是使用规则和替换列表。对于每个产品我们从它的颜色和商品类型开始然后从产品可用的元数据中随机添加一个描述性修饰词领口、图案、袖长、长度、表面样式、版型、面料、季节或用途。之后我们通过从固定的同义词表中替换词语对查询进行改写。这样可以避免生成重复使用目录自身词语的查询。例如″t-shirt″会变成 ″tee″″regular fit″会变成 ″classic cut″″printed″会变成 ″with graphic design″″sleeveless″会变成 ″no sleeves″。替换时会优先替换包含同义词的最长短语因此我们会替换″sports shoes″而不是仅替换″shoes″。由于该流程基于规则并使用固定随机种子因此查询生成过程具有可复现性并且所有变化都会被考虑在内。德语查询也使用相同方式生成只是使用德语词汇表然后由母语者对其进行修正使其符合自然的零售表达方式。一些示例# usage / occasion in casual style: for everyday wear, in formal style: for the office, in sports style: for working out, in ethnic style: in traditional wear, in party style: for a night out# article types t-shirt: tee, trousers: pants, sweatshirt: pullover, sweater: knit pullover, kurta: tunic, capris: cropped pants, track pants: joggers, innerwear vest: undershirt, briefs: underwear # colours (safe near-equivalents) navy blue: dark blue, off white: cream, maroon: deep red,德语查询使用了它们自己的术语表将相同的目录属性映射为自然的德语零售表达方式之后由母语者进行检查。一些示例我们测试的六种 embedding 配置我们在六种配置下测试了检索每个测试条件都使用相同的文本查询并使用相同的 5,000 个产品索引数据集。对于jina-clip-v2和jina-embeddings-v5-omni-small我们测试了三种不同的生成 embedding 用于索引的方法仅图片。我们仅使用图片生成 embeddings不包含任何其他数据。仅文本。我们仅使用自由文本描述生成 embeddings。图片和文本平均值。对于每个产品我们分别为图片和文本描述生成 embeddings然后将两个向量进行平均合成为一个向量。我们使用 Jina API 为产品图片和自由文本描述生成文档和查询 embeddings如下面的代码所示。所有图片在处理之前都会调整大小以适配 512x512 像素的正方形尺寸。import requests def embed(inputs, model, taskNone): body {model: model, input: inputs} if task: body[task] task response requests.post( https://api.jina.ai/v1/embeddings, headers{Authorization: fBearer {JINA_API_KEY}}, jsonbody, timeout120, ) response.raise_for_status() return [d[embedding] for d in response.json()[data]] # Query example using text query_vec embed([{text: T-Shirt in Grau für den Herbst}], jina-embeddings-v5-omni-small, taskretrieval.query) # Document example using an image. # image_base64 is the resized and base64 encoded PNG. image_vec embed([{image: image_base64}], jina-embeddings-v5-omni-small, taskretrieval.passage)我们通过分别对图片和文本生成 embedding然后将两个向量取平均最后对结果进行归一化来组合图片和文本这样可以加速计算余弦相似度。由于两种 embedding 共享同一个语义空间因此这种方法适用于多模态模型。两个向量的和会形成一个新的向量其中包含两者的语义特征。使用 Python 中的 numpy 包可以非常轻松地完成这一操作。我们使用了下面的代码import numpy as np def l2(x): # includes row-wise L2 normalization return x / np.linalg.norm(x, axis1, keepdimsTrue) # image_vecs and text_vecs are embeddings of the same products. # They share one space, so averaging them is meaningful. combined l2((l2(image_vecs) l2(text_vecs)) / 2)对于本文我们进行了精确检索计算查询与所有 5,000 个存储产品 embeddings 之间的余弦相似度。在Elasticsearch中我们会使用一种近似方法来获得相同的结果。从排序后的结果中我们计算了 Recall1、Recall5、Recall10、平均倒数排名MRR以及位置 10 的归一化折损累计增益nDCG10。每个查询都只有一个正确答案因此RecallK表示正确产品出现在前 K 个结果中的查询所占比例。MRR 根据正确答案距离顶部结果的位置远近对结果进行评分。nDCG10 是一种标准指标它会惩罚将最佳答案放在结果列表较低位置的情况。产品搜索基准测试结果下面的表格展示的是德语跨语言测试结果。我们评估了使用德语查询查找具有英文描述的产品的效果使用德语文本查询以及服装图片和英文描述对jina-clip-v2和jina-embeddings-v5-omni-small进行查询基准测试的结果。无论使用jina-clip-v2还是jina-embeddings-v5-omni-small图片/文本平均 embeddings 都取得了最佳效果。令人意外的是来自jina-clip-v2的平均向量位列表现最佳。它将正确产品排在第一位的频率约为仅使用图片配置的 1.5 倍并且明显高于仅使用文本配置的结果。此外它还超过了jina-embeddings-v5-omni-small的所有测试条件。以下是使用英语查询进行相同测试的结果使用英语文本查询以及服装图片和英文描述对jina-clip-v2和jina-embeddings-v5-omni-small进行查询基准测试的结果。在相同的 5,000 个产品上进行的英语测试得出了相同的结论。主要区别在于jina-embeddings-v5-omni-small的得分明显更接近jina-clip-v2尽管仍然低于它。基准测试分数实际代表什么上面德语和英语基准测试表中的相对较低分数是可以预期的。这是一个真实世界的数据集其中充满了高度相似的产品。例如搜索 “black tee with classic cut/经典剪裁的黑色 T 恤” 时需要在几十件基础款黑色 T 恤中进行排序即使是在最佳的电子商务网站上也会预期出现类似结果。重要的是理解不同测试条件之间的分数差异而不是它们的绝对值。我们的关键发现是将文本和图片 embeddings 结合起来比单独使用其中任何一种都有更好的性能这突出了由多模态 AI 驱动的搜索如何利用不同的信息来源比非多模态策略产生更好的性能。当一张图片胜过千言万语以及什么时候不是这样将图片添加到文本 embeddings 中带来的收益并不是均匀分布的。我们深入分析了结果查看是否存在某种规律并发现了以下几点图片对于视觉上具有明显特征的商品和属性帮助很大。例如在鞋类产品中仅图片检索的效果与仅文本检索相当Recall1 分别为 0.029 和 0.028。鞋子的款式具有明显的形状特征因此图片可以发挥作用仅图片 0.029对比文本 0.028。对于更广泛的可见属性颜色、图案、袖长也是如此在这些情况下融合图片和文本相比仅使用文本带来了最大的提升0.085 对比 0.073。图片对于模型无法观察到的内容帮助最小。例如如果我们查询面料类型将图片加入 embeddings 几乎没有带来任何提升。人类和 AI 模型都难以判断某件商品是否由亚麻、聚酯或其他类型的面料制成。这些信息只存在于文本描述和元数据中。作为经验法则我们发现服装搜索更依赖准确的文本描述而鞋类搜索更依赖图片的语义。但在这两种情况下合并两个 embeddings 要么提升结果要么不会使结果变差。这说明具体使用场景的特点决定了最佳搜索策略。跨语言查询从多模态 embeddings 中获得巨大收益使用jina-clip-v2时仅文本 embeddings 与图片和文本组合 embeddings 之间的性能差距在德语查询中Recall1 为 0.074 对比 0.065明显大于英语查询0.076 对比 0.075。这意味着英语查询可以利用与产品描述相同语言带来的优势。无论这是因为词语之间存在重叠还是因为模型在单语言语义理解方面比跨语言理解更强都不重要。但将图片加入文本 embeddings几乎完全弥补了模型在跨语言检索方面的不足。对于jina-embeddings-v5-omni-small这个差距甚至更大。在任何跨语言或多语言场景中多模态 embeddings 似乎都能够显著提升检索性能。AI 生成的产品描述可以替代人工描述吗在我们的测试中AI 生成的描述得分低于人工编写的描述。我们尝试使用基于图片生成描述的jina-vlm替换人工编写的产品描述。在这个测试中我们使用了随机抽取的 1,000 个产品子集。结果明显比原始人工文本差。这符合我们的预期自动生成的描述准确性较低并且不像人工编写的描述那样关注产品的重要特征。所以事实证明并不是所有人的工作都可以被 AI 替代。现在为产品目录撰写描述的人应该还是安全的。你应该如何索引你的电子商务数据我们的测试并不完全符合严格的科学标准但它们确实提供了一些关于如果你拥有类似数据时可能遇到的问题的洞察。我们提出以下作为暂定结论如果你拥有匹配的文本和图片大多数目录都拥有请将它们组合到你的 embeddings 中。在所有情况下使用 Elastic 提供的类似 Jina AI 的多模态embedding 模型然后对图片和文本 embeddings 进行平均都明显优于其他所有方案。这种组合不会增加推理时的计算成本但会在生成 embedding 时产生额外成本。对于每个产品你需要生成两个 embeddings 并将它们组合这大约会使成本增加一倍。使用正确的模型。你需要确定一个支持你计划使用的所有模态和语言的模型。所有输入必须被嵌入到同一个语义向量空间中否则这一切都无法工作。你不能使用两个单模态模型或多个特定语言的文本模型然后对它们的输出取平均并希望获得最佳结果。Elastic 提供的 Jina AI 当前支持最多 100 种语言的文本包括计算机代码和技术术语支持各种类型的图片例如扫描件和信息图以及音频和视频数据。你之后可以改变模型选择但前提是你愿意重新索引所有数据。无论你选择什么都要在自己的数据上进行测试。想知道对于你、你的数据和你的使用场景来说最佳模型是什么唯一方法就是实际尝试。我们非常惊讶于在这个数据集中较旧的 CLIP 风格模型击败了最新模型但这是因为它几乎就是针对这个使用场景训练的。你的数据和使用场景很容易得出相反的结果。这个结果来自一个目录、一种摄影风格以及一种查询类型。如果领域、图片风格或查询组合不同两个模型之间的排名可能会发生变化。在做出最终选择之前请在你自己的产品样本上运行类似的基准测试。这是唯一能知道哪个模型真正适合你的方法。使用生成的描述来填补缺失而不是替代优秀的文本。AI 不是替代认真工作的人所创造的高质量内容的工具。用机器生成的描述替换人工描述会导致结果变差。只有在必须使用 AI 时例如数据缺失、需要补充数据并且让人工填补这些空白不现实的情况下才应该让 AI 替代人工。是的我们有适用于这些场景的工具但它们并不一定是好的替代品。有时它们只是还可以的替代品。对你的 embeddings 取平均。语义 embeddings 非常稳定而对它们取平均是一种成本相对较低的解决方案并且完全不会影响推理阶段的成本。这相比于分别索引每种模态、并且需要多次查询才能满足单个请求的方法是一个真正的优势。但它确实要求使用兼容的多模态模型。这个产品搜索基准测试的限制在从这个实验中进行过度推广之前需要注意以下几点这篇文章并不能完全匹配真实世界的使用场景。真实用户会提出更加混乱的查询并且具有更加模糊的匹配标准。我们使用的查询是专门为这些数据生成的。如果使用系统日志中的真实客户查询进行测试会更加合理。embedding 平均值并不等同于真正的联合 embedding。Embedding 模型依靠输入不同部分之间的交互来提取整体语义表示。本文使用的方法有一点取巧它依赖语义 embedding 空间的稳定特性来完成任务。我们预计未来 Jina AI 的模型将通过一次支持多个输入模态生成更好的 embeddings。这是一个单一领域中的单个数据集并且具有明显特征。时尚摄影通常高度聚焦主体而描述中包含丰富的属性信息。其他类型的材料即使是在电子商务领域也可能完全不同。尽可能使用你自己的数据或者非常相似的数据进行测试非常重要。如何开始使用多模态产品搜索 embeddingsjina-clip-v2和jina-embeddings-v5-omni-small可以通过 Jina API、Elastic Inference Service]EIS以及 Hugging Face 获取。Omni 模型可以在 CC-BY-NC-4.0 许可证下免费下载并且可以免费用于非商业用途商业许可则通过 Elastic 提供。如果你使用 ElasticsearchEIS 会通过semantic_text字段类型提供这两个模型并支持使用 Base64 编码表示非文本媒体。本文的核心结论旨在实用且可执行对于产品搜索图片和它的描述并不是相同的信息信号。两者都会提供额外信息你不必二选一。对你的多模态 embeddings 取平均并使用你自己的数据进行基准测试从而了解你可以期待获得什么类型的结果。原文Multimodal embeddings for ecommerce product search - Elasticsearch Labs