AI

[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

0 views
[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

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" →\rightarrow 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:

  1. 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!
  2. 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 (XX): Kích thước (Từ 0 = Rất nhỏ đến 1 = Rất lớn).
  • Trục tung (YY): 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èo và 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.
  • 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ừ 384384 đến 15361536 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ữ: v⃗Vua (King)−v⃗Đaˋn oˆng (Man)+v⃗Phụ nữ (Woman)≈v⃗Nữ hoaˋng (Queen)\vec{v}_{\text{Vua (King)}} - \vec{v}_{\text{Đàn ông (Man)}} + \vec{v}_{\text{Phụ nữ (Woman)}} \approx \vec{v}_{\text{Nữ hoàng (Queen)}}

  • 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
  1. 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 →\rightarrow Khoảng cách Euclidean bị lớn!
  2. Độ 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 (Theta) lệch giữa hai hướng đi của vector: Cosine Similarity=cos⁡(θ)=A⃗⋅B⃗∥A⃗∥∥B⃗∥\text{Cosine Similarity} = \cos(\theta) = \frac{\vec{A} \cdot \vec{B}}{\|\vec{A}\| \|\vec{B}\|}
    • Giá trị nằm trong khoảng từ −1-1 đến +1+1:
      • cos⁡(θ)=1.0\cos(\theta) = 1.0 (Góc 0∘0^\circ): Hai câu hoàn toàn trùng khớp ngữ nghĩa.
      • cos⁡(θ)=0.0\cos(\theta) = 0.0 (Góc 90∘90^\circ): Hai câu hoàn toàn độc lập, không liên quan.
      • cos⁡(θ)=−1.0\cos(\theta) = -1.0 (Góc 180∘180^\circ): 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ĩaThấ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ếmRấ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ánSiêu nhẹ, chỉ cần thuật toán Inverted IndexCầ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ậtDù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 đoCông thức bản chấtĐộ nhạy với độ dài văn bảnTrường hợp sử dụng tối ưu
Cosine SimilarityĐo góc hợp bởi 2 vector: A⃗⋅B⃗∥A⃗∥∥B⃗∥\frac{\vec{A} \cdot \vec{B}}{\|\vec{A}\| \|\vec{B}\|}Hoàn toàn không bị ảnh hưởngTiê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: ∑AiBi\sum A_i B_iPhụ thuộc mạnh vào độ dài vectorKhi tất cả các vector đã được chuẩn hóa độ dài bằng 1
Euclidean Distance (L2L_2)Độ dài đoạn thẳng hình học: ∑(Ai−Bi)2\sqrt{\sum (A_i - B_i)^2}Rất nhạy cảm với độ dài văn bảnNhậ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 EmbeddingSố chiều vector (Dimensions)Đơn vị phát triểnCách thức sử dụngĐánh giá thực tế
all-MiniLM-L6-v2384 dims384\text{ dims}HuggingFace (Sentence-Transformers)Chạy Offline miễn phí trên máy tính/CPUSiêu nhẹ, chạy cực nhanh, rất tốt cho học tập
text-embedding-3-small1536 dims1536\text{ dims}OpenAIGọi qua Cloud API có phíRất thông minh, hỗ trợ đa ngôn ngữ xuất sắc
BGE-M31024 dims1024\text{ dims}BAAIChạ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â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 AA 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 BB 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 100%100\%, nhưng vì văn bản BB 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 AA và BB 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 1.01.0 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ủ đề.

❓ 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:
    1. 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.
    2. 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 (qq).
      • Hệ thống gửi vector qq vào Vector Database để tìm kiếm Top KK vector sản phẩm có độ tương đồng Cosine cao nhất chỉ trong vòng vài mili-giây (<15ms< 15\text{ms}).
      • 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.

6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)

  1. 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.
  2. 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.
  3. Cosine Similarity đo góc giữa 2 vector (từ −1-1 đến +1+1), 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.
  4. 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.
  5. Mô hình all-MiniLM-L6-v2 từ thư viện sentence-transformers là 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.
0Claps