Cách Mình Xử Lý Embeddings

Nguyên tắc làm việc hiệu quả với vector embeddings

Embeddings biến text thành vectors -- ý nghĩa trở thành khoảng cách trong không gian toán học. Nghe đơn giản vậy thôi chứ sai một bước là hỏng hết. Dùng cosine similarity chỗ cần Euclidean distance, bỏ qua dimensionality reduction trước khi clustering -- lỗi kiểu này cho kết quả sai mà nhìn bề ngoài không thấy. Embeddings cũng lớn (hàng nghìn dimensions) và tốn kém để tính, nên phải xài cho đúng.

Câu hỏi cốt lõi: "Mình có đang dùng đúng embedding, đúng distance metric, và đúng dimensionality cho task này không?"

Chọn model phù hợp task

Đừng lấy một model dùng cho mọi thứ. General-purpose embeddings cho domain-specific tasks, large model cho simple classification -- toàn là lãng phí.

Chọn dựa trên yêu cầu: semantic similarity hay search retrieval? Domain general hay specialized? Hỗ trợ ngôn ngữ nào? Tradeoff dimension size vs. accuracy ra sao? Document lại tại sao chọn model đó.

Ví dụ thực tế: code embedding model sẽ vượt trội hơn general model khi xử lý code. Multilingual model xử lý tiếng Việt tốt hơn model chỉ English. Chọn sai model thì downstream algorithm hay đến mấy cũng vô ích -- garbage in, garbage out mà.

Giảm dimensions có mục đích

Hai cực đoan đều sai: dùng thẳng embeddings 3,072 dimensions cho clustering (curse of dimensionality) hoặc giảm hết xuống 2D (mất quá nhiều thông tin).

Dùng dimensionality khác nhau cho mục đích khác nhau:

  • High dimensions (50-100) cho clustering algorithms kiểu HDBSCAN
  • Low dimensions (2-3) chỉ cho visualization thôi
  • Giữ nguyên original embeddings để re-processing khi cần

Clustering trong dimensions quá cao thì fail do distance concentration -- tất cả points có vẻ cách đều nhau hết. Nhưng reduce quá mạnh lại mất semantic distinctions. Tuỳ task mà chọn.

Distance metric -- đừng để mặc định

Mặc định Euclidean cho mọi thứ là thói quen nguy hiểm, nhất là với normalized embeddings.

Nguyên tắc đơn giản: dùng cosine similarity/distance cho semantic similarity khi embeddings đã normalized. Dùng Euclidean distance sau dimensionality reduction (UMAP, PCA). Match metric với cách embedding model được train. Nhiều models tạo ra normalized vectors mà cosine similarity mới là phương pháp so sánh đúng -- Euclidean vẫn chạy nhưng kém chính xác hơn.

Batch rồi giữ lại

Tính embeddings từng cái một thì chậm kinh khủng. Tính xong rồi bỏ thì lần sau phải tính lại -- lãng phí tiền API.

Luôn batch embedding requests (50-100 items mỗi request). Lưu computed embeddings cùng source text. Cho phép re-clustering hoặc re-analysis mà không cần tính lại. Embeddings là bước chậm nhất và tốn kém nhất trong pipeline -- batching giảm latency ~10x, còn giữ lại thì cho phép thử nghiệm parameters thoải mái mà không lặp bước tốn kém.

Edge cases phải xử lý rõ ràng

Empty strings, text quá dài, ký tự đặc biệt -- đừng giả định mọi text đều cho ra valid embeddings.

Validate text trước khi gửi đi embed. Empty strings thì skip hoặc dùng placeholder. Text dài thì truncate với cảnh báo hoặc chunk rồi aggregate. Document hết behavior cho edge cases. Một null vector duy nhất trong clustering operation có thể crash hoặc làm lệch toàn bộ kết quả, nên đừng để lọt.

Khung quyết định

Khi nào giảm dimensionality?

Luôn giảm trước khi:

  • Clustering với density-based algorithms (HDBSCAN, DBSCAN)
  • K-means hoặc hierarchical clustering trên >1000 dimensions
  • Visualization (luôn giảm xuống 2-3D)

Giữ full dimensions cho:

  • Nearest neighbor search với optimized libraries (FAISS, Annoy)
  • Algorithms thiết kế cho high dimensions
  • Storage khi có thể cần re-reduce sau

Target bao nhiêu dimensions?

Mục đíchDimensions khuyến nghịLý do
Visualization2-3Giới hạn nhận thức con người
Clustering30-50Cân bằng chi tiết vs. curse of dimensionality
Search/retrievalFull hoặc 256-512Giữ semantic precision
Storage (compressed)128-256Giảm size nhưng giữ utility

UMAP, PCA, hay t-SNE?

UMAP khi:

  • Cần giữ cả local và global structure
  • Target dimension là 2-50
  • Tốc độ quan trọng cho datasets lớn
  • Kết quả sẽ dùng cho clustering

PCA khi:

  • Cần deterministic, reproducible results
  • Tốc độ là critical và approximation chấp nhận được
  • Linear relationships là đủ
  • Cần interpretable components

t-SNE khi:

  • Visualization là mục tiêu duy nhất
  • Local structure quan trọng hơn global
  • Dataset nhỏ (dưới 10,000 items)
  • Ưu tiên cluster separation rõ ràng

Mấy lỗi hay gặp

Clustering thẳng trên high dimensions. Kết quả ra một cục giant cluster và toàn outliers, tune parameters kiểu gì cũng không khá hơn. Giảm xuống 30-50 dimensions trước khi clustering, dùng UMAP với metric phù hợp.

Dùng 2D embeddings cho analysis. Clusters nhìn trên plot thì đẹp nhưng mở ra xem nội dung thì lẫn lộn hết. 2D chỉ để visualization thôi. Clustering thật thì dùng 30-50 dimensions, xong rồi project xuống 2D để hiển thị.

Không đọc docs của embedding model. Symmetric similarity model mà đem đi làm search, retrieval model mà dùng cho classification -- sai tool cho sai task. Đọc documentation trước: model nào train cho query-document retrieval (asymmetric), model nào cho sentence similarity (symmetric).

Bỏ qua text length limits. Documents dài cho ra embeddings giống nhau hết vì bị truncate mà không biết. Nắm rõ token limit của model (thường 512-8192 tokens). Text dài thì chunk rồi aggregate, hoặc chọn representative portions.

Tính đi tính lại không cần thiết. Cùng data mà chạy nhiều lần với parameters khác, mỗi lần đều tính embeddings lại từ đầu -- tốn tiền vô ích. Cache embeddings kèm source text hash, check cache trước khi tính. Tách bước embedding khỏi downstream processing.

Checklist đánh giá

Đang ổn nếu:

  • Giải thích được tại sao chọn embedding model này
  • Dimensionality reduction phù hợp downstream task
  • Distance metric match cách embedding model được train
  • Embeddings được batched và parallelized
  • Edge cases (empty, long text) xử lý rõ ràng

Cần xem lại nếu:

  • Đổi embedding model phải sửa code khắp nơi
  • Clusters không khớp kỳ vọng semantic
  • Không chắc distance metric nào đang dùng
  • Chạy lại với parameters khác phải tính lại embeddings
  • Một số inputs âm thầm cho ra null hoặc truncated embeddings

Tham khảo nhanh

Text Input
    |
    v
+-------------------+
| Embedding Model   |   text-embedding-3-large: 3,072 dims
| (API call)        |   all-MiniLM: 384 dims
+-------------------+   multilingual-e5: 768 dims
    |
    v
+-------------------+
| Full Embeddings   |   Lưu để re-processing
| (high-dim)        |   Dùng cosine distance
+-------------------+
    |
    +------+-------+
    |      |       |
    v      v       v
  30-50D  2D     3D
 Cluster  Plot   Plot
  UMAP    UMAP   UMAP
Vấn đềHướng dẫn
Chọn modelPhù hợp task (search vs. similarity), ngôn ngữ, domain
DimensionsFull cho storage, 30-50 cho clustering, 2-3 cho visualization
Distance metricCosine cho raw embeddings, Euclidean sau UMAP
Batching50-100 items mỗi request, parallelize batches
CachingLưu embeddings với text hash, tái sử dụng qua các lần chạy