# 💡 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;温度系数;向量归一化;多向量表示