免费POC, 零成本试错
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


我要投稿

Gemini Embedding 2把多模态信息整合同一向量空间了,还需要多向量列吗?

发布日期:2026-03-12 21:31:34 浏览次数: 1521
作者:Zilliz

微信搜一搜,关注“Zilliz”

推荐语

Gemini Embedding 2实现多模态统一向量表示,但多向量检索技术仍有不可替代的价值。

核心内容:
1. Gemini Embedding 2的核心突破:全模态原生支持与灵活尺寸
2. 多向量检索技术的独特价值与适用场景
3. 统一表示与多向量检索的互补关系

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家
图片
昨天,谷歌正式发布首个原生多模态嵌入模型 Gemini Embedding 2。
可以一次性把文本、图像、视频、音频、文档几大模态数据,全部映射进同一个统一的向量空间,做统一的管理与检索。
那么问题来了,既然一个向量模型就能搞定全模态数据的语义表示,那向量数据库深耕多年的多向量列技术,还有存在的必要吗?

01 

Gemini Embedding 2,突破在哪里?

Embedding模型的本质,是把非结构化数据转化为稠密向量,让语义相似的数据在向量空间中彼此靠近。
而 Gemini Embedding 2 的颠覆性,在于它第一次彻底打通了多模态数据的语义壁垒,做到了:
第一,全模态原生支持。它一次性实现了文本、图像、视频、音频、文档几大类数据的原生embedding生成:文本支持最长 8192 个 token,单次请求最多处理 6 张图像,支持最长 120 秒的视频输入,音频无需经过 ASR 转录即可直接生成向量数据,还能直接处理最多 6 页的 PDF 文档。
更关键的是,它不仅能处理单一模态,还支持图像 + 文本这类多模态混合输入,精准捕捉不同媒体之间的复杂语义关系。
在官方公布的评测数据中,Gemini Embedding 2 在文本任务上,多语言 MTEB 均值达到 69.9,代码任务均值高达 84.0;跨模态任务中,Text-Image 的 TextCaps 达到 89.6,Image-Text 任务更是做到 97.4,Text-Video、Text-Document 等任务也均实现了行业领先的效果。
第二,灵活的尺寸支持与落地能力。模型延续了 Matryoshka Representation Learning(MRL)技术,默认输出 3072 维向量,同时支持开发者按需缩减为 1536 维、768 维等不同规格,在检索性能与存储成本之间灵活平衡。
这些能力的升级,大幅简化了传统多模态检索的工程链路。
举个最常见的例子:搭建一个短视频库的语义检索系统,一条短视频里的画面帧、人声、字幕,三者围绕同一个内容主体,过去需要用图片、音频、文本三个独立的 Embedding 模型,分别生成三套向量,存成三个独立的向量列,检索时还要做多路召回、结果融合与去重,开发和维护成本不小。
而现在,用 Gemini Embedding 2,直接把这条视频的画面、音频、字幕一次性输入,就能生成一个统一的多模态向量,完整承载整条视频的全量语义信息,开发链路大幅简化。
也正是因为这个核心突破,很多人产生了 “多向量列无用论” 的判断 —— 既然全模态内容都能一个向量搞定,还要分列存储、多向量检索干嘛?但恰恰是这个判断,混淆了 “多模态统一表示” 与 “多维度向量检索” 的核心能力边界,更忽略了工业级场景里,绝大多数真实检索需求的复杂性。

02 

多向量检索到底解决什么问题?

多向量混合检索本质就是整合不同搜索方法或跨模态的embedding信息,主要分为两类:
稀疏 - 稠密向量搜索:稠密向量擅长捕捉语义关系,稀疏向量适合精准的关键词匹配。两者结合后,既能理解整体概念,又能匹配精确术语,弥补了单一方法的不足,让复杂查询的结果更优。
以下是稀疏 - 稠密向量混合检索的示范:

https://milvus.io/docs/hybrid_search_with_milvus.md

多模态向量搜索:Milvus目前支持跨文本、图像、音频等多种数据类型搜索,能把不同形式的信息整合为连贯的搜索体验。比如电商搜索中,用户输入文本查询+照片,系统可以同时匹配产品的文字描述和实物图像,让结果更准、更丰富。
针对以上两种类型,针对落地中的具体实践需求,Milvus 和 Zilliz Cloud 还提供了全方位的技术支持:
灵活的Schema定义:能在Collection Schema中定义多个向量字段,支持整数主键(INT64)、字符串(VARCHAR)、稠密向量(DENSE_VECTOR)、稀疏向量(SPARSE_FLOAT_VECTOR)等多种数据类型,还能开启全文搜索分析器(enable_analyzer)。
多样化索引与度量:提供自动索引(AUTOINDEX)、稀疏倒排索引(SPARSE_INVERTED_INDEX)等类型,支持内积(IP)、BM25 等度量方式,适配不同类型向量的搜索需求。
内置全文搜索:集成 BM25 算法,能自动从文本字段生成稀疏向量,不用用户手动计算,简化数据准备流程。
完善的重排序机制:支持 RRFRanker 等多种策略,支持对多个ANN搜索结果集进行合并与重新排序,高效输出最优结果。
严谨的搜索流程:明确规定了集合加载、参数配置等步骤,保障混合搜索的稳定性和准确性。

03 

选型指南

首先,必须承认一点,对于同一件事的强相关多模态信息(如一个视频的画面、字幕和声音),Gemini Embedding 2 能够很好的取代传统的多向量列方案。
但是对于,属于同一实体的不同维度,却分属完全独立的语义空间、检索诉求完全分离的多组向量数据,就完全超出了Gemini Embedding 2 的舒适区。
最典型的场景,就是生物身份认证系统。同一个用户主体,会对应人脸图像、声纹音频、指纹数据、虹膜信息这几类核心生物特征。
这四类数据都必须通过向量化,才能完成相似度检索与身份核验;它们虽然都属于同一个人,但描述的是完全独立、语义空间毫无交集的生物特征 ,不存在强语义关联,更不可能被强行对齐到同一个有效的向量空间里。
另一种Gemini Embedding 2 替代不了的多模态场景,是我们对检索内容需要细粒度检索的时候。
以OpenClaw 为例,它会将用户的历史对话、操作记忆、任务日志,通过 Embedding 模型生成稠密语义向量,用于模糊语义检索(比如 “之前讨论过的部署问题”);同时通过 BM25 算法生成稀疏向量,用于文件名、命令、特定参数的精准匹配;这两类向量分属不同的语义空间、服务于完全不同的检索诉求,必须通过多向量列独立存储、并行检索、结果重排
另一个典型场景是:在电商行业,一件商品的宣传视频、详情图文,属于围绕商品本身的强相关多模态内容,完全可以用 Gemini Embedding 2 生成一个统一向量。
但如果,用户除了需要 “外观长得像的裙子”,也可能要找 “参数规格匹配的同类型商品”,这时候,就需要通过多向量列,把这些不同维度的向量分开存储、分别构建索引(关键词与语义),才能支撑这种灵活、精准、分维度的混合检索需求。

04 

如何快速在Milvus中使用Gemini Embedding 2

下面是一个简单的使用demo,只需要一个可以运行的 Milvus/Zilliz Cloud 实例(https://milvus.io/docs/install-overview.md),和一个 GOOGLE_API_KEY 就可以体验起来。
"""Prerequisites:    pip install google-genai pymilvusSet environment variable:    export GOOGLE_API_KEY="your-api-key""""import osimport structimport numpy as npfrom google import genaifrom google.genai import typesfrom pymilvus import MilvusClient, DataType# ── Config ───────────────────────────────────────────────────────────────COLLECTION_NAME = "gemini_multimodal_demo"MILVUS_URI = "http://localhost:19530"  # Change to your Milvus addressDIM = 3072  # gemini-embedding-2-preview output dimensionGEMINI_MODEL = "gemini-embedding-2-preview"# ── Initialize clients ──────────────────────────────────────────────────gemini_client = genai.Client()  # Uses GOOGLE_API_KEY env varmilvus_client = MilvusClient(MILVUS_URI)# ── Helper: generate embedding ──────────────────────────────────────────def embed_texts(texts: list[str], task_type: str = "SEMANTIC_SIMILARITY") -> list[list[float]]:    """Embed a list of text strings."""    result = gemini_client.models.embed_content(        model=GEMINI_MODEL,        contents=texts,        config=types.EmbedContentConfig(task_type=task_type),    )    return [e.values for e in result.embeddings]def embed_image(image_path: str) -> list[float]:    """Embed an image file."""    with open(image_path, "rb"as f:        image_bytes = f.read()    mime = "image/png" if image_path.endswith(".png"else "image/jpeg"    result = gemini_client.models.embed_content(        model=GEMINI_MODEL,        contents=types.Part.from_bytes(data=image_bytes, mime_type=mime),    )    return result.embeddings[0].valuesdef embed_audio(audio_path: str) -> list[float]:    """Embed an audio file."""    with open(audio_path, "rb"as f:        audio_bytes = f.read()    mime_map = {".mp3""audio/mpeg"".wav""audio/wav"".flac""audio/flac"}    ext = os.path.splitext(audio_path)[1].lower()    mime = mime_map.get(ext, "audio/mpeg")    result = gemini_client.models.embed_content(        model=GEMINI_MODEL,        contents=types.Part.from_bytes(data=audio_bytes, mime_type=mime),    )    return result.embeddings[0].values# ── 1. Create Milvus collection ─────────────────────────────────────────print("=== Creating collection ===")if milvus_client.has_collection(COLLECTION_NAME):    milvus_client.drop_collection(COLLECTION_NAME)schema = milvus_client.create_schema()schema.add_field("id", DataType.INT64, is_primary=True, auto_id=True)schema.add_field("content", DataType.VARCHAR, max_length=2000)   # description of the contentschema.add_field("modality", DataType.VARCHAR, max_length=20)    # "text", "image", "audio"schema.add_field("vector", DataType.FLOAT_VECTOR, dim=DIM)index_params = milvus_client.prepare_index_params()index_params.add_index(    field_name="vector",    index_type="AUTOINDEX",    metric_type="COSINE",)milvus_client.create_collection(    COLLECTION_NAME,    schema=schema,    index_params=index_params,    consistency_level="Strong",)print(f"Collection '{COLLECTION_NAME}' created (dim={DIM}, metric=COSINE)")# ── 2. Insert text embeddings ───────────────────────────────────────────print("\n=== Inserting text embeddings ===")documents = [    "Artificial intelligence was founded as an academic discipline in 1956.",    "The Mona Lisa is a half-length portrait painting by Leonardo da Vinci.",    "Beethoven's Symphony No. 9 premiered in Vienna on May 7, 1824.",    "The Great Wall of China stretches over 13,000 miles across northern China.",    "Jazz music originated in the African-American communities of New Orleans.",    "The Hubble Space Telescope was launched into orbit on April 24, 1990.",    "Vincent van Gogh painted The Starry Night while in an asylum in Saint-Rémy.",    "Machine learning is a subset of AI focused on learning from data.",]text_vectors = embed_texts(documents)text_rows = [    {"content": doc, "modality""text""vector": vec}    for doc, vec in zip(documents, text_vectors)]milvus_client.insert(COLLECTION_NAME, text_rows)print(f"Inserted {len(text_rows)} text documents")# ── 3. (Optional) Insert image embeddings ───────────────────────────────# Uncomment and provide real image paths to test multimodal search## image_files = [#     ("photo of the Mona Lisa painting", "mona_lisa.jpg"),#     ("satellite photo of the Great Wall of China", "great_wall.png"),# ]# for desc, path in image_files:#     if os.path.exists(path):#         vec = embed_image(path)#         milvus_client.insert(COLLECTION_NAME, [#             {"content": desc, "modality": "image", "vector": vec}#         ])#         print(f"Inserted image: {desc}")# ── 4. (Optional) Insert audio embeddings ───────────────────────────────# Uncomment and provide real audio paths to test multimodal search## audio_files = [#     ("Beethoven Symphony No.9 excerpt", "beethoven_9.mp3"),#     ("jazz piano improvisation", "jazz_piano.mp3"),# ]# for desc, path in audio_files:#     if os.path.exists(path):#         vec = embed_audio(path)#         milvus_client.insert(COLLECTION_NAME, [#             {"content": desc, "modality": "audio", "vector": vec}#         ])#         print(f"Inserted audio: {desc}")# ── 5. Search ────────────────────────────────────────────────────────────print("\n=== Searching ===")queries = [    "history of artificial intelligence",    "famous Renaissance paintings",    "classical music concerts",]query_vectors = embed_texts(queries, task_type="SEMANTIC_SIMILARITY")for query_text, query_vec in zip(queries, query_vectors):    results = milvus_client.search(        COLLECTION_NAME,        data=[query_vec],        limit=3,        output_fields=["content""modality"],        search_params={"metric_type""COSINE"},    )    print(f"\nQuery: '{query_text}'")    for hits in results:        for rank, hit in enumerate(hits, 1):            print(f"  [{rank}] (score={hit['distance']:.4f}, modality={hit['entity']['modality']}) "                  f"{hit['entity']['content'][:80]}")# ── 6. Cross-modal search example (image query -> text results) ─────────# Uncomment to search text collection using an image as query## print("\n=== Cross-modal search: image -> text ===")# query_image_vec = embed_image("query_image.jpg")# results = milvus_client.search(#     COLLECTION_NAME,#     data=[query_image_vec],#     limit=3,#     output_fields=["content", "modality"],#     search_params={"metric_type": "COSINE"},# )# for hits in results:#     for rank, hit in enumerate(hits, 1):#         print(f"  [{rank}] (score={hit['distance']:.4f}) {hit['entity']['content'][:80]}")# ── Cleanup ──────────────────────────────────────────────────────────────# milvus_client.drop_collection(COLLECTION_NAME)# print(f"\nCollection '{COLLECTION_NAME}' dropped")print("\nDone!")

尾声

Milvus 的Embedding Function功能与 Gemini Embedding 2 的深度集成,即将正式推出。
在该功能中,用户无需手动对接各种embedding API,Function 模块会自动调用 OpenAI、AWS Bedrock、Google Vertex AI 等外部embedding API,将原始数据数据转化为向量。在检索阶段,Milvus 也会自动用同一embedding模型,将原始查询转为向量,并返回所需的检索结果。
届时,开发者既能借助 Gemini 多模态 Embedding 的强大能力,轻松搞定复杂多模态内容的统一语义表示;又能依托 Milvus 成熟的多向量技术体系,实现精细化的多维度混合检索与实体级的细粒度召回。
对于以上能力,大家有任何期待或吐槽,欢迎评论区交流。
阅读推荐
Embedding相似度虚高,如何用langchain+Milvus搭建CRAG解决?
Agent都是伪需求!如何判断是否需要Multi-Agent,以及如何搭?" data-itemshowtype="0" linktype="text" data-linktype="2">80%的 Multi-Agent都是伪需求!如何判断是否需要Multi-Agent,以及如何搭?
养虾实战教程:我用OpenClaw做了个能盯盘,也能深度复盘的投资agent
Qwen3.5-397B+Milvus+ColQwen2,如何做基于PDF的多模态RAG知识库
开源|Milvus2.6又有功能上新啦!Embedding Function、N-gram、decay ranker、field-level boosting、Highlighting解读
图片
图片

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询