CLIP 跨模态检索 RAG
CLIP 把文本和图片编码进同一个 512 维空间,于是「文搜图 / 图搜图」成立。基于 LlamaIndex 从 CLIP MVP 一路做到 VLM 图片描述 + BM25 混合检索(RRF 融合),Milvus 持久化。
普通 RAG 在文本里检索。这个项目做的是跨模态:用文字搜图片、用图片搜图片。关键是 CLIP(OpenAI, 2021,对比学习双编码器)把文本和图片映进同一个 512 维向量空间,所以跨模态 cosine 相似度才有意义。基于 LlamaIndex 实现。
CLIP MVP:文图同一空间
from llama_index.embeddings.clip import ClipEmbedding
embed = ClipEmbedding() # 自动下载 ~400MB 权重
t = embed.get_text_embedding("架构图") # len = 512
i = embed.get_image_embedding("diagram.png") # len = 512 ← 同一空间!
get_text_embedding 和 get_image_embedding 都返回 512 维向量(notebook 里实测验证),所以可以直接算文 ↔ 图的 cosine。CLIP 编码约 10ms/图。
CLIP 的边界(课程明说):读不了图内文字、细粒度区分弱、中文弱(建议换 Chinese-CLIP)。
文搜图 / 图搜图
index = MultiModalVectorStoreIndex.from_documents(docs, image_embed_model=embed)
retriever = index.as_retriever(similarity_top_k=3, image_similarity_top_k=3)
# 文搜图
retriever.text_to_image_retrieve("system architecture diagram")
# 图搜图
retriever.image_to_image_retrieve("query.png")
两个实战细节:
- 文搜图分数偏低很正常:实测「架构图」命中约 0.24,英文 query(
architecture diagram0.28)还高一点。绝对值低不重要,看排序,精度靠后接 Reranker - 图搜图会命中自己:query 图自身相似度 1.0,工程上用
Path.resolve()比对路径过滤掉自身
持久化:MilvusVectorStore(uri, collection_name, dim=512, overwrite=True)(Milvus v2.3.21,localhost:19530),文本/图片各一个 collection。
进阶:VLM 描述 + 混合检索
CLIP 的弱点(图内文字、中文)用 VLM 生成图片描述补:
# VLMSelector:< 50 张图用 GPT-4o($0.003/张),≥ 50 张用 Qwen-VL-Max(¥0.01/张)
# 描述缓存在 ./caption_cache
# 描述入库用 OpenAIEmbedding(text-embedding-3-small),1536 维
# ImageNode(text=caption, image_path=...) → Milvus collection (dim=1536)
检索时再叠加 BM25(关键词)+ 向量(语义)混合:
fusion = QueryFusionRetriever(
retrievers=[vector_retriever, bm25_retriever],
mode="reciprocal_rerank", # RRF
num_queries=1,
)
# RRF: score = Σ 1/(k + rank_i), k = 60
演进路线
notebook 还指出了演进方向(Qwen3-VL 黄金架构、Agentic RAG),但可跑通的承重部分是 CLIP + VLM 描述 + 混合检索这条线。
价值点
- 跨模态检索落地:不是「Chat with text」,而是文 ↔ 图互搜,理解共享向量空间
- 知道 CLIP 的边界:图内文字 / 中文弱,并知道用 VLM 描述补
- 混合检索工程:向量 + BM25 经 RRF 融合,而不是只靠单路
- LlamaIndex 多模态栈:MultiModalVectorStoreIndex + Milvus + QueryFusionRetriever 串起来
Demo 真实材料对应
互动 Demo 把 CLIP 的「同一空间」可视化:文本 / 图片 query 编码成 512 维后落进同一张 2D 图,沿 cosine 拉出最近的图(文搜图约 0.24、图搜图自身 1.0 被过滤);混合模式叠加 BM25 + RRF(k=60)。512 维、~0.24 分数、RRF k=60、VLM 描述 1536 维等都来自《LlamaIndex 多模态文搜图图搜图 RAG 实战》notebook。