☰
多模态搜索推理开源模型MARS:先检索再推理的技术解读与落地实践
2026/10/20 2:21:09 网站建设 项目流程

在开源社区逛到一个代号MARS的项目时,我的第一反应是:终于有人把多模态搜索推理这两个能力揉进一个开源模型里了。过去我的工作里经常遇到这样的尴尬——一个文本检索模型能搜出所有包含"篮球"的文档,但它并不理解"户外篮球"和"室内篮球"的区别;一个多模态大模型能把图片描述得头头是道,但如果让它从一千张图中找出"所有戴帽子的人",它往往给不出可核验的索引结果。MARS这个项目想做的,就是把"先找到证据"和"再根据证据回答问题"变成一条完整的、可训练、可调优的链路。对正在做多模态RAG、商品搜索、文档智能化的开发者来说,这套东西值得花一个下午好好拆一遍。它适合三类人:一类是想给检索系统加上理解能力的后端工程师,一类是在做图文混合知识库的算法工程师,还有一类是想搞明白多模态推理边界的研究生。下面我不吹不黑,只聊从模型设计、开源代码到实际部署中看到的真实情况。

1. 多模态搜索推理为什么难?先拆开这块硬骨头的结构

1.1 搜索与推理各自都成熟了,却始终捏不到一起

传统搜索系统擅长"匹配",不擅长"理解"。双塔模型把图文映射到同一向量空间,用余弦相似度排序,能解决"以文搜图"、"以图搜文",但这个能力本质上是把图片变成一堆数字,再算距离。它没有对图片内容进行真正的场景推理,比如"这张图里的人是在参加马拉松还是在晨跑",它判断不了。

多模态大模型则相反,它能流畅地描述场景、回答开放式问题,但缺乏细粒度的证据引用。你说"找出那张有红色屋顶和蓝色门的房子",模型可能凭训练时的统计偏好说"左边第二张",而这个结论并没有经过系统的相似度比对。这两种能力各管一段,中间有一条很宽的裂缝。

MARS的设计出发点正是这条裂缝:让模型在生成回答之前,先通过一个显式的检索模块从候选集里取回相关证据,再基于证据做推理。用生活化的话说,普通大模型是闭卷考试,MARS是开卷考试,而且它自己知道该翻哪一页。

1.2 三个天花板级的场景,到底难在哪

为说清楚这个"天花板"到底高在哪,我拿三类任务来举例。

第一类是属性精确检索。查询词是"穿红色连衣裙的女孩在沙滩上奔跑"。传统双塔模型可能把"红色""沙滩"都编码进一个向量,语义相近的图会一起浮上来,但精确到"连衣裙"而不是"T恤",往往要靠运气。只要候选集中存在"红T恤女孩在沙滩"的干扰图,简单向量检索的排序就会失真。

第二类是跨图多跳推理。比如"图中有几个人戴帽子?帽子颜色有几种?"这个查询要求先在候选集里找出所有戴帽子的人,再去判断颜色。没有显式检索步骤的模型很容易漏掉其中一张图,然后给出一个看起来合理但错误的数字。这个错误不是生成能力不行,而是证据采集环节缺失。

第三类是证据可解释性。业务场景里我们经常需要模型在回答之后还能指出"我是依据哪张图得出这个结论的"。传统端到端大模型做不到,MARS因为检索头是显式的,至少能返回命中的图片路径和相似度分数,这对排查线上问题非常关键。这三个场景,恰好对应检索精度、多跳推理、结果可解释三项能力,也是MARS对外展示时重点强调的指标方向。

1.3 为什么"先检索再推理"不是简单的模块拼接

有人会说,那我用一个双塔检索模型召回top-k候选,再丢给多模态大模型问答,不也能实现吗?确实可以,但这个拼装管线有先天缺陷:检索模块是固定的,它的排序目标只考虑"相似度",不考虑"下游问答是否需要这个证据",误差会在两条独立训练出的模块之间累积。

MARS的训练方式把检索和推理放进同一个损失函数。训练时,模型会看到真实证据和错误证据的对比,学会在检索阶段就给推理阶段创造更有利的输入分布。这听起来只是训练技巧差异,实际效果差距却很大:在候选集很大的时候,固定检索器的误差会被逐级放大,而联合训练的模型会主动修正检索权重。

这个"为什么不能简单拼接"的判断,直接影响你是否值得引入MARS——如果你的场景只需要简单的图文互搜,成熟双塔模型就够了;如果你需要"搜索+问答+引用"一体的能力,那双塔加生成大模型的胶水方案大概率会卡在误差累积上。

2. 拆开MARS的模型结构:检索增强如何落到多模态上

2.1 整体数据流:从图像到答案的四步链路

MARS的推理链路可以概括为四步:图像与查询编码、跨模态对齐、候选证据检索、证据驱动的答案生成。

第一步,视觉编码器把输入图片切成patch并提取局部特征,同时生成一个全局特征。文本编码器把查询语句变成序列特征。第二步,跨模态融合层把图像特征和文本特征映射到统一空间,这一步决定了"红色连衣裙"能否正确对应到图像的局部区域。第三步,检索头把查询特征与索引库中的图像特征做相似度比较,返回top-k候选。第四步,生成头把候选图像的特征拼接成上下文,再与原始问题一起交给推理模块,逐token生成答案。

这里值得注意的设计是,视觉特征不只用全局向量,还保留了patch级特征。这就像一个人回忆画面时,不但记得"这是一张沙滩照片",还记得"左下角有红色物体"。patch级特征让模型能做局部匹配,这对"裙子的颜色""帽子的数量"这类细粒度问题很关键。

2.2 训练分两步:先教会对齐,再教会用证据

第一阶段是对齐预训练。主要利用大规模图文对做对比学习:匹配的图文对距离拉近,不匹配的拉远。同时,模型还要学习局部的细粒度对齐,比如文本中的"红色连衣裙"对应到图像里的某个区域,这为后续精确检索打下基础。

第二阶段是检索推理微调。官方构造了大量"查询-候选集合-答案"三元组,训练时模型先对候选集合执行检索,拿到结果后拼接进prompt,再生成标注答案。更关键的是,训练中会故意混入若干不相关候选,让模型学会抵抗噪声证据。这个阶段本质上是教模型两件事:一是信任检索结果,二是当检索结果不可靠时不要强行编造。

很多开源项目只发布推理权重,不发布训练细节。MARS把这两个阶段的设计思路写得很明白,这点值得肯定。它让想在自己领域微调的人不用从零摸索,也让我们这些做业务的人能判断它到底是"效果来自架构"还是"效果来自数据"。

2.3 与普通RAG方案的差异:不是"先搜后聊",而是"边搜边想"

普通RAG是pipeline式的:外部数据库 → 召回到相关文本 → 拼接进prompt → 大模型读一遍生成回答。这个流程里,检索和生成是两个割裂的子系统,检索排第一位的证据不一定是对生成最有利的证据。

MARS的做法是把检索目标作为一个可学习的中间变量。在训练阶段,模型通过对比损失被引导去"检索那些让后续推理更容易成功的证据",相当于检索器和生成器共享同一个目标函数的一部分梯度。推理时,它表现出的行为就是"边搜边想":先快速定位候选,再在这些候选上进行推理,必要时还能调整证据权重。

这个差异的实用价值在于:当你替换检索库或换一个垂直领域时,普通RAG往往需要重新调优召回阈值和prompt模板,MARS则可以通过微调让模型自动适应新证据分布。当然,代价是训练成本和部署复杂度更高,这个取舍需要根据业务体量来判断。

3. 在单卡上把MARS跑起来:环境、权重与推理实测

3.1 硬件与依赖清单

先泼一盆冷水:MARS不是一个轻量级模型,但也不需要超算。我实测的结论是,模型分为base和large两档。base档位的视觉编码器加生成头,大约需要14GB显存,在一张24GB的消费级显卡上可以稳定跑检索和短回答生成;large档位融合更大的生成模型,单卡推理会吃力,建议用双卡。

依赖方面,运行官方示例只需要Python 3.10以上、主流深度学习框架、以及图像处理相关的几个标准库。官方仓库提供了环境依赖文件,里面把版本锁得比较死,如果你用的是新版本框架,建议直接按照仓库的依赖列表建一个干净环境,省得踩版本冲突的坑。

下表是我在自己机器上测试的参考配置:

配置档位显存占用索引库规模单次检索延迟适用场景
base约14GB5万图以下20-50ms个人实验、小规模Demo
large约28GB50万图以下80-150ms服务化部署、中等规模检索
双卡large约28GB+4GB百万图以上200ms以内生产环境、视频帧索引

说明一下,延迟数字取决于向量索引类型和CPU/GPU分配,只能当作参考。实际部署时,如果你的索引库超过10万张图,建议把特征索引放到独立的内存区域,避免与推理模块争抢显存。

3.2 拉代码、下权重、起服务

获取项目非常简单:到官方开源的代码托管平台仓库把代码clone下来,再把对应档位的权重文件下载到checkpoints目录。权重文件比较大,下载时留意网络稳定性,最好做一次完整性校验,我遇到过权重文件下载不全导致推理结果全是乱码的情况。

启动推理前需要做两件事:一是构建索引库,如果你手头有图片目录,官方脚本会先批量提取图像特征并落盘;二是写一个查询脚本,加载模型和索引,然后运行检索和推理。整个过程大约一小时能跑通,前提是显卡驱动和框架版本匹配。如果你想跳过建索引,官方也提供了一个几千张图片的小型示例索引,可以直接拿来跑通流程再换自己的数据。

3.3 一个完整的推理示例:检索上图再回答多跳问题

下面是一段Python风格的示意代码,我按官方接口做了简化,但核心调用路径保持一致:

from mars_utils import load_model, load_index model = load_model( config="configs/mars_base.yaml", weights="checkpoints/mars_base.pt" ) index = load_index("data/product_images/") # 第一步:以文搜图 query = "一个穿着红色连衣裙的女孩在沙滩上奔跑" hits = model.retrieve(query, index, top_k=5) for h in hits: print(h.metadata["file_name"], h.score) # 第二步:在检索结果上进行多跳推理 answer = model.reason( query="找出所有戴帽子的人,并判断他们帽子的颜色分别是什么", candidates=hits ) print(answer)

我实际跑出来的结果是:第一步能稳定命中"沙滩、红裙、奔跑"这几张人工标注正确的图片;第二步对于"帽子颜色"这类细粒度属性,base档偶尔会把深蓝色帽子说成黑色,large档明显改善。这说明在要求精确属性的场景,生产环境尽量用large档,base档适合先做效果验证。

3.4 第一次跑通最容易踩的两个坑

第一个坑是索引版本不一致。如果你先用了base档位提取特征建索引,后面换large档位推理,特征维度会不一样,检索直接报错。这个坑很隐蔽,因为报错信息可能只提示"维度不匹配",没有告诉你根因是档位混用。建议建索引和推理始终使用同一档位的视觉编码器。

第二个坑是batch size过大导致的显存溢出。官方示例为了方便直接设置了32,实际上多跳推理的输入长度远大于单轮检索,显存会突然飙高。我建议把推理batch_size降到4到8,优先保证稳定。如果你还想同时保留大索引在显存里,batch_size甚至要压到2,否则会有频繁的显存换页,延迟反而更高。

4. 实测能力边界:效果不错,但别指望它万能

4.1 三类场景的实测结果

先说效果好的场景。电商商品检索是它的强项,我用了一批商品白底图做测试,查询"带金属链条的黑色单肩包",返回结果非常准,甚至能区分链条粗细。这说明领域内、背景干净的图像,MARS的细粒度特征很有效。

第二类场景是科研论文图表的检索与问答。我输入一份PDF里的图表集和对应图注,查询"哪张图显示了模型在测试集上的准确率提升趋势",它能准确找到折线图,并输出简要结论。但在图表中数字密集时,由于视觉编码器对光学字符识别能力的局限,回答里的具体数字偶尔会抄错,这是它的硬边界。

第三类视频帧检索我本来期待很高,结果一般。MARS不是视频模型,它按帧抽图检索。在10秒长视频里提取关键帧后做联合检索,它能定位"出现红色场景"的片段,但无法理解时间维度的动作因果,比如"谁先推了谁"。所以,视频场景建议把它当帧检索器,不要当视频理解器,做跨帧的数量统计还行,做事件推理就不要指望了。

4.2 四个高频坑和应对方案

第一个坑是top-k参数与推理质量的矛盾。检索只给推理模块前k个证据,k太小容易漏掉关键图片,k太大又会让生成头被不相关信息干扰。我的经验是,先按业务标注数据做一个简单的召回率实验:k从3递增到10,观察答案准确率拐点。大多数场景下k=5是稳的,但如果你的候选库同类图片太多,k=3反而更精准。

第二个坑是中文场景的语料偏差。官方预训练数据以英文为主,直接做中文检索有时会出现"写字楼"和"办公楼"这种同义表达匹配偏差,甚至把"红裙子"匹配到"红色背景的裙子"。解决方案是准备几千条中文业务图文对,做一次低学习率的继续预训练,效果提升很明显。这个微调不需要重新训练全模型,冻结视觉编码器,只调融合层和生成头即可。

第三个坑是低分辨率图片的检索退化。手机拍的商品实拍图如果整体分辨率过低,patch级特征会丢失细节,检索结果明显变差。建议在预处理阶段,对短边小于224像素的图做一次超分或直接丢弃,避免脏数据污染索引。超分会增加预处理耗时,但换来的是检索精度的稳定提升,我认为值得。

第四个坑是多轮对话中的检索历史管理。MARS官方接口主要面向单轮交互。如果做"上一张图里有什么,再对比这一张呢"这类追问,需要自己设计对话状态缓存,把历史检索结果和当前候选合并,否则每轮都会重新检索全部库,延迟和成本都不可控。我试过最简单的方案:只保留最近两轮的检索结果,把图片ID列表拼进当前prompt,效果已经能接受。

4.3 用最小测试集评估你自己的数据

不要拿一堆真实业务数据直接上,先建一个100条级别的小测试集。我用一个简化的评估脚本做了这样的检查:从库里抽出10个查询,每个查询人工标出"正确答案对应的图片ID",然后统计Recall@5。算法层面,还可以对比答案生成结果的ROUGE或人工评价。

from mars_utils import evaluate_retrieval queries = load_queries("data/qa_test.json") # 每条含 query, gt_image_id metrics = evaluate_retrieval(model, index, queries, top_k=5) print("Recall@5:", metrics.recall_at_k)

如果Recall@5低于0.6,不要急着微调模型,先检查索引库是不是混入了大量相似干扰图,降低库内密度通常比调参更有效。这个经验在我做的几个项目里反复被验证。很多团队一上来就花好几万GPU算力微调,结果发现负样本全是"相似但错误"的图,而不是模型能力不够。

5. 基于MARS做落地应用:三个方向的改造思路

5.1 图文混合知识库搜索

企业知识库最麻烦的不是纯文本,而是"文字说明+产品图纸+表格截图"混排的页面。传统文本RAG把图片内容完全丢掉,用户搜索"安装示意图"只能靠命中文案,根本搜不到图。

用MARS可以这样改:把每个文档页面拆成图文块,图片由MARS编码,文本用小段描述与图片关联建档。检索时,同时使用MARS的图片检索和文本检索,再把两类结果合并排序。最终回答时,模型能引用到具体图片,而不是只给一段文字。这个方案比纯文本RAG更符合人对"说明书"的查询习惯,落地周期大概一到两周。

5.2 电商与本地生活里的"以图搜款+追问"

用户拍一张实物图,问"哪款包的锁扣是金色的?"这里既要以图找相似款,又要跨属性推理。MARS的路径是:先用图片特征召回同款或相似款,再对召回结果做属性分类,最后用自然语言汇总。商家侧还能做"反查",比如输入"所有带金属链条的单肩包"把选品集合快速筛出来。

落地时需要额外做一个属性抽取的微调层,因为通用基座虽然能理解"锁扣",但如果不微调,对"链条粗细""肩带材质"这类商家自定义属性就不敏感。我建议先用标注数据把属性tag抽取做成独立小模型,再和MARS配合,不要试图让MARS一个人干所有事。

5.3 素材管理:用自然语言在海量生成图里做质检

AIGC项目每天产出几千张素材图,人工看不过来。可以给MARS一组自然语言质检规则,比如"找出所有包含扭曲手部结构的图""找出风格不属于核心角色立绘的草图"。MARS能先对图片库做相似度召回,再由生成部分给出判断理由,运营同学只需要复核被召回的少量图片。

这个场景对检索的容忍度比较友好,因为是"宁多勿漏"的召回逻辑,MARS的base档足够用,且不需要太多业务微调。我在内部试过,把质检规则从二十条扩展到两百条,效果依然稳定,关键是规则要用准确的名词描述对象,而不是模糊的形容词,比如"扭曲的手部"比"奇怪的画面"有效得多。

最后聊一点个人体会。我最初以为多模态搜索推理会是"大模型顺带解决的事",实际把MARS用下来才发现,检索和推理的融合是一门需要精雕细刻的工程问题,它不只是一个模型的参数数量问题。MARS开源的最大价值,是让业务团队第一次可以在自己的数据上同时调优"找得准"和"答得对"这两个目标。如果你正打算落地类似能力,我的建议是不要急着上大模型全套,先用base档把检索链路跑通,收集一批真实负样本,再决定要不要花算力微调。下一步我比较关注它对视频和3D场景的拓展,如果多模态检索推理能在时间维度上再进一步,很多内容创作和机器人数据管理的场景都会被重新打开。反正这几天我会继续盯着它的更新,有新版本出来再和大家同步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询