[AI Blog #65] Hiểu Bản Chất Của Embeddings & Vector Search Từ Con Số 0: Biến Chữ Viết Thành Tọa Độ Hình Học, Độ Tương Đồng Cosine & Tìm Kiếm Ngữ Nghĩa Bằng Python
![[AI Blog #65] Hiểu Bản Chất Của Embeddings & Vector Search Từ Con Số 0: Biến Chữ Viết Thành Tọa Độ Hình Học, Độ Tương Đồng Cosine & Tìm Kiếm Ngữ Nghĩa Bằng Python](/uploads/ai-images/cover-embeddings-vector-search-python.png)
1. Bối cảnh thực tế (Context & Problem Statement)
Trong nhiều thập kỷ qua, khi bạn tìm kiếm thông tin trên Google, máy tính cá nhân hay ứng dụng thương mại điện tử, hệ thống chủ yếu sử dụng Tìm kiếm từ khóa (Keyword Search / Lexical Search - tương tự phím tắt Ctrl + F):
- Bạn gõ:
"con chó dễ thương"Hệ thống sẽ lùng sục khắp cơ sở dữ liệu để tìm đúng các tài liệu có chứa chính xác các từ:"con","chó","dễ thương".
Điểm yếu chí mạng của tìm kiếm từ khóa:
- Bất lực trước từ đồng nghĩa và tiếng lóng: Nếu một bài viết viết về: "chú cún đáng yêu" hay "thú cưng 4 chân trung thành", công cụ tìm kiếm từ khóa sẽ hoàn toàn bỏ qua vì các ký tự chữ cái không hề trùng khớp nhau!
- Không hiểu ngữ cảnh: Khi bạn tìm từ
"quả táo", máy tính không phân biệt được bạn đang muốn mua trái cây hay đang tìm mua điện thoại iPhone của tập đoàn Apple.
Để máy tính thực sự "hiểu" được ý nghĩa của ngôn ngữ loài người, các nhà khoa học máy tính đã phát minh ra một khái niệm mang tính cách mạng: Vector Embeddings (Vectơ nhúng ngữ nghĩa).
2. Các Khái Niệm & Cơ Chế Cốt Lõi
2.1. Bản Chất Của Embedding: Biến Chữ Viết Thành Tọa Độ Không Gian
Máy tính không biết đọc chữ; máy tính chỉ biết tính toán trên các con số.
Embedding đơn giản là một thuật toán chuyển đổi một từ, một câu văn hoặc một bức ảnh thành một dãy các con số (Vector tọa độ) đại diện cho ý nghĩa của nó:
Hình ảnh trực quan trong không gian 2 Chiều:
Giả sử ta chỉ dùng 2 thuộc tính để mô tả các loài động vật:
- Trục hoành (): Kích thước (Từ 0 = Rất nhỏ đến 1 = Rất lớn).
- Trục tung (): Mức độ thuần hóa (Từ 0 = Hoang dã đến 1 = Thú cưng trong nhà).
Mức độ thuần hóa (Trục Y)
^
| * [Mèo nhà] (X=0.2, Y=0.9)
| * [Chó nhà] (X=0.3, Y=0.85) <--- Hai điểm này NẰM GẦN NHAU!
|
|
| * [Sư tử] (X=0.8, Y=0.1)
| * [Hổ] (X=0.85, Y=0.15) <--- NẰM GẦN NHAU!
+--------------------------------------------------------------------> Kích thước (Trục X)
0
- Nhìn vào đồ thị trên, ta thấy ngay một nguyên lý tuyệt đẹp:
- Hai khái niệm có ý nghĩa tương đồng (
MèovàChó) sẽ có tọa độ nằm rất gần nhau. - Hai khái niệm khác biệt (
ChóvàSư tử) sẽ nằm xa nhau.
- Hai khái niệm có ý nghĩa tương đồng (
- Trong thực tế, các mô hình Embedding hiện đại không chỉ có 2 chiều, mà mô tả câu văn trong không gian từ đến chiều số thực để bắt trọn mọi sắc thái ngữ nghĩa tinh vi!
2.2. Phép Toán Kinh Điển Của Word Embeddings
Khi ngôn ngữ được số hóa thành các vector tọa độ, ta có thể thực hiện các phép cộng trừ đại số trên ý nghĩa của từ ngữ:
- Giải thích đời thường: Lấy khái niệm "Vua", trừ đi tính chất "Đàn ông", rồi cộng thêm tính chất "Phụ nữ", kết quả thu được một vector tọa độ gần nhất với từ "Nữ hoàng"!
2.3. Đo Lường Độ Tương Đồng: Cosine Similarity vs. Khoảng Cách Euclidean
Làm thế nào để đo xem hai câu văn có ý nghĩa giống nhau hay không?
B (Câu văn dài)
/
/ Góc θ (Theta) nhỏ -> Cosine Similarity ≈ 1.0 (CÙNG Ý NGHĨA!)
/ )
+---------> A (Câu văn ngắn)
0
- Khoảng cách Euclidean (Khoảng cách đường chim bay):
- Đo độ dài đoạn thẳng nối giữa 2 điểm tọa độ.
- Điểm yếu trong văn bản: Một câu văn ngắn ("Thời tiết đẹp") và một câu văn dài ("Hôm nay bầu trời trong xanh, nắng vàng rực rỡ, thời tiết vô cùng đẹp đẽ") có cùng ý nghĩa, nhưng do độ dài câu khác nhau nên vector của câu dài sẽ bị kéo dài ra xa Khoảng cách Euclidean bị lớn!
- Độ tương đồng Cosine (Cosine Similarity - Chuẩn mực số 1):
- Không quan tâm vector dài hay ngắn, chỉ đo góc (Theta) lệch giữa hai hướng đi của vector:
- Giá trị nằm trong khoảng từ đến :
- (Góc ): Hai câu hoàn toàn trùng khớp ngữ nghĩa.
- (Góc ): Hai câu hoàn toàn độc lập, không liên quan.
- (Góc ): Hai câu có ý nghĩa trái ngược nhau hoàn toàn.
2.4. Nguyên Lý Hoạt Động Của Hệ Thống Tìm Kiếm Ngữ Nghĩa (Semantic Search)
Một hệ thống Semantic Search (như tìm kiếm bài viết, tìm kiếm sản phẩm Tiki/Shopee) hoạt động qua 2 quy trình:
QUY TRÌNH 1: OFFLINE INDEXING (Tính toán trước một lần)
[Hàng triệu bài viết / Sản phẩm] ---> [Embedding Model] ---> [Các Vector số] ---> [Lưu vào Vector DB / Cache]
QUY TRÌNH 2: ONLINE QUERY (Khi người dùng tìm kiếm)
[User gõ: "Điện thoại pin trâu"] ---> [Embedding Model] ---> Vector Câu Hỏi (q)
|
v (Tính Cosine Similarity siêu nhanh)
[Top 5 sản phẩm có Vector nằm gần vector (q) nhất: "iPhone 15 Plus dung lượng 4383 mAh..."]
3. Các Bảng Markdown So Sánh Chi Tiết
📊 Bảng 1: So Sánh Tìm Kiếm Từ Khóa (Keyword Search) vs. Tìm Kiếm Ngữ Nghĩa (Vector Search)
| Tiêu chí | Tìm kiếm từ khóa (Keyword / BM25 / Ctrl+F) | Tìm kiếm ngữ nghĩa (Vector Search / Embeddings) |
|---|---|---|
| Bản chất cơ chế | So khớp chính xác chuỗi ký tự bề mặt (Exact Match) | So khớp khoảng cách tọa độ trong không gian ngữ nghĩa |
| Xử lý từ đồng nghĩa | Thất bại hoàn toàn (Không tìm được nếu từ ngữ khác nhau) | Xuất sắc (Hiểu "ô tô" và "xe hơi" là một) |
| Xử lý lỗi chính tả | Kém (Sai 1 chữ cái coi như từ mới) | Rất tốt (Vector của từ gõ sai vẫn nằm sát từ đúng) |
| Độ chính xác với từ hiếm | Rất cao (Tìm số mã định danh, số hợp đồng, tên riêng) | Đôi khi bị mờ nhạt nếu tên riêng quá mới |
| Chi phí tính toán | Siêu nhẹ, chỉ cần thuật toán Inverted Index | Cần chạy mô hình Deep Learning để sinh vector |
| Khuyến nghị thực tế | Dùng cho tìm kiếm mã đơn hàng, số CCCD, tài liệu luật | Dùng cho tìm kiếm sản phẩm, câu hỏi FAQ, hệ thống RAG/AI |
📊 Bảng 2: So Sánh 3 Thước Đo Khoảng Cách Hình Học Trong Không Gian Vector
| Thước đo | Công thức bản chất | Độ nhạy với độ dài văn bản | Trường hợp sử dụng tối ưu |
|---|---|---|---|
| Cosine Similarity | Đo góc hợp bởi 2 vector: | Hoàn toàn không bị ảnh hưởng | Tiêu chuẩn vàng cho Tìm kiếm văn bản & NLP |
| Dot Product (Tích vô hướng) | Nhân từng tọa độ tương ứng: | Phụ thuộc mạnh vào độ dài vector | Khi tất cả các vector đã được chuẩn hóa độ dài bằng 1 |
| Euclidean Distance () | Độ dài đoạn thẳng hình học: | Rất nhạy cảm với độ dài văn bản | Nhận diện khuôn mặt, Bài toán phân cụm K-Means |
📊 Bảng 3: Các Dòng Mô Hình Embedding Phổ Biến Hiện Nay
| Mô hình Embedding | Số chiều vector (Dimensions) | Đơn vị phát triển | Cách thức sử dụng | Đánh giá thực tế |
|---|---|---|---|---|
all-MiniLM-L6-v2 | HuggingFace (Sentence-Transformers) | Chạy Offline miễn phí trên máy tính/CPU | Siêu nhẹ, chạy cực nhanh, rất tốt cho học tập | |
text-embedding-3-small | OpenAI | Gọi qua Cloud API có phí | Rất thông minh, hỗ trợ đa ngôn ngữ xuất sắc | |
BGE-M3 | BAAI | Chạy mã nguồn mở (Hỗ trợ GPU) | Hỗ trợ Tiếng Việt và đa ngôn ngữ tốt nhất hiện nay |
4. Thực Hành Thực Chiến: Ứng Dụng Semantic Search Đầu Tiên Bằng Python (Walkthrough)
📌 Kịch bản bài toán:
Xây dựng một công cụ tìm kiếm bài viết cho một website công nghệ. Người dùng có thể tìm kiếm bằng câu nói tự nhiên, hệ thống sẽ tự động tìm ra bài viết phù hợp nhất về mặt ý nghĩa mà không cần trùng từ khóa!
# Cài đặt thư viện: pip install sentence-transformers scikit-learn
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 1. Tải mô hình Embedding nhỏ gọn chạy trực tiếp trên CPU (Miễn phí 100%):
print("-> Đang tải mô hình Embedding...")
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Cơ sở dữ liệu mẫu gồm 5 bài viết công nghệ:
documents = [
"Hướng dẫn cách thay dầu và bảo dưỡng xe máy Honda định kỳ.",
"Apple vừa ra mắt dòng điện thoại iPhone mới với nhiều tính năng AI hiện đại.",
"Công thức nấu món phở bò truyền thống thơm ngon chuẩn vị Hà Nội.",
"Các thủ thuật tối ưu hóa mã nguồn Python giúp chương trình chạy nhanh hơn gấp đôi.",
"Bí quyết chăm sóc và huấn luyện chó cưng nghe lời chủ tại nhà."
]
# 3. OFFLINE STEP: Chuyển đổi toàn bộ tài liệu thành các Vector Embeddings:
print("-> Đang chuyển đổi tài liệu thành các vector số...")
doc_embeddings = model.encode(documents)
print(f"Kích thước ma trận vector tài liệu: {doc_embeddings.shape}") # (5 tài liệu, 384 chiều)
# 4. ONLINE STEP: Người dùng nhập câu tìm kiếm tự nhiên:
# Chú ý: Câu tìm kiếm dùng từ "smartphone" và "thiết bị di động", trong tài liệu chỉ có từ "điện thoại" và "iPhone":
user_query = "Tôi muốn tìm mua một chiếc smartphone di động thông minh của hãng Táo"
# Chuyển câu hỏi của người dùng thành vector tọa độ:
query_embedding = model.encode([user_query])
# 5. Tính độ tương đồng Cosine giữa câu hỏi và toàn bộ 5 tài liệu:
similarity_scores = cosine_similarity(query_embedding, doc_embeddings)[0]
# 6. Sắp xếp và in ra kết quả bài viết có điểm số cao nhất:
ranked_indices = np.argsort(similarity_scores)[::-1] # Sắp xếp giảm dần
print(f"\nCâu hỏi của người dùng: '{user_query}'\n")
print("=== KẾT QUẢ TÌM KIẾM NGỮ NGHĨA TỐT NHẤT ===")
for rank, idx in enumerate(ranked_indices[:3], start=1):
score = similarity_scores[idx]
print(f"Top {rank} (Độ tương đồng: {score:.4f}):")
print(f"-> Nội dung: \"{documents[idx]}\"\n")
5. Góc Ôn Luyện Phỏng Vấn (Interview Corner)
❓ Câu hỏi 1: Vector Embedding là gì? Tại sao các mô hình học máy và AI bắt buộc phải chuyển đổi văn bản thành vector số trước khi xử lý?
- Gợi ý trả lời ngắn gọn, chuẩn xác:
- Định nghĩa Vector Embedding:
- Là quá trình ánh xạ một đối tượng dữ liệu phi cấu trúc (như một từ, một câu văn, một đoạn mã hay một bức ảnh) thành một dãy số thực (Vector nhiều chiều) trong một không gian hình học liên tục.
- Tại sao bắt buộc phải chuyển đổi:
- Các chip xử lý máy tính (CPU/GPU) và các thuật toán học máy về bản chất chỉ là các cỗ máy tính toán số học. Chúng chỉ có thể thực hiện các phép cộng, trừ, nhân ma trận giữa các con số chứ hoàn toàn không thể hiểu trực tiếp các ký tự chữ cái
A, B, C. - Quan trọng hơn, việc chuyển đổi thành vector giúp bảo tồn và mã hóa được mối quan hệ ngữ nghĩa: Các từ có ý nghĩa tương tự nhau sẽ được đặt ở các vị trí tọa độ gần nhau, cho phép máy tính có thể đo lường và so sánh mức độ giống nhau giữa các câu văn thông qua các công thức khoảng cách toán học.
- Các chip xử lý máy tính (CPU/GPU) và các thuật toán học máy về bản chất chỉ là các cỗ máy tính toán số học. Chúng chỉ có thể thực hiện các phép cộng, trừ, nhân ma trận giữa các con số chứ hoàn toàn không thể hiểu trực tiếp các ký tự chữ cái
- Định nghĩa Vector Embedding:
❓ Câu hỏi 2: Tại sao trong các bài toán Tìm kiếm Văn bản theo ngữ nghĩa, người ta hầu như luôn sử dụng Cosine Similarity thay vì Khoảng cách Euclidean? Cho một ví dụ cụ thể.
- Gợi ý trả lời:
- Bản chất của Cosine Similarity:
- Cosine Similarity chỉ đo góc lệch giữa hai vector, hoàn toàn bỏ qua độ dài (độ lớn Magnitude) của vector.
- Hạn chế của khoảng cách Euclidean đối với văn bản:
- Khoảng cách Euclidean đo độ dài đoạn thẳng nối giữa 2 điểm. Do đó, nó bị chi phối nặng nề bởi độ dài của văn bản.
- Ví dụ thực tế minh họa:
- Giả sử ta có 2 văn bản cùng nói về chủ đề "Tài chính doanh nghiệp":
- Văn bản là một dòng tweet ngắn: "Báo cáo tài chính quý 3 của công ty rất khả quan."
- Văn bản là một bài báo cáo dài 10 trang phân tích chi tiết mọi khía cạnh tài chính của công ty đó.
- Mặc dù cả hai văn bản cùng chia sẻ chung một hướng ngữ nghĩa , nhưng vì văn bản dài gấp 100 lần, các vector đếm từ của nó sẽ bị phóng to lên rất nhiều lần.
- Khoảng cách Euclidean giữa và sẽ rất lớn, khiến hệ thống ngộ nhận rằng 2 văn bản này không liên quan đến nhau.
- Ngược lại, Cosine Similarity sẽ cho ra điểm số gần bằng vì hai vector cùng chỉ về một hướng trong không gian, phản ánh chính xác rằng chúng cùng chung một chủ đề.
- Giả sử ta có 2 văn bản cùng nói về chủ đề "Tài chính doanh nghiệp":
- Bản chất của Cosine Similarity:
❓ Câu hỏi 3: Hãy giải thích quy trình 2 bước để xây dựng một hệ thống Tìm kiếm Ngữ nghĩa (Semantic Search) cho hàng triệu sản phẩm trong một sàn thương mại điện tử.
- Gợi ý trả lời theo 2 bước có cấu trúc:
- Bước 1: Quá trình tính toán ngoại tuyến (Offline Indexing Pipeline):
- Trích xuất thông tin sản phẩm (Tên sản phẩm, Mô tả, Thương hiệu, Danh mục).
- Đưa văn bản qua một mô hình Embedding (như Sentence-BERT hoặc OpenAI Embedding) để chuyển thành các vector số cố định.
- Lưu trữ toàn bộ các vector này vào một Cơ sở dữ liệu Vector (Vector Database như Milvus, Qdrant, ChromaDB, hoặc chỉ mục HNSW trong PostgreSQL) kèm theo các chỉ mục tìm kiếm xấp xỉ (ANN - Approximate Nearest Neighbors) để tăng tốc độ truy vấn. Quá trình này chỉ cần chạy 1 lần hoặc cập nhật định kỳ khi có sản phẩm mới.
- Bước 2: Quá trình truy vấn trực tuyến thời gian thực (Online Query Pipeline):
- Khi người dùng gõ câu tìm kiếm trên app, hệ thống đưa câu hỏi đó qua chính mô hình Embedding ở Bước 1 để tạo ra một vector câu hỏi ().
- Hệ thống gửi vector vào Vector Database để tìm kiếm Top vector sản phẩm có độ tương đồng Cosine cao nhất chỉ trong vòng vài mili-giây ().
- Trả về danh sách các sản phẩm khớp nhất về mặt ý nghĩa hiển thị lên màn hình người dùng.
- Bước 1: Quá trình tính toán ngoại tuyến (Offline Indexing Pipeline):
6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)
- Vector Embedding là cây cầu nối biến chữ viết con người thành các tọa độ số học mà máy tính có thể tính toán được.
- Các khái niệm cùng ý nghĩa sẽ có tọa độ nằm gần nhau trong không gian nhiều chiều.
- Cosine Similarity đo góc giữa 2 vector (từ đến ), là chuẩn mực số 1 cho tìm kiếm văn bản vì không bị ảnh hưởng bởi độ dài câu.
- Semantic Search vượt trội hơn tìm kiếm từ khóa truyền thống nhờ khả năng hiểu được từ đồng nghĩa, từ viết tắt và ngữ cảnh tự nhiên.
- Mô hình
all-MiniLM-L6-v2từ thư việnsentence-transformerslà lựa chọn hoàn hảo để bắt đầu học tập và làm thử nghiệm AI hoàn toàn miễn phí trên máy tính cá nhân.