Hiểu và ứng dụng HNSW trong tìm kiếm ngữ nghĩa với embedding

Đỗ Minh Đức Đỗ Minh Đức
Chia sẻ bài viết

Trong các hệ thống AI hiện đại, khả năng hiểu ngữ nghĩa của văn bản là yếu tố cốt lõi giúp mô hình trả lời chính xác và tự nhiên hơn. Bài viết này Bizfly sẽ hướng dẫn bạn cách tối ưu hóa tìm kiếm ngữ nghĩa với embedding, tập trung vào kỹ thuật index và thuật toán HNSW (Hierarchical Navigable Small World) một trong những thuật toán tìm kiếm lân cận hiệu quả nhất trong vector database hiện nay.

Tìm kiếm ngữ nghĩa là gì và vì sao cần tối ưu?

Tìm kiếm ngữ nghĩa (semantic search) là bước tiến mới của công nghệ tìm kiếm, cho phép hệ thống hiểu được ý định và ngữ cảnh của câu truy vấn thay vì chỉ đối chiếu từ khóa.

Thay vì chỉ trả kết quả cho truy vấn “học máy”, hệ thống semantic search có thể hiểu rằng người dùng đang quan tâm đến Machine Learning, thuật toán học tự động hoặc ứng dụng AI trong dữ liệu, dù các cụm từ không trùng khớp hoàn toàn.

Để đạt được khả năng này, ta cần chuyển văn bản thành biểu diễn vector (embedding) nơi mỗi câu, đoạn hoặc tài liệu được mã hóa thành dãy số có ý nghĩa ngữ nghĩa.

Khoảng cách giữa các vector (thường đo bằng cosine similarity) thể hiện độ gần về ý nghĩa giữa các câu.

Embedding

Cách hoạt động của Embedding

Embedding hoạt động dựa trên mô hình học sâu (Deep Learning), học cách ánh xạ các đơn vị ngôn ngữ (word, sentence, document) vào không gian số có chiều cao (từ vài trăm đến hàng nghìn chiều). Mục tiêu là để các câu có ý nghĩa tương đồng nằm gần nhau trong không gian này.

Ví dụ:

  • “Mua laptop giá rẻ” và “Máy tính xách tay phù hợp với ngân sách thấp” → vector gần nhau.
  • “Tôi thích cà phê” và “Chó nhà tôi sủa to” → vector cách xa nhau.

Các mô hình tạo embedding phổ biến

  • OpenAI Text-Embedding-3 Large: mạnh mẽ, chính xác cao, phù hợp cho ứng dụng RAG, chatbot.
  • Sentence-Transformers (SBERT): miễn phí, dễ triển khai trên local, phù hợp môi trường on-premise.
  • E5-Large / Instructor-XL: tối ưu cho tác vụ tìm kiếm và truy xuất ngữ nghĩa (retrieval tasks).

Ví dụ tạo embedding bằng Sentence-Transformers:

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
vectors = model.encode(["Tối ưu tìm kiếm ngữ nghĩa", "Embedding là gì?"])

Kết quả là mảng numpy (768 chiều) dùng để lưu trữ và tìm kiếm trong vector DB.

Vector Database – Lưu trữ và truy xuất ngữ nghĩa

Khi có hàng trăm nghìn hoặc hàng triệu embedding, việc tìm vector gần nhất theo cosine distance bằng brute-force (O(n)) là bất khả thi. Do đó, các vector database (VD) như FAISS, Chroma, Milvus, Weaviate, Pinecone ra đời để xử lý việc tìm kiếm lân cận xấp xỉ (Approximate Nearest Neighbor – ANN) nhanh hơn hàng trăm lần.
Các VD này cung cấp:

  • Tốc độ truy vấn cao (dưới 50ms với hàng triệu vector).
  • Cấu trúc index linh hoạt (HNSW, IVF, PQ…).
  • API/SDK dễ dùng cho Python, Node.js, Java.

Ví dụ: FAISS (Facebook AI Similarity Search) có thể index hàng trăm triệu vector chỉ với vài GB RAM nhờ các kỹ thuật nén (PQ/OPQ).

Thuật toán HNSW

Giới thiệu HNSW

HNSW (Hierarchical Navigable Small World) là thuật toán tìm kiếm lân cận xấp xỉ dựa trên đồ thị, được coi là state-of-the-art trong lĩnh vực ANN. Nó xây dựng mạng đồ thị nhiều tầng (multi-layer graph), nơi mỗi vector là một node, được liên kết với các vector gần nhất.

Cách hoạt động

  1. Tầng cao nhất chứa ít vector, giúp hệ thống bắt đầu tìm kiếm từ vị trí gần đúng.
  2. Các tầng thấp hơn có mật độ kết nối dày hơn, cho phép tìm chính xác hơn trong vùng cục bộ.
  3. Khi truy vấn, HNSW bắt đầu từ tầng cao và đi xuống, mỗi tầng chọn đường đi gần nhất (greedy search).

Điều này giúp tìm top-k vector gần nhất chỉ trong O(log N) thay vì O(N) như brute-force.

Ví dụ triển khai HNSW với FAISS

import faiss
import numpy as np

d = 768  # số chiều vector
index = faiss.IndexHNSWFlat(d, 32)
index.hnsw.efConstruction = 200
index.hnsw.efSearch = 64

# Thêm dữ liệu
index.add(np.array(vectors))

# Truy vấn
D, I = index.search(np.array([query_vector]), k=5)
print(I)  # trả về 5 vector gần nhất

Ưu – Nhược điểm

Ưu điểm Nhược điểm
Tốc độ truy vấn cực nhanh (ms-level) Tốn RAM khi lưu đồ thị
Độ chính xác cao (Recall ~0.95) Cần tinh chỉnh tham số (efConstruction, M)
Dễ mở rộng, chèn dữ liệu động

Không phù hợp khi bộ dữ liệu quá lớn >100M vector nếu không có GPU

Chiến lược Index để tối ưu hiệu suất

Để tận dụng tối đa sức mạnh HNSW, ta cần chọn chiến lược index phù hợp:

Kiểu index Đặc điểm Khi nên dùng
Flat (Brute-Force) Chính xác tuyệt đối, chậm với tập lớn
IVF (Inverted File) Phân cụm, giảm độ phức tạp Dataset vài triệu vector
HNSW Dựa đồ thị, tốc độ cực cao Hệ thống RAG / chatbot
PQ / OPQ Giảm kích thước vector, tiết kiệm bộ nhớ Khi dung lượng lớn và tài nguyên giới hạn


Kết hợp HNSW với PQ là chiến lược phổ biến để tăng tốc nhưng vẫn tiết kiệm RAM. Các kỹ thuật tối ưu bổ sung

1. Chuẩn hóa vector (Normalization): Trước khi index, nên áp dụng L2 normalization:

faiss.normalize_L2(vectors)

Điều này giúp khoảng cách cosine phản ánh chính xác hơn mức độ tương đồng.

2. Giảm chiều vector: Dùng PCA hoặc UMAP để giảm từ 1536 → 256 chiều, tiết kiệm không gian và tăng tốc truy v

3. Reranking: Sau khi tìm top-k vector gần nhất bằng HNSW, có thể rerank bằng mô hình Cross-Encoder để đảm bảo chất lượng kết quả.

4. Batching query: Nếu cần tìm nhiều truy vấn một lúc (ví dụ AI Agent xử lý đồng thời nhiều người dùng), nên gộp chúng lại thành batch để tối ưu GPU/CPU.

Ứng dụng thực tế về RAG & AI Agent

Trong hệ thống Retrieval-Augmented Generation (RAG):

  1. Người dùng gửi câu hỏi → chuyển thành embedding.
  2. Vector DB (với index HNSW) tìm ra các đoạn văn bản liên quan.
  3. Kết quả được đưa vào LLM (GPT, Claude, Mistral…) để sinh câu trả lời chính xác và có ngữ cảnh.

HNSW đóng vai trò như bộ não tìm kiếm ngữ nghĩa giúp RAG hoạt động nhanh, chính xác và tiết kiệm chi phí inference.

Thực hành benchmark: HNSW vs IVF vs Flat

Thuật toán Dataset (1M vector, 768 chiều) Thời gian truy vấn trung bình Recall@10
Flat ~1200 ms 1.0  
IVF ~60 ms 0.85  
HNSW ~25 ms 0.95 +  


=> HNSW mang lại hiệu suất tốt nhất khi cần tốc độ & độ chính xác đồng thời.

Kết bài

Tối ưu hóa tìm kiếm ngữ nghĩa bằng embedding và HNSW không chỉ là bước kỹ thuật, mà là nền tảng cho các sản phẩm AI hiểu ngôn ngữ tự nhiên. Từ chatbot doanh nghiệp, hệ thống tìm kiếm nội bộ đến RAG engine, việc triển khai HNSW trong vector database giúp rút ngắn thời gian phản hồi, nâng độ chính xác và giảm chi phí vận hành.

Nếu bạn đang xây dựng một hệ thống AI Agent hoặc công cụ tìm kiếm thông minh, hãy bắt đầu thử nghiệm với FAISS hoặc ChromaDB, kết hợp embedding + HNSW index và bạn sẽ thấy sự khác biệt rõ rệt trong hiệu suất.

Đỗ Minh Đức
Tác giả
Đỗ Minh Đức

Với gần 20 năm kinh nghiệm trong ngành công nghệ, Đỗ Minh Đức hiện là Giám đốc Sản phẩm Bizfly Martech tại VCCorp. Anh được biết đến là một trong bốn người đặt nền móng cho BizChatAI, giải pháp ứng dụng trí tuệ nhân tạo để chăm sóc khách hàng tự động đa kênh.

Anh tập trung phát triển BizChatAI như một "trợ lý ảo" cho doanh nghiệp, giúp tự động hóa việc tương tác và CSKH. Công nghệ này đang thay đổi mạnh mẽ cách doanh nghiệp tiếp cận khách hàng, từ việc gửi tin nhắn, quà tri ân tự động đến ứng dụng hiệu quả cho các chuỗi bán lẻ và nhà hàng... Qua các bài viết của mình, anh chia sẻ sâu hơn về những lợi ích và cách thức hoạt động của chatbot trong kinh doanh.