# 💡 Summary > [!info] > 关键是:**图片编码器**和**文本编码器**输出的向量要“可比”。 > 1. 还是要么[[向量检索、双塔模型(Bi-Encoder)]]、要么精排 2. 训练时到底在干嘛:对比学习把“语义”对齐 双塔最常见训练目标是**对比学习(contrastive)**: - 一个 batch 里有 N 对图文 `(img_i, txt_i)` - 计算所有两两相似度矩阵 `S_ij = sim(v_img_i, v_txt_j)` - 让 `S_ii` 最大(正确配对),`S_i≠j` 更小(错误配对) - 损失函数常见就是 InfoNCE / softmax 交叉熵那套 直觉就是: - “这张图的正确描述”比“别的图的描述”更像它 - 反过来“这段文字的正确图片”比“别的图片”更像它 所以你后来用“文搜图”,其实是在问:哪张图的 `v_img` 跟 query 文本的 `v_txt` 最近。 # 🧩 Cues # 🪞Notes 你这个问题本质上是**“跨模态检索 / 相似度检索(Image/Text Retrieval)”**这类经典问题的变体:把图片和文字都变成同一种“向量语言”,然后在向量空间里按相似度去找最近的结果。 下面按“现在主流工业实现”的思路,把图搜图 / 文搜图背后的原理讲清楚(你已经懂 Transformer,所以我会直接用编码器 + 对齐 + 向量检索来讲)。 --- ## 1)核心想法:把“图”和“文”都编码成同一个向量空间 无论是图搜图还是文搜图,最终都变成一句话: > 给定一个 query(图片或文本),算出它的 embedding 向量,然后去一个巨大的向量库里找最相近的向量(Top-K)。 所以关键是:**图片编码器**和**文本编码器**输出的向量要“可比”。 --- ## 2)两种主流范式:双塔对齐 vs 单塔交互 ### A. 双塔(Two-Tower / Dual-Encoder):工业检索最主流 - 一塔编码图片:`f_img(image) -> v_img` - 一塔编码文本:`f_txt(text) -> v_txt` - 通过训练让“匹配的图文”向量更近,“不匹配的”更远 优点: - **离线**把全库图片都算成向量并建索引,线上只算 query 向量 + ANN 检索,**极快** - 很适合“海量库 + 实时检索” 缺点: - 只有“向量相似度”这一次交互,细粒度对齐能力不如下面的交互式模型 典型代表(你肯定听过思路):CLIP 这一类(但工业上不一定就是 CLIP 本体,更多是同范式的变体)。 ### B. 交互式(Cross-Encoder / Late-Interaction):用于精排/高精度场景 - 把 `(text, image)` 一起喂给一个模型,让它做深度交互,再输出相关性分数 优点: - **更准**,尤其对复杂描述、细粒度属性更强 缺点: - 不能对全库逐个跑(太慢),通常只做: - 双塔先召回 Top 100/1000 - 再用交互式模型重排 --- ## 3)训练时到底在干嘛:对比学习把“语义”对齐 双塔最常见训练目标是**对比学习(contrastive)**: - 一个 batch 里有 N 对图文 `(img_i, txt_i)` - 计算所有两两相似度矩阵 `S_ij = sim(v_img_i, v_txt_j)` - 让 `S_ii` 最大(正确配对),`S_i≠j` 更小(错误配对) - 损失函数常见就是 InfoNCE / softmax 交叉熵那套 直觉就是: - “这张图的正确描述”比“别的图的描述”更像它 - 反过来“这段文字的正确图片”比“别的图片”更像它 所以你后来用“文搜图”,其实是在问:哪张图的 `v_img` 跟 query 文本的 `v_txt` 最近。 --- ## 4)线上检索怎么做到“秒搜亿级”:ANN 向量索引 有了 embedding,下一步是**最近邻搜索**: - 全库每张图一个向量(比如 512/768 维) - 建一个近似最近邻索引(ANN,Approximate Nearest Neighbor) - 查询时:算 query 向量 → ANN 返回 Top-K 候选 ANN 的直觉是: - 不做暴力遍历(太慢) - 用分桶/图结构/量化等方式,让“找近邻”近似但超快 工程上常见组件就是向量数据库/库(Faiss、HNSW 一类思路),但你理解到“**向量索引 = 让相似度搜索可扩展**”就够了。 --- ## 5)图搜图 vs 文搜图:差别其实只在“query 编码器” - 图搜图:`query = image`,走 `f_img` 得到 `v_img_query` - 文搜图:`query = text`,走 `f_txt` 得到 `v_txt_query` - 检索目标都是同一个:在 `v_img_db` 里找最近的 所以这两者在系统层基本是同一条链路:**编码 → 向量检索 → 精排 → 展示**。 --- ## 6)为什么有时“搜得不准”:你能用的调优旋钮 常见不准的根因与对应手段: - **语义域不匹配**(训练数据不覆盖你的业务,如酒店图片、医学影像、商品细节) - 用领域数据继续对比学习(图文对 / 弱标注 / 伪标签) - **细粒度属性差**(“红色细条纹”“右上角 logo”) - 用交互式模型做精排;或引入局部特征/region 对齐 - **文本太口语/太长**(包含噪声) - query 改写、抽关键词、做多 query 融合 - **相似度度量不合适** - cosine vs dot;温度系数;向量归一化;多向量表示