搜索引擎AI 应用后端电商NLP【免费下载链接】marqoEcommerce Search and Discovery - marqo.ai项目地址https://gitcode.com/gh_mirrors/ma/marqo点击查看免费下载导读本文以 Marqo 仓库中的 MultiModalSearch 示例 为核心骨架系统讲解如何在电商场景下用 Marqo 同时以文本与图片进行多模态检索包括多部件查询、负向加权negation、以图搜图、语义过滤、提示式搜索searching as prompting、基于上下文向量的个性化重排以及结合score_modifiers引入文档级标量信号如美学评分、销量参与排序。读完本文你将掌握从数据加载、索引创建、文档灌入到十余种检索玩法的一整套可运行方案并理解这些能力在 Marqo 源码层的实现依据。1. 什么是多模态搜索多模态搜索Multimodal Search指检索过程同时作用于多种模态modality的数据。电商场景中一件商品往往同时拥有标题、描述文字和多张展示图片衣服、背包这类商品尤其如此。图片中可能包含互补信息——比如同时出现裤子和上衣时文字能帮助模型判断真正的主体是什么。把图片与文字一起纳入检索不仅能提升相关性还能解锁全新的检索方式。从实现角度看多模态搜索可分为两类多模态查询Multimodal Query查询本身由文本和/或图片共同构成通过加权组合参与相似度打分。多模态文档Multimodal Document被检索的文档本身由多个模态字段组合而成例如多张展示图加标题、描述。虽然本文以文本和图片两种模态为例这套思路同样可以扩展到视频、音频等模态。Marqo 官方示例仓库的 演示动图 直观展示了用图片加文本组合查询来策划搜索结果的过程。1.1 多模态搜索的核心收益Marqo 的多模态方案带来以下实际收益互补信息利用文档的多模态表示可以同时捕捉文本与图片中各自缺失的信息检索不再局限于单一模态。元数据可更新无需重新训练模型或大规模重索引即可通过编辑文档的多模态元数据来更新表示。相关性反馈可在文档级别轻松引入 relevance feedback改善或调整结果。按查询个性化通过给查询附加上下文实现按查询粒度per-query的结果策划与个性化无需额外模型或微调。自然语言策划可以用自然语言进行结果策划并将业务逻辑如排除低质量图直接写进查询。2. 多模态搜索的实战玩法本节逐一演示如何用多模态查询改善与策划搜索结果每种玩法均可在真实数据上复现。2.1 多部件查询多模态查询多模态查询由多个部件和/或多种模态组成本质上是修改近似 kNN 的打分函数让它同时考虑多个图片或文本图片的相似度。打分对象从一段文本变成一组带权重的项从而比单部件查询更精细地策划结果。在 Marqo 中查询可以写成字典每个键是查询项、值是该部件的权重query {green shirt:1.0, short sleeves:1.0}这种多部件查询可以理解为一种手动的查询扩展query expansion——用绿色衬衫和短袖两个概念同时约束结果起到软过滤或语义过滤的作用。2.2 负向加权Negation正向部件把结果拉向某些概念负权部件则把结果推离某些概念query {green shirt:1.0, short sleeves:1.0, buttons:-1.0}上面的查询同时被绿色衬衫短袖吸引、被纽扣buttons排斥。Marqo 的查询验证逻辑位于 tensor_search.py搜索前会对查询与 limit/offset 做合法性校验负权项参与向量相似度计算后会在排序层面压低含该概念的文档。2.3 排除低质量图片负向加权最常见的业务场景之一是用自然语言排除低质量图片或 NSFW 内容query {yellow handbag:1.0, lowres, blurry, low quality:-1.1}负权越大排斥越强此处-1.1的幅度略高于普通负项。同时也可以用正权主动检索低质量图片用于清洗存量数据——同一查询既能避免坏结果也能定位坏数据。2.4 以图搜图Searching with Images图片可以单独作为查询项利用图像相似度找到外观相近的商品query {image_url:1.0}也可以像文本一样自然地扩展为多模态组合query {image_url:1.0, RED:1.0}即先用一张图找到相似款再用自然语言RED进一步细化。Marqo 在索引设置中通过treatUrlsAndPointersAsImages新版本为treatUrlsAndPointersAsMedia把 URL/文件指针当作图片处理其校验逻辑见 index_settings.py。2.5 基于热门/喜爱商品的条件搜索Relevance Feedback把一组历史喜欢或购买过的商品编码成查询上下文可以让检索结果朝这些商品的方向倾斜实现按查询粒度的个性化。这可以看作一种使用商品而非查询词变体的 相关性反馈Rocchio algorithm。为避免查询时引入额外推理开销可以预计算这组商品的向量融合成一个上下文向量context vectorquery {backpack:1.0} context_vector1 [.1, ..., -.8] # 第一组商品的融合向量 context_vector2 [-.01, ..., .3] # 第二组商品的融合向量每组中每个商品的贡献权重可以按流行度调整下文 3.13 节给出完整实现。2.6 提示式搜索Searching as Prompting除了构造多部件查询还可以把特定风格或特征直接追加到查询末尾这与文生图模型如 DALLE、Stable Diffusion中的 prompting 思路一致query {handbag, bold colors, vibrant:1.0}再例如圣诞/假日风格query {cozy sweater, xmas, festive, holidays:1.0}提示词越长、越具体结果策划越精细这类查询在 index_and_search.py 中有对应实现。2.7 用其他信号参与排序Score Modifiers除向量相似度外还可以用文档自身的标量字段来乘或加到相似度分数上让流行度等文档级信号影响排名。下面的查询先按纯相似度返回结果query {yellow handbag:1.0}假设每个文档都有一个取值范围 1–10 的aesthetic_score美学评分可以用add_to_score把该字段加权加入得分query {yellow handbag:1.0} score_modifiers { add_to_score: [ {field_name: aesthetic_score, weight: 0.02}] }加入后低美学评分的低质量图片会被自然排后。Marqo 的score_modifiers支持multiply_score_by与add_to_score两类操作模型定义在 score_modifiers_object.py底层会转换为 score_modifier.py 中的ScoreModifierType.Multiply/ScoreModifierType.Add类型参与 Vespa 打分校验规则要求两者至少提供其一、字段名不能是_id。2.8 多模态实体Multimodal Entities多模态实体把多张图片与文字组合成一个检索单位。电商中常用多张展示图帮助消歧区分在售商品与图片中的其他物品。若使用 CLIP 这类多模态模型不同模态因共享同一向量空间latent space可以直接联合使用document {combined_text_image: { image1:https://some_image1.png, image2:https://some_image2.png, image3:https://some_image3.png, title: Fresh and Versatile: The Green Cotton T-Shirt for Effortless Style description: Crafted from high-quality cotton fabric, this t-shirt offers a soft and breathable feel, ensuring all-day comfort. } }注意Marqo 中组合多个字段需要借助mappings对象multimodal_combination类型详见 3.13、3.14 节示例仓库 multim.png 展示了多字段文档的示意。3. 完整实战示例含代码本节基于 index_and_search.py 端到端复现上述所有能力。3.1 数据集示例使用约 220,000 条电商商品数据含图片、文本与元数据品类覆盖服装、手表、包、背包、钱包等。除图片外每条数据还带aesthetic_score、blip_large_caption与价格字段。文中示例取前 100 条运行N 100完整数据集约 220k 条。3.2 安装与启动 Marqo首先从终端启动 MarqoDockerdocker pull marqoai/marqo:latest docker rm -f marqo docker run --name marqo -it -p 8882:8882 --add-host host.docker.internal:host-gateway marqoai/marqo:latest随后安装 Python 客户端Marqo 同时提供 REST APIpip install marqo3.3 加载数据图片托管在 S3 上元数据含图片指针从 CSV 读取import pandas as pd N 100 # samples to use, the full dataset is ~220k filename https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce_meta_data.csv data pd.read_csv(filename, nrowsN) data[_id] data[s3_http] documents data[[s3_http, _id, price, blip_large_caption, aesthetic_score]].to_dict(orientrecords)注意此处以s3_http作为文档_id与图片字段aesthetic_score是后续排序实验要用的标量字段。3.4 创建索引推荐使用 OpenCLIP 的ViT-L-14laion2b_s32b_b82k作为编码模型效果较好建议至少 4GB 显存的 GPU若无 GPU 可换用更小的模型效果可能略降。from marqo import Client client Client() index_name multimodal settings { treatUrlsAndPointersAsImages: True, model: open_clip/ViT-L-14/laion2b_s32b_b82k, normalizeEmbeddings: True, } response client.create_index(index_name, settings_dictsettings)参数说明treatUrlsAndPointersAsImages把 URL/指针字段当作图片处理Marqo 的新版本以treatUrlsAndPointersAsMedia取代并推荐使用treatUrlsAndPointersAsImages会触发弃用警告且不能与treatUrlsAndPointersAsMediaTrue冲突见 index_settings.py该参数仅适用于非结构化索引。normalizeEmbeddings是否归一化嵌入向量默认True影响余弦相似度打分的数值范围。model编码模型名完整模型列表可查看仓库中的模型注册与配置。3.5 向索引添加图片device cpu # use cuda if a GPU is available res client.index(index_name).add_documents(documents, client_batch_size64, tensor_fields[s3_http], devicedevice)tensor_fields[s3_http]指定需要向量化的字段此处只嵌入图片字段。client_batch_size64客户端分批灌入文档。device有 GPU 时改为cuda。3.6 基础搜索query green shirt res client.index(index_name).search(query, devicedevice, limit10)3.7 提示式搜索query cozy sweater, xmas, festive, holidays res client.index(index_name).search(query, devicedevice, limit10)3.8 语义过滤多部件查询query {green shirt:1.0, short sleeves:1.0} res client.index(index_name).search(query, devicedevice, limit10)3.9 负向加权query {green shirt:1.0, short sleeves:1.0, buttons:-1.0} res client.index(index_name).search(query, devicedevice, limit10)这里去除长袖衬衫示例中的纽扣。3.10 以图搜图image_context_url https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/red_backpack.jpg query {image_context_url:1.0} res client.index(index_name).search(query, devicedevice, limit10)3.11 文本图片的多模态查询# skateboard滑板 image_context_url https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/71iPk9lfhML._SL1500_.jpg query {backpack:1.0, image_context_url:1.0} res client.index(index_name).search(query, devicedevice, limit10) # trees/hiking森林/徒步 image_context_url https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/trees.jpg query {backpack:1.0, image_context_url:1.0} res client.index(index_name).search(query, devicedevice, limit10)同一个 backpack 搭配不同图片上下文检索结果会被分别导向滑板场景与户外徒步场景。3.12 用文档级信号参与排名query {yellow handbag:1.0} # we define the extra document specific data to use for ranking # multiple fields can be used to multiply or add to the vector similarity score score_modifiers { add_to_score: [ {field_name: aesthetic_score, weight: 0.02}] } res client.index(index_name).search(query, devicedevice, limit10, score_modifiersscore_modifiers) # now get the aggregate aesthetic score print(sum(r[aesthetic_score] for r in res[hits])) # and compare to the non ranking version res client.index(index_name).search(query, devicedevice, limit10) print(sum(r[aesthetic_score] for r in res[hits]))对比两次查询返回 10 条结果的aesthetic_score总和可以量化排序偏置带来的美学质量提升。score_modifiers中的字段可以同时用多个也可用multiply_score_by做乘法式偏置其校验与转换实现见 score_modifiers_object.py。3.13 基于热门/喜爱商品的条件搜索上下文向量分两阶段实现先预计算上下文向量一组商品的浓缩表示再在查询时使用。第一步创建专用上下文索引# we create another index to create a context vector index_name_context multimodal-context settings { treatUrlsAndPointersAsImages: True, model: open_clip/ViT-L-14/laion2b_s32b_b82k, normalizeEmbeddings: True, } res client.create_index(index_name_context, settings_dictsettings)第二步构造两组商品的文档# create the document that will be created from multiple images document1 {_id: 1, top_1: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/blue_backpack.jpg, top_2: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/dark_backpack.jpeg, top_3: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/green_backpack.jpg, top_4: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/red_backpack.jpg } # create the document that will be created from multiple images document2 {_id: 2, top_1: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/office_1.jpg, top_2: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/office2.webp, top_3: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/office_3.jpeg, top_4: https://marqo-overall-demo-assets.s3.us-west-2.amazonaws.com/ecommerce/office_4.jpg }第三步定义映射并灌入mappings决定多个字段如何组合成一个多模态表示type: multimodal_combinationweights定义各字段的融合权重# define how we want to combine mappings1 {multimodal: {type: multimodal_combination, weights: {top_1: 0.40, top_2: 0.30, top_3: 0.20, top_4: 0.10, }}} # define how we want to combine mappings2 {multimodal: {type: multimodal_combination, weights: {top_1: 0.25, top_2: 0.25, top_3: 0.25, top_4: 0.25, }}} # index the document res client.index(index_name_context).add_documents([document1], tensor_fields[multimodal], devicedevice, mappingsmappings1) # index the other using a different mappings res client.index(index_name_context).add_documents([document2], tensor_fields[multimodal], devicedevice, mappingsmappings2)mappings1偏向第一张图top_1权重 0.40mappings2四张图均分各 0.25。multimodal_combination类型及其权重校验定义在 mappings_object.py对应枚举见 enums.py。第四步取出向量构造查询上下文# retrieve the embedding to use as a context for search indexed_documents client.index(index_name_context).get_documents([document1[_id], document2[_id]] , expose_facetsTrue) # get the embedding context_vector1 indexed_documents[results][0][_tensor_facets][0][_embedding] context_vector2 indexed_documents[results][1][_tensor_facets][0][_embedding] # create the context for the search context1 {tensor: [ {vector:context_vector1, weight:0.50} ] } # create the context for the search context2 {tensor: [ {vector:context_vector2, weight:0.50} ] } # now search query {backpack:1.0} res1 client.index(index_name).search(query, devicedevice, limit10, contextcontext1) res2 client.index(index_name).search(query, devicedevice, limit10, contextcontext2)查询时通过context参数注入预计算的张量向量权重 0.50 控制上下文对最终打分的贡献幅度。SearchContext的完整结构tensor与documents两种形式其中tensor限制 1–64 个向量且二者至少提供其一定义在 search.pySearchQuery中对 query 与 context 的联合校验见 api_models.py。3.14 将多模态对象作为文档灌入最后演示文本图片组合成一个实体进行检索。# we will create a new index for the multimodal objects index_name_mm_objects multimodal-objects settings { treatUrlsAndPointersAsImages: True, model: open_clip/ViT-L-14/laion2b_s32b_b82k, normalizeEmbeddings: True, } res client.create_index(index_name_mm_objects, settings_dictsettings)索引时除tensor_fields外用mappings指定图片s3_http与文本blip_large_caption的融合比例# the fields we do not want to embed non_tensor_fields [_id, price, blip_large_caption, aesthetic_score, s3_http] # define how we want to combine the fields mappings {multimodal: {type: multimodal_combination, weights: {blip_large_caption: 0.20, s3_http: 0.80, } } } # now index res client.index(index_name_mm_objects).add_documents(documents, client_batch_size64, tensor_fields[multimodal], devicedevice, mappingsmappings)此处图片占 0.80、描述文字占 0.20图片主导多模态表示。搜索与前面完全一致query red shawl res client.index(index_name_mm_objects).search(query, devicedevice, limit10)从源码看灌入文档时的mappings参数由 add_docs_params.py 接收处理多模态字段组合multimodal_combination并在 utils.py 中通过extract_multimodal_mappings与extract_multimodal_content抽取映射与字段内容后送入向量化流程。4. 总结通过 Marqo 可以方便地把向量搜索改造成功能丰富的多模态检索系统文本图片的多模态查询、负向加权、排除低质量图片、以图搜图、用热门/喜爱商品做查询级个性化、提示式搜索、用外部标量参与排名以及文本图片的多模态实体表示。所有这些能力都可以直接在电商等高图片密度场景落地相关可运行代码见 index_and_search.py更多示例可浏览仓库的 examples 目录 与 Marqo 官方博客。赞分享搜索引擎AI 应用后端电商NLP【免费下载链接】marqoEcommerce Search and Discovery - marqo.ai项目地址https://gitcode.com/gh_mirrors/ma/marqo点击查看免费下载相关推荐突破模态壁垒Milvus多模态向量检索实战指南突破模态壁垒Milvus多模态向量检索实战指南 你还在为跨模态数据检索烦恼吗当文本、图像、视频等异构数据涌向AI系统传统数据库早已力不从心。本文将带你掌握数据库向量数据库分布式数据库后端打破模态壁垒Qdrant多模态向量检索实战指南打破模态壁垒Qdrant多模态向量检索实战指南 你是否还在为文本、图像、音频数据的统一检索而烦恼传统数据库只能处理单一类型数据而Qdrant向量数据库通过向量数据库数据库后端搜索引擎LanceDB Node.js 多向量搜索理解 MultiVector 类型别名与多向量查询实战LanceDB Node.js 多向量搜索理解 MultiVector 类型别名与多向量查询实战 MultiVector 是 lancedb/lancedb数据库向量数据库全文检索人工智能上一篇告别DeprecatedCropper.js实战指南从废弃插件到现代图片裁剪解决方案下一篇终极指南shadcn-vue组合式函数提取组件逻辑的10个最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考