Chỉ mục
Một đặc điểm quan trọng của Qdrant là sự kết hợp hiệu quả giữa chỉ mục vector và chỉ mục truyền thống. Điều này quan trọng vì chỉ có một chỉ mục vector không đủ để cho phép tìm kiếm vector hiệu quả dưới điều kiện lọc. Đơn giản, chỉ mục vector tăng tốc tìm kiếm vector, trong khi chỉ mục payload tăng tốc lọc.
Chỉ mục trong một đoạn văn tồn tại độc lập, nhưng các tham số của chỉ mục được cấu hình cho toàn bộ tập hợp.
Không phải tất cả các đoạn văn tự động có chỉ mục. Điều này phụ thuộc vào yêu cầu của các thiết lập tối ưu và thường phụ thuộc vào số lượng điểm đã lưu.
Chỉ mục Payload
Chỉ mục payload trong Qdrant tương tự như chỉ mục trong cơ sở dữ liệu hướng tài liệu truyền thống. Chỉ mục này được xây dựng cho các trường và loại cụ thể, được sử dụng để nhanh chóng truy xuất các điểm dựa trên các điều kiện lọc tương ứng.
Nó cũng được sử dụng để ước tính chính xác sự duy nhất của các điều kiện lọc, giúp trình lập trình truy vấn lựa chọn chiến lược tìm kiếm.
Tạo một chỉ mục đòi hỏi tài nguyên tính toán và bộ nhớ bổ sung, nên quan trọng để lựa chọn cẩn thận các trường cần được chỉ mục. Qdrant không thực hiện lựa chọn này cho bạn, mà ủy quyền cho người dùng.
Để đánh dấu một trường là có thể chỉ mục, có thể sử dụng phương thức sau:
PUT /collections/{collection_name}/index
{
"field_name": "tên trường cần chỉ mục",
"field_schema": "keyword"
}
Các loại trường có sẵn là:
-
keyword
- cho payload từ khóa, ảnh hưởng đến các điều kiện lọc khớp. -
integer
- cho payload số nguyên, ảnh hưởng đến các điều kiện lọc khớp và dải giá trị. -
float
- cho payload số thực, ảnh hưởng đến các điều kiện lọc dải giá trị. -
bool
- cho payload boolean, ảnh hưởng đến điều kiện lọc khớp (có sẵn từ phiên bản 1.4.0 trở lên). -
geo
- cho payload địa lý, ảnh hưởng đến hộp giới hạn địa lý và điều kiện lọc bán kính địa lý. -
text
- một loại chỉ mục đặc biệt phù hợp với payload từ khóa/chuỗi, ảnh hưởng đến điều kiện lọc tìm kiếm toàn văn.
Chỉ mục payload có thể tiêu tốn bộ nhớ bổ sung, vì vậy khuyến nghị chỉ mục các trường được sử dụng trong điều kiện lọc. Nếu cần lọc dựa trên nhiều trường, và ràng buộc bộ nhớ không cho phép chỉ mục tất cả chúng, thì nên lựa chọn các trường hạn chế kết quả tìm kiếm nhất. Nói chung, giá trị payload càng duy nhất, thì việc sử dụng chỉ mục sẽ hiệu quả hơn.
Chỉ mục toàn văn văn bản
Có sẵn từ phiên bản 0.10.0
Qdrant hỗ trợ tìm kiếm toàn văn văn bản cho payload chuỗi. Chỉ mục toàn văn văn bản cho phép bạn lọc các điểm dựa trên sự hiện diện của từ hoặc cụm từ trong trường payload.
Cấu hình chỉ mục toàn văn văn bản hơi phức tạp bởi vì bạn có thể chỉ định các tham số phân mảnh từ. Phân mảnh từ là quá trình phân mảnh một chuỗi thành các từ ngữ và sau đó chỉ mục các từ ngữ này thành một chỉ mục nghịch đảo.
Để tạo một chỉ mục toàn văn văn bản, bạn có thể sử dụng phương thức sau:
PUT /collections/{collection_name}/index
{
"field_name": "tên trường để chỉ mục",
"field_schema": {
"type": "text",
"tokenizer": "word",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
Các phương thức phân mảnh từ có sẵn là:
-
word
- Tách chuỗi dựa trên khoảng trắng, dấu câu và ký tự đặc biệt. -
whitespace
- Tách chuỗi dựa trên khoảng trắng. -
prefix
- Tách chuỗi dựa trên khoảng trắng, dấu câu và ký tự đặc biệt, sau đó tạo chỉ mục tiền tố cho mỗi từ ngữ. Ví dụ,hello
sẽ được chỉ mục làh
,he
,hel
,hell
,hello
. -
multilingual
- Một loại phương thức phân mảnh đặc biệt dựa trên gói charabia. Nó cho phép phân mảnh và chuyển ngữ đúng của nhiều ngôn ngữ, bao gồm cả những ngôn ngữ có chữ cái không phải Latin và ngữ cảnh không phải dấu cách. Tham khảo tài liệu charabia để biết danh sách đầy đủ các ngôn ngữ được hỗ trợ và các tùy chọn chuẩn hóa. Trong cấu hình xây dựng mặc định, qdrant không bao gồm hỗ trợ cho tất cả các ngôn ngữ vì điều này sẽ làm tăng kích thước của các tệp nhị phân. Tiếng Trung, tiếng Nhật và tiếng Hàn không được kích hoạt mặc định, nhưng có thể được kích hoạt bằng cách xây dựng qdrant từ mã nguồn bằng cờ--features multiling-chinese, multiling-japanese, multiling-korean
.
Vui lòng tham khảo các ví dụ khớp toàn văn văn bản để biết ví dụ về việc sử dụng chỉ mục toàn văn văn bản cho các truy vấn.
Chỉ mục Vector
Chỉ mục vector là một cấu trúc dữ liệu dựa trên các vector, được xây dựng thông qua các mô hình toán học cụ thể. Với chỉ mục vector, chúng ta có thể truy vấn một cách hiệu quả nhiều vector tương tự với vector mục tiêu.
Hiện tại, Qdrant chỉ sử dụng HNSW làm chỉ mục vector.
HNSW (Hierarchical Navigable Small World Graph) là một thuật toán sắp xếp dữ liệu dựa trên đồ thị. Theo một số quy tắc nhất định, nó xây dựng một cấu trúc điều hướng đa tầng cho đồ thị. Trong cấu trúc này, các tầng phía trên xâu rộng hơn, có khoảng cách lớn giữa các nút. Các tầng phía dưới có mật độ dày hơn, với khoảng cách nhỏ hơn giữa các nút. Tìm kiếm bắt đầu từ tầng trên cùng, tìm nút gần nhất với mục tiêu trong tầng đó, sau đó đi vào tầng tiếp theo để tìm kiếm tiếp. Sau nhiều lần lặp, nó có thể nhanh chóng tiến đến vị trí mục tiêu.
Để cải thiện hiệu suất, HNSW giới hạn số bậc tối đa của các nút trên mỗi tầng của đồ thị bằng m
. Ngoài ra, bạn có thể chỉ định phạm vi tìm kiếm bằng cách sử dụng ef_construct
(trong quá trình xây dựng chỉ mục) hoặc ef
(trong khi tìm kiếm mục tiêu).
Các thông số này có thể được cấu hình trong tệp cấu hình:
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
Trong quá trình tạo bộ sưu tập, thông số ef
có thể được cấu hình và mặc định bằng ef_construct
.
HNSW được chọn với một số lý do. Đầu tiên, HNSW tương thích cao với việc cho phép Qdrant sửa đổi bộ lọc trong quá trình tìm kiếm. Thứ hai, theo các kiểm thử benchmark công cộng, đó là một trong những thuật toán chính xác và nhanh nhất.
Có sẵn từ phiên bản v1.1.1
Các thông số HNSW cũng có thể được điều chỉnh tinh tế cho các bộ sưu tập và các vector có tên để tối ưu hóa hiệu suất tìm kiếm bằng cách cài đặt hnsw_config
.
Chỉ mục có thể lọc
Chỉ mục vector đơn riêng và chỉ mục tải trọng một mình không thể hoàn toàn đáp ứng việc sử dụng bộ lọc cho tìm kiếm.
Trong những trường hợp bộ lọc yếu, chỉ mục HNSW có thể được sử dụng trực tiếp. Trong những trường hợp bộ lọc chặt chẽ, chỉ mục tải trọng có thể được sử dụng và đánh giá lại hoàn toàn. Tuy nhiên, trong những trường hợp vừa phải, phương pháp này là không hiệu quả.
Một mặt, chúng ta không thể chi trả để thực hiện quét toàn bộ trên quá nhiều vector. Mặt khác, khi sử dụng bộ lọc quá chặt chẽ, đồ thị HNSW bắt đầu phân rã.
Các cạnh bổ sung cho phép bạn sử dụng chỉ mục HNSW một cách hiệu quả để tìm kiếm các vector láng giềng và áp dụng bộ lọc trong quá trình tìm kiếm trên đồ thị.
Phương pháp này giảm thiểu chi phí kiểm tra điều kiện, vì bạn chỉ cần tính toán điều kiện cho một phần nhỏ các điểm tham gia vào tìm kiếm.