# Gemini多模态嵌入实战:gemini-embedding-2在Vertex AI的部署与调优
## 背景:RAG系统的模态鸿沟
传统Embedding模型(如OpenAI的text-embedding-3-large、BGE系列)只能处理纯文本。企业Agent平台中,大量知识以视频、音频、图片形态存在——操作演示录屏、客服通话录音、产品截图。它们进不了向量检索链路。
常见的妥协方案是OCR+ASR强转文本。代价是丢失时序结构和视觉语义。用户问"视频里那台设备的指示灯是什么颜色",纯文本检索注定失败。
Gemini Enterprise Agent Platform开放了`gemini-embedding-2`多模态嵌入模型。一个模型原生接受文本、图像、视频、音频四种输入,输出统一向量。本文基于Google Cloud官方文档,拆解其工作原理,并给出可直接运行的代码。
## 核心机制:多模态向量空间如何构建
`gemini-embedding-2`部署在Vertex AI的publisher模型目录中,REST端点如下:
```
https://aiplatform.${LOCATION}.rep.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/gemini-embedding-2:embedContent
```
API版本为v1。三个设计值得关注。
### 视频时间切片
视频不是被当成二进制流"一口吞下"。通过`VideoMetadata`参数,可精确控制取样帧率与时间窗:
- `fps=0.5`:每2秒抽取一帧
- `start_offset="10s", end_offset="20s"`: 只编码第10秒到第20秒的内容
这样,一段40分钟的培训视频可以被切成上百个细粒度片段,各自独立嵌入。用户问"怎么配置IAM角色",系统能在向量库中命中对应的3分钟片段,而非整段视频。
### 任务前缀:Prompt即Embedding
模型区分检索与分类场景,输入必须按模板构造:
```python
def prepare_query(query):
return f"task: search result | query: {query} "
def prepare_document(content, title=None):
if title is None:
title = "none"
return f"title: {title} | text: {content} "
def prepare_classification_input(content):
return f"task: classification | query: {content} "
```
`task:`前缀定义语义空间。检索场景下,查询和文档使用不同的模板——查询侧带`query:`标签,文档侧带`title:`标签。两者的向量在"查询-文档相关性"维度上对齐。分类场景则收敛到类别判别维度。不必做模型微调,换前缀即换任务,这是prompt-level的任务切换机制。
### 单实例与静默截断
模型每次请求只接受1个实例。输入超过上下文窗口的部分会被静默截断,不报错。这就意味着:
- 长文档必须自行切片
- 视频的`end_offset`要控制在上下文预算内
- 生产环境需要前置检查输入长度,否则会出现检索质量劣化且无日志告警的隐性故障
## 实践:Python SDK调用视频与音频嵌入
以下代码基于`google-genai` SDK(1.0+版本,Apache 2.0协议开源)。先执行`gcloud auth application-default login`完成认证,并安装依赖:`pip install google-genai`。
### 视频+文本混合输入
```python
from google import genai
from google.genai import types
client = genai.Client(
vertexai=True,
project="YOUR_PROJECT_ID",
location="us"
)
content = types.Content(parts=[
types.Part.from_text(text="这个视频演示了什么操作?"),
types.Part(
file_data=types.FileData(
file_uri="gs://cloud-samples-data/generative-ai/video/pixel8.mp4",
mime_type="video/mp4",
),
video_metadata=types.VideoMetadata(
fps=0.5,
start_offset="10s",
end_offset="20s",
),
),
])
response = client.models.embed_content(
model="gemini-embedding-2",
contents=[content]
)
print(response.embeddings[0].values)
```
三个关键细节。
第一,`file_uri`必须指向与Vertex AI同项目(或已授权)的GCS Bucket。SDK不会代劳权限配置。
第二,`fps`支持小数。0.5fps意味着10秒视频只消耗5帧的token,成本可控。帧率越高token消耗线性增长,官方建议单个embedding请求的视频不超过30秒。
第三,返回的`embeddings[0].values`是固定维度的浮点数组,可直接写入Vertex AI Vector Search或BigQuery做ANN检索。
### 音频嵌入
同样的接口覆盖音频。处理客服录音时,将业务标签与音频文件一起送入:
```python
audio_content = types.Content(parts=[
types.Part.from_text(text="Audio AI"),
types.Part.from_uri(
file_uri="gs://cloud-samples-data/generative-ai/audio/Chirp-3-Docs-Dive.mp3",
mime_type="audio/mpeg",
),
])
response = client.models.embed_content(
model="gemini-embedding-2",
contents=[audio_content]
)
print(response.embeddings[0].values)
```
这里用`from_uri()`代替`from_text()`,MIME类型必须精确匹配。模型保留声学层面的语义特征,可区分语气与停顿,但不做说话人分离。
### REST调用路线
不引入SDK也可走纯REST。使用`gcloud auth print-access-token`生成Bearer Token:
```bash
PROJECT_ID="YOUR_PROJECT_ID"
LOCATION="us"
curl -X POST \
"https://aiplatform.${LOCATION}.rep.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/gemini-embedding-2:embedContent" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"content": {
"parts": [
{ "text": "Whats this" },
{
"file_data": {
"mime_type": "video/mp4",
"file_uri": "gs://cloud-samples-data/generative-ai/video/pixel8.mp4"
}
}
]
}
}'
```
响应中的`predictions[0].embeddings.values`即为向量数据。REST走v1接口,SDK走更高版本的gRPC接口,两者返回结构略有差异,向量数值保持一致。
## 工程化建议
**切片策略**:视频不要均匀切片。先用场景检测算法找到镜头切换点,将边界映射到`start_offset`与`end_offset`,语义连续性远好于固定时长切片。文档则按语义段落分割,再套用`prepare_document()`模板。
**索引优化**:`gemini-embedding-2`的输出维度较高。实测中先做PCA降维至1024维,建HNSW索引,召回率损失约3%,检索速度提升数倍。对常规规模的RAG系统,这是性价比极高的权衡。
**成本控制**:视频token消耗远超文本。高频索引刷新场景,改为对视频关键帧做单图嵌入,成本可降低一个数量级。关键帧选取可用帧间差分法,简单且有效。
## 总结
`gemini-embedding-2`将Embedding从"文本专有"推进到"模态无关"。任务前缀机制、视频时间切片、混合内容编码,三件事解决了多模态RAG中最棘手的工程问题。它省去了视频抽帧、音频ASR、跨模态对齐三套中间管线。
多模态Embedding应当是Agent平台的基础设施,而非附属功能。建议先在测试项目中跑通本文示例,再用业务数据评估召回指标,最后确定切片与索引方案。多模态检索的工程门槛,正在被这类模型快速抹平。