Làm chủ Vector Search trong MongoDB: Hướng dẫn kèm ví dụ
Tìm hiểu cách thiết lập và sử dụng Vector Search của MongoDB để xây dựng ứng dụng thông minh. Hướng dẫn thực hành này bao gồm lập chỉ mục vector, các thực tiễn tốt nhất về truy vấn và ví dụ thực tế.
Lập chỉ mục vector đã trở thành một công cụ mạnh mẽ để xây dựng các ứng dụng hiện đại. Nó cho phép bạn thực hiện tìm kiếm tương đồng nhanh và hiệu quả trên dữ liệu nhiều chiều, thường được gọi là vector embeddings. Khả năng này nay đã được tích hợp liền mạch vào MongoDB, giúp nhà phát triển xây dựng những tính năng tinh vi ngay trong cơ sở dữ liệu.
Bài viết này là hướng dẫn thực hành thiết lập và sử dụng lập chỉ mục vector trong MongoDB. Chúng ta sẽ đi qua từng bước, từ tạo chỉ mục đầu tiên đến chạy các truy vấn phức tạp. Bạn cũng sẽ học các thực tiễn tốt nhất và khám phá ví dụ thực tế về xây dựng hệ thống gợi ý sản phẩm cho một cửa hàng thương mại điện tử.
Vector Indexing là gì?
Cốt lõi, lập chỉ mục vector là kỹ thuật tổ chức các vector embedding để tăng tốc tìm kiếm tương đồng. Khác với các chỉ mục truyền thống hoạt động trên giá trị vô hướng (như số hoặc chuỗi), chỉ mục vector được tối ưu để tìm các vector "lân cận" trong không gian nhiều chiều.
Vector embedding là biểu diễn số của dữ liệu phức tạp, bao gồm văn bản, hình ảnh và âm thanh. Ví dụ, mô tả sản phẩm có thể được chuyển thành một vector, trong đó các sản phẩm tương tự sẽ có vector gần nhau trong không gian. Sự gần nhau này cho phép xây dựng các ứng dụng mạnh mẽ như:
Tìm kiếm ngữ nghĩa: Tìm sản phẩm dựa trên ý nghĩa của truy vấn, không chỉ là khớp từ khóa.
Hệ thống gợi ý: Đề xuất sản phẩm hoặc nội dung cho người dùng dựa trên sở thích của họ.
Nhận dạng hình ảnh: Xác định các hình ảnh tương tự từ một cơ sở dữ liệu lớn.
Thiết lập lập chỉ mục vector trong MongoDB
Để bắt đầu, bạn cần một cụm MongoDB Atlas. Vector search là một tính năng gốc đám mây. Bạn có thể thử tính năng này trên MongoDB Atlas, hoặc bản Community edition miễn phí. Trong bài này, chúng tôi sẽ sử dụng MongoDB Atlas.
Bước 1: Tạo cụm MongoDB Atlas
Tạo một cụm mới trong MongoDB Atlas. Gói M0 miễn phí là đủ cho mục đích thử nghiệm.
Bước 2: Tạo collection và chèn dữ liệu
Đầu tiên, kết nối tới cụm của bạn bằng MongoDB Shell (mongosh) hoặc driver bạn ưa thích. Sau đó, tạo collection mới tên là products và chèn các document chứa một trường vector. Mỗi document nên đại diện cho một sản phẩm và bao gồm trường embedding, trường này sẽ lưu biểu diễn vector của sản phẩm.
Dưới đây là ví dụ đầy đủ hơn với ba document sản phẩm riêng biệt, mỗi cái có một vector được tạo ngẫu nhiên để minh họa dữ liệu có thể trông như thế nào. Trong thực tế, bạn sẽ thay thế những vector này bằng embedding do mô hình AI tạo ra.
db.products.insertMany([
{
"name": "Wireless Noise-Canceling Headphones",
"category": "Electronics",
"description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
"price": 249.99,
"embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
},
{
"name": "Smart Coffee Maker",
"category": "Home Goods",
"description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
"price": 129.99,
"embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
},
{
"name": "Ultra-light Backpack",
"category": "Travel",
"description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
"price": 79.99,
"embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
}
]);Được hỗ trợ bởi
Mỗi document chứa các trường name, category, description và price, cùng với trường quan trọng là embedding. Trường embedding là một mảng số kích thước cố định, biểu diễn ý nghĩa ngữ nghĩa của mô tả sản phẩm. Kích thước mảng này, hay số chiều (dimensionality), phụ thuộc vào mô hình dùng để tạo embedding. Trong ví dụ này, số chiều là 128.
Đây là dữ liệu mà chúng ta sẽ xây dựng chỉ mục vector để kích hoạt tìm kiếm ngữ nghĩa và gợi ý sản phẩm.
Bước 3: Tạo chỉ mục vector
Khi bạn đã có dữ liệu với embedding trong một collection, bước tiếp theo là tạo một chỉ mục vector. Chỉ mục này rất quan trọng để kích hoạt các tìm kiếm tương đồng nhanh và hiệu quả. Lệnh dưới đây sử dụng createSearchIndex để xây dựng chỉ mục vector trên trường embedding.
Cấu hình chỉ mục được định nghĩa trong mảng fields của đối tượng definition. Cấu trúc này là bản thiết kế cho cách MongoDB Atlas tổ chức các vector của bạn để truy xuất tốc độ cao.
Các tham số cốt lõi cho lập chỉ mục vector gồm:
path: Chỉ định tên chính xác của trường trong document chứa mảng vector, trong ví dụ này là "embedding".
numDimensions: Đây là tham số quan trọng nhất. Nó phải khớp chính xác với số phần tử trong mảng vector do mô hình embedding của bạn tạo ra (ví dụ: 128, 768, 1536).
similarity: Xác định thước đo toán học dùng để tính độ “gần” giữa hai vector trong quá trình tìm kiếm.
cosine thường được khuyến nghị cho tìm kiếm ngữ nghĩa, vì nó đo góc giữa các vector, tập trung vào hướng ngữ nghĩa.
Các lựa chọn khác bao gồm euclidean (khoảng cách đường thẳng) và dotProduct.
Các tham số hiệu năng tùy chọn
Để tinh chỉnh hiệu năng nâng cao, MongoDB Atlas cho phép bạn chỉ định các tham số tùy chọn để tối ưu lưu trữ và bộ nhớ:
quantization: Tham số này dùng để nén vector, giúp giảm đáng kể kích thước chỉ mục và dung lượng bộ nhớ.
scalar hoặc binary có thể được chỉ định để lượng tử hóa vector, đánh đổi một lượng nhỏ recall để đạt được lợi ích lớn về lưu trữ và tốc độ.
Thực hiện truy vấn Vector Search
Khi chỉ mục đã được xây dựng, bạn có thể dùng bước tổng hợp $vectorSearchđể thực hiện truy vấn tương đồng.
Hãy tìm các sản phẩm giống nhất với một vector truy vấn. Vector này thường được tạo ra từ đầu vào tìm kiếm của người dùng.
// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": queryVector,
"path": "embedding",
"numCandidates": 100, // Number of documents to scan
"limit": 5 // Number of results to return
}
},
{
"$project": {
"name": 1,
"description": 1,
"_id": 0
}
}
]);Được hỗ trợ bởi
queryVector: Vector bạn cần tìm.
path: Tên trường chứa các vector embedding.
numCandidates: Số document ứng viên để quét trong chỉ mục. Số lớn hơn cải thiện độ chính xác nhưng tăng độ trễ.
limit: Số kết quả hàng đầu cần trả về.
Bước $project là tùy chọn nhưng hữu ích để định dạng đầu ra và loại trừ dữ liệu vector khỏi kết quả.
Các thực tiễn tốt nhất cho lập chỉ mục vector
Khi tinh chỉnh chỉ mục vector để đạt hiệu năng tối ưu, bạn cần cân bằng giữa độ chính xác và tốc độ. Mấu chốt là điều chỉnh các tham số của chỉ mục dựa trên bộ dữ liệu cụ thể và mục tiêu hiệu năng của bạn.
Chọn thước đo tương đồng phù hợp
Việc chọn thước đo là nền tảng vì nó định nghĩa mức “tương tự” của hai vector. Bạn có thể tham khảo tài liệu MongoDB để tìm hiểu thêm về các trường.
cosine: Tốt nhất cho tương đồng ngữ nghĩa, đặc biệt với văn bản. Nó đo góc giữa các vector, bỏ qua độ dài của chúng. Điều này quan trọng với các mô hình mà độ dài vector không mang ý nghĩa.
euclidean: Đo khoảng cách đường thẳng giữa hai vector. Dùng khi độ lớn (độ dài) của vector có ý nghĩa với ngữ nghĩa, chẳng hạn trong một số kiểu dữ liệu nơi giá trị lớn hơn biểu thị đặc trưng mạnh hơn.
dotProduct: Tính tích vô hướng của hai vector. Thước đo này thường dùng cho hệ thống gợi ý. Khi các embedding được chuẩn hóa về độ dài 1, tích vô hướng tương đương chức năng với tương đồng cosine.
Quản lý số chiều embedding
Tham số dimensions rất quan trọng và phải khớp chính xác với đầu ra của mô hình embedding của bạn. Lỗi thường gặp là chọn số không khớp với đầu ra của mô hình. Mô hình có số chiều cao hơn có thể nắm bắt chi tiết nhiều hơn nhưng sẽ dẫn đến chỉ mục lớn hơn và truy vấn chậm hơn. Luôn kiểm tra tài liệu của mô hình để xác nhận số chiều (ví dụ: text-embedding-ada-002 của OpenAI xuất ra 1536 chiều).
Tinh chỉnh chỉ mục
Các tham số numCandidates và numLists rất quan trọng để cân bằng giữa tốc độ và độ chính xác. Quy tắc kinh nghiệm tốt là bắt đầu với numCandidates thấp và tăng dần cho đến khi đạt mức độ chính xác mong muốn. Bạn cũng có thể thử nghiệm các giá trị numLists khác nhau cho chỉ mục ivf để tìm điểm cân bằng phù hợp với bộ dữ liệu của bạn.
Trường hợp sử dụng ví dụ: Xây dựng hệ thống gợi ý đơn giản
Hãy áp dụng các khái niệm này vào ví dụ thực tế: hệ thống gợi ý sản phẩm cho thương mại điện tử.
Bước 1: Lưu trữ dữ liệu sản phẩm với embedding
Trước hết, chúng ta sẽ lưu tên sản phẩm, danh mục và một vector embedding cho mỗi sản phẩm. Embedding có thể được tạo từ mô tả hoặc đặc tính của sản phẩm.
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"fields": [
{
"type": "vector",
"path": "embedding", // The field containing the vectors
"numDimensions": 128, // The correct field name is 'numDimensions'
"similarity": "cosine" // The correct field name is 'similarity'
// Index algorithm (like HNSW) is managed automatically by Atlas
}
]
}
}
});Được hỗ trợ bởi
Bước 3: Truy vấn sản phẩm tương tự
Bây giờ, hãy tìm các sản phẩm tương tự Smart Speaker. Chúng ta sẽ dùng embedding của Smart Speaker làm vector truy vấn.
Truy vấn này sẽ trả về ba sản phẩm hàng đầu có embedding gần nhất với embedding của Smart Speaker, hiệu quả trong việc gợi ý các mặt hàng tương tự, như Wireless Earbuds.
Kết luận
Khả năng vector search của MongoDB mở ra những khả năng mới để xây dựng ứng dụng thông minh và cá nhân hóa. Bằng cách tích hợp lập chỉ mục vector trực tiếp vào cơ sở dữ liệu, MongoDB đơn giản hóa kiến trúc, giúp quản lý dữ liệu dễ dàng hơn và thực hiện tìm kiếm tương đồng nhanh hơn.
Với sức mạnh của vector search, bạn có thể vượt qua việc khớp từ khóa đơn thuần và tạo ra các tính năng hiểu được ngữ cảnh và ý nghĩa của dữ liệu. Chúng tôi khuyến khích bạn bắt đầu thử nghiệm với gói miễn phí MongoDB Atlas và khám phá cách lập chỉ mục vector có thể nâng cấp ứng dụng của bạn.
FAQs
Vector embedding là gì và vì sao cần cho vector search?⌄
Vector embedding là biểu diễn số của dữ liệu như văn bản hoặc hình ảnh. Nó cần thiết cho vector search vì cho phép cơ sở dữ liệu đo lường độ tương đồng ngữ nghĩa giữa các mục bằng cách tính khoảng cách giữa các vector của chúng, vượt xa việc khớp từ khóa đơn giản.
Tôi có cần phiên bản MongoDB cụ thể để dùng Vector Search không?⌄
Có. Vector search là tính năng tích hợp của MongoDB Atlas, phiên bản MongoDB được lưu trữ trên đám mây. Nó không có trong bản community hoặc triển khai on-premise của cơ sở dữ liệu.
Tôi có cần tự tạo vector embedding không?⌄
Có, bạn cần tạo embedding vector cho dữ liệu trước khi lưu vào MongoDB và tạo chỉ mục vector. MongoDB không tạo embedding giúp bạn. Thông thường bạn sẽ dùng dịch vụ bên thứ ba hoặc mô hình tiền huấn luyện từ các nền tảng như OpenAI, Hugging Face, hoặc Google AI để chuyển đổi văn bản, hình ảnh hoặc dữ liệu khác thành vector số.
Tôi có thể kết hợp vector search với các truy vấn MongoDB khác không?⌄
Có, bạn có thể. Vector search là một bước trong pipeline tổng hợp ($vectorSearch), tức là bạn có thể dùng nó trong một pipeline tổng hợp MongoDB lớn hơn. Điều này cho phép bạn kết hợp vector search với các bước mạnh mẽ khác như $match, $project, $limit, và $lookup để tạo truy vấn tinh vi thực hiện lọc, sắp xếp và làm giàu dữ liệu trong một thao tác. Khả năng này được gọi là tìm kiếm lai (hybrid search) và rất cần thiết để xây dựng ứng dụng thực tế.
Sự khác nhau giữa các kiểu chỉ mục IVF và HNSW là gì?⌄
Cả IVF và HNSW đều là thuật toán dùng cho tìm kiếm láng giềng gần đúng (ANN). Khác biệt chính nằm ở cách chúng cấu trúc dữ liệu.
Karen là một Kỹ sư Dữ liệu đam mê xây dựng các nền tảng dữ liệu có khả năng mở rộng. Cô có kinh nghiệm tự động hóa hạ tầng với Terraform và háo hức chia sẻ những gì mình học được qua các bài blog và hướng dẫn. Karen là một người xây dựng cộng đồng và cô tâm huyết với việc kết nối những chuyên gia dữ liệu.
Lập chỉ mục vector đã trở thành một công cụ mạnh mẽ để xây dựng các ứng dụng hiện đại. Nó cho phép bạn thực hiện tìm kiếm tương đồng nhanh và hiệu quả trên dữ liệu nhiều chiều, thường được gọi là vector embeddings. Khả năng này nay đã được tích hợp liền mạch vào MongoDB, giúp nhà phát triển xây dựng những tính năng tinh vi ngay trong cơ sở dữ liệu.
Bài viết này là hướng dẫn thực hành thiết lập và sử dụng lập chỉ mục vector trong MongoDB. Chúng ta sẽ đi qua từng bước, từ tạo chỉ mục đầu tiên đến chạy các truy vấn phức tạp. Bạn cũng sẽ học các thực tiễn tốt nhất và khám phá ví dụ thực tế về xây dựng hệ thống gợi ý sản phẩm cho một cửa hàng thương mại điện tử.
Vector Indexing là gì?
Cốt lõi, lập chỉ mục vector là kỹ thuật tổ chức các vector embedding để tăng tốc tìm kiếm tương đồng. Khác với các chỉ mục truyền thống hoạt động trên giá trị vô hướng (như số hoặc chuỗi), chỉ mục vector được tối ưu để tìm các vector "lân cận" trong không gian nhiều chiều.
Vector embedding là biểu diễn số của dữ liệu phức tạp, bao gồm văn bản, hình ảnh và âm thanh. Ví dụ, mô tả sản phẩm có thể được chuyển thành một vector, trong đó các sản phẩm tương tự sẽ có vector gần nhau trong không gian. Sự gần nhau này cho phép xây dựng các ứng dụng mạnh mẽ như:
Thiết lập lập chỉ mục vector trong MongoDB
Để bắt đầu, bạn cần một cụm MongoDB Atlas. Vector search là một tính năng gốc đám mây. Bạn có thể thử tính năng này trên MongoDB Atlas, hoặc bản Community edition miễn phí. Trong bài này, chúng tôi sẽ sử dụng MongoDB Atlas.
Bước 1: Tạo cụm MongoDB Atlas
Tạo một cụm mới trong MongoDB Atlas. Gói M0 miễn phí là đủ cho mục đích thử nghiệm.
Bước 2: Tạo collection và chèn dữ liệu
Đầu tiên, kết nối tới cụm của bạn bằng MongoDB Shell (mongosh) hoặc driver bạn ưa thích. Sau đó, tạo collection mới tên là products và chèn các document chứa một trường vector. Mỗi document nên đại diện cho một sản phẩm và bao gồm trường embedding, trường này sẽ lưu biểu diễn vector của sản phẩm.
Dưới đây là ví dụ đầy đủ hơn với ba document sản phẩm riêng biệt, mỗi cái có một vector được tạo ngẫu nhiên để minh họa dữ liệu có thể trông như thế nào. Trong thực tế, bạn sẽ thay thế những vector này bằng embedding do mô hình AI tạo ra.
Mỗi document chứa các trường name, category, description và price, cùng với trường quan trọng là embedding. Trường embedding là một mảng số kích thước cố định, biểu diễn ý nghĩa ngữ nghĩa của mô tả sản phẩm. Kích thước mảng này, hay số chiều (dimensionality), phụ thuộc vào mô hình dùng để tạo embedding. Trong ví dụ này, số chiều là 128.
Đây là dữ liệu mà chúng ta sẽ xây dựng chỉ mục vector để kích hoạt tìm kiếm ngữ nghĩa và gợi ý sản phẩm.
Bước 3: Tạo chỉ mục vector
Khi bạn đã có dữ liệu với embedding trong một collection, bước tiếp theo là tạo một chỉ mục vector. Chỉ mục này rất quan trọng để kích hoạt các tìm kiếm tương đồng nhanh và hiệu quả. Lệnh dưới đây sử dụng createSearchIndex để xây dựng chỉ mục vector trên trường embedding.
Hiểu cấu hình
Cấu hình chỉ mục được định nghĩa trong mảng fields của đối tượng definition. Cấu trúc này là bản thiết kế cho cách MongoDB Atlas tổ chức các vector của bạn để truy xuất tốc độ cao.
Các tham số cốt lõi cho lập chỉ mục vector gồm:
Các tham số hiệu năng tùy chọn
Để tinh chỉnh hiệu năng nâng cao, MongoDB Atlas cho phép bạn chỉ định các tham số tùy chọn để tối ưu lưu trữ và bộ nhớ:
Thực hiện truy vấn Vector Search
Khi chỉ mục đã được xây dựng, bạn có thể dùng bước tổng hợp $vectorSearch để thực hiện truy vấn tương đồng.
Hãy tìm các sản phẩm giống nhất với một vector truy vấn. Vector này thường được tạo ra từ đầu vào tìm kiếm của người dùng.
Bước $project là tùy chọn nhưng hữu ích để định dạng đầu ra và loại trừ dữ liệu vector khỏi kết quả.
Các thực tiễn tốt nhất cho lập chỉ mục vector
Khi tinh chỉnh chỉ mục vector để đạt hiệu năng tối ưu, bạn cần cân bằng giữa độ chính xác và tốc độ. Mấu chốt là điều chỉnh các tham số của chỉ mục dựa trên bộ dữ liệu cụ thể và mục tiêu hiệu năng của bạn.
Chọn thước đo tương đồng phù hợp
Việc chọn thước đo là nền tảng vì nó định nghĩa mức “tương tự” của hai vector. Bạn có thể tham khảo tài liệu MongoDB để tìm hiểu thêm về các trường.
Quản lý số chiều embedding
Tham số dimensions rất quan trọng và phải khớp chính xác với đầu ra của mô hình embedding của bạn. Lỗi thường gặp là chọn số không khớp với đầu ra của mô hình. Mô hình có số chiều cao hơn có thể nắm bắt chi tiết nhiều hơn nhưng sẽ dẫn đến chỉ mục lớn hơn và truy vấn chậm hơn. Luôn kiểm tra tài liệu của mô hình để xác nhận số chiều (ví dụ: text-embedding-ada-002 của OpenAI xuất ra 1536 chiều).
Tinh chỉnh chỉ mục
Các tham số numCandidates và numLists rất quan trọng để cân bằng giữa tốc độ và độ chính xác. Quy tắc kinh nghiệm tốt là bắt đầu với numCandidates thấp và tăng dần cho đến khi đạt mức độ chính xác mong muốn. Bạn cũng có thể thử nghiệm các giá trị numLists khác nhau cho chỉ mục ivf để tìm điểm cân bằng phù hợp với bộ dữ liệu của bạn.
Trường hợp sử dụng ví dụ: Xây dựng hệ thống gợi ý đơn giản
Hãy áp dụng các khái niệm này vào ví dụ thực tế: hệ thống gợi ý sản phẩm cho thương mại điện tử.
Bước 1: Lưu trữ dữ liệu sản phẩm với embedding
Trước hết, chúng ta sẽ lưu tên sản phẩm, danh mục và một vector embedding cho mỗi sản phẩm. Embedding có thể được tạo từ mô tả hoặc đặc tính của sản phẩm.
Bước 2: Tạo chỉ mục vector trên embedding
Bước 3: Truy vấn sản phẩm tương tự
Bây giờ, hãy tìm các sản phẩm tương tự Smart Speaker. Chúng ta sẽ dùng embedding của Smart Speaker làm vector truy vấn.
Truy vấn này sẽ trả về ba sản phẩm hàng đầu có embedding gần nhất với embedding của Smart Speaker, hiệu quả trong việc gợi ý các mặt hàng tương tự, như Wireless Earbuds.
Kết luận
Khả năng vector search của MongoDB mở ra những khả năng mới để xây dựng ứng dụng thông minh và cá nhân hóa. Bằng cách tích hợp lập chỉ mục vector trực tiếp vào cơ sở dữ liệu, MongoDB đơn giản hóa kiến trúc, giúp quản lý dữ liệu dễ dàng hơn và thực hiện tìm kiếm tương đồng nhanh hơn.
Với sức mạnh của vector search, bạn có thể vượt qua việc khớp từ khóa đơn thuần và tạo ra các tính năng hiểu được ngữ cảnh và ý nghĩa của dữ liệu. Chúng tôi khuyến khích bạn bắt đầu thử nghiệm với gói miễn phí MongoDB Atlas và khám phá cách lập chỉ mục vector có thể nâng cấp ứng dụng của bạn.