Sự trỗi dậy của LLM và tìm kiếm ngữ nghĩa đã làm thay đổi căn bản cách chúng ta xây dựng hệ thống tìm kiếm, gợi ý và truy xuất. Tìm kiếm theo từ khóa truyền thống—dù là qua SQL LIKE, chỉ mục đảo Lucene, hay chỉ mục toàn văn—ngày càng trở nên thiếu hụt khi người dùng kỳ vọng khả năng hiểu ngôn ngữ tự nhiên.
Đây là lúc embeddings và cơ sở dữ liệu vector xuất hiện.
MongoDB đã phát triển nhanh chóng trong lĩnh vực này với Atlas Vector Search, giúp nhà phát triển có một cơ sở dữ liệu duy nhất cho tài liệu + metadata + vector—tất cả trong một API. Trong hướng dẫn này, chúng ta sẽ tìm hiểu:
MongoDB là gì.
Embeddings cho truy vấn là gì và vì sao chúng quan trọng.
Khi nào bạn nên dùng embeddings.
Cách lưu trữ embeddings trong MongoDB.
Cách tạo và truy vấn chúng bằng Python.
Hướng dẫn này mang tính thực hành và sẵn sàng để tích hợp vào retrieval-augmented generation (RAG), tìm kiếm tương đồng hoặc pipeline gợi ý của bạn.
MongoDB là gì?
MongoDB là cơ sở dữ liệu NoSQL hướng tài liệu, lưu dữ liệu trong các tài liệu BSON linh hoạt—BSON là dạng mã hóa nhị phân của JavaScript Object Notation (JSON)—một chuẩn ký hiệu đối tượng dạng văn bản được dùng rộng rãi để truyền và lưu trữ dữ liệu trong các ứng dụng web. Khác với cơ sở dữ liệu quan hệ cứng nhắc, MongoDB đơn giản hóa việc tiến hóa schema và cung cấp:
Khả năng mở rộng ngang (sharding).
Khung tổng hợp (aggregation) phong phú.
Tìm kiếm toàn văn.
Tìm kiếm vector.
Bộ sưu tập chuỗi thời gian.
Linh hoạt về schema.
MongoDB Atlas—dịch vụ đám mây được quản lý hoàn toàn—mở rộng các khả năng này với:
Atlas Search (xây dựng trên Lucene).
Atlas Vector Search (tìm kiếm ngữ nghĩa qua chỉ mục HNSW).
Tự động mở rộng, sao lưu, bảo mật và giám sát.
MongoDB đã trở thành lựa chọn mạnh mẽ cho khối lượng công việc AI vì vector thường đi kèm metadata, và MongoDB Atlas gom tất cả vào một hệ thống.
Embeddings là gì và vì sao chúng ta dùng query embeddings?
Khi bạn làm việc với tìm kiếm hoặc truy xuất trong các ứng dụng AI, một trong những khái niệm đầu tiên bạn gặp là embeddings.
Một embedding về bản chất là biểu diễn số, một danh sách dài các giá trị dấu phẩy động, nắm bắt ý nghĩa của một đoạn văn bản (hoặc hình ảnh, âm thanh, v.v.). Thay vì nhìn vào chính xác các từ, embeddings ánh xạ văn bản vào không gian vector, nơi các ý tưởng tương tự nằm gần nhau. Ví dụ, hãy xem xét ba phát biểu khác nhau của người dùng:
Vấn đề thanh toán hóa đơn
Lỗi thanh toán
Lương chưa được ghi có
Dù từ ngữ khác nhau, cả ba đều mô tả một vấn đề tài chính. Một mô hình embedding tốt sẽ đặt các văn bản này gần nhau trong không gian vector, cho phép bạn truy xuất dựa trên ý nghĩa thay vì từ khóa.
Điều này đặc biệt quan trọng khi người dùng thực hiện tìm kiếm. Văn bản họ gõ—“Vì sao lương của tôi bị chậm?”—cũng được chuyển thành một embedding. Vector mới này được gọi là query embedding. Sau đó bạn so sánh vector truy vấn này với tất cả embeddings đã lưu để tìm tài liệu tương đồng về ngữ nghĩa. Vector càng gần nhau, kết quả càng liên quan.
MongoDB Atlas khiến toàn bộ quy trình này trở nên cực kỳ đơn giản với Atlas Vector Search. Sau khi lưu tài liệu và embeddings của chúng trong một collection MongoDB, Atlas tạo chỉ mục vector (sử dụng HNSW bên dưới) có thể nhanh chóng truy xuất các tài liệu tương tự ở quy mô lớn. Ví dụ, nếu bạn lưu các bài viết hỗ trợ kèm embeddings của chúng, một truy vấn như…
query ="Why isn't my salary showing up this month?"
query_vec = get_embedding(query)# Explained in below examplesĐược hỗ trợ bởi
…có thể được dùng trực tiếp trong MongoDB:
results = collection.aggregate([{"$vectorSearch":{"path":"embedding","queryVector": query_vec,"index":"vector_index","limit":3}}])Được hỗ trợ bởi
MongoDB sẽ tự động trả về 3 bài viết hỗ trợ hàng đầu có embeddings gần với truy vấn nhất—mà không cần bạn phải khớp từ khóa hay chấm điểm thủ công.
Đây là sức mạnh của embeddings trong MongoDB Atlas: bạn lưu trữ ý nghĩa, không chỉ văn bản, và bạn truy vấn dựa trên ý định, không chỉ từ ngữ. Sự chuyển dịch này là lý do embeddings trở thành khối xây dựng cốt lõi cho tìm kiếm ngữ nghĩa, hệ thống RAG, trợ lý AI và kho tri thức thông minh.
Khi nào sử dụng query embeddings
Dùng embeddings khi bạn muốn tương đồng ngữ nghĩa, chẳng hạn:
Retrieval-augmented generation (RAG)
Cung cấp cho LLM của bạn ngữ cảnh chính xác từ kho tri thức
Thay thế tìm kiếm từ khóa mong manh
Chatbot cần hiểu sâu
Cổng trợ giúp
Hỗ trợ khách hàng
Gợi ý sản phẩm
“mặt hàng tương tự với mặt hàng này”
Phát hiện tài liệu hoặc trùng lặp
Phân cụm
Nhóm chủ đề
Khi tìm kiếm từ khóa thất bại
Các truy vấn như “chậm ghi có lương” so với “sự cố xử lý thanh toán”
Không dùng embeddings khi:
Bạn cần khớp chính xác (ID, số hóa đơn).
Bộ dữ liệu rất nhỏ (tìm kiếm đơn giản hiệu quả).
Bạn cần lọc/so sánh số học (metadata nên xử lý việc đó).
Cách lưu trữ embeddings trong MongoDB
Điểm hay của MongoDB là embeddings tự nhiên phù hợp trong tài liệu. Bạn chỉ cần lưu chúng như mảng số thực.
Ví dụ schema tài liệu
Đây là cấu trúc tài liệu điển hình:
{"_id":"uuid-123","text":"This is a sample document about MongoDB vector search.","embedding":[0.123,-0.241,0.998, ...],"tags":["mongodb","vector","ai"],"createdAt":"2025-01-01T10:20:00Z"}Được hỗ trợ bởi
Những điều quan trọng cần lưu ý:
Mọi embedding trong một collection phải có cùng số chiều.
Lý tưởng nhất, embeddings nên được lưu dưới dạng float32 (MongoDB sẽ chuyển nội bộ thành float64).
Nếu tài liệu của bạn dài, hãy chia nhỏ trước khi tạo embedding.
Lưu metadata riêng—thẻ, danh mục, URL, dấu thời gian, v.v. Điều này giúp tìm kiếm lai (hybrid) mạnh mẽ hơn.
Tạo chỉ mục vector trong MongoDB (Bước quan trọng)
Trước khi lưu trữ hoặc truy vấn embeddings, bạn phải tạo chỉ mục tìm kiếm vector trong MongoDB Atlas.
Trong MongoDB Atlas, vào:Atlas → Database → Collections → Search → Create Search Index
Dùng định nghĩa như sau:
{"fields":[{"type":"vector","path":"embedding","numDimensions":1536,"similarity":"cosine"}]}Được hỗ trợ bởi
Điều này cho MongoDB biết:
Trường embedding chứa các vector.
Mỗi vector có 1536 chiều.
Dùng độ tương đồng cosine để xếp hạng.
Chỉ mục này cung cấp sức mạnh cho mọi truy vấn tìm kiếm vector.
MongoDB bao gồm khả năng tìm kiếm vector gốc với hỗ trợ cho:
Độ tương đồng cosine.
Khoảng cách Euclid.
chấm điểm dotProduct.
Chọn dựa trên mô hình embedding của bạn—nhưng làm sao biết chọn gì? Hãy đi sâu.
Cosine similarity
Nó đo lường gì
Nó đo mức độ thẳng hàng của hai vector—tức là góc giữa chúng. Bỏ qua độ lớn, chỉ tập trung vào hướng.
Trực giác
Nếu hai vector cùng hướng → độ tương đồng gần 1
Ngược hướng → –1
Vuông góc (không liên quan) → 0
Khi nào dùng
Dùng cosine khi độ lớn không quan trọng, chỉ cần mẫu hình hoặc khái niệm được biểu đạt.
Trường hợp phổ biến
Embeddings văn bản/NLP
Tìm kiếm ngữ nghĩa
Hệ thống gợi ý dựa trên ý nghĩa, không phải độ lớn
Cosine là mặc định an toàn cho hầu hết các mô hình embedding.
Khoảng cách Euclid
Nó đo lường gì
Đo khoảng cách đường thẳng giữa hai vector trong không gian.
Trực giác
Khoảng cách nhỏ → các vector tương tự
Khoảng cách lớn → các vector xa nhau
Khi nào dùng
Dùng Euclid khi giá trị tuyệt đối và độ lớn quan trọng, không chỉ hướng.
Trường hợp phổ biến
Embeddings hình ảnh
Đo đạc vật lý/dữ liệu cảm biến
Thuật toán phân cụm như K-means (bên trong dùng Euclid)
Nếu dữ liệu của bạn vốn dĩ sống trong không gian hình học (ví dụ, cường độ điểm ảnh), Euclid thường hợp lý hơn.
Tích vô hướng (dot product)
Nó đo lường gì
Nó đo lường sự kết hợp giữa độ tương đồng và độ lớn.
Về mặt toán học: dot(u, v) = |u| × |v| × cos(θ)
Trực giác
Độ lớn lớn HƠN VÀ thẳng hàng → điểm số cao hơn
Nhạy với độ dài vector
Không được chuẩn hóa tự động
Khi nào dùng
Dùng dot product khi bạn muốn các vector dài hơn có ảnh hưởng lớn hơn hoặc khi mô hình embedding được huấn luyện dựa trên dot product.
Trường hợp phổ biến
Embeddings từ mô hình ngôn ngữ lớn giả định chấm điểm theo inner product
Các lớp tương đồng trong mạng nơ-ron
Mô hình gợi ý nơi “độ mạnh” của đặc trưng có ý nghĩa
Quy tắc ngón tay cái nhanh
Thước đo
Phù hợp cho
Tránh khi
Cosine
Văn bản, tìm kiếm ngữ nghĩa, embeddings tổng quát
Độ lớn quan trọng
Euclid
Hình ảnh, đặc trưng hình học, phân cụm
Dữ liệu có thang đo tùy ý
Dot product
Mô hình huấn luyện với inner product, recsys
Độ lớn làm méo tương đồng
Tạo, lưu trữ và truy vấn embeddings trong MongoDB (Hướng dẫn Python)
Hãy cùng thực hiện như thể chúng ta đang xây dựng một hệ thống thực tế.
Dùng OpenAI (có thể thay bằng bất kỳ nhà cung cấp embedding nào bạn thích):
import os
from openai import OpenAI
os.environ["OPENAI_API_KEY"]="your_api_key_here"
client = OpenAI()defget_embedding(text:str):
response = client.embeddings.create(
model="text-embedding-3-small",input=text
)return response.data[0].embeddingĐược hỗ trợ bởi
Kết nối tới MongoDB và chèn tài liệu
Dùng OpenAI (có thể thay bằng bất kỳ nhà cung cấp embedding nào bạn thích):
from pymongo import MongoClient
import uuid
mongo = MongoClient("<MONGODB_ATLAS_URI>")
db = mongo["vector_db"]
collection = db["documents"]
text ="This is a sample document about MongoDB vector search."
embedding = get_embedding(text)
document ={"_id":str(uuid.uuid4()),"text": text,"embedding": embedding,"tags":["mongodb","search"],}
collection.insert_one(document)print("Document inserted successfully!")Được hỗ trợ bởi
Tới bước này, dữ liệu của bạn đã sẵn sàng cho tìm kiếm ngữ nghĩa.
Truy vấn embeddings trong MongoDB
Giờ đến phần thú vị: truy xuất các tài liệu tương tự bằng truy vấn vector. MongoDB dùng $vectorSearch trong pipeline tổng hợp.
Tạo vector truy vấn
from pymongo import MongoClient
query ="How does MongoDB handle semantic search?"
query_vec = get_embedding(query)Được hỗ trợ bởi
Thực hiện tìm kiếm vector (query embeddings)
results = collection.aggregate([{"$vectorSearch":{"index":"vector_index","path":"embedding","queryVector": query_vec,"numCandidates":100,"limit":5,"similarity":"cosine"}},{"$project":{"text":1,"score":{"$meta":"vectorSearchScore"}}}])for r in results:print(r)Được hỗ trợ bởi
Điều này trả về năm tài liệu tương đồng ngữ nghĩa nhất.
Điều này rất hữu ích cho pipeline RAG nơi bạn muốn tìm kiếm ngữ nghĩa.
Giải thích từng bước truy vấn trên
$vectorSearch → Tìm các tài liệu có trường embedding gần với queryVector nhất theo thước đo tương đồng đã chọn
numCandidates → Số lượng ứng viên công cụ nên xem xét trước khi chọn các kết quả hàng đầu
limit → Số lượng kết quả tương tự cuối cùng cần trả về
$project → Trả về văn bản gốc cùng trường đặc biệt gọi là score
Trường score là gì?
MongoDB Atlas Vector Search trả về một trường metadata đặc biệt,"score": {"$meta": "vectorSearchScore"}, cho bạn biết mức độ tương đồng giữa vector đã lưu và vector truy vấn.
Ý nghĩa của điểm số phụ thuộc vào thước đo tương đồng bạn chọn, như giải thích dưới đây:
Thước đo tương đồng
Điểm số có nghĩa là gì
Điểm cao hơn = giống hơn?
Khoảng điểm
cosine
Độ giống về góc giữa các vector
Có
–1 đến +1
euclidean
Khoảng cách L2 âm
Không—càng gần 0 = càng giống
–∞ đến 0
dotProduct
Sự thẳng hàng theo độ lớn vector
Có
–∞ đến +∞
Thực hành tốt
Chia nhỏ tài liệu dài (300–500 token mỗi phần): Cải thiện mức độ liên quan + tránh embedding các khối văn bản dài
Lưu metadata riêng: Hỗ trợ lọc và xếp hạng
Tạo embeddings theo lô: Cải thiện thông lượng và giảm chi phí mô hình
Dùng embeddings float32 trong mô hình của bạn: MongoDB nội bộ dùng float64 nhưng chấp nhận mảng float32
Chỉ lập chỉ mục trường vector: Thêm trường vào chỉ mục sẽ tăng bộ nhớ và độ trễ
Những lỗi thường gặp cần tránh
Vấn đề
Vì sao xảy ra
Sai số chiều
Số chiều vector truy vấn ≠ số chiều chỉ mục
Kết quả không liên quan
Dùng mô hình khác nhau giữa lưu trữ và truy vấn
Tìm kiếm chậm
numCandidates quá lớn hoặc yêu cầu cụm lớn
Tài liệu quá lớn
Giới hạn tài liệu 16MB
Chọn sai thước đo tương đồng
Mô hình được huấn luyện cho cosine nhưng lại dùng dot product
Lời kết
Embeddings và tìm kiếm ngữ nghĩa nay là nền tảng cho các sản phẩm AI hiện đại. Dù bạn xây chatbot, pipeline RAG, công cụ gợi ý hay lớp tìm kiếm thông minh, bạn cần cách đáng tin cậy để lưu trữ vector và truy vấn chúng hiệu quả.
MongoDB cung cấp một nền tảng hợp nhất nơi:
Văn bản của bạn được lưu.
Metadata của bạn được lưu.
Embeddings của bạn được lưu.
Tìm kiếm vector của bạn chạy.
Mọi thứ cùng mở rộng.
Điều này giúp bạn tránh phức tạp khi phải xoay sở nhiều cơ sở dữ liệu riêng lẻ và tập trung vào xây dựng năng lực sản phẩm, không phải hạ tầng.
FAQs
Tôi có cần một cơ sở dữ liệu vector riêng nếu dùng MongoDB cho embeddings không?⌄
Không. MongoDB Atlas Vector Search là tính năng tích hợp sẵn, vì vậy bạn có thể lưu tài liệu, metadata và vector cùng một chỗ mà không cần dùng cơ sở dữ liệu vector riêng như Pinecone hoặc Milvus.
Tôi nên dùng số chiều embedding nào trong MongoDB?⌄
Hãy dùng số chiều do mô hình embedding của bạn cung cấp (ví dụ, 768 hoặc 1536). Tất cả tài liệu trong một collection phải dùng cùng số chiều với chỉ mục vector.
MongoDB có thể thực hiện tìm kiếm lai (metadata + tìm kiếm vector) không?⌄
Bạn có thể lọc bằng $match rồi áp dụng $vectorSearch trong cùng một pipeline tổng hợp—rất lý tưởng cho RAG và hệ thống gợi ý.
MongoDB có phù hợp với khối lượng công việc tìm kiếm vector quy mô lớn không?⌄
Có. MongoDB sử dụng lập chỉ mục dựa trên HNSW trong Atlas Search, có khả năng mở rộng tốt cho hàng triệu tài liệu. Thông lượng phụ thuộc vào kích thước chỉ mục, hạng cụm và mô hình tải.
Tôi có thể dùng bất kỳ mô hình embedding nào với MongoDB không?⌄
Chắc chắn. MongoDB không phụ thuộc mô hình. Bạn có thể dùng OpenAI, HuggingFace, Cohere, mô hình cục bộ hoặc embeddings tùy chỉnh—miễn là số chiều khớp với chỉ mục.
Sự trỗi dậy của LLM và tìm kiếm ngữ nghĩa đã làm thay đổi căn bản cách chúng ta xây dựng hệ thống tìm kiếm, gợi ý và truy xuất. Tìm kiếm theo từ khóa truyền thống—dù là qua SQL LIKE, chỉ mục đảo Lucene, hay chỉ mục toàn văn—ngày càng trở nên thiếu hụt khi người dùng kỳ vọng khả năng hiểu ngôn ngữ tự nhiên.
Đây là lúc embeddings và cơ sở dữ liệu vector xuất hiện.
MongoDB đã phát triển nhanh chóng trong lĩnh vực này với Atlas Vector Search, giúp nhà phát triển có một cơ sở dữ liệu duy nhất cho tài liệu + metadata + vector—tất cả trong một API. Trong hướng dẫn này, chúng ta sẽ tìm hiểu:
Hướng dẫn này mang tính thực hành và sẵn sàng để tích hợp vào retrieval-augmented generation (RAG), tìm kiếm tương đồng hoặc pipeline gợi ý của bạn.
MongoDB là gì?
MongoDB là cơ sở dữ liệu NoSQL hướng tài liệu, lưu dữ liệu trong các tài liệu BSON linh hoạt—BSON là dạng mã hóa nhị phân của JavaScript Object Notation (JSON)—một chuẩn ký hiệu đối tượng dạng văn bản được dùng rộng rãi để truyền và lưu trữ dữ liệu trong các ứng dụng web. Khác với cơ sở dữ liệu quan hệ cứng nhắc, MongoDB đơn giản hóa việc tiến hóa schema và cung cấp:
MongoDB Atlas—dịch vụ đám mây được quản lý hoàn toàn—mở rộng các khả năng này với:
MongoDB đã trở thành lựa chọn mạnh mẽ cho khối lượng công việc AI vì vector thường đi kèm metadata, và MongoDB Atlas gom tất cả vào một hệ thống.
Embeddings là gì và vì sao chúng ta dùng query embeddings?
Khi bạn làm việc với tìm kiếm hoặc truy xuất trong các ứng dụng AI, một trong những khái niệm đầu tiên bạn gặp là embeddings.
Một embedding về bản chất là biểu diễn số, một danh sách dài các giá trị dấu phẩy động, nắm bắt ý nghĩa của một đoạn văn bản (hoặc hình ảnh, âm thanh, v.v.). Thay vì nhìn vào chính xác các từ, embeddings ánh xạ văn bản vào không gian vector, nơi các ý tưởng tương tự nằm gần nhau. Ví dụ, hãy xem xét ba phát biểu khác nhau của người dùng:
Dù từ ngữ khác nhau, cả ba đều mô tả một vấn đề tài chính. Một mô hình embedding tốt sẽ đặt các văn bản này gần nhau trong không gian vector, cho phép bạn truy xuất dựa trên ý nghĩa thay vì từ khóa.
Điều này đặc biệt quan trọng khi người dùng thực hiện tìm kiếm. Văn bản họ gõ—“Vì sao lương của tôi bị chậm?”—cũng được chuyển thành một embedding. Vector mới này được gọi là query embedding. Sau đó bạn so sánh vector truy vấn này với tất cả embeddings đã lưu để tìm tài liệu tương đồng về ngữ nghĩa. Vector càng gần nhau, kết quả càng liên quan.
MongoDB Atlas khiến toàn bộ quy trình này trở nên cực kỳ đơn giản với Atlas Vector Search. Sau khi lưu tài liệu và embeddings của chúng trong một collection MongoDB, Atlas tạo chỉ mục vector (sử dụng HNSW bên dưới) có thể nhanh chóng truy xuất các tài liệu tương tự ở quy mô lớn. Ví dụ, nếu bạn lưu các bài viết hỗ trợ kèm embeddings của chúng, một truy vấn như…
…có thể được dùng trực tiếp trong MongoDB:
MongoDB sẽ tự động trả về 3 bài viết hỗ trợ hàng đầu có embeddings gần với truy vấn nhất—mà không cần bạn phải khớp từ khóa hay chấm điểm thủ công.
Đây là sức mạnh của embeddings trong MongoDB Atlas: bạn lưu trữ ý nghĩa, không chỉ văn bản, và bạn truy vấn dựa trên ý định, không chỉ từ ngữ. Sự chuyển dịch này là lý do embeddings trở thành khối xây dựng cốt lõi cho tìm kiếm ngữ nghĩa, hệ thống RAG, trợ lý AI và kho tri thức thông minh.
Khi nào sử dụng query embeddings
Dùng embeddings khi bạn muốn tương đồng ngữ nghĩa, chẳng hạn:
Retrieval-augmented generation (RAG)
Chatbot cần hiểu sâu
Gợi ý sản phẩm
Phát hiện tài liệu hoặc trùng lặp
Khi tìm kiếm từ khóa thất bại
Không dùng embeddings khi:
Cách lưu trữ embeddings trong MongoDB
Điểm hay của MongoDB là embeddings tự nhiên phù hợp trong tài liệu. Bạn chỉ cần lưu chúng như mảng số thực.
Ví dụ schema tài liệu
Đây là cấu trúc tài liệu điển hình:
Những điều quan trọng cần lưu ý:
Tạo chỉ mục vector trong MongoDB (Bước quan trọng)
Trước khi lưu trữ hoặc truy vấn embeddings, bạn phải tạo chỉ mục tìm kiếm vector trong MongoDB Atlas.
Trong MongoDB Atlas, vào: Atlas → Database → Collections → Search → Create Search Index
Dùng định nghĩa như sau:
Điều này cho MongoDB biết:
Chỉ mục này cung cấp sức mạnh cho mọi truy vấn tìm kiếm vector.
MongoDB bao gồm khả năng tìm kiếm vector gốc với hỗ trợ cho:
Chọn dựa trên mô hình embedding của bạn—nhưng làm sao biết chọn gì? Hãy đi sâu.
Cosine similarity
Nó đo lường gì
Nó đo mức độ thẳng hàng của hai vector—tức là góc giữa chúng. Bỏ qua độ lớn, chỉ tập trung vào hướng.
Trực giác
Khi nào dùng
Dùng cosine khi độ lớn không quan trọng, chỉ cần mẫu hình hoặc khái niệm được biểu đạt.
Trường hợp phổ biến
Cosine là mặc định an toàn cho hầu hết các mô hình embedding.
Khoảng cách Euclid
Nó đo lường gì
Đo khoảng cách đường thẳng giữa hai vector trong không gian.
Trực giác
Khi nào dùng
Dùng Euclid khi giá trị tuyệt đối và độ lớn quan trọng, không chỉ hướng.
Trường hợp phổ biến
Nếu dữ liệu của bạn vốn dĩ sống trong không gian hình học (ví dụ, cường độ điểm ảnh), Euclid thường hợp lý hơn.
Tích vô hướng (dot product)
Nó đo lường gì
Nó đo lường sự kết hợp giữa độ tương đồng và độ lớn.
Về mặt toán học: dot(u, v) = |u| × |v| × cos(θ)
Trực giác
Khi nào dùng
Dùng dot product khi bạn muốn các vector dài hơn có ảnh hưởng lớn hơn hoặc khi mô hình embedding được huấn luyện dựa trên dot product.
Trường hợp phổ biến
Quy tắc ngón tay cái nhanh
Thước đo
Phù hợp cho
Tránh khi
Cosine
Văn bản, tìm kiếm ngữ nghĩa, embeddings tổng quát
Độ lớn quan trọng
Euclid
Hình ảnh, đặc trưng hình học, phân cụm
Dữ liệu có thang đo tùy ý
Dot product
Mô hình huấn luyện với inner product, recsys
Độ lớn làm méo tương đồng
Tạo, lưu trữ và truy vấn embeddings trong MongoDB (Hướng dẫn Python)
Hãy cùng thực hiện như thể chúng ta đang xây dựng một hệ thống thực tế.
Cài đặt phụ thuộc
Tạo embeddings
Dùng OpenAI (có thể thay bằng bất kỳ nhà cung cấp embedding nào bạn thích):
Kết nối tới MongoDB và chèn tài liệu
Dùng OpenAI (có thể thay bằng bất kỳ nhà cung cấp embedding nào bạn thích):
Tới bước này, dữ liệu của bạn đã sẵn sàng cho tìm kiếm ngữ nghĩa.
Truy vấn embeddings trong MongoDB
Giờ đến phần thú vị: truy xuất các tài liệu tương tự bằng truy vấn vector. MongoDB dùng $vectorSearch trong pipeline tổng hợp.
Tạo vector truy vấn
Thực hiện tìm kiếm vector (query embeddings)
Điều này trả về năm tài liệu tương đồng ngữ nghĩa nhất.
Điều này rất hữu ích cho pipeline RAG nơi bạn muốn tìm kiếm ngữ nghĩa.
Giải thích từng bước truy vấn trên
$vectorSearch → Tìm các tài liệu có trường embedding gần với queryVector nhất theo thước đo tương đồng đã chọn
numCandidates → Số lượng ứng viên công cụ nên xem xét trước khi chọn các kết quả hàng đầu
limit → Số lượng kết quả tương tự cuối cùng cần trả về
$project → Trả về văn bản gốc cùng trường đặc biệt gọi là score
Trường score là gì?
MongoDB Atlas Vector Search trả về một trường metadata đặc biệt, "score": {"$meta": "vectorSearchScore"}, cho bạn biết mức độ tương đồng giữa vector đã lưu và vector truy vấn.
Ý nghĩa của điểm số phụ thuộc vào thước đo tương đồng bạn chọn, như giải thích dưới đây:
Thước đo tương đồng
Điểm số có nghĩa là gì
Điểm cao hơn = giống hơn?
Khoảng điểm
cosine
Độ giống về góc giữa các vector
Có
–1 đến +1
euclidean
Khoảng cách L2 âm
Không—càng gần 0 = càng giống
–∞ đến 0
dotProduct
Sự thẳng hàng theo độ lớn vector
Có
–∞ đến +∞
Thực hành tốt
Những lỗi thường gặp cần tránh
Vấn đề
Vì sao xảy ra
Sai số chiều
Số chiều vector truy vấn ≠ số chiều chỉ mục
Kết quả không liên quan
Dùng mô hình khác nhau giữa lưu trữ và truy vấn
Tìm kiếm chậm
numCandidates quá lớn hoặc yêu cầu cụm lớn
Tài liệu quá lớn
Giới hạn tài liệu 16MB
Chọn sai thước đo tương đồng
Mô hình được huấn luyện cho cosine nhưng lại dùng dot product
Lời kết
Embeddings và tìm kiếm ngữ nghĩa nay là nền tảng cho các sản phẩm AI hiện đại. Dù bạn xây chatbot, pipeline RAG, công cụ gợi ý hay lớp tìm kiếm thông minh, bạn cần cách đáng tin cậy để lưu trữ vector và truy vấn chúng hiệu quả.
MongoDB cung cấp một nền tảng hợp nhất nơi:
Điều này giúp bạn tránh phức tạp khi phải xoay sở nhiều cơ sở dữ liệu riêng lẻ và tập trung vào xây dựng năng lực sản phẩm, không phải hạ tầng.