Multimodal LLM — Cách AI thực sự "thấy" image, "nghe" audio, "xem" video
Giải thích từ first principles cách một model chỉ hiểu token lại "thấy" được ảnh, "nghe" được tiếng: patch tokenization, CLIP, projection layer, 3 kiểu fusion, dataflow, trade-off, ví dụ production thật, và khi nào KHÔNG nên dùng.
Một LLM, bản chất, chỉ biết làm một việc duy nhất: nhận một dãy số (token) và đoán số tiếp theo. Nó không có mắt, không có tai. Vậy mà GPT-4o đọc được screenshot, Gemini tóm tắt được video 1 tiếng, Claude trích được số liệu từ ảnh hoá đơn.
Câu hỏi cốt lõi của cả bài này: làm sao một cỗ máy chỉ hiểu token lại “thấy” được pixel và “nghe” được sóng âm? Trả lời được câu đó, bạn sẽ hiểu vì sao multimodal model mạnh ở việc này nhưng dở tệ ở việc kia — và build app không còn coi model là hộp đen.
Ý tưởng lớn nhất cần nhớ: multimodal không phải model “học nhìn” theo kiểu con người. Nó là một mánh kỹ thuật — biến ảnh/âm thanh thành token nằm chung không gian với token chữ, để cùng một Transformer xử lý tất cả như nhau. Mọi điểm mạnh và điểm yếu đều bắt nguồn từ mánh này.
1. First principle: token là “đồng tiền chung” của model
Trước khi nói tới ảnh, phải nắm một sự thật về LLM (xem sâu ở Tokens & Context Windows):
- Model không xử lý chữ. Nó xử lý token — những số nguyên, mỗi số là một ID trong từ điển (vocabulary).
- Mỗi token ID được tra thành một vector (embedding) — một điểm trong không gian nhiều chiều. Transformer chỉ làm toán trên các vector đó.
Nói cách khác, “ngôn ngữ mẹ đẻ” của Transformer không phải tiếng Anh hay tiếng Việt — mà là dãy vector. Đây chính là kẽ hở để nhét modality khác vào.
Ẩn dụ: coi Transformer như một nhà máy chỉ nhận container tiêu chuẩn (vector). Hàng hoá ban đầu là chữ, nhưng nếu bạn đóng được ảnh hay âm thanh vào đúng loại container đó, nhà máy xử lý tuốt — nó không quan tâm bên trong container là gì.
Vậy bài toán multimodal rút gọn thành một câu:
Làm sao biến ảnh (lưới pixel) / audio (sóng) / video (chuỗi khung hình)
→ thành một dãy vector "giả làm token", nằm cùng không gian với token chữ?
Ba phần tiếp theo trả lời câu này cho ba modality. Phần 4 nói về cách ghép chúng lại (fusion). Phần còn lại là thực chiến.
Hiểu lầm thường gặp: “model đa phương thức nhìn ảnh như mắt người”. Sai. Nó chỉ thấy một dãy vector được nén từ ảnh — gần với việc bạn mô tả bức tranh qua điện thoại cho người khác hơn là nhìn trực tiếp. Đó là lý do nó hay bịa chi tiết và đếm sai (xem Phần 6).
2. Vision: biến lưới pixel thành token
2.1. Vấn đề con
Một ảnh 224×224 có hơn 150.000 con số (chiều rộng × cao × 3 kênh
màu). Không thể nhét thẳng từng pixel làm token — chuỗi sẽ dài vô lý và
model không học nổi quan hệ ở xa. Cần một cách nén ảnh thành ít token,
mỗi token mang nhiều ý nghĩa.
2.2. ViT — cắt ảnh thành “chữ”
Vision Transformer (Google, 2020) giải bài này bằng một ý tưởng đơn giản đến bất ngờ: cắt ảnh thành các ô vuông (patch) và coi mỗi ô như một “từ”.
Ảnh 224×224×3
│ cắt thành ô 16×16
▼
196 patch (14 hàng × 14 cột)
│ mỗi patch (16×16×3 = 768 số) được "ép phẳng" rồi chiếu tuyến tính
▼
196 vector ← đây chính là "image token"
│ cộng thêm positional embedding (để model biết ô nào ở đâu)
▼
Đưa vào Transformer y hệt một câu 196 từ
Giải thích đơn giản: thay vì đọc từng pixel, ViT đọc từng “mảnh ghép” của ảnh, giống như bạn hiểu một bức tranh ghép (mosaic) qua các ô gạch chứ không qua từng hạt sơn.
Ẩn dụ: ViT giống việc đọc truyện tranh. Bạn không nhìn từng điểm mực; bạn lướt qua từng khung tranh, và bộ não tự ghép thành câu chuyện. Mỗi patch là một khung; positional embedding là số thứ tự khung để biết đọc theo trình tự nào.
Điểm mấu chốt: kiến trúc ViT gần như trùng khít với Transformer của LLM. Chỉ khác ở cửa vào (patch thay vì chữ). Đây là lý do hai thế giới ráp được vào nhau dễ dàng.
2.3. CLIP — kéo ảnh và chữ về chung một không gian
ViT cho ta vector của ảnh, nhưng vector đó chưa “nói cùng ngôn ngữ” với vector của chữ. CLIP (OpenAI, 2021) là bước bắc cầu.
CLIP train trên 400 triệu cặp (ảnh, caption) lấy từ internet, với một
mục tiêu duy nhất:
ẢNH CHỮ ("a dog on a beach")
│ │
ViT encoder Text encoder
│ │
▼ ▼
vector_ảnh vector_chữ
└──────────────┬───────────────────┘
▼
Kéo gần lại nếu là cặp đúng; đẩy xa nếu là cặp sai
(contrastive learning)
Sau khi train, một điều kỳ diệu xảy ra: ảnh con chó và dòng chữ “a dog” nằm cạnh nhau trong cùng không gian. Đo độ gần (dot product) giữa vector ảnh và vector chữ = đo “ảnh này khớp mô tả này tới đâu”.
Ví dụ thực tế: đây chính là động cơ của zero-shot classification —
không cần train riêng cho từng nhãn. Muốn biết ảnh là mèo hay chó? Đưa
ảnh + hai câu "a photo of a cat", "a photo of a dog", xem vector ảnh
gần câu nào hơn.
Sản phẩm thật: Google Lens và tìm kiếm ảnh ngữ nghĩa, gợi ý sản phẩm “tìm bằng hình”, và bộ lọc nội dung của nhiều mạng xã hội đều dựa trên ý tưởng kiểu CLIP — nhúng ảnh và chữ vào chung một không gian rồi đo khoảng cách. Chi tiết toán học ở Vector Embeddings.
Hiểu lầm thường gặp: “CLIP đọc chữ trong ảnh (OCR)”. Không. CLIP nắm ý nghĩa tổng thể (“đây là ảnh hoá đơn”), không đọc được từng con số trong đó. Đọc text chi tiết là việc của VLM sinh chữ ở mục sau.
2.4. VLM hiện đại — projection layer là toàn bộ bí mật
Model như GPT-4V, Claude 3.5, LLaVA ghép mọi thứ lại. Kiến trúc, khi bỏ hết hào nhoáng, chỉ có ba khối:
ẢNH ─► ViT/encoder ─► image features
│
▼
Projection layer (vài lớp MLP) ← "phiên dịch viên"
│
▼
"image tokens" nằm CÙNG không gian với text token
│
▼
LLM có sẵn (Llama, Mistral...) xử lý lẫn lộn ảnh + chữ
│
▼
Sinh ra text
Giải thích đơn giản: projection layer là một bộ phiên dịch nhỏ. Nó nhận vector “tiếng ViT” và dịch sang vector “tiếng LLM”. Sau khi dịch, LLM coi token ảnh y như token chữ — attention qua lại tự nhiên, nên model có thể vừa “nhìn” vừa “lập luận bằng chữ”.
Cách train (đáng giá để hiểu vì sao chất lượng khác nhau giữa các model):
- Pre-train projection: đóng băng cả ViT lẫn LLM, chỉ train bộ
phiên dịch trên cặp
(ảnh, caption). Rẻ, nhanh. - Instruction tuning: train trên bộ ba
(ảnh, câu hỏi, câu trả lời)để model biết làm theo yêu cầu. - RLHF / DPO: tinh chỉnh để câu trả lời hữu ích và an toàn.
Ẩn dụ: bạn có một chuyên gia ngôn ngữ cực giỏi (LLM) chỉ nói tiếng Việt, và một nhiếp ảnh gia (ViT) mô tả ảnh bằng “tiếng ViT”. Projection layer là người phiên dịch giữa hai người. Bạn không cần dạy lại chuyên gia từ đầu — chỉ cần huấn luyện người phiên dịch. Đó là vì sao thêm “mắt” cho một LLM có sẵn lại rẻ và nhanh hơn train từ đầu rất nhiều.
2.5. Độ phân giải đổi bằng token (và bằng tiền)
Ảnh càng nét → càng nhiều patch → càng nhiều token → càng đắt và càng ngốn context.
512×512 → 32×32 = 1.024 image token
1024×1024 → 64×64 = 4.096 image token
Đây là trade-off bạn phải quyết mỗi lần gọi API:
| Chế độ | Thấy được gì | Giá |
|---|---|---|
| Low detail | Bố cục tổng thể, vật thể lớn | Rẻ |
| High detail | Chữ nhỏ, đường nét mảnh, chi tiết | Đắt |
GPT-4V có hai chế độ: “low” (gần như 1 token cho cả ảnh) và “high” (cắt ảnh thành nhiều ảnh con rồi xử lý từng phần). Anthropic và Google làm tương tự. Quy tắc thực dụng: chỉ bật high detail khi cần đọc chữ nhỏ hoặc chi tiết tinh vi.
3. Audio: hai trường phái
3.1. Cách cũ — nối ống (cascade)
Trước 2024, “audio AI” thường là ba model nối đuôi nhau:
AUDIO ─► Whisper (ASR) ─► text ─► LLM ─► text ─► TTS ─► AUDIO
- Ưu: đơn giản, lắp ghép linh hoạt, mỗi khối thay được độc lập.
- Nhược: độ trễ cộng dồn (2–5 giây); và chữ làm mất sắc thái — giọng giận dữ, tiếng cười, ngập ngừng đều biến mất khi chuyển thành text thuần.
Ẩn dụ: như dịch một bài hát ra lời rồi đọc lại — đúng nội dung nhưng mất hết giai điệu và cảm xúc.
3.2. Cách mới — native audio
GPT-4o (2024), Gemini Live, Moshi (Kyutai) xử lý âm thanh thẳng, không qua bước biến thành chữ trung gian:
AUDIO ─► audio tokenizer ─► audio token
│
▼
LLM đa phương thức
│
▼
Output: text + audio token
│
▼
Audio decoder ─► sóng âm
Độ trễ rớt xuống còn 200–500ms, đủ để hội thoại cảm giác như nói chuyện với người. Quan trọng hơn: model giữ được prosody — nó “nghe” thấy bạn đang vui hay bực, và đáp lại bằng giọng phù hợp.
Audio token hoá thế nào? Hai hướng: (1) giữ dạng liên tục (continuous embedding) cho LLM attend thẳng; hoặc (2) lượng tử hoá thành token rời rạc như một “bảng chữ cái âm thanh” (codebook) để LLM coi hệt như chữ. Model hiện đại thường lai hai cách.
Sản phẩm thật: Whisper (OpenAI) là cách cũ nhưng vẫn là tiêu chuẩn vàng cho phụ đề/transcription hàng loạt. Còn Advanced Voice của ChatGPT và Gemini Live là native — đó là lý do chúng ngắt lời được và phản hồi tức thì.
Hiểu lầm thường gặp: “native luôn tốt hơn cascade”. Không hẳn. Nếu bạn chỉ cần transcript chính xác cho 10.000 file ghi âm, cascade với Whisper rẻ hơn, dễ kiểm soát và dễ audit hơn nhiều so với một model hội thoại real-time.
4. Video: modality khó nhất
Video = chuỗi ảnh + audio + quan hệ thời gian. Cái khó không nằm ở từng khung hình, mà ở việc hiểu chuyện gì đang diễn ra theo thời gian.
Cách 1 — lấy mẫu khung hình (cascade): cứ mỗi giây lấy 1 khung, đưa qua VLM, rồi gộp kết quả. GPT-4V bản đầu làm vậy. Nhược điểm chí mạng: bỏ lỡ sự kiện giữa hai khung — nó không thực sự “xem video”, chỉ xem một xấp ảnh rời.
Cách 2 — native video: Gemini 2.0+ mã hoá cả không gian lẫn thời gian, nên nắm được chuyển động và suy luận theo trình tự.
VIDEO ─► encoder không-gian-thời-gian (3D) ─► video token ─► LLM
Cái giá: số token bùng nổ. 1 phút video ≈ 10.000–100.000 token — đắt và dễ tràn context.
Ẩn dụ: cascade giống lật vài tấm ảnh chụp một trận bóng rồi đoán tỷ số. Native video giống xem cả pha bóng — bạn thấy được đường chạy chỗ, pha chuyền, nhịp độ. Nhưng “xem cả trận” tốn thời gian (token) hơn nhiều “liếc vài tấm ảnh”.
Sản phẩm thật: Gemini được Google dùng cho hiểu nội dung video quy mô lớn; các đội highlight thể thao và tóm tắt cuộc họp xài cùng tư duy này. Nhưng video dài trên 1 giờ vẫn là bài toán mở — thường phải cắt khúc + tóm tắt phân tầng.
5. Ba kiểu fusion — kiến trúc gắn các modality lại
Có ba cách “trộn” modality. Hiểu chúng giúp bạn đọc được tại sao một model mạnh cross-modal còn model khác thì không.
EARLY FUSION LATE FUSION CROSS-ATTENTION
(trộn ở đầu vào) (trộn ở đầu ra) (LLM "nhìn sang" encoder)
text ─┐ text ─►encoder─┐ LLM(text)
image ─┼─► 1 Transformer image─►encoder─┼─►gộp ▲ ║ cross-attention
audio ─┘ audio─►encoder─┘ ║ ▼
Vision encoder output
| Kiểu | Cơ chế | Ưu | Nhược | Ai dùng |
|---|---|---|---|---|
| Early fusion | Trộn token mọi modality từ đầu vào | Tương tác cross-modal sâu nhất | Phải train from scratch, rất tốn kém | Một số model native thế hệ mới |
| Late fusion | Encoder riêng, chỉ gộp ở cuối | Tái dùng encoder pre-trained, rạch ròi | Tương tác cross-modal nông | Hệ thống retrieval/phân loại |
| Cross-attention | LLM cross-attend sang encoder ảnh | Tái dùng cả LLM mạnh lẫn encoder mạnh | Train tinh tế, phải cân bằng kỹ | LLaVA, GPT-4V, Claude 3.5 |
Vì sao cross-attention thắng thế: nó cho bạn đứng trên vai khổng lồ — lấy một LLM giỏi sẵn, một vision encoder giỏi sẵn, và chỉ học cách nối hai bên. Rẻ hơn early fusion, mà mạnh hơn late fusion.
6. Giới hạn — và vì sao chúng tồn tại
Đây là phần quan trọng nhất để dùng VLM đúng chỗ. Mọi giới hạn dưới đây đều suy ra trực tiếp từ first principle ở Phần 1: model thấy token nén từ ảnh, không thấy ảnh thật.
6.1. Lý luận không gian (spatial) yếu
Đếm vật thể, trái/phải, trên/dưới — VLM sai thường xuyên.
Hỏi: "Có bao nhiêu xe đỏ trong ảnh?" → "3" (thực tế 5)
Hỏi: "Cốc nằm bên trái hay phải laptop?" → đúng kiểu tung đồng xu
Vì sao: thông tin vị trí bị nén mạnh khi ảnh thành ít token; model được train để mô tả cái gì trong ảnh, không phải đo đạc ở đâu, bao nhiêu.
Khi nào KHÔNG nên dùng: đừng dùng VLM tổng quát cho đếm chính xác, đo đạc, hay định vị pixel-perfect. Dùng object detection chuyên dụng (YOLO, DETR) cho phần đó, rồi để VLM lo phần “giải thích ý nghĩa”.
6.2. Bỏ sót chi tiết nhỏ
Chữ li ti, viền 1px, logo ở góc, bảng số hàng ngàn dòng → dễ trượt. Khắc phục: bật high-detail, hoặc crop vùng cần trước khi gửi.
6.3. Ảo giác thị giác (visual hallucination)
[Ảnh: căn phòng trống]
Hỏi: "Mô tả những gì bạn thấy"
Đáp: "Một phòng khách ấm cúng với ghế sofa nâu, đèn, kệ sách..." ← bịa
Vì sao: model là máy đoán-cái-có-khả-năng-nhất. Phòng khách “thường” có sofa, nên nó điền vào dù ảnh trống. Khắc phục: prompt ràng buộc (“chỉ mô tả thứ thực sự nhìn thấy, nói ‘không rõ’ nếu không chắc”).
6.4. Hiểu quan hệ thành phần (compositional)
“Khối đỏ nằm trên khối xanh” — model có thể đảo quan hệ. Đang cải thiện theo thời gian nhưng chưa hoàn hảo.
6.5. Thứ tự đọc trong tài liệu phức tạp
Báo 3 cột → model có thể đọc ngang qua các cột → văn bản vô nghĩa. Với tài liệu có layout phức tạp, dùng model layout-aware (LayoutLM, DocLLM).
6.6. Chi phí & độ trễ
Text input: 1K token ≈ $0.003 (Claude Sonnet, giá ví dụ)
Ảnh high-detail: ~1.5K–3K token ≈ $0.005–0.009 / ảnh
Video 1 phút: 50K–100K token ≈ $0.15–0.30
Cộng thêm 1–3 giây độ trễ cho mỗi lần gọi VLM. Xem Cost Optimization để cắt giảm.
6.7. Độ phân giải & tỷ lệ khung hình
Ảnh quá to hoặc tỷ lệ lạ có thể bị resize → méo hoặc mất chi tiết. Tiền xử lý đúng (giữ tỷ lệ, giới hạn cạnh dài) trước khi gửi.
Case “khi nào KHÔNG dùng” kinh điển — xe tự lái: Tesla, Waymo không dùng VLM hội thoại để lái xe real-time. Lái xe cần độ trễ mili-giây, đầu ra hình học chính xác (khoảng cách, vận tốc) và độ tin cậy an toàn — đúng những điểm VLM tổng quát yếu nhất. Họ dùng model perception chuyên biệt. VLM hợp cho giải thích một cảnh, không hợp cho điều khiển an toàn tính mạng theo thời gian thực.
7. Đánh giá VLM khó hơn đánh giá LLM text
Câu trả lời thị giác thường là free-form (“mô tả ảnh này”), nên chấm tự động khó; LLM-judge thì thiên lệch; benchmark hay bị nhiễm dữ liệu.
Benchmark hay gặp: MMMU (đề thi đại học đa phương thức), MathVista (toán có hình), DocVQA (hỏi đáp tài liệu), TextVQA (chữ trong ảnh), Video-MME (video).
Lời khuyên production: đừng tin leaderboard. Tự dựng eval set riêng cho task của bạn — 100–500 ví dụ có ground truth — và đo accuracy trên đó. Xem Evaluating LLMs & Agents.
8. Chọn model multimodal (đầu 2026)
| Model | Mạnh ở | Ghi chú |
|---|---|---|
| GPT-4o | Audio + ảnh, hội thoại tự nhiên | Mặc định cho voice assistant |
| Gemini 2.0+ | Video native, context dài | Tốt nhất cho suy luận video |
| Claude 3.5 Sonnet | Ảnh, hỏi đáp tài liệu, độ chính xác | Tốt cho thay-thế-OCR, document |
| Llama 3.2 Vision | Mở, ảnh | Lựa chọn self-host |
| Pixtral (Mistral) | Mở, vision | Data residency châu Âu |
| Qwen2-VL | Mở, OCR mạnh | OCR tiếng Trung tốt nhất |
| Whisper | ASR (audio → text) | Dùng cascade khi chỉ cần ASR |
Cây quyết định nhanh:
Cần video → Gemini 2.0+
Cần audio real-time → GPT-4o
Cần chính xác tài liệu → Claude 3.5 Sonnet
Cần mở / self-host → Llama 3.2 Vision / Qwen2-VL
Chỉ cần OCR thuần → Tesseract (rẻ) + VLM review (khi cần)
9. Use case thật & ví dụ production
| Use case | Vì sao multimodal thắng cách cũ | Ví dụ thực tế |
|---|---|---|
| Design → code | Hiểu cả bố cục lẫn ý đồ, không chỉ DOM | Vercel v0, design-to-code trong Cursor |
| Trích dữ liệu tài liệu (OCR++) | “Thấy” cả chart/table, không chỉ chữ phẳng | Fintech trích hoá đơn/biên lai bằng Claude/GPT-4o |
| Hỗ trợ người khiếm thị | Mô tả khung cảnh + trả lời câu hỏi tiếp theo | Be My Eyes × OpenAI (“Be My AI”) |
| Tìm kiếm ảnh ngữ nghĩa | Khớp ý định, không khớp tag thủ công | Google Lens, “tìm bằng hình” trong e-commerce |
| Trợ lý camera real-time | Trỏ camera + hỏi, độ trễ ~500ms | Meta Ray-Ban “look and ask”, ChatGPT voice + vision |
Minh hoạ design → code (pseudo):
image = upload_screenshot()
prompt = """Convert this UI to a React component.
Tailwind CSS, TypeScript strict. Match layout, color, typography."""
code = vlm.generate(image, prompt) # 70–90% dùng được ngay cho UI đơn giản
Minh hoạ OCR++ có cấu trúc:
prompt = """Từ hoá đơn này, trích JSON:
{ "vendor": str, "total": number,
"items": [{ "desc": str, "qty": number, "price": number }] }
Chỉ trả JSON."""
data = vlm.generate(invoice_image, prompt) # vẫn cần human review cho high-stake
10. Mẹo thực chiến giảm chi phí & tăng độ chính xác
- Tiền xử lý ảnh: giữ tỷ lệ, giới hạn cạnh dài ~2048px, convert sRGB, JPEG quality ~85. Tiết kiệm băng thông và token.
- Crop trước khi gửi: chỉ cần vùng menu trong screenshot? Crop trước → ít token, ít nhiễu, chính xác hơn.
- Kết hợp CV truyền thống: YOLO/DETR đếm & định vị → VLM giải thích. Mỗi công cụ làm đúng việc nó giỏi.
- Cache mạnh tay: embedding ảnh ổn định → cache CLIP embedding cho cả kho ảnh, tái dùng cho mọi query về sau.
Pipeline lai (hybrid) điển hình:
Ảnh ─► YOLO ─► bounding boxes ─► crop từng box ─► VLM mô tả ─► gộp ─► trả lời
Key Takeaways
- Multimodal = mánh token hoá, không phải “model học nhìn”. Ảnh, audio, video đều bị nén thành vector “giả token” nằm chung không gian với chữ, để một Transformer xử lý tất cả.
- VLM = encoder (ViT) + projection layer + LLM. Projection layer — bộ phiên dịch nhỏ — là chỗ phần lớn phép màu (và sự khác biệt chất lượng) xảy ra.
- CLIP kéo ảnh và chữ về chung không gian → nền tảng của semantic image search và zero-shot classification.
- Mọi giới hạn đều suy từ first principle: nén làm yếu lý luận không gian, gây ảo giác, bỏ sót chi tiết nhỏ.
- Chi phí theo token: ảnh đắt gấp nhiều lần text, video gấp 50–100×. Tiền xử lý + crop + cache là ba đòn bẩy lớn nhất.
Common Mistakes
- Dùng VLM để đếm/đo/định vị chính xác. Hãy ghép object detection chuyên dụng; để VLM lo phần ngữ nghĩa.
- Bật high-detail cho mọi ảnh. Chỉ bật khi cần đọc chi tiết nhỏ — nếu không là đốt token vô ích.
- Tin model đã “thấy đúng”. Không ràng buộc prompt → model bịa chi tiết “thường có”. Luôn yêu cầu “chỉ mô tả thứ thực sự thấy”.
- Native audio cho mọi việc. Chỉ cần transcript hàng loạt thì cascade Whisper rẻ và dễ kiểm soát hơn.
- Ném cả video 1 giờ vào một lần gọi. Token bùng nổ + “lost in the middle”. Cắt khúc và tóm tắt phân tầng.
- Tin leaderboard thay vì eval riêng. Benchmark hay bị nhiễm dữ liệu; task của bạn mới là thước đo thật.
When Should You Use This?
Nên dùng khi:
- Đầu vào vốn dĩ là hình/âm thanh: screenshot, scan tài liệu có chart/table, ảnh sản phẩm, ghi âm hội thoại.
- Cần hiểu ý nghĩa hơn là đo đạc chính xác: mô tả, phân loại, hỏi đáp, tóm tắt, hỗ trợ tiếp cận (accessibility).
- Cần dựng nhanh prototype thay cho pipeline CV nhiều mảnh (Tesseract + regex + rule…).
KHÔNG nên dùng khi:
- Cần độ chính xác hình học/thời-gian-thực an toàn tính mạng (xe tự lái, robot công nghiệp) → dùng perception chuyên dụng.
- Cần đếm/đo/định vị tuyệt đối → object detection.
- Chỉ cần transcript thuần, quy mô lớn, chi phí nhạy cảm → ASR cascade.
- Tài liệu layout cực phức tạp cần đúng thứ tự đọc → model layout-aware.
Quick Start Guide
Bước đầu tiên thực sự để chạm tay vào (đọc screenshot và trả về JSON có cấu trúc):
import base64, json
from openai import OpenAI
client = OpenAI()
def vlm_extract(image_path: str, instruction: str) -> dict:
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": instruction +
" Chỉ mô tả thứ thực sự thấy. Trả về JSON hợp lệ."},
{"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{b64}",
"detail": "high"}}, # 'low' nếu chỉ cần tổng quan
],
}],
temperature=0, # cần đầu ra ổn định, không sáng tạo
)
return json.loads(resp.choices[0].message.content)
print(vlm_extract("invoice.jpg",
'Trích {"vendor": str, "total": number}.'))
Lộ trình 5 bước để áp dụng:
- Chọn đúng modality + model theo cây quyết định ở Phần 8.
- Tiền xử lý: resize giữ tỷ lệ, chọn
detaillow/high theo nhu cầu. - Ràng buộc đầu ra: yêu cầu JSON +
temperature=0cho task trích xuất; cấm bịa. - Dựng eval set nhỏ (100–500 ví dụ có ground truth) và đo accuracy trên chính dữ liệu của bạn.
- Tối ưu chi phí: crop vùng cần, cache embedding, ghép CV truyền thống cho phần đếm/đo.
Đọc thêm
- Vector Embeddings deep dive — chi tiết CLIP
- LLM Models Comparison
- RAG Guide — multimodal RAG
- Cost Optimization
- AI Safety
Reference
- “An Image is Worth 16x16 Words” (ViT) — Dosovitskiy et al. 2020
- “Learning Transferable Visual Models” (CLIP) — Radford et al. 2021
- “Visual Instruction Tuning” (LLaVA) — Liu et al. 2023
- “GPT-4V System Card” — OpenAI 2023
- “Gemini: A Family of Highly Capable Multimodal Models” — Google 2023