
版权与内容来源声明本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容均在附表 A 中标注来源引用官方原文保持原样不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式也不对任何收益结果作承诺。转载请注明出处。一、三个词混着用库建完就废「以文搜图」和「以图搜图」能不能共用一个库只取决于一个前提——两路编码器是不是成对训练出来的这个前提不成立共用一个库只会让两边的检索一起失效。先看现场两路查询打的是同一张表一个图文检索服务上线第一天两个入口都有人用。文本入口搜「红色的登山鞋」返回的十条里有六条是无关风景图片入口上传一张鞋子的照片返回的十条整整齐齐全是风景照。翻配置发现问题不在界面在库文本用一个通用句向量模型编码图片用另一个图像分类网络的中间层特征两个向量写进同一张表、同一个向量列查询时算余弦相似度。代码没报错接口也没超时就是结果不对。混用的根源把「多模态」当成一个筐这三个词经常出现在同一段技术介绍里都顶着「多模态」的帽子边界却是三件事单模态嵌入只吃一种输入纯文本或纯图像把「同一种模态里像的东西」放到一起。图文对比嵌入跨模态把图片和文字压进同一个向量空间让两个模态互相可查。生成式图文模型输出是内容本身一张图、一段描述优化的是「生成得像不像、答得对不对」。把它们混起来的典型动作就是「随便挑两个编码器把向量放同一个库」。这一步一旦做了后面无论换多大模型、加多少数据都补不回来——因为问题不在数据量在训练目标。混用的代价不是差一点是接近瞎猜余弦相似度是一个「比较」。比较成立的前提是两个向量在同一个坐标系里。两个各自独立训练出来的编码器坐标原点、方向和数值尺度都不一样它们的余弦值没有解释意义。这不是「效果打点折」而是「退回到随机」。后文实测给出的数字是未对齐时命中情况与随机基线几乎重合一旦对齐8 对图文能全部命中。差别不在模型大小在有没有成对训练。二、单模态嵌入只管「同类相聚」管不了跨模态单模态嵌入single-modal embedding的职责只有一条在同一种模态内部把「像的东西」拉到一起。它从来没有承诺过「文字能和图片对上」。它是什么一种模态进一个向量出文本编码器把一句话压成一个定长向量图像编码器把一张图压成一个定长向量。这是两种独立的模型训练时各自看各自的数据文本模型看的是句子之间的相似关系同义句靠近图像模型看的是图片之间的相似关系同类图靠近。一句话判断它管什么它负责「排序」不负责「配对」——它能把同类排到前面但不能保证文字排到对应的图前面。它管什么模态内部的远近关系聚类与去重一批文本或一批图片按远近先分组。同类召回用一张图找「长得像的图」用一句话找「意思像的话」。当特征用把向量接给分类器或排序模型。不该用它做什么跨模态检索和「拼接对齐」这是最常踩的两脚拆开跨模态用。拿文本编码器的输出直接去查图像向量库或反过来。两边各自在自家模态里都挺好凑在一起命中就退到随机附近。拼接当对齐。把文本向量和图像向量首尾接成一条更长的向量指望它是「跨模态向量」。这只是把两个不可比的东西拼长了维度变了可比性没变。想让图文可比必须让两个编码器在同一次训练里一起学——这就进入了下一个概念。三、图文对比嵌入职责是让图文共享一个空间前提是成对训练图文对比嵌入跨模态是唯一能让「以文搜图」和「以图搜图」共用一个库的东西但它成立的前提很硬——两路编码器必须在图文配对数据上一起训练。它是什么成对图文一起训出来的两个编码器做一次对比学习一个批次里放若干图文配对训练目标是让成对的图文向量更接近、不配对的更远。约束加在两个编码器上结果就是它们的输出落在同一个向量空间里。因为空间是共享的所以文本能查到图图也能查到文本。这件事在官方文档里怎么写的逐字核过一遍。CLIP 论文摘要OpenAIarXiv:2103.00020里这件事被写成「the simple pre-training task of predicting which caption goes with which image is an efficient and scalable way to learn SOTA image representations from scratch on a dataset of 400 million (image, text) pairs collected from the internet」。摘要接着说明训练后的用法「After pre-training, natural language is used to reference learned visual concepts (or describe new ones) enabling zero-shot transfer of the model to downstream tasks.」官方仓库 README 的说法更直白「CLIP (Contrastive Language-Image Pre-Training) is a neural network trained on a variety of (image, text) pairs.」而 CLIP 的模型卡写明了训练目标「These encoders are trained to maximize the similarity of (image, text) pairs via a contrastive loss.」——注意主语是复数两个编码器一起被同一个损失约束。论文摘要还给出这个做法在 ImageNet 上的位置「we match the accuracy of the original ResNet-50 on ImageNet zero-shot without needing to use any of the 1.28 million training examples it was trained on.」不该用它做什么生成、精细计数、事后「对齐」别让它生成。它输出的永远是向量不是像素也不是句子。要内容去找生成模型。别拿它做精细计数和空间关系。同一份模型卡在「局限」一节里写明CLIP 在细粒度分类和数物体这类任务上比较吃力且明确把未做域内测试的部署列为超出适用范围。别先分开训再「对齐」。共享空间是训练出来的不是事后配出来的。两个已经各自训练好的编码器中间加一个投影层去「蹭」到一起本质上还是重新训了一遍且需要配对数据——那不如直接做对比训练。实测未对齐与对齐后的相似度矩阵下面用合成向量模拟两路编码器的输出。未对齐 图、文各加较大的独立噪声对齐后 噪声很小、且共享同一个语义中心方向。矩阵的行是图列是文对角线就是正确配对。 实测环境Python 3.13.12 / macOS / numpy 2.5.4importnumpyasnp rngnp.random.default_rng(11);N,D8,16centersrng.normal(size(N,D));centers/np.linalg.norm(centers,axis1,keepdimsTrue)img_uncentersrng.normal(size(N,D))*1.0txt_uncentersrng.normal(size(N,D))*1.0img_trcentersrng.normal(size(N,D))*0.15txt_trcentersrng.normal(size(N,D))*0.15normlambdax:x/np.linalg.norm(x,axis1,keepdimsTrue)defdiag_gap(img,txt):Snorm(img) norm(txt).T diagnp.diag(S).mean()off(S.sum()-np.trace(S))/(N*(N-1))returndiag,off,S np.set_printoptions(precision2,suppressTrue,linewidth140)forname,im,txin[(未对齐时相似度矩阵对角线应无明显优势,img_un,txt_un),(对齐后相似度矩阵对角线明显领先,img_tr,txt_tr)]:d,o,Sdiag_gap(im,tx)print(name);print(S);print(f 对角线均值{d:.3f}非对角均值{o:.3f}差距{d-o:.3f});print()hitlambdaim,tx:(norm(im) norm(tx).T).argmax(axis1)np.arange(N)print(f图文检索命中未对齐{hit(img_un,txt_un).mean()*100:.0f}% → 对齐后{hit(img_tr,txt_tr).sum()}/{N}8 对)未对齐时相似度矩阵对角线应无明显优势 [[-0.16 0. -0.21 0.14 -0.15 -0.3 -0.29 0.24] [ 0.09 0.21 -0.23 0.41 -0.06 0.1 -0.26 -0.11] [-0.15 -0.37 0.23 -0.3 0.58 0.34 0.02 0.05] [-0.26 -0.34 0.13 -0.28 0.17 -0.11 0.17 0.05] [-0.14 -0.11 0.21 0.17 0.31 -0.15 -0.05 0.05] [-0.01 0.05 -0.57 0.11 0.25 0.04 -0.42 -0.14] [-0.34 -0.06 0.11 -0.13 -0.58 -0.38 -0.23 -0.14] [-0.12 -0.13 0.36 -0.13 0.16 -0.14 0.21 0.1 ]] 对角线均值0.027 非对角均值-0.048 差距0.075 对齐后相似度矩阵对角线明显领先 [[ 0.73 -0.04 0.24 -0.1 -0.03 0.22 0.05 0.03] [ 0.02 0.78 -0.36 0.11 0.01 -0.04 0.07 -0.41] [ 0.28 -0.08 0.82 -0.22 -0.2 0.16 -0.54 0.22] [-0.45 -0.01 0.28 0.64 -0.01 0.05 -0.14 0.14] [-0.34 0.09 -0.18 0.4 0.58 0.16 0.09 -0.25] [-0.13 0.15 0.37 -0.05 0.03 0.59 -0.44 -0.13] [ 0.27 0.18 -0.22 -0.18 -0.08 0.17 0.66 -0.01] [-0.06 -0.36 -0.04 0.13 -0.1 0.03 -0.07 0.87]] 对角线均值0.709 非对角均值-0.023 差距0.732 图文检索命中未对齐 12% → 对齐后 8/88 对读法在后文第五节展开这里先钉一个数字未对齐时对角线的平均相似度只比非对角线高 0.0758 对图文的命中情况与随机基线约 12.5%基本重合。四、生成式图文模型负责生成不负责检索生成式图文模型的价值在「造内容」把它当检索编码器用是错位使用——它的目标函数里没有「向量距离可比」这一项。它是什么输出是内容本身不是向量扩散类文生图模型、图像描述模型、多模态对话模型都属于这一类。它们吃提示或图片吐像素或文字。你可以从网络中间抠出一个隐表示但这个表示是为「生成本身」服务的不是为了「两两比较」训练的。不该用它做什么当检索编码器不要用它的中间表示入库检索。维度和数值尺度都不是为距离可比设计的算出来的相似度没有解释意义。不要拿它的「打分」代替检索打分。生成模型判断「这段描述像不像这张图」和向量距离是不是一回事两者不能互换。一条能跑但走远了的路线先让多模态模型给每张图写一段描述再把描述丢给纯文本检索。这属于「生成 单模态检索」的两段式能跑通但它和「共享向量空间」是两套东西——多了一层描述损耗描述写错就等于检索错。一张表三者的边界对照概念输入 → 输出管什么职责不管什么典型误用单模态嵌入单一模态 → 向量同模态内部的远近与排序聚类 / 去重 / 同类召回跨模态的可比性拿文本向量去查图像向量把两路向量拼接当跨模态图文对比嵌入跨模态图 / 文 → 同一个向量空间图文共享空间支撑双向检索与零样本分类生成像素或句子精细计数与空间关系让它生成内容先分开训再事后「对齐」生成式图文模型提示 → 像素 / 文本生成内容文生图 / 图生文 / 图文问答向量距离的可比性把中间表示当检索编码器用生成打分代替检索打分向量检索与多模态检索的动手章节这一章讲的是「编码器怎么分工」配套视频课里有 EmbeddingRAG 的完整动手部分正好接得上。放在资料包里扫码即可获取五、判断对齐与否看对角优势不看平均相似度判断两路编码器是否共享空间只看一个量——正确配对的对角优势整体平均相似度是个会骗人的指标。判据对角优势不是平均相似度把图库向量和文本向量摆成一个矩阵行是图列是文对角线就是「正确的图文配对」。两件事同时成立才算对齐对角线上的相似度明显高于非对角线用「每张图找最相似的文本」做检索命中情况显著高于随机基线N 对图文随机基线约为 1/N。为什么不能看平均相似度因为平均相似度会被「整体偏置」拉平。如果所有图向量和所有文本向量都挤在一个很窄的锥形区域里彼此都挺像平均值可以很高但对角线并不突出检索照样错。所以验收要看「对角减非对角」的差而不是一个总和。官方仓库 README 也把衡量方式写明了模型返回的是「The values are cosine similarities between the corresponding image and text features, times 100.」——用余弦相似度衡量图文匹配这是共同口径。实测未对齐与对齐后的四个量 实测环境Python 3.13.12 / macOS / numpy 2.5.4合成向量模拟8 对图文 / 16 维随机种子固定取数日期 2026-10-13状态对角线均值非对角均值差距对角 − 非对角检索命中8 对未对齐两个编码器各自独立0.027−0.0480.0751/812%随机基线约 12.5%对齐后共享同一语义中心、成对训练0.709−0.0230.7328/8全部命中口径说明上表来自合成向量模拟不是真实模型的跑分它要验证的是结构关系——未对齐时对角优势极小、命中回到随机附近对齐后对角优势被拉开、命中拉满。同一套口径取自本文第三节的原样输出。还有一个容易忽略的评测口径问题同一个数字可能测的不是同一回事。CLIP 论文摘要给出的定位是「we match the accuracy of the original ResNet-50 on ImageNet zero-shot without needing to use any of the 1.28 million training examples it was trained on」——站在同一个 ImageNet 准确率上一边是在 128 万条标注样本上全监督训出来的一边是零样本迁移过来的数值相同、含义不同。落到本文场景就是一个只报「平均相似度 0.5」的系统不足以说明它对齐了要看这个 0.5 的构成里正确配对是不是被单独拉起来了。组合分工与停手条件查询类型用哪个编码器编码查询检索哪个库备注以文搜图文本编码器图像向量库查询与库必须来自同一对训练好的编码器以图搜图图像编码器图像向量库用同一路图像编码器别混进别的视觉模型图文混合检索文本、图像各编一次分别召回再融合图像向量库融合权重按评测口径调别凭手感定生成图像 / 描述生成式图文模型不涉及向量库生成结果若要入库得先过对比嵌入编码器落到代码上「不共用一个库」其实只有两条接线规则入库和查询必须走同一路编码器两路编码器必须来自同一次成对训练。⚠️代码待验证# 以文搜图入库与查询必须走同一对编码器此处以文本查询为例img_dbimage_encoder(all_images)# 入库图像编码器img_dbimg_db/np.linalg.norm(img_db,axis1,keepdimsTrue)qtext_encoder([user_query])# 查询与它配对的文本编码器qq/np.linalg.norm(q,axis1,keepdimsTrue)scoresq img_db.T# 同一空间里算余弦相似度top10np.argsort(-scores[0])[:10]什么时候该停手给三条可执行的判断对角差距只在 0.0x 量级且检索命中接近 1/N→ 没对齐别上线先回去查两路编码器是不是成对训练的。换过任何一路编码器哪怕只换了图像那一路→ 空间就变了上面这张表要重跑不能沿用旧结论。验收时别用「平均相似度看起来挺高」→ 那是上一节说的假信号要么看对角优势要么看给定查询下的命中情况。大模型学习路线图与工程落地专题本章的判据最终要落到一个能验收的检索服务上配套资料里的路线图从「能跑通」到「能上线」分了阶段。放在资料包里扫码即可获取附表 A本文引用事实与出处对照表#事实含逐字原文的按原文照录出处文档 / 发布方 / 链接本文位置1「the simple pre-training task of predicting which caption goes with which image is an efficient and scalable way to learn SOTA image representations from scratch on a dataset of 400 million (image, text) pairs collected from the internet」《Learning Transferable Visual Models From Natural Language Supervision》摘要OpenAIhttps://arxiv.org/abs/2103.00020第三章2「After pre-training, natural language is used to reference learned visual concepts (or describe new ones) enabling zero-shot transfer of the model to downstream tasks.」同上论文摘要第三章3「we match the accuracy of the original ResNet-50 on ImageNet zero-shot without needing to use any of the 1.28 million training examples it was trained on.」同上论文摘要第三章4「CLIP (Contrastive Language-Image Pre-Training) is a neural network trained on a variety of (image, text) pairs.」CLIP 仓库 READMEOpenAIhttps://github.com/openai/CLIP第三章5「The values are cosine similarities between the corresponding image and text features, times 100.」CLIP 仓库 READMEOpenAIhttps://github.com/openai/CLIP第五章6「These encoders are trained to maximize the similarity of (image, text) pairs via a contrastive loss.」同一份模型卡在局限一节说明 CLIP 在细粒度分类、数物体等任务上表现较弱并把未做域内测试的部署列为超出适用范围CLIP Model CardOpenAIhttps://github.com/openai/CLIP/blob/main/model-card.md第三章、第四章7合成向量模拟未对齐时对角均值 0.027 / 非对角均值 −0.048 / 差距 0.075 / 命中 1-of-8对齐后 0.709 / −0.023 / 0.732 / 8-of-88 对、16 维随机种子固定本文实测本地运行取数日期 2026-10-13第三章、第五章写在最后这篇用到的资料写这篇文章时把相关的官方文档和源码又翻了一遍顺手也整理了几份配套的东西大模型学习路线图从零基础到能自己动手做 Agent按阶段说明每一步该学什么、哪些可以先跳过《LangChain LangGraph MCP 智能体开发实战》视频课7 个模块从私有化部署、EmbeddingRAG 到 MCPAgent 全流程AI 大模型知识库在线可查Agent Skills 从入门到落地、Claude Skills 完全指南等专题按目录浏览即可640 套 AI 大模型行业报告 经典 PDF 书籍看行业落地案例和别人怎么做的时候用得上大模型零基础到精通教学视频跟着敲一遍比只读文档快得多资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「AI」优先通过。资料按「先路线、再动手、最后查漏」的顺序整理好了建议先看学习路线那一份照着它挑一条适合自己当前基础的路径再往下看。