Bài viết

Google GA Gemini Embedding 2: Kiến trúc One-Model cho Text, Image và Video

Khám phá cách mô hình Multimodal Embedding mới nhất của Google map text, image và video vào cùng một vector không gian, giải pháp dứt điểm cho bài toán Multimodal RAG.

Google GA Gemini Embedding 2: Kiến trúc One-Model cho Text, Image và Video

Nếu bạn đang build hệ thống RAG (Retrieval-Augmented Generation) ở thời điểm hiện tại, 90% khả năng hệ thống của bạn bị “mù”. Chúng ta cắm đầu vào việc chunking text, optimize BM25 + Vector Search, nhưng lại bỏ qua một thực tế: Dữ liệu doanh nghiệp không chỉ có chữ. Báo cáo tài chính chứa hàng tá biểu đồ, tài liệu kỹ thuật có sơ đồ kiến trúc, app e-commerce thì ngập tràn hình ảnh và video review.

Trước đây, để làm search đa phương tiện (ví dụ: dùng text tìm ảnh, hoặc dùng ảnh tìm video), team backend/data thường phải gánh 2-3 pipeline độc lập. Bạn dùng CLIP cho ảnh, OpenAI text-embedding-3 cho text, rồi viết logic để “đoán” xem score của 2 model này map với nhau thế nào. Rất cồng kềnh và tốn kém resource.

Việc Google chính thức GA (General Availability) thế hệ Gemini Embedding mới — nổi bật với khả năng Multimodal Embedding (Một mô hình cho mọi loại dữ liệu) — là một cú hích lớn. Nó giải quyết triệt để bài toán: Làm sao để gom Text, Image và Video vào chung một không gian toán học (Joint Embedding Space)?

Dưới góc nhìn của một backend engineer, hãy cùng bóc tách xem mô hình này hoạt động ra sao và cách tích hợp nó vào hệ thống của bạn.

1. Joint Embedding Space hoạt động như thế nào?

Khái niệm “Embedding” thực chất là việc dịch dữ liệu thô thành các mảng số thực (vector). Với các mô hình cũ, không gian vector của chữ và ảnh là hai thế giới tách biệt.

Với Gemini Multimodal Embedding (cụ thể là các model family như multimodalembedding@001 trên Vertex AI), Google sử dụng kiến trúc encoder chung. Khi bạn đưa vào bức ảnh “một con chó màu vàng” và đoạn text “chú chó lông vàng đang chạy”, mô hình sẽ output ra 2 vector. Điều kỳ diệu là tính toán khoảng cách (Cosine Similarity) giữa 2 vector này sẽ cho ra kết quả rất gần nhau, gần như xấp xỉ 1.

Điểm khác biệt so với OpenAI CLIP

CLIP của OpenAI từng là tiêu chuẩn vàng cho bài toán Image-Text matching. Tuy nhiên, nó có hạn chế chí mạng cho các ứng dụng enterprise:

  1. Giới hạn text cực ngắn: CLIP base chỉ nhận tối đa 77 tokens cho text. Nếu bạn đưa một đoạn mô tả sản phẩm dài, nó sẽ bị cắt cụt. Gemini Embedding xử lý context window lớn hơn rất nhiều.
  2. Native Video Support: Để search video bằng CLIP, bạn phải tự viết script cắt frame (ví dụ 1 frame/giây), lấy embedding từng frame, rồi tính trung bình (mean pooling). Gemini Embedding hỗ trợ input thẳng file video (tối đa 2 phút) và tự động xử lý trích xuất feature theo thời gian thực.
  3. Matryoshka Representation Learning (MRL): Tương tự model text-embedding-3 của OpenAI, Google áp dụng kỹ thuật MRL cho phép bạn “cắt ngắn” số chiều của vector (từ 1408 dimensions xuống 512, 256, hoặc 128) mà không làm suy giảm đáng kể độ chính xác (accuracy drop < 2%). Điều này cực kỳ quan trọng giúp giảm chi phí RAM cho Vector Database.

Code Example: Generate Multimodal Embeddings

Dưới đây là đoạn code Python sử dụng SDK của Google Cloud (Vertex AI) để tạo embedding cho cả hình ảnh và text, chuẩn bị cho việc lưu vào Vector DB.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
from vertexai.vision_models import MultiModalEmbeddingModel, Image
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# Khởi tạo model (yêu cầu đã authen Google Cloud)
# Sử dụng dimension 512 để tối ưu storage cho Vector DB
model = MultiModalEmbeddingModel.from_pretrained("multimodalembedding@001")

# 1. Lấy embedding từ một hình ảnh sản phẩm
image_path = "data/red_sneaker.jpg"
image_input = Image.load_from_file(image_path)

image_emb = model.get_embeddings(
    image=image_input,
    dimension=512
).image_embedding

# 2. Lấy embedding từ text query của user
query_text = "giày thể thao nam màu đỏ để chạy bộ"
text_emb = model.get_embeddings(
    contextual_text=query_text,
    dimension=512
).text_embedding

# 3. Tính toán độ tương đồng (mô phỏng quá trình DB tính vector distance)
score = cosine_similarity(
    [image_emb], 
    [text_emb]
)[0][0]

print(f"Cosine Similarity Score: {score:.4f}")
# Output kỳ vọng: > 0.85 (tùy thuộc vào hình ảnh)

Vector output (dạng [0.012, -0.045, ...]) có thể được lưu thẳng vào PostgreSQL thông qua extension pgvector hoặc các DB chuyên dụng như Milvus/Qdrant.

1
2
3
4
5
6
7
8
9
10
11
12
13
-- Ví dụ table schema trên PostgreSQL + pgvector
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    image_url TEXT,
    embedding VECTOR(512) -- Sử dụng dimension 512 như config ở Python code
);

-- Khi user search text, bạn generate text vector rồi query:
SELECT id, name, image_url, 1 - (embedding <=> '[0.012, -0.045, ...]') AS similarity
FROM products
ORDER BY embedding <=> '[0.012, -0.045, ...]'
LIMIT 5;

2. Ứng dụng thực tế: Xóa bỏ rào cản Multimodal RAG

Việc có một API duy nhất nén được mọi định dạng dữ liệu mở ra nhiều Use Case thiết thực cho Backend & Data team.

Use case 1: Visual E-commerce Search (Search bằng ảnh + text)

Giả sử bạn build tính năng search cho app thời trang. User tải lên bức ảnh một chiếc áo thun màu đen (Image input), nhưng gõ thêm text query: “tôi muốn mẫu y hệt nhưng màu trắng”. Với pipeline cũ, đây là bài toán cực khó. Với Gemini Multimodal Embedding, bạn truyền đồng thời cả ảnh và text vào API: model.get_embeddings(image=black_shirt_img, contextual_text="tôi muốn mẫu y hệt nhưng màu trắng"). Model sẽ trả ra một vector đại diện cho “chiếc áo thun form đó, nhưng màu trắng”, map thẳng với DB sản phẩm của bạn.

Use case 2: Enterprise Multimodal RAG

Trong hệ thống quản lý tài liệu (DMS) của công ty, tài liệu PDF không chỉ có chữ. Nó chứa các biểu đồ tài chính (bar chart, pie chart) và sơ đồ luồng (flowchart). Thay vì phải dùng OCR bóc tách text từ ảnh một cách gượng ép, workflow mới sẽ là:

  1. Parse file PDF, tách riêng đoạn text và hình ảnh/biểu đồ.
  2. Quăng tất cả qua multimodalembedding để lấy Vector.
  3. Lưu vào Qdrant/Milvus cùng với metadata (page_number, document_id).
  4. Khi sếp gõ query: “Cho tôi xem sơ đồ luồng thanh toán của năm ngoái”, hệ thống Vector Search sẽ tự động tính cosine similarity và bốc chính xác bức ảnh sơ đồ luồng đó ra, kèm đoạn text giải thích xung quanh để nhồi vào LLM sinh câu trả lời.

Takeaway cho Backend Engineer

  1. Gộp Pipeline ngay hôm nay: Nếu hệ thống của bạn đang chạy song song 2 embedding models riêng biệt cho Image và Text, hãy lên plan benchmark thử Gemini Multimodal. Việc maintain 1 Joint Embedding Space giúp giảm độ phức tạp của logic Ranking/Scoring đi rất nhiều.
  2. Tối ưu Storage với Dimension: Đừng mù quáng dùng dimension cao nhất. Việc Google hỗ trợ Matryoshka Representation (128, 256, 512, 1408) là chìa khóa tối ưu chi phí. Với database hàng triệu records, chuyển từ 1408 về 512 dimensions giúp bạn giảm 63% dung lượng RAM cần thiết cho Vector Index (HNSW/IVFFlat) mà Recall rate gần như không đổi.
  3. Chunking cho Video: Dù API support video, nhớ giới hạn độ dài. Theo docs của Google, tốt nhất là cắt video thành các clip ngắn 10-15 giây mô tả một hành động cụ thể trước khi nhét qua embedding API để có vector biểu diễn chính xác nhất.

RAG đang tiến hóa. Kỷ nguyên của việc chỉ search trên text đã kết thúc. Multimodal Vector Search chính là standard mới mà các hệ thống backend cần phải trang bị trong năm nay.


Nguồn tham khảo

Bài viết này được cấp phép bởi tác giả theo giấy phép CC BY 4.0 .