289 lượt đọc

The AI Engineer’s Playbook: Mastering Vector Search & Management (Phần 2)

từ tác giả Paolo Perrone20m2025/04/30
Read on Terminal Reader

dài quá đọc không nổi

Vector embeddings là xương sống của các hệ thống AI hiện đại. Chúng bao gồm các mô hình phức tạp từ văn bản, hình ảnh, âm thanh và các loại dữ liệu khác. Ngay cả các loại nhúng tốt nhất cũng vô dụng nếu không có các hệ thống vững chắc để lưu trữ, truy xuất và quản lý chúng một cách hiệu quả ở quy mô lớn. khía cạnh này thường bị bỏ qua, được gọi là Vector Search & Management (VS&M), rất quan trọng để biến dữ liệu của bạn thành một cái gì đó thực sự thúc đẩy giá trị.
featured image - The AI Engineer’s Playbook: Mastering Vector Search & Management (Phần 2)
Paolo Perrone HackerNoon profile picture
0-item


Vector embeddings là xương sống của các hệ thống AI hiện đại, bao bì các mô hình phức tạp từ văn bản, hình ảnh, âm thanh và các loại dữ liệu khác.Ngay cả những nhúng tốt nhất cũng vô dụng nếu không có hệ thống vững chắc để lưu trữ, thu thập và quản lý chúng một cách hiệu quả ở quy mô lớn..


Khía cạnh này thường bị bỏ qua, được gọi là Vector Search & Management (VS&M), rất quan trọng để biến dữ liệu của bạn thành một cái gì đó thực sự thúc đẩy giá trị.


This article presents a systematic approach to vector search and managementDựa trên ba trụ cột chính:(1) access patterns, (2) performance requirements, and (3) data characteristics.


Bằng cách đánh giá hệ thống của bạn thông qua khuôn khổ này, bạn sẽ đưa ra các quyết định kiến trúc có hiểu biết cân bằng tốc độ, độ chính xác, chi phí và khả năng mở rộng.Phần 1 chúng tôi đã khám phá cách làm việc với các nguồn dữ liệu phù hợpBây giờ chúng ta sẽ giải quyết lớp tiếp theo: chuyển đổi các nhúng đó thành các hệ thống có thể thực hiện thông qua tìm kiếm và quản lý vector hiệu quả.

Một cách tiếp cận có hệ thống để tìm kiếm và quản lý vector

Trong vài năm qua xây dựng các hệ thống ML, tôi đã thấy các nhóm nỗ lực nghiêm túc trong việc tạo ra các nhúng vector tinh vi.Họ nắm bắt các mô hình tinh tế trên văn bản, hình ảnh, âm thanh - bạn đặt tên nó.


Bởi vì bất kể nhúng của bạn tốt như thế nào, chúng chỉ hữu ích như khả năng của bạn để lấy và hành động với chúng - nhanh chóng, chính xác và quy mô.


  • Bạn không thể bề mặt kết quả có liên quan
  • Embeddings bị trì trệ thay vì cải thiện với phản hồi
  • Sự chậm trễ và chi phí đi ra khỏi tầm kiểm soát khi dữ liệu của bạn phát triển


Đây là phần làm cho hệ thống hoạt động. nó là công cụ đằng sau tìm kiếm ngữ nghĩa, đề xuất và tất cả các tính năng thông minh mà người dùng mong đợi. bỏ qua nó, và bạn đã xây dựng một bộ não không có hệ thống thần kinh.


Trước khi đi sâu vào các chi tiết kỹ thuật, hãy thiết lập khuôn khổ quyết định sẽ hướng dẫn các lựa chọn thực hiện của chúng tôi:


(1) Define System Requirements

  • Mục tiêu hiệu suất (latency, throughput, recall)
  • Đặc điểm dữ liệu (tổng lượng, kích thước, tần suất cập nhật)
  • Các hạn chế hoạt động (chi phí, cơ sở hạ tầng, chuyên môn của nhóm)


(2) Choose Access Patterns

  • Static in-memory (các bộ dữ liệu nhỏ, ổn định)
  • Truy cập động (một tập dữ liệu lớn hoặc thay đổi thường xuyên)
  • Xử lý hàng loạt (phân tích ngoại tuyến và xây dựng chỉ mục)


(3) Select Technical Implementation

  • Thuật toán tìm kiếm (exact vs. approximate)
  • Các kỹ thuật tối ưu hóa (tính lượng, lọc)
  • Các chiến lược lưu trữ và lập chỉ mục


(4) Establish Evaluation Framework

  • Hệ thống đo lường (thông lượng, độ trễ, sử dụng tài nguyên)
  • Đo lường chất lượng (nhớ lại, chính xác, liên quan)
  • Operational metrics (build time, update latency) (Thời gian xây dựng, độ trễ cập nhật)

Khung này đảm bảo rằng các quyết định kỹ thuật phù hợp với trường hợp sử dụng cụ thể và yêu cầu kinh doanh của bạn.

Khái niệm cốt lõi

Vector Search & Management bao gồm hai thành phần liên kết:


  • Quản lý vector: Cơ sở hạ tầng để lưu trữ, lập chỉ mục, cập nhật và duy trì các nhúng vector và siêu dữ liệu liên quan. Nhận được quyền này đảm bảo dữ liệu tươi mới, khả năng truy cập và chuẩn bị vector cho các nhiệm vụ tiếp theo.
  • Tìm kiếm vector: Công cụ truy vấn cho phép tìm kiếm nhanh chóng và có liên quan từ các bộ dữ liệu vector có khả năng lớn.Đây là nơi phép thuật tìm kiếm các mục tương tự xảy ra ở quy mô lớn.

Tại sao Mastering Vector Search & Management là không thể đàm phán

Khả năng tìm kiếm và quản lý vector hiệu quả mở ra ba lợi ích chính:


  • Đánh giá và cải tiến nhúng: Làm thế nào bạn biết liệu nhúng của bạn thực sự hoạt động tốt trong thực tế? Để trả lời câu hỏi này, bạn cần truy vấn chúng với các tập dữ liệu đại diện và đánh giá chúng bằng các chỉ số như recall@k. Nếu không có tìm kiếm vector hiệu quả, việc đánh giá nhúng trên hàng triệu hoặc hàng tỷ mục trở nên chậm rãi, hạn chế thử nghiệm đến các mẫu nhỏ hoặc các trường hợp đơn giản.
  • Tin tức mới, có liên quan đến mô hình ML: Các mô hình thực hiện Transfer Learning, RL, Recommendations, Anomaly Detection, hoặc Active Learning dựa vào embeddings như input.Thêm vào đó, khả năng tìm kiếm vector cho phép tìm kiếm hiệu quả các vector cụ thể cần thiết cho các nhiệm vụ đào tạo phức tạp (chẳng hạn như tìm kiếm tiêu cực cứng cho học tập tích cực).
  • Khả năng ứng dụng thời gian thực: Các ứng dụng hướng tới người dùng như tìm kiếm ngữ nghĩa, đề xuất và tìm kiếm tương đồng hình ảnh đòi hỏi các câu trả lời truy vấn chậm trễ và công suất cao, đặc biệt là do dữ liệu liên tục thay đổi. Trong khi nhúng xác định sự tương đồng, đó là công cụ tìm kiếm vector cung cấp kết quả trong milliseconds, quy mô. cơ sở dữ liệu truyền thống đấu tranh để đáp ứng các yêu cầu này, làm cho các hệ thống tìm kiếm và quản lý vector chuyên biệt.

Navigating the Design Trade-offs for Vector Tìm kiếm & Quản lý

Việc thực hiện thành công Vector Search & Management đòi hỏi phải cân bằng các ưu tiên cạnh tranh.

Yêu cầu hiệu suất

Mỗi hệ thống tìm kiếm vector tạo ra sự thỏa hiệp giữa:

(1) Speed/Latency:Hệ thống phải đáp ứng nhanh như thế nào?Tính trễ dưới 100ms là cần thiết, hoặc một giây là chấp nhận được?Tính trễ thấp hơn thường đòi hỏi nhiều tài nguyên tính toán hơn và có thể đòi hỏi sự thỏa hiệp về độ chính xác.


(2) Accuracy/Recall: What level of precision is required? Is finding 95% of relevant results sufficient, or must you capture 99.9%? Higher recall requirements typically increase computational costs and may reduce speed.


(3) Cost:Những hạn chế ngân sách nào tồn tại? Hiệu suất cao hơn thường đòi hỏi nhiều nguồn lực hơn, dẫn đến chi phí gia tăng.


(4) Scalability:Làm thế nào hệ thống phải mở rộng quy mô khi dữ liệu phát triển? có cần phải xử lý hàng triệu truy vấn trên hàng tỷ vector không? yêu cầu mở rộng ảnh hưởng đến các lựa chọn kiến trúc ngay từ đầu.

Dữ liệu đặc trưng

Hiểu dữ liệu của bạn là rất quan trọng đối với thiết kế tìm kiếm vector:


(1) Data Volume:Số lượng vector trong bộ dữ liệu của bạn cơ bản ảnh hưởng đến các lựa chọn kiến trúc. hệ thống xử lý hàng ngàn, hàng triệu hoặc hàng tỷ vector đòi hỏi các cách tiếp cận khác nhau.


(2) Vector Dimensionality:Kích thước cao hơn (1024+) so với kích thước thấp hơn (128) ảnh hưởng đến việc sử dụng bộ nhớ, yêu cầu tính toán và lựa chọn thuật toán.


(3) Update Frequency:Làm thế nào thường xuyên vector thay đổi hình dạng toàn bộ đường ống của bạn:

  • Streaming thời gian thực: Cập nhật ngay lập tức đòi hỏi phải lập chỉ mục liên tục
  • Các lô thường xuyên: Cập nhật thường xuyên (giờ/ngày) cho phép định kỳ reindexing
  • Tải lượng lớn không thường xuyên: Cập nhật hiếm có cho phép tối ưu hóa tĩnh

Truy cập Query Access Patterns

Xem xét cách người dùng và hệ thống tương tác với dữ liệu vector của bạn xác định kiến trúc:


(1) High-throughput single lookups:Truy vấn cá nhân nhanh đòi hỏi các con đường tìm kiếm được tối ưu hóa

(2) Complex batch queries:Tải công việc phân tích xử lý nhiều vector cùng một lúc

(3) Filtering before search:Các kịch bản yêu cầu lọc siêu dữ liệu trước hoặc cùng với sự tương đồng vector


Một cách để suy nghĩ về quá trình thiết kế là hình dung nó như một tam giác, nơi mỗi yếu tố này tạo thành một góc, và thiết kế tối ưu nằm ở giao điểm của cả ba:

Synthesizing the Tradeoffs: The Design Triangle


Mỗi dự án liên quan đến việc thực hiện các thỏa hiệp có ý thức, đặc biệt là khi xác định các ưu tiên của bạn và quyết định những khía cạnh nào để ưu tiên.Ví dụ, trong mộte-commerce recommendation system, nhu cầu độ trễ thấp (tốc độ) và cập nhật thời gian thực có thể chiếm ưu thế.

Điều này sẽ yêu cầu ưu tiên tìm kiếm nhanh các vector ngay khi người dùng tương tác với hệ thống. tuy nhiên, điều này có thể có nghĩa là chấp nhận tỷ lệ thu hồi thấp hơn một chút hoặc chi phí cơ sở hạ tầng cao hơn do yêu cầu duy trì dữ liệu cập nhật, nhanh và có liên quan.


Mặt khác, trong mộtoffline analytical system, bạn có thể ưu tiên độ chính xác hơn độ trễ, với xử lý lô và phân tích sâu hơn trở thành trọng tâm chính.


So, how do we achieve the desired speed and accuracy within these constraints?Điều này đưa chúng ta thẳng vào phòng động cơ của Vector Search.

Công cụ cốt lõi: thuật toán tìm kiếm hàng xóm gần nhất

Tìm kiếm vector phụ thuộc vào tốc độ - khả năng nhanh chóng quét một tập dữ liệu và tính toán sự tương đồng giữa các vector. Ở cốt lõi của nhiệm vụ này là tìm kiếm Nearest Neighbor (NN). Mục tiêu là đơn giản: với một vector truy vấn, hãy tìm các vector trong tập dữ liệu được lập chỉ mục của bạn gần nhất theo thước đo khoảng cách đã chọn (như Cosine Similarity hoặc Euclidean Distance). Có nhiều cách để thực hiện tìm kiếm hàng xóm gần nhất.

Full Scan (Brute Force Approach) - Phương pháp quét toàn diện

Hãy tưởng tượng rằng chúng ta có một tập dữ liệu của 1 triệu vector 1000-dimensional và cần tìm các vector tương tự cho một truy vấn nhất định. một cách tiếp cận ngây thơ sẽ so sánh vector truy vấn với mỗi vector duy nhất - thực hiện 1 tỷ hoạt động (1M vector * 1000 dimensions) cho mỗi truy vấn.


Full scan là một phương pháp brute-force, kiểm tra từng điểm dữ liệu trong tập dữ liệu để đảm bảo nó tìm thấy những người hàng xóm tuyệt đối gần nhất.Đối với các bộ dữ liệu nhỏ hơn - dưới một triệu vector, đặc biệt là những vector không thay đổi thường xuyên - phương pháp này có thể hoạt động tốt và thậm chí có thể là một điểm khởi đầu tốt.


Tuy nhiên, khi tập hợp dữ liệu phát triển hoặc nếu độ tươi của dữ liệu trở nên rất quan trọng, khả năng thực tế của quét đầy đủ nhanh chóng giảm đi. Một khi bạn vượt qua dấu triệu vector hoặc cần cập nhật thường xuyên, chi phí tính toán của mỗi truy vấn tăng đáng kể.


Performance characteristics:

  • Latency: O(n×d) nơi n = số vector và d = kích thước
  • Bộ nhớ: O(n×d) – yêu cầu toàn bộ bộ dữ liệu trong bộ nhớ để có hiệu suất tối ưu
  • Độ chính xác: 100% thu hồi (được đảm bảo để tìm thấy những người hàng xóm thực sự gần nhất)
  • Thời gian xây dựng: O(1) – không yêu cầu lập chỉ mục


In my experience, relying solely on full scan for large, dynamic production systems is rarely a viable option. We need faster alternatives.

Algorithm hàng xóm gần nhất (ANN)

Đây là nơi các thuật toán Gần hàng xóm gần nhất (ANN) đi vào hình ảnh.

Các thuật toán ANN giới thiệu các cách tiếp cận cho tốc độ cải thiện đáng kể.


(1) Tree-based methods (KD-trees, Ball trees)

Chúng chia không gian vector thành các khu vực được niêm phong, vì vậy bạn không cần phải tìm kiếm mọi thứ.

  • Tuyệt vời cho dữ liệu chiều thấp (nghĩ ≤20 chiều)
  • Đấu tranh tồi tệ trong các chiều cao cao do "lời nguyền của tính chiều cao"
  • Tốt nhất cho các tập dữ liệu nhỏ hoặc có cấu trúc, nơi phân vùng chính xác trả tiền


(2) Locality-Sensitive Hashing (LSH)

Điều này hash vector để các vector tương tự rơi vào cùng một thùng chứa thường xuyên hơn không.

  • Tăng quy mô tốt với cả số lượng kích thước và kích thước tập dữ liệu
  • Không cần phải quét toàn bộ không gian
  • Nhưng: đòi hỏi điều chỉnh cẩn thận các hàm hash và ngưỡng để có được hồi âm tốt


(3) Graph-based methods

Chúng xây dựng một biểu đồ nơi mỗi nút (vector) kết nối với hàng xóm gần nhất của nó - tìm kiếm trở thành lối đi nhanh.

  • HNSW (Hierarchical Navigable Small World): Xây dựng một biểu đồ nhiều lớp để điều hướng các tập dữ liệu lớn hiệu quả
  • NSG (Navigable Spreading-Out Graph): Tập trung vào việc xây dựng một biểu đồ tốt để giảm thiểu các bước nhảy và giảm chi phí tìm kiếm
  • DiskANN: Tối ưu hóa cho các tập dữ liệu quy mô hàng tỷ, được thiết kế để tắt SSD thay vì giữ mọi thứ trong RAM


Ưu điểm chính của ANN so với tìm kiếm brute force là khả năng xử lý các tập dữ liệu quy mô lớn một cách hiệu quả. kết quả benchmarking, chẳng hạn như những người từCác benchmark, liên tục cho thấy sự thỏa hiệp này: lực thô cung cấp độ chính xác cao nhất nhưng hỗ trợ ít truy vấn mỗi giây (QPS). thuật toán ANN, mặt khác, cho phép QPS cao hơn nhiều, làm cho chúng lý tưởng cho các hệ thống thời gian thực - mặc dù thường có một sự giảm nhẹ trong thu hồi, tùy thuộc vào thuật toán và cách nó được điều chỉnh.

Plots for glove-100-angular (k = 10) Recall/Queries per second (1/s) form ANN-benchmarks


Mã ví dụ: Full Scan vs. ANN

Để làm cho các khái niệm này cụ thể hơn, chúng ta hãy chứng minh một so sánh cơ bản giữa một quét đầy đủ (tìm kiếm tuyến tính) và một cách tiếp cận ANN sử dụng chỉ số IVFFlat sử dụng phổ biếnThư viện Faiss.


import numpy as np
import faiss
import time

# 1. Create a synthetic dataset
num_vectors = 1000000  # One million vectors
vector_dim = 1000      # 1000 dimensions
print(f"Creating dataset with {num_vectors} vectors of dimension {vector_dim}...")
dataset = np.random.rand(num_vectors, vector_dim).astype('float32')

# 2. Define a sample query vector
query_vector = np.random.rand(vector_dim).astype('float32')
query_vector_reshaped = query_vector.reshape(1, vector_dim)

# --- Linear Scan (Full Scan) Example ---
print("\n--- Linear Scan (using IndexFlatL2) ---")

# 3. Create a Faiss index for exact L2 distance search (Full Scan)
index_flat = faiss.IndexFlatL2(vector_dim)

# 4. Add the dataset vectors to the index
print("Adding vectors to IndexFlatL2...")
index_flat.add(dataset)
print(f"Index contains {index_flat.ntotal} vectors.")

# 5. Perform the search
print("Performing linear scan search...")
start_time = time.time()
distances_flat, indices_flat = index_flat.search(query_vector_reshaped, k=1)
end_time = time.time()

# On typical hardware, this might take 1-2 seconds for this dataset size
print(f"Linear scan time: {end_time - start_time:.4f} seconds")
print(f"Nearest neighbor index (Linear): {indices_flat[0][0]}, Distance: {distances_flat[0][0]}")

# --- Approximate Nearest Neighbor (ANN) Example ---
print("\n--- ANN Scan (using IndexIVFFlat) ---")

# 6. Define and create an ANN index (IVFFlat)
# IVF1024 partitions the data into 1024 clusters (voronoi cells)
nlist = 1024  # Number of clusters/cells
quantizer = faiss.IndexFlatL2(vector_dim)
index_ivf = faiss.IndexIVFFlat(quantizer, vector_dim, nlist)

# 7. Train the index on the dataset (learns the cluster centroids)
# This is a one-time operation that can be slow but improves query performance
print(f"Training IndexIVFFlat with {nlist} clusters...")
index_ivf.train(dataset)
print("Training complete.")

# 8. Add the dataset vectors to the trained index
print("Adding vectors to IndexIVFFlat...")
index_ivf.add(dataset)
print(f"Index contains {index_ivf.ntotal} vectors.")

# 9. Perform the ANN search
# nprobe controls search accuracy vs. speed tradeoff
# Higher values = better recall but slower search
index_ivf.nprobe = 10  # Search within the 10 nearest clusters
print(f"Performing ANN search (nprobe={index_ivf.nprobe})...")
start_time = time.time()
distances_ivf, indices_ivf = index_ivf.search(query_vector_reshaped, k=1)
end_time = time.time()

# On typical hardware, this might take 10-20ms - about 100x faster than brute force
print(f"ANN scan time: {end_time - start_time:.4f} seconds")
print(f"Nearest neighbor index (ANN): {indices_ivf[0][0]}, Distance: {distances_ivf[0][0]}")

# Expected recall rate at nprobe=10 is approximately 90-95%
# To verify, we could compute overlap between exact and approximate results


Trong ví dụ này, trước tiên chúng ta tạo ra một tập dữ liệu lớn của vector ngẫu nhiên.IndexFlatL2Chỉ số này chỉ đơn giản là lưu trữ tất cả các vector và so sánh truy vấn với mỗi trong suốt quá trình tìm kiếm - đường cơ bản của chúng tôi.


Tiếp theo, chúng tôi chuyển sangIndexIVFFlat, một kỹ thuật ANN phổ biến. Điều này liên quan đến một bước đào tạo bổ sung, trong đó chỉ số tìm hiểu cấu trúc của dữ liệu phân chia nó thành các tế bào (hoặc các tế bào Voronoi). Trong quá trình tìm kiếm, tham số nprobe xác định số lượng phân vùng được kiểm tra, cho phép thuật toán để thông minh lấy mẫu chỉ một tiểu tập dữ liệu, làm giảm đáng kể số lượng so sánh cần thiết.


Chạy mã này (thời gian thực phụ thuộc rất nhiều vào phần cứng) thường chứng minh rằng ANN tìm kiếm (IndexIVFFlatTuy nhiên, sau khi thực hiện quá trình kiểm tra kỹ thuật số, việc kiểm tra kỹ thuật số sẽ nhanh hơn rất nhiều so với quá trình kiểm tra kỹ thuật số (IndexFlatL2), làm nổi bật lợi thế tốc độ thực tế của các phương pháp ANN cho các tập dữ liệu lớn.


Tuy nhiên, điều quan trọng cần lưu ý là các triển khai ANN khác nhau đi kèm với các thỏa thuận tối ưu hóa riêng của họ. IndexIVFFlat chỉ là một lựa chọn, và việc chọn phương pháp phù hợp liên quan đến việc đánh giá thỏa thuận về tốc độ, độ chính xác, sử dụng bộ nhớ và thời gian lập chỉ mục. Mỗi phương pháp có điểm mạnh của nó, vì vậy đánh giá so sánh các phương pháp khác nhau là rất quan trọng để tìm thấy sự cân bằng tối ưu dựa trên các mẫu tập dữ liệu và truy vấn của bạn.

Giảm dấu chân bộ nhớ: định lượng

Khi tập dữ liệu vector ngày càng lớn, tiêu thụ bộ nhớ trở thành một thách thức đáng kể, đặc biệt là khi đối phó với hàng triệu hoặc hàng tỷ vector kích thước cao.Khi tập dữ liệu vượt quá RAM có sẵn trên một máy duy nhất, các kỹ sư thường sử dụng để phân tách chỉ số trên nhiều máy, giới thiệu sự phức tạp hoạt động và tăng chi phí cơ sở hạ tầng.


Một giải pháp hiệu quả cho vấn đề này làquan hóa, một kỹ thuật được thiết kế để giảm dấu vết bộ nhớ bằng cách nén dữ liệu vectorMục tiêu là đại diện cho các vector điểm nổi có độ chính xác cao với ít dữ liệu hơn, thường sử dụng các phương pháp lập bản đồ các giá trị liên tục thành một tập hợp các đại diện nhỏ hơn.


Bằng cách này, định lượng giảm yêu cầu không gian lưu trữ, có thể giúp phù hợp với các chỉ số lớn trên ít máy hơn hoặc thậm chí một máy duy nhất.


Có một số cách tiếp cận để định lượng vector, với ba loại phổ biến là:


(1) Scalar Quantization

Kỹ thuật này làm giảm độ chính xác của từng kích thước trong một vector. Thay vì sử dụng floats 32-bit chính xác cao, mỗi kích thước có thể được lưu trữ bằng cách sử dụng ít bit hơn, chẳng hạn như số nguyên 8 bit. SQ cung cấp sự cân bằng vững chắc giữa nén, độ chính xác tìm kiếm và tốc độ, làm cho nó trở thành một lựa chọn phổ biến để giảm sử dụng bộ nhớ.

Performance impact:

  • Giảm bộ nhớ: 4x (32-bit → 8-bit)
  • Tác động tốc độ: Ít (đôi khi nhanh hơn do giảm băng thông bộ nhớ)
  • Tác động chính xác: Thường giảm 1–3% thu hồi
  • Trường hợp sử dụng: Tùy chọn chung tốt cho tối ưu hóa bộ nhớ ban đầu


(2) Binary Quantization

Tiếp tục nén bằng cách đại diện các thành phần vector với mã nhị phân, thường chỉ sử dụng 1 bit cho mỗi thành phần hoặc nhóm thành phần. Điều này dẫn đến nén cao và tính toán khoảng cách rất nhanh (ví dụ, khoảng cách Hamming). Tuy nhiên, BQ có thể dẫn đến mất thông tin đáng kể, có thể làm giảm độ chính xác, vì vậy nó phù hợp nhất cho các trường hợp tốc độ rất quan trọng và dữ liệu phù hợp cho đại diện nhị phân.

Performance impact:

  • Giảm bộ nhớ: 8–64x tùy thuộc vào cấu hình
  • Tác động tốc độ: Tính toán khoảng cách phức tạp có thể chậm hơn
  • Tác động chính xác: Giảm 5–15% thu hồi (tùy thuộc vào cấu hình)
  • Trường hợp sử dụng: Hệ thống quy mô lớn nơi bộ nhớ là hạn chế chính


(3) Product Quantization

This technique takes a different approach. It splits each high-dimensional vector into smaller sub-vectors, which are quantized independently using clustering techniques like k-means. Each sub-vector is represented by a code from a codebook, leading to substantial compression. While PQ achieves low memory usage, the process of calculating distances and performing searches can be more computationally intensive than SQ, resulting in slower query times and possibly lower accuracy at similar compression levels.

Performance impact:

  • Giảm bộ nhớ: 32x so với 32-bit floats
  • Tác động tốc độ: Rất nhanh bằng cách sử dụng tính toán khoảng cách đập
  • Tác động của độ chính xác: đáng kể (20% + giảm thu hồi)
  • Trường hợp sử dụng: Các ứng dụng thông lượng cực cao, nơi tốc độ vượt trội với độ chính xác hoàn hảo


Các kỹ thuật định lượng thường được sử dụng kết hợp với các phương pháp tìm kiếm ANN, chứ không phải là các lựa chọn thay thế.Ví dụ, các chỉ số FAISS như IndexIVFPQ kết hợp một cấu trúc IVF (để lựa chọn ứng cử viên nhanh bằng ANN) với Product Quantization (để nén các vector trong mỗi danh sách).


Chọn chiến lược định lượng phù hợp, chẳng hạn như chọn phương pháp ANN tối ưu, đòi hỏi phải hiểu các thỏa thuận và điều chỉnh chúng với nhu cầu hệ thống và đặc điểm dữ liệu của bạn.

Chiến lược lọc

Trong hầu hết các kịch bản thế giới thực, điều cần thiết làKết hợp vector similarity với metadata filtrationHãy nghĩ về các truy vấn như “tìm các sản phẩm tương tự có trong kho và dưới $ 50.”

Phương pháp Filter

(1) Pre-filtering

Cách tiếp cận này lọc dữ liệu dựa trên siêu dữ liệu trước khi lặn vào sự tương đồng vector. Nó hoạt động tốt nhất khi bộ lọc siêu dữ liệu rất chọn lọc (ví dụ, tìm sản phẩm dưới $ 50).Điều này đòi hỏi một cách tiếp cận tích hợp, nơi cả vector và siêu dữ liệu được lập chỉ mục với nhau.

Example: Trước tiên, bạn lọc ra các sản phẩm dưới 50 đô la, sau đó tính toán sự tương đồng chỉ trên nhóm con đáp ứng tiêu chí đó.


(2) Post-filtering

Với lọc sau, bạn thực hiện tìm kiếm tương đồng vector đầu tiên, sau đó áp dụng bộ lọc siêu dữ liệu của bạn sau đó. Đây là một lựa chọn vững chắc khi bộ lọc siêu dữ liệu không đặc biệt chọn lọc. Nhược điểm? Nó có thể trở nên không hiệu quả khi làm việc với các bộ dữ liệu lớn có bộ lọc nghiêm ngặt.

ExampleTìm 1000 sản phẩm tương tự hàng đầu, sau đó thu hẹp chúng xuống dưới 50 đô la.


(3) Hybrid filtering

Bộ lọc lai đạt được sự cân bằng — sử dụng siêu dữ liệu để giảm không gian tìm kiếm trước khi điều chỉnh nó với tìm kiếm vector. Cách tiếp cận này thường sử dụng sự kết hợp của các chỉ số đảo ngược và chỉ số vector để có được tốt nhất của cả hai thế giới.

Example: Sử dụng siêu dữ liệu (chẳng hạn như danh mục và phạm vi giá) để giới hạn không gian tìm kiếm, sau đó không vào các vector phù hợp nhất.

Các chiến lược thực hiện

(1) Inverted Index + Vector Index

Với chiến lược này, bạn tạo các chỉ mục riêng biệt cho siêu dữ liệu và vector. Đầu tiên, chỉ số siêu dữ liệu giúp bạn xác định một tập hợp các ứng cử viên nhỏ hơn. Sau đó, bạn chỉ áp dụng tìm kiếm vector cho các ứng cử viên đó, tiết kiệm thời gian. phương pháp này là lý tưởng khi bộ lọc của bạn thực sự chọn lọc.


(2) Joint Indexing

Ở đây, bạn kết hợp siêu dữ liệu trực tiếp vào chỉ mục vector. Hãy tưởng tượng các cụm IVF cũng bao gồm các thuộc tính siêu dữ liệu. Điều này cho phép hệ thống có thể phân tách các ứng cử viên không liên quan một cách hiệu quả trong quá trình tìm kiếm.


(3) Filter-Aware ANN

Phương pháp này đi sâu hơn bằng cách sửa đổi chính thuật toán ANN để xem xét bộ lọc siêu dữ liệu trong quá trình vượt qua đồ thị. Nó phức tạp hơn một chút nhưng có thể tăng tốc độ truy vấn của bạn đáng kể. ngày càng có nhiều cơ sở dữ liệu vector đang bắt đầu cung cấp tính năng này như là một tính năng tích hợp, làm cho nó dễ dàng hơn để thực hiện trên quy mô.

Key Access Patterns (mẫu truy cập chính)

Cách ứng dụng của bạn truy cập dữ liệu vector – mô hình truy cập của nó – có tác động lớn đến hiệu suất, thiết kế lưu trữ và kiến trúc hệ thống tổng thể.Phù hợp mô hình truy cập với nhu cầu của ứng dụng của bạn là chìa khóa để xây dựng một hệ thống truy cập hiệu quảHãy xem xét một số mô hình phổ biến.

Trực tiếp In-Memory Access

Một trong những mô hình truy cập đơn giản nhất cho tìm kiếm vector là truy cập tĩnh trong bộ nhớ. cách tiếp cận này là lý tưởng khi làm việc với các tập dữ liệu tương đối nhỏ - thường dưới một triệu vector - không thay đổi thường xuyên.


Trong thiết lập này, toàn bộ chỉ số vector được tải vào bộ nhớ khi khởi động ứng dụng.Bởi vì tất cả các so sánh vector xảy ra cục bộ trong quá trình, không cần phải giao tiếp với lưu trữ bên ngoài trong các truy vấn.


Truy cập tĩnh trong bộ nhớ rất thích hợp cho các trường hợp sử dụng đòi hỏi phản ứng chậm trễ thấp và có thể kết hợp dữ liệu vector của họ thoải mái trong bộ nhớ RAM của một máy duy nhất.


Implementation Considerations

Truy cập tĩnh trong bộ nhớ tương đối dễ thực hiện bằng cách sử dụng các công cụ Python phổ biến, đặc biệt là đối với các tập dữ liệu nhỏ hơn.

  • Đối với các thiết lập nhẹ – ví dụ, dưới 100.000 vector – NumPy có thể đủ. Nó cho phép các hoạt động trong bộ nhớ hiệu quả như tương đồng cosine bằng cách sử dụng các mảng đơn giản.
  • Khi tập dữ liệu tiếp cận phạm vi triệu vector, yêu cầu hiệu suất có xu hướng tăng lên.Trong những trường hợp đó, các thư viện như Faiss cung cấp hiệu quả hơn trong việc lập chỉ mục và tìm kiếm điểm tương đồng, bao gồm hỗ trợ cho ANN và định lượng, trong khi vẫn hoạt động hoàn toàn trong bộ nhớ.
  • Nếu ứng dụng của bạn cần lọc theo siêu dữ liệu cùng với sự tương đồng vector - hoặc nếu bộ dữ liệu trong bộ nhớ của bạn lớn nhưng vẫn phù hợp với bộ nhớ RAM - các công cụ như LanceDB hoặc Chroma có thể phù hợp hơn.


Service Restart Implications

Một nhược điểm của mô hình này là những gì xảy ra khi dịch vụ khởi động lại. Bởi vì tất cả dữ liệu sống trong bộ nhớ, toàn bộ bộ dữ liệu vector phải được tải lại khi khởi động. Điều này có thể giới thiệu sự chậm trễ đáng chú ý, đặc biệt là với các chỉ số lớn, và tạm thời ảnh hưởng đến tính sẵn có của hệ thống trong quá trình khởi động. Nếu thời gian khởi động là quan trọng, bạn sẽ cần tính đến điều này khi thiết kế chiến lược triển khai của bạn.

Dynamic truy cập

Mô hình truy cập động được xây dựng cho các hệ thống quy mô sản xuất nơi tập dữ liệu vector quá lớn hoặc quá biến động cho các phương pháp tĩnh trong bộ nhớ. Điều này trở nên đặc biệt quan trọng khi làm việc với hơn một triệu vector hoặc khi nhúng liên tục được thêm vào, cập nhật hoặc thay thế - chẳng hạn như trong các trường hợp sử dụng liên quan đến dữ liệu cảm biến trực tiếp, hành vi người dùng thời gian thực, hoặc phân tích phát trực tuyến.


Không giống như các thiết lập tĩnh, nơi dữ liệu được tải và giữ trong bộ nhớ, truy cập động tải lưu trữ và truy xuất đến các cơ sở dữ liệu vector bên ngoài hoặc công cụ tìm kiếm. các hệ thống này được xây dựng để xử lý dữ liệu kích thước cao ở quy mô lớn, cung cấp các tính năng như lưu trữ vĩnh viễn, cập nhật gia tăng và lập chỉ mục thời gian thực.


Các loại hệ thống khác nhau hỗ trợ truy cập động, mỗi hệ thống có đặc điểm hiệu suất và thỏa thuận riêng của nó.Lựa chọn phù hợp phụ thuộc vào yêu cầu cụ thể của bạn - khối lượng dữ liệu, mô hình truy vấn, độ trễ và độ phức tạp hoạt động.


  1. Cơ sở dữ liệu vector gốc (ví dụ: Weaviate, Pinecone, Milvus, Vespa, Qdrant): được tối ưu hóa đặc biệt để lưu trữ, lập chỉ mục và thực hiện tìm kiếm tương đồng nhanh trên dữ liệu vector chiều cao. thiết kế của chúng tập trung vào các hoạt động vector, làm cho chúng rất hiệu quả cho mục đích này. tuy nhiên, chúng có thể thiếu các tính năng toàn diện được tìm thấy trong cơ sở dữ liệu mục đích chung để xử lý dữ liệu có cấu trúc hoặc không có cấu trúc truyền thống.
  2. Cơ sở dữ liệu lai (ví dụ, MongoDB Atlas Vector Search, PostgreSQL với pgvector, Redis với redis-vss): là các cơ sở dữ liệu được thiết lập tốt (NoSQL, quan hệ, giá trị khóa) có tích hợp tìm kiếm vector thông qua các phần mở rộng hoặc các tính năng tích hợp.
  3. Công cụ tìm kiếm có khả năng vector (ví dụ, Elasticsearch, OpenSearch): ban đầu được xây dựng cho tìm kiếm văn bản và phân tích nhật ký, các công cụ tìm kiếm này có tính năng tìm kiếm vector tích hợp. Đối với các tổ chức đã sử dụng chúng, điều này cho phép khả năng khai thác cơ sở hạ tầng hiện có cho cả tìm kiếm tương đồng văn bản và vector. tuy nhiên, hiệu suất tìm kiếm vector của họ và các thuật toán có sẵn có thể không chuyên biệt hoặc hiệu quả như những gì được tìm thấy trong cơ sở dữ liệu vector chuyên dụng.

So sánh cạnh nhau các ưu và nhược điểm của từng loại cơ sở dữ liệu

Batch truy cập

Trong khi truy cập động tập trung vào các truy vấn trực tiếp chống lại dữ liệu liên tục thay đổi,batch access là mô hình go-to để xử lý các tập dữ liệu vector lớn đòi hỏi xử lý ngoại tuyến, không thời gian thực.Cách tiếp cận này là lý tưởng khi đối phó với các tập dữ liệu lớn (thường hơn một triệu vector) nơi các truy vấn được xử lý trong các lô lớn, tập thể thay vì tương tác.


Việc xử lý hàng loạt đặc biệt có giá trị đối với các nhiệm vụ quản lý vector cơ bản quan trọng cho các dịch vụ tìm kiếm vector hiệu quả, chẳng hạn như:

  • Xây dựng chỉ mục ban đầu cho các tập dữ liệu rất lớn.
  • Đào tạo mô hình định kỳ hoặc đào tạo lại bằng cách sử dụng đại diện vector.
  • Tính toán trước hàng xóm gần nhất hoặc các phân tích khác trên toàn bộ bộ dữ liệu.
  • Dữ liệu làm sạch, chuyển đổi, hoặc làm giàu nhiệm vụ áp dụng cho vector trong số lượng lớn.


Để tối ưu hóa xử lý lô cho ứng dụng của bạn, điều quan trọng là phải xem xét một số yếu tố:


(1) Storage Technologies

Lưu trữ đáng tin cậy là điều cần thiết để chứa các tập dữ liệu vector lớn và đảm bảo chúng có thể truy cập được cho xử lý hàng loạt. Sự lựa chọn của công nghệ lưu trữ ảnh hưởng đến khả năng mở rộng, tốc độ truy cập và tích hợp với đường ống xử lý. Dưới đây là một số tùy chọn phổ biến:


  • Lưu trữ đối tượng (ví dụ: Amazon S3, Google Cloud Storage, Azure Blob Storage): Giải pháp lưu trữ này có khả năng mở rộng cao và hiệu quả về chi phí, làm cho nó phù hợp để lưu trữ các bộ vector tĩnh lớn. Nó tích hợp tốt với các công cụ xử lý dựa trên đám mây như Spark và Flink. Tuy nhiên, nhược điểm chính của nó là độ trễ truy cập cao hơn so với các hệ thống tệp, làm cho nó ít lý tưởng cho các hoạt động I/O chuyên sâu đòi hỏi đọc hoặc viết nhanh, độ trễ thấp.
  • Hệ thống tệp phân tán (ví dụ, HDFS, GlusterFS): Các hệ thống này được thiết kế để lưu trữ các tập dữ liệu khổng lồ trên nhiều máy chủ, cung cấp quyền truy cập công suất cao lý tưởng cho các khung dữ liệu lớn như Hadoop và Spark. Chúng cung cấp khả năng dư thừa dữ liệu và được tối ưu hóa để đọc liên tiếp. tuy nhiên, chúng đi kèm với sự phức tạp của thiết lập, quản lý và bảo trì, có thể là khó khăn hơn so với các giải pháp lưu trữ đối tượng đám mây được quản lý.


(2) Data Serialization Formats

Để lưu trữ vector hiệu quả cho xử lý lô, điều quan trọng là chọn các định dạng dữ liệu làm giảm không gian lưu trữ và cho phép các hoạt động đọc/viết nhanh.

  • Avro và Parquet: Đây là các định dạng serialization nhị phân được sử dụng rộng rãi trong hệ sinh thái dữ liệu lớn (ví dụ, Hadoop, Spark). Cả hai đều cung cấp nén tuyệt vời và hỗ trợ tiến hóa sơ đồ, điều này đặc biệt hữu ích nếu kích thước vector hoặc siêu dữ liệu thay đổi theo thời gian. Avro thường được ưa thích cho các hoạt động theo dòng hoặc tải công việc nặng viết, trong khi Parquet, với định dạng cột, được tối ưu hóa cho các truy vấn phân tích nặng đọc, lý tưởng cho các công việc xử lý lô. các định dạng này cũng tích hợp liền mạch với các công cụ xử lý phân tán và lưu trữ đám mây, làm cho chúng trở thành các tùy chọn linh hoạt cho các hoạt động dữ liệu quy mô lớn.
  • Mảng NumPy nén: Đối với các đường ống đơn giản hơn, dựa trên Python, serializing các mảng NumPy sử dụng các định dạng như .npz hoặc serialization tùy chỉnh với các thư viện nén như zlib hoặc lz4 là một cách tiếp cận hiệu quả. phương pháp này đặc biệt hữu ích trong các môi trường Python khoa học và tích hợp dễ dàng với các thư viện như NumPy và SciPy. tuy nhiên, nó có thể không di động hoặc hiệu suất cho các môi trường đa ngôn ngữ quy mô lớn, nơi các định dạng như Parquet thường cung cấp khả năng mở rộng và hiệu suất tốt hơn.


(3) Execution Environment

Khi chọn nơi và làm thế nào công việc lô của bạn sẽ chạy, bạn phải quyết định giữa cơ sở hạ tầng tự quản lý và dịch vụ đám mây:

  • On-Premise Execution: Using tools like Apache Hadoop or Apache Spark on your own infrastructure gives you complete control over the environment, security, and configuration. However, this comes with significant costs related to infrastructure setup, maintenance, and the need for operational expertise. Additionally, scaling resources can be less flexible and more complex compared to cloud solutions.
  • Dịch vụ đám mây: Các nền tảng như Amazon EMR, Google Cloud Dataproc, hoặc Azure HDInsight cung cấp các giải pháp xử lý lô được quản lý dựa trên các khung phổ biến như Spark. Các dịch vụ này trừ bỏ phần lớn quản lý cơ sở hạ tầng, cung cấp khả năng mở rộng trên cơ sở trả tiền và tích hợp dễ dàng với các dịch vụ đám mây khác, chẳng hạn như lưu trữ đối tượng.


Choosing a batch processing setup


Tóm lại, chọn đúng công nghệ lưu trữ, định dạng serialization dữ liệu, và môi trường thực hiện cho xử lý vector lôĐây là một quyết định phức tạp, nóTùy thuộc vào các yếu tố như:


  • Kích thước của bộ dữ liệu vector của bạn
  • Cho dù dữ liệu là tĩnh hay động (tức là nó thay đổi thường xuyên như thế nào).
  • Scalability cần cho khối lượng công việc của bạn.
  • Cho dù tập hợp dữ liệu được phân phối trên nhiều máy chủ.
  • Yêu cầu (hoặc thiếu) cho truy vấn thời gian thực cùng với các công việc lô.
  • Cần tích hợp với các công cụ hoặc khuôn khổ xử lý dữ liệu lớn khác.
  • Mức độ kiểm soát bạn cần về môi trường xử lý.
  • Các nguồn lực sẵn có (thời gian, ngân sách, chuyên môn) để cài đặt và bảo trì.

Kết luận: Xây dựng các hệ thống tìm kiếm vector hiệu quả

Như chúng tôi đã thảo luận, Vector Search & Management là lớp hoạt động quan trọng chuyển đổi các nhúng trừu tượng thành các ứng dụng có giá trị.Bằng cách giải quyết có hệ thống ba trụ cột của khuôn khổ của chúng tôi - mô hình truy cập, yêu cầu hiệu suất và đặc điểm dữ liệu - bạn có thể xây dựng các hệ thống mang lại cả sự xuất sắc về kỹ thuật và giá trị kinh doanh.

Đặt tất cả cùng nhau: Danh sách kiểm tra thực hiện chính

(1) Define clear requirements:

  • Document latency, throughput, and recall targets mục tiêu
  • Xác định nhu cầu cập nhật tần số
  • Xác định các mô hình lọc và truy vấn


(2) Choose appropriate architecture:

  • Chọn mô hình truy cập (tĩnh, động, lô)
  • Xác định vector database hoặc storage solution
  • Thiết kế cho quy mô và tăng trưởng thích hợp


(3) Optimize for your use case:

  • Chọn và điều chỉnh các thuật toán ANN
  • Thực hiện định lượng thích hợp
  • Thiết kế các chiến lược lọc hiệu quả


(4) Implement comprehensive evaluation:

  • Tạo Metrics Quality Baseline
  • Hệ thống giám sát hiệu suất
  • Track Business Impact Metrics (Metric Tác động Kinh doanh)


(5) Plan for operational excellence:

  • Thiết kế để quan sát
  • Thực hiện xử lý lỗi
  • Tạo ra một khuôn khổ kiểm tra và xác nhận


Trong phần tiếp theo của The AI Engineer's Playbook, chúng tôi sẽ khám phá cách tận dụng hiệu quả các khả năng vector này trong các ứng dụng AI thực tế.

Bạn muốn nghe từ tôi thường xuyên hơn?Connect with me on LinkedIn!

Liên hệ với tôi trên LinkedIn

Chia sẻhàng ngàynhững hiểu biết, lời khuyên và cập nhật có thể thực hiện để giúp bạn tránh những sai lầm tốn kém và đi trước trong cuộc đua AI.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks