Trong quá khứ gần đây, máy tính vận hành như những thủ thư hiệu quả nhưng máy móc. Nếu bạn tìm "trận chiến robot khổng lồ", chúng chỉ tìm các tiêu đề có đúng những từ đó. Một kết quả khớp hoàn hảo như "Kaiju Mech Warfare" sẽ bị bỏ qua. Máy tính nhận diện được từ ngữ nhưng bỏ lỡ giai điệu—chúng thiếu sự thấu hiểu, sắc thái và ngữ cảnh. Đó là kỷ nguyên tìm kiếm theo từ khóa, vốn là lựa chọn tốt nhất của chúng ta trong nhiều năm.
Rồi cuộc cách mạng xuất hiện. Lấy cảm hứng từ bộ não con người, trí tuệ nhân tạo phát triển một cách học mới. Thay vì chỉ ghi nhớ từ ngữ, AI bắt đầu hiểu mối quan hệ giữa chúng. Nó hiểu rằng "vua" liên hệ với "đàn ông" như "hoàng hậu" liên hệ với "phụ nữ". Nó nhận ra rằng "vui", "hân hoan" và "ngây ngất" cùng chia sẻ một miền cảm xúc, trong khi "trầm buồn" thuộc về một thế giới hoàn toàn khác.
AI làm điều đó như thế nào? Bằng cách tạo ra một bản đồ ý nghĩa.
Vector Search là gì? Bản đồ ý nghĩa
Hãy hình dung một thiên hà đa chiều rộng lớn nơi mỗi khái niệm—một từ, một câu, một hình ảnh, một bản nhạc—là một ngôi sao. Trong thiên hà này, các ngôi sao có ý nghĩa tương tự sẽ tụ lại với nhau, còn những ngôi sao không liên quan thì cách nhau hàng năm ánh sáng.
Một vector embedding đơn giản là tọa độ của một ngôi sao trong thiên hà này. Đó là một danh sách số (ví dụ, [0.12, -0.45, 0.89, ...]) xác định chính xác vị trí của một khái niệm trên bản đồ ý nghĩa này.
Vector search là khả năng đột phá để điều hướng bản đồ này. Khi bạn hỏi, "một bộ phim về cậu bé mồ côi phát hiện mình là phù thủy," chúng ta không săn lùng đúng các từ khóa đó. Thay vào đó, chúng ta:
Tìm tọa độ (vector) cho câu hỏi của bạn trên bản đồ.
Xác định các ngôi sao lân cận gần nhất (các cốt truyện phim của chúng ta).
Những ngôi sao gần nhất đại diện cho các kết quả tương đồng về mặt ngữ nghĩa nhất. Đây là cách AI tiến hóa từ một thủ thư máy móc thành một nhà thông thái hiểu được điều bạn thật sự muốn nói.
Vì sao điều này quan trọng?
Tìm kiếm theo ý nghĩa thay vì từ khóa đang vận hành các ứng dụng AI hiện đại trên nhiều ngành. Năng lực này cho phép:
Netflix gợi ý những bộ phim lạ mà có "chất" tương đồng với lịch sử xem của bạn.
Spotify tuyển chọn playlist với các bài hát mang lại cảm giác giống bài yêu thích của bạn, không kể thể loại hay thời kỳ.
Chatbot và LLM nắm bắt ý định đằng sau câu hỏi của bạn, từ đó đưa ra câu trả lời phù hợp theo ngữ cảnh.
Trang thương mại điện tử hiển thị các sản phẩm có hình thức tương tự với hình ảnh bạn tải lên.
Vector search bắc cầu giữa ý định của con người và dữ liệu số, thay đổi căn bản cách chúng ta tương tác với thông tin. Công nghệ này khiến hệ thống số bớt máy móc và giống những cộng tác viên thấu hiểu hơn.
Cùng học: Xây dựng ứng dụng Vector Search đầu tiên với MongoDB
Chào mừng đến với kỷ nguyên tìm kiếm mới! MongoDB đã giới thiệu Vector Search trong Atlas. Tính năng này cho phép bạn lưu trữ và truy vấn vector embedding (như từ văn bản, hình ảnh hoặc âm thanh) trực tiếp trong MongoDB—không cần một cơ sở dữ liệu vector riêng như Pinecone hoặc Weaviate.
Trong hướng dẫn này, chúng ta sẽ xây dựng một công cụ gợi ý giày đơn giản mà mạnh mẽ bằng Python và MongoDB Atlas. Bạn sẽ học cách biến văn bản thành các biểu diễn số có ý nghĩa (vector) và sau đó dùng Vector Search tích hợp sẵn của Atlas để tìm những đôi giày có mô tả tương tự.
Bạn sẽ học gì
Cách kết nối tới cụm MongoDB Atlas một cách an toàn bằng thư viện pymongo của Python.
Cách tạo và chèn tài liệu chứa các vector embedding.
Cách tạo vector embedding từ văn bản bằng thư viện sentence-transformers.
Cách xây dựng một chỉ mục Vector Search trong giao diện MongoDB Atlas.
Cách thực hiện một truy vấn tìm kiếm ngữ nghĩa bằng pipeline tổng hợp $vectorSearch.
pip install pymongo sentence-transformers numpyĐược hỗ trợ bởi
Bước 1: Tạo cụm MongoDB Atlas
Đăng nhập vào Atlas.
Tạo một cụm miễn phí. Tạo người dùng và sao chép tên người dùng và mật khẩu.
Sau khi tạo người dùng, nhấp vào Chọn phương thức kết nối. Bạn sẽ thấy màn hình đầu tiên bên dưới. Nhấp vào Drivers để chuyển đến màn hình thứ hai. Chọn Python làm driver và phiên bản phù hợp. Sao chép chuỗi kết nối.
Đi tới Database Deployments → Nhấp Browse Collections → Tạo cơ sở dữ liệu mới:
Tên cơ sở dữ liệu: vectorDemo
Tên bộ sưu tập: items
Bật Vector Search:
Trong giao diện MongoDB Atlas, điều hướng tới Vector Search Indexes → Tạo chỉ mục mới cho items.
Tên chỉ mục: “vector_index”
Dùng định nghĩa sau:
{"fields":[{"type":"vector","path":"embedding","numDimensions":768,"similarity":"cosine"}]}Được hỗ trợ bởi
Lưu ý: 768 là kích thước embedding chúng ta sẽ dùng với mô hình sentence-transformers.
Hiểu định nghĩa chỉ mục:
"type": "vector": Cho Atlas biết đây là chỉ mục vector.
"path": "embedding": Quan trọng, trường này trỏ tới field trong tài liệu chứa các vector.
"numDimensions": 768: Giá trị này phải khớp với số chiều của vector do mô hình tạo ra.
"similarity": "cosine": Thuật toán dùng để đo độ "gần" giữa các vector. Rất hiệu quả cho độ tương tự dựa trên văn bản.
Bước 2: Kết nối Python với MongoDB Atlas
Lấy chuỗi kết nối MongoDB Atlas của bạn:
Trong MongoDB Atlas, nhấp Connect → Drivers → Python.
Thay thế <username>, <password> và <cluster-url> trong đoạn dưới đây.
from pymongo import MongoClient
# Replace with your Atlas connection string
uri ="mongodb+srv://<username>:<password>@<cluster-url>/vectorDemo?retryWrites=true&w=majority"
client = MongoClient(uri)
db = client["vectorDemo"]
collection = db["items"]print("Connected to MongoDB Atlas")# Clear existing
collection.delete_many({})print("Cleared collection.")Được hỗ trợ bởi
Bước 3: Tạo embeddings với Python
Chúng ta sẽ dùng SentenceTransformers để chuyển văn bản thành embeddings.
from sentence_transformers import SentenceTransformer
# Choose model: higher-quality for search -> "sentence-transformers/all-mpnet-base-v2" (768-d)# If you need faster/smaller: "all-MiniLM-L6-v2" (384-d)
MODEL_NAME ="sentence-transformers/all-mpnet-base-v2"# MODEL_NAME = "all-MiniLM-L6-v2"# Note: if you use all-mpnet-base-v2, your Atlas vector index must use numDimensions: 768# If you use all-MiniLM-L6-v2, index numDimensions: 384
model = SentenceTransformer(MODEL_NAME)defembed_text(text:str):return model.encode(text).tolist()Được hỗ trợ bởi
Bước 4: Chèn tài liệu mẫu kèm embeddings
Hãy lưu một số mô tả sản phẩm vào MongoDB kèm theo embeddings của chúng.
# Each product includes name, description, list of features, use_cases and tags.
products =[# Marathon / long-distance running (explicit!){"name":"MarathonPro 3000","description":"Designed specifically for marathon and ultra distance running: maximum cushioning, breathable knit upper, responsive midsole and engineered heel support for long-run comfort.","features":["marathon","long-distance","max cushioning","breathable","support"],"category":"shoes","use_cases":["marathon","long-distance running","road running"],"tags":["running","endurance","comfort"]},{"name":"Enduro LongRun","description":"Lightweight long-run trainer optimized for marathon pacing with added cushioning, stable platform, and enhanced forefoot energy return for hours of comfortable running.","features":["long-run","lightweight","energy return","cushioning"],"category":"shoes","use_cases":["marathon","road running"],"tags":["running","marathon","comfort"]},# Road running / neutral{"name":"Red Road Runner","description":"Neutral road running shoe for daily training: breathable mesh, moderate cushioning and responsive ride; suitable for tempo runs and long easy runs.","features":["road running","breathable","moderate cushioning"],"category":"shoes","use_cases":["training","road running","tempo runs"],"tags":["running","training"]},# Trail running (explicit trail){"name":"TrailMaster RidgeGrip","description":"Trail-running shoe with aggressive outsole, rock plate for protection, waterproof upper, designed for technical trails and rugged terrain.","features":["trail","high grip","rock plate","waterproof"],"category":"shoes","use_cases":["trail running","hiking","off-road"],"tags":["trail","outdoors"]},# Tennis & court{"name":"CourtPro Tennis","description":"Court shoe with lateral support, non-marking sole and reinforced toe; built for tennis footwork and short intense bursts, not for long-distance running.","features":["court","lateral support","non-marking sole"],"category":"shoes","use_cases":["tennis","court sports"],"tags":["tennis","sport"]},# Formal{"name":"Oxford Leather Formal","description":"Classic leather formal shoe for office and events: polished leather, sturdy sole, refined silhouette.","features":["formal","leather","office"],"category":"shoes","use_cases":["formal wear","office"],"tags":["formal","leather"]},# Hiking{"name":"Alpine Trek Boots","description":"High-ankle hiking boots with waterproof membrane, ankle support and durable lugged outsole for mountain treks.","features":["hiking","waterproof","ankle support","lugged outsole"],"category":"shoes","use_cases":["hiking","trekking","outdoor"],"tags":["outdoors","hiking"]},# Casual sneakers{"name":"Classic Canvas Sneaker","description":"Casual everyday canvas sneaker with rubber sole, comfortable fit for daily wear and walking.","features":["casual","canvas","everyday"],"category":"shoes","use_cases":["casual","walking"],"tags":["casual"]},# Cross-trainer{"name":"CrossFit Trainer","description":"Stable cross-trainer shoe engineered for gym workouts, short sprints, and lateral movements; flexible yet supportive.","features":["cross-train","stable","gym"],"category":"shoes","use_cases":["gym","cross-training"],"tags":["training","gym"]},# Cleats{"name":"Pro Soccer Cleats","description":"Low-profile football/soccer cleats with studded outsole; optimized for grip on grass and agility.","features":["cleats","studs","agility"],"category":"shoes","use_cases":["soccer","football"],"tags":["sports","cleats"]}]# ---------- Create 'canonical_text' to improve embedding quality for better scoring ----------for p in products:# join features and others into one rich text blob
features =", ".join(p["features"])
uses =", ".join(p["use_cases"])
tags =", ".join(p["tags"])
canonical =f"{p['name']}. {p['description']}. Features: {features}. Use cases: {uses}. Tags: {tags}."
p["canonical_text"]= canonical
# ---------- Embed canonical_text----------print("Embedding items...")for p in products:
p["embedding"]= embed_text(p["canonical_text"])# ---------- Insert into MongoDB ----------
collection.insert_many(products)Được hỗ trợ bởi
Bằng cách dùng insert_many, chúng ta thực hiện một thao tác ghi hàng loạt hiệu quả tới cơ sở dữ liệu.
Bước 5: Thực hiện truy vấn vector đầu tiên của bạn
Đến lúc cho bước cuối cùng và thú vị nhất! Chúng ta sẽ dùng aggregation framework của MongoDB và $vectorSearch—một toán tử để tìm truy vấn giày phù hợp nhất.
query_text ="25k long running best shoes"
query_embedding = embed_text(query_text)
pipeline =[{"$vectorSearch":{"index":"vector_index",# Use the vector search index you created"path":"embedding","queryVector": query_embedding,"numCandidates":100,"limit":3}},{"$project":{"name":1,"description":1,"score":{"$meta":"vectorSearchScore"}}}]
results = collection.aggregate(pipeline)print(f"\nSearch results for: '{query_text}'\n")for r in results:print(f"- {r['name']} (score: {r['score']:.4f})")Được hỗ trợ bởi
Mổ xẻ pipeline $vectorSearch:
$vectorSearch: Đây là toán tử cốt lõi. Nó so sánh hiệu quả queryVector với field plot_embedding đã được lập chỉ mục cho mọi tài liệu.
$project: Giai đoạn này định hình lại đầu ra. Chúng ta gồm name và description, loại trừ _id và các trường khác gây nhiễu, và quan trọng nhất, thêm trường score bằng $meta: "vectorSearchScore". Điểm số từ 0 đến 1 phản ánh mức độ tương tự giữa kết quả và truy vấn của chúng ta.
Kết quả mong đợi
Nếu mọi thứ được thiết lập đúng, bạn sẽ thấy như sau:
Search results for:'25k long running best shoes'- MarathonPro 3000(score:0.7980)- Red Road Runner (score:0.7479)- Enduro LongRun (score:0.7389)Được hỗ trợ bởi
Hãy để ý rằng “MarathonPro 3000” đứng đầu—đúng như kỳ vọng của chúng ta.
Chúc mừng! Bạn đã xây dựng thành công một ứng dụng tìm kiếm vector từ con số 0. Bạn đã học cách kết nối tới cơ sở dữ liệu, tạo và xác thực dữ liệu, tạo vector embeddings, và tận dụng sức mạnh của MongoDB Atlas để tìm thông tin theo cách thực sự thông minh. Chào mừng đến tương lai của tương tác dữ liệu.
Kết luận
Trong hướng dẫn này, bạn đã học cách:
Kết nối tới MongoDB Atlas bằng Python và pymongo, đặt nền móng cho các ứng dụng vận hành bằng cơ sở dữ liệu.
Tạo embeddings (chỉ văn bản) từ một danh mục sản phẩm thực tế bằng các mô hình chất lượng cao như all-mpnet-base-v2, sau đó lưu trong MongoDB với cách chuẩn hóa phù hợp.
Xây dựng bộ dữ liệu phong phú, có cấu trúc bằng canonical_text (tên, mô tả, tính năng, tình huống sử dụng, thẻ), giúp cải thiện độ liên quan của embedding.
Thực hiện tìm kiếm tương tự vector với $vectorSearch của MongoDB để tìm các sản phẩm tương đồng về ngữ nghĩa dựa trên truy vấn ngôn ngữ tự nhiên.
Bước tiếp theo (Tự thực hành)
Lưu trữ đánh giá của người dùng và xây dựng một công cụ tìm kiếm ngữ nghĩa.
Hãy thử nghiệm với các thước đo độ tương tự khác nhau (dotProduct, euclidean).
FAQs
Vì sao canonical_text phong phú hơn chỉ mỗi mô tả sản phẩm?⌄
canonical_text bao gồm tính năng, tình huống sử dụng và thẻ để cung cấp ngữ cảnh tốt hơn cho embeddings—giúp mô hình nắm bắt ý định người dùng chính xác hơn trong vector search.
Vì sao tôi chọn all-mpnet-base-v2 thay vì MiniLM hoặc CLIP?⌄
all-mpnet-base-v2 (768 chiều) cung cấp biểu diễn ngữ nghĩa mạnh hơn cho độ tương tự chỉ văn bản so với các mô hình gọn nhẹ (384 chiều). CLIP vượt trội ở tác vụ đa phương thức nhưng kém chính xác hơn cho truy vấn chỉ văn bản có sắc thái tinh tế.
Cách tiếp cận này có mở rộng cho bộ dữ liệu lớn không?⌄
Có! MongoDB Atlas hỗ trợ chỉ mục vector với hàng triệu tài liệu. Với quy mô lớn, tinh chỉnh tham số chỉ mục (ví dụ, numCandidates) và chỉ tái xếp hạng trên top-N kết quả sẽ giữ hiệu năng tốt.
Nếu tôi muốn tìm kiếm đa phương thức (văn bản + hình ảnh) thì sao?⌄
Bạn có thể nâng cấp sang mô hình embedding đa phương thức (như CLIP hoặc các lựa chọn mã nguồn mở), chuẩn hóa embeddings, lưu trữ tương tự, rồi dùng cùng chiến lược tìm kiếm vector + tái xếp hạng cho tìm kiếm đa phương tiện.
Làm sao biết nên dùng số chiều mô hình nào?⌄
Số chiều lớn hơn (ví dụ, 512, 768, 1024, 2056) thường nắm bắt ngữ nghĩa tốt hơn nhưng đòi hỏi nhiều lưu trữ và tính toán hơn. Dùng mô hình nhỏ (384) cho tốc độ hoặc thử nghiệm, và nâng lên 768 khi cần độ chính xác.
Tôi có thể kết hợp tìm kiếm vector với tìm kiếm full-text không?⌄
Hoàn toàn được. MongoDB Atlas cho phép bạn kết hợp một giai đoạn $search dùng truy vấn compound—kết hợp bộ lọc full-text BM25 với knnBeta hoặc $vectorSearch—để tạo trải nghiệm tìm kiếm lai phong phú.
Trong quá khứ gần đây, máy tính vận hành như những thủ thư hiệu quả nhưng máy móc. Nếu bạn tìm "trận chiến robot khổng lồ", chúng chỉ tìm các tiêu đề có đúng những từ đó. Một kết quả khớp hoàn hảo như "Kaiju Mech Warfare" sẽ bị bỏ qua. Máy tính nhận diện được từ ngữ nhưng bỏ lỡ giai điệu—chúng thiếu sự thấu hiểu, sắc thái và ngữ cảnh. Đó là kỷ nguyên tìm kiếm theo từ khóa, vốn là lựa chọn tốt nhất của chúng ta trong nhiều năm.
Rồi cuộc cách mạng xuất hiện. Lấy cảm hứng từ bộ não con người, trí tuệ nhân tạo phát triển một cách học mới. Thay vì chỉ ghi nhớ từ ngữ, AI bắt đầu hiểu mối quan hệ giữa chúng. Nó hiểu rằng "vua" liên hệ với "đàn ông" như "hoàng hậu" liên hệ với "phụ nữ". Nó nhận ra rằng "vui", "hân hoan" và "ngây ngất" cùng chia sẻ một miền cảm xúc, trong khi "trầm buồn" thuộc về một thế giới hoàn toàn khác.
AI làm điều đó như thế nào? Bằng cách tạo ra một bản đồ ý nghĩa.
Vector Search là gì? Bản đồ ý nghĩa
Hãy hình dung một thiên hà đa chiều rộng lớn nơi mỗi khái niệm—một từ, một câu, một hình ảnh, một bản nhạc—là một ngôi sao. Trong thiên hà này, các ngôi sao có ý nghĩa tương tự sẽ tụ lại với nhau, còn những ngôi sao không liên quan thì cách nhau hàng năm ánh sáng.
Một vector embedding đơn giản là tọa độ của một ngôi sao trong thiên hà này. Đó là một danh sách số (ví dụ, [0.12, -0.45, 0.89, ...]) xác định chính xác vị trí của một khái niệm trên bản đồ ý nghĩa này.
Vector search là khả năng đột phá để điều hướng bản đồ này. Khi bạn hỏi, "một bộ phim về cậu bé mồ côi phát hiện mình là phù thủy," chúng ta không săn lùng đúng các từ khóa đó. Thay vào đó, chúng ta:
Những ngôi sao gần nhất đại diện cho các kết quả tương đồng về mặt ngữ nghĩa nhất. Đây là cách AI tiến hóa từ một thủ thư máy móc thành một nhà thông thái hiểu được điều bạn thật sự muốn nói.
Vì sao điều này quan trọng?
Tìm kiếm theo ý nghĩa thay vì từ khóa đang vận hành các ứng dụng AI hiện đại trên nhiều ngành. Năng lực này cho phép:
Vector search bắc cầu giữa ý định của con người và dữ liệu số, thay đổi căn bản cách chúng ta tương tác với thông tin. Công nghệ này khiến hệ thống số bớt máy móc và giống những cộng tác viên thấu hiểu hơn.
Cùng học: Xây dựng ứng dụng Vector Search đầu tiên với MongoDB
Chào mừng đến với kỷ nguyên tìm kiếm mới! MongoDB đã giới thiệu Vector Search trong Atlas. Tính năng này cho phép bạn lưu trữ và truy vấn vector embedding (như từ văn bản, hình ảnh hoặc âm thanh) trực tiếp trong MongoDB—không cần một cơ sở dữ liệu vector riêng như Pinecone hoặc Weaviate.
Trong hướng dẫn này, chúng ta sẽ xây dựng một công cụ gợi ý giày đơn giản mà mạnh mẽ bằng Python và MongoDB Atlas. Bạn sẽ học cách biến văn bản thành các biểu diễn số có ý nghĩa (vector) và sau đó dùng Vector Search tích hợp sẵn của Atlas để tìm những đôi giày có mô tả tương tự.
Bạn sẽ học gì
Yêu cầu tiên quyết
Bước 1: Tạo cụm MongoDB Atlas
vectorDemoitemsitems.Lưu ý: 768 là kích thước embedding chúng ta sẽ dùng với mô hình sentence-transformers.
Hiểu định nghĩa chỉ mục:
"type": "vector": Cho Atlas biết đây là chỉ mục vector."path": "embedding": Quan trọng, trường này trỏ tới field trong tài liệu chứa các vector."numDimensions": 768: Giá trị này phải khớp với số chiều của vector do mô hình tạo ra."similarity": "cosine": Thuật toán dùng để đo độ "gần" giữa các vector. Rất hiệu quả cho độ tương tự dựa trên văn bản.Bước 2: Kết nối Python với MongoDB Atlas
Lấy chuỗi kết nối MongoDB Atlas của bạn:
<username>,<password>và<cluster-url>trong đoạn dưới đây.Bước 3: Tạo embeddings với Python
Chúng ta sẽ dùng SentenceTransformers để chuyển văn bản thành embeddings.
Bước 4: Chèn tài liệu mẫu kèm embeddings
Hãy lưu một số mô tả sản phẩm vào MongoDB kèm theo embeddings của chúng.
Bằng cách dùng insert_many, chúng ta thực hiện một thao tác ghi hàng loạt hiệu quả tới cơ sở dữ liệu.
Bước 5: Thực hiện truy vấn vector đầu tiên của bạn
Đến lúc cho bước cuối cùng và thú vị nhất! Chúng ta sẽ dùng aggregation framework của MongoDB và
$vectorSearch—một toán tử để tìm truy vấn giày phù hợp nhất.Mổ xẻ pipeline
$vectorSearch:$vectorSearch: Đây là toán tử cốt lõi. Nó so sánh hiệu quả queryVector với fieldplot_embeddingđã được lập chỉ mục cho mọi tài liệu.$project: Giai đoạn này định hình lại đầu ra. Chúng ta gồmnamevàdescription, loại trừ_idvà các trường khác gâynhiễu, và quan trọng nhất, thêm trường score bằng$meta: "vectorSearchScore". Điểm số từ 0 đến 1 phản ánh mức độ tương tự giữa kết quả và truy vấn của chúng ta.Kết quả mong đợi
Nếu mọi thứ được thiết lập đúng, bạn sẽ thấy như sau:
Hãy để ý rằng “MarathonPro 3000” đứng đầu—đúng như kỳ vọng của chúng ta.
Chúc mừng! Bạn đã xây dựng thành công một ứng dụng tìm kiếm vector từ con số 0. Bạn đã học cách kết nối tới cơ sở dữ liệu, tạo và xác thực dữ liệu, tạo vector embeddings, và tận dụng sức mạnh của MongoDB Atlas để tìm thông tin theo cách thực sự thông minh. Chào mừng đến tương lai của tương tác dữ liệu.
Kết luận
Trong hướng dẫn này, bạn đã học cách:
Bước tiếp theo (Tự thực hành)
Hãy thử nghiệm với các thước đo độ tương tự khác nhau (
dotProduct, euclidean).