Bỏ qua để đến nội dung
Search & RAG

1.8 Vector và embedding — trực giác hình học

BM25 vẫn dựa trên từ chung. Nếu người dùng gõ “quên pass” thì df của “pass” bằng 0 và cả công thức trên vô dụng. Đây là chỗ embedding vào cuộc.

Vector là gì? Một danh sách số. (3, 4) là một vector 2 chiều — vẽ được như một mũi tên từ gốc toạ độ tới điểm (3,4). (0.12, −0.98, 0.31, …) với 768 số là một vector 768 chiều: không vẽ được, nhưng mọi phép toán vẫn y hệt.

Embedding là gì? Là việc dùng một model biến một đoạn văn thành một vector, sao cho đoạn văn gần nghĩa thì vector chỉ về cùng hướng. Chỉ có thế.

Đo “cùng hướng” bằng cosine. Cosine của góc giữa hai vector:

cos(u,v)=uvuv\cos(u,v) = \frac{u \cdot v}{\lVert u\rVert \, \lVert v\rVert}

trong đó uvu \cdot v là tổng các cặp toạ độ nhân với nhau, còn u\lVert u\rVert là độ dài của vector — căn bậc hai của tổng bình phương các toạ độ.

Tính thật, ba vector 2 chiều, cả ba đều dài 5:

a = (3, 4) b = (4, 3) c = (−3, 4)
cos(a,b) = (3·4 + 4·3)/(5·5) = 24/25 = 0.96 <- gần như cùng hướng
cos(a,c) = (3·−3 + 4·4)/(5·5) = 7/25 = 0.28 <- lệch nhau nhiều
cos(a,2a)= với 2a = (6,8) = 1.00 <- TRÙNG hướng

Dòng cuối là dòng quan trọng nhất: nhân đôi vector không đổi cosine. Cosine chỉ quan tâm hướng, không quan tâm độ dài. Đó chính là lý do các hệ thống luôn chuẩn hoá vector về độ dài 1 trước khi lưu — sau khi chuẩn hoá, phép nhân đơn giản (u·v) đã bằng cosine, tính nhanh hơn nhiều. Chi tiết ở Tầng 1.

Vì sao “cùng hướng” lại là “cùng nghĩa”? Đây là câu hỏi hay nhất của cả phần này, và câu trả lời không hiển nhiên: không ai lập trình cho nó như vậy. Model được cho xem hàng tỷ cặp văn bản đi với nhau (tiêu đề ↔ nội dung, câu hỏi ↔ câu trả lời) và bị buộc phải xếp các cặp đó gần nhau, đồng thời đẩy các cặp không đi với nhau ra xa. Ngữ nghĩa là sản phẩm phụ của bài toán đó. Cơ chế đầy đủ ở Tầng 1.3.

Phần 1 — Nhập môn