Điểm
Điểm là các thực thể cốt lõi được điều khiển bởi Qdrant. Một điểm là một bản ghi bao gồm một vector và một tải trọng tùy chọn.
Bạn có thể tìm kiếm các điểm được nhóm trong một bộ sưu tập dựa trên độ tương đồng vector. Một mô tả chi tiết hơn về quá trình này được cung cấp trong phần Tìm kiếm và Lọc.
Phần này giới thiệu cách tạo và quản lý các vector.
Bất kỳ hoạt động sửa đổi nào trên một điểm đều là không đồng bộ và chia thành hai bước. Ở giai đoạn đầu tiên, hoạt động sẽ được ghi vào một nhật ký trước khi ghi.
Lúc này, ngay cả khi máy mất điện, dịch vụ cũng sẽ không mất dữ liệu.
Mẹo: Điểm là một khái niệm trừu tượng trong Qdrant, bạn có thể tưởng tượng chúng như một hàng dữ liệu trong bảng MySQL.
Chờ Kết Quả
Nếu API được gọi với tham số &wait=false
, hoặc không được chỉ định một cách rõ ràng, khách hàng sẽ nhận một thông báo xác nhận về việc nhận dữ liệu:
{
"result": {
"operation_id": 123,
"status": "acknowledged"
},
"status": "ok",
"time": 0.000206061
}
Phản hồi này không đảm bảo việc truy xuất dữ liệu ngay lập tức. Nó sử dụng một dạng của tính nhất quán cuối cùng. Việc cập nhật bộ sưu tập có thể mất một thời gian trong quá trình thực tế. Trong thực tế, yêu cầu này có thể cuối cùng thất bại. Nếu việc chèn một số lượng lớn vector, chúng tôi cũng khuyên bạn nên sử dụng các yêu cầu không đồng bộ để tận dụng đầy đủ các hoạt động liên-pipeline.
Nếu logic ứng dụng của bạn yêu cầu sẵn sàng ngay lập tức cho việc tìm kiếm sau khi phản hồi của API, hãy sử dụng cờ ?wait=true
. Trong trường hợp này, API sẽ chỉ trả về kết quả sau khi hoạt động hoàn tất:
{
"result": {
"operation_id": 0,
"status": "completed"
},
"status": "ok",
"time": 0.000206061
}
ID của Điểm
Qdrant hỗ trợ việc sử dụng số nguyên 64-bit không dấu
và UUID
làm định danh cho các điểm.
Các ví dụ về biểu diễn chuỗi UUID như sau:
- Biểu diễn đơn giản:
936DA01F9ABD4d9d80C702AF85C822A8
- Biểu diễn có dấu gạch ngang:
550e8400-e29b-41d4-a716-446655440000
- URN:
urn:uuid:F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4
Điều này có nghĩa rằng trong mỗi yêu cầu, chuỗi UUID có thể được sử dụng thay vì các ID số. Ví dụ:
PUT /collections/{tên_bộ_sưu_tập}/points
{
"points": [
{
"id": "5c56c793-69f3-4fbf-87e6-c4bf54c28c26",
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
và
PUT /collections/{tên_bộ_sưu_tập}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
}
]
}
đều là hợp lệ.
Tải lên các Điểm Dữ liệu
Để tối ưu hóa hiệu suất, Qdrant hỗ trợ tải lên hàng loạt điểm dữ liệu. Điều này có nghĩa là bạn có thể tải lên nhiều điểm dữ liệu vào dịch vụ trong một lệnh API duy nhất. Tải lên hàng loạt có thể giảm đáng kể chi phí kết nối mạng.
API của Qdrant hỗ trợ hai phương pháp tạo hàng loạt - hướng ghi nhận và hướng cột. Bên trong, những tùy chọn này không thể phân biệt và chỉ là để thuận tiện trong tương tác.
Tạo điểm dữ liệu bằng cách sử dụng API REST:
PUT /collections/{collection_name}/points
{
"batch": {
"ids": [1, 2, 3],
"payloads": [
{"color": "red"},
{"color": "green"},
{"color": "blue"}
],
"vectors": [
[0.9, 0.1, 0.1],
[0.1, 0.9, 0.1],
[0.1, 0.1, 0.9]
]
}
}
Hoặc sử dụng phương pháp tương đương sử dụng hướng ghi nhận:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"payload": {"color": "red"},
"vector": [0.9, 0.1, 0.1]
},
{
"id": 2,
"payload": {"color": "green"},
"vector": [0.1, 0.9, 0.1]
},
{
"id": 3,
"payload": {"color": "blue"},
"vector": [0.1, 0.1, 0.9]
}
]
}
Tất cả các API trong Qdrant, bao gồm tải lên điểm dữ liệu, đều là idempotent. Điều này có nghĩa là thực hiện cùng phương pháp liên tục tương đương với một lần thực thi duy nhất.
Trong trường hợp này, điều này có nghĩa là khi tải lên lại các điểm dữ liệu có cùng id, các điểm dữ liệu hiện có sẽ bị ghi đè.
Tính chất idempotent hữu ích khi sử dụng hàng đợi tin nhắn không cung cấp đảm bảo chính xác một lần duy nhất. Ngay cả trong trường hợp này, Qdrant đảm bảo tính nhất quán dữ liệu.
Có sẵn từ phiên bản v0.10.0
Nếu một bộ sưu tập đang được tạo có nhiều vector, bạn có thể cung cấp dữ liệu cho mỗi vector bằng cách đặt tên cho các vector:
PUT /collections/{collection_name}/points
{
"points": [
{
"id": 1,
"vector": {
"image": [0.9, 0.1, 0.1, 0.2],
"text": [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2]
}
},
{
"id": 2,
"vector": {
"image": [0.2, 0.1, 0.3, 0.9],
"text": [0.5, 0.2, 0.7, 0.4, 0.7, 0.2, 0.3, 0.9]
}
}
]
}
Có sẵn từ phiên bản v1.2.0
Các vector có tên là tùy chọn. Khi tải lên điểm dữ liệu, một số vector có thể bị bỏ qua. Ví dụ, bạn có thể tải lên một điểm dữ liệu chỉ với vector image
và một điểm dữ liệu khác chỉ với vector text
.
Khi sửa đổi một điểm dữ liệu có ID hiện có, điểm dữ liệu hiện có sẽ trước tiên bị xóa và sau đó sẽ được chèn lại với vector được chỉ định. Nói cách khác, toàn bộ điểm dữ liệu sẽ được thay thế, và bất kỳ vector không được chỉ định nào sẽ được đặt thành null. Nếu bạn muốn giữ nguyên các vector hiện có và chỉ cập nhật các vector được chỉ định, vui lòng tham khảo cập nhật vector.
Sửa đổi các Điểm Dữ liệu
Để sửa đổi một điểm dữ liệu, bạn có thể sửa đổi vector hoặc payload của nó. Có một số phương pháp để đạt được điều này.
Cập nhật Vectors
Có sẵn từ phiên bản v1.2.0
Phương thức này cập nhật các vectors được chỉ định tại các điểm được cho. Các vectors không được chỉ định sẽ không thay đổi. Tất cả các điểm được chỉ định phải tồn tại.
REST API (Schema):
PUT /collections/{collection_name}/points/vectors
{
"points": [
{
"id": 1,
"vector": {
"image": [0.1, 0.2, 0.3, 0.4]
}
},
{
"id": 2,
"vector": {
"text": [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2]
}
}
]
}
Để cập nhật điểm và thay thế tất cả các vectors, vui lòng xem phương thức tải lên điểm.
Xóa Vectors
Có sẵn từ phiên bản v1.2.0
Phương thức này chỉ xóa các vectors được chỉ định từ các điểm được cho. Các vectors khác sẽ không thay đổi. Các điểm sẽ không bị xóa.
REST API (Schema):
POST /collections/{collection_name}/points/vectors/delete
{
"points": [0, 3, 100],
"vectors": ["text", "image"]
}
Đặt Payload
Đặt các giá trị payload được chỉ định trên các điểm.
REST API (Schema):
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
Bạn không cần phải biết id của điểm cần được sửa đổi. Một cách khác là sử dụng bộ lọc.
POST /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Ghi Đè Payload
Hoàn toàn thay thế payload hiện tại bằng payload được cung cấp.
REST API (Schema):
PUT /collections/{collection_name}/points/payload
{
"payload": {
"property1": "string",
"property2": "string"
},
"points": [
0, 3, 100
]
}
Tương tự Đặt Payload, bạn không cần phải biết id của điểm cần được sửa đổi. Một cách khác là sử dụng bộ lọc.
Xóa Khóa Payload
REST API (Schema):
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"points": [0, 3, 100]
}
Hoặc bạn có thể sử dụng bộ lọc để xóa các khóa payload từ các điểm.
POST /collections/{collection_name}/points/payload/delete
{
"keys": ["color", "price"],
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Xóa Payload
Phương thức này loại bỏ tất cả các khóa payload từ các điểm được chỉ định.
REST API (Schema):
POST /collections/{collection_name}/points/payload/clear
{
"points": [0, 3, 100]
}
Xóa Điểm
REST API (Schema):
POST /collections/{collection_name}/points/delete
{
"points": [0, 3, 100]
}
Một cách khác để chỉ định các điểm cần xóa là bằng cách sử dụng bộ lọc:
POST /collections/{collection_name}/points/delete
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
}
}
Ví dụ này xóa tất cả các điểm có { "màu_sắc": "đỏ" }
từ bộ sưu tập.
Lấy Điểm
Phương thức để lấy điểm dựa trên các ID của chúng:
REST API (Schema):
POST /collections/{collection_name}/points
{
"ids": [0, 3, 100]
}
Phương thức này có các thông số bổ sung with_vectors
và with_payload
. Sử dụng các thông số này, bạn có thể lựa chọn các phần của kết quả điểm mà bạn cần. Việc loại bỏ giúp tránh lãng phí dữ liệu không cần thiết trong quá trình truyền tải dữ liệu.
Cũng có thể lấy một điểm duy nhất thông qua API:
REST API (Schema):
GET /collections/{collection_name}/points/{point_id}
Cuộn
Đôi khi cần lấy tất cả các điểm đã lưu mà không biết ID của chúng, hoặc lặp qua các điểm thỏa mãn các điệu kiện lọc.
REST API (Schema):
POST /collections/{collection_name}/points/scroll
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"limit": 1,
"with_payload": true,
"with_vector": false
}
Trả về tất cả các điểm thỏa mãn color
=red
:
{
"result": {
"next_page_offset": 1,
"points": [
{
"id": 0,
"payload": {
"color": "red"
}
}
]
},
"status": "ok",
"time": 0.0001
}
API Cuộn sẽ trả về tất cả các điểm thỏa mãn bộ lọc theo cách phân trang.
Tất cả các điểm kết quả được sắp xếp theo ID. Để truy vấn trang tiếp theo, bạn cần chỉ định ID tối đa được phát hiện trong trường offset
. Để thuận tiện, ID này cũng được trả về trong trường next_page_offset
. Nếu giá trị của trường next_page_offset
là null
, nghĩa là đã truy cập trang cuối cùng.
Đếm Điểm
Có sẵn từ phiên bản v0.8.4
Đôi khi, việc chỉ biết có bao nhiêu điểm thỏa mãn các điệu kiện lọc mà không cần thực sự thực hiện một tìm kiếm có thể hữu ích.
Ví dụ, điều này có thể hữu ích trong các tình huống sau:
- Ước lượng kích thước kết quả cho tìm kiếm đa dạng
- Xác định số trang cho phân trang
- Gỡ lỗi tốc độ thực hiện truy vấn
REST API (Schema):
POST /collections/{collection_name}/points/count
{
"filter": {
"must": [
{
"key": "color",
"match": {
"value": "red"
}
}
]
},
"exact": true
}
Trả về số lượng điểm thỏa mãn các điều kiện lọc đã cho:
{
"count": 3811
}
Cập nhật Hàng loạt
Có sẵn từ phiên bản v1.5.0
Bạn có thể thực hiện các hoạt động hàng loạt trên nhiều điểm. Điều này bao gồm việc chèn, cập nhật và xóa điểm, vector và dữ liệu payloads.
Yêu cầu cập nhật hàng loạt bao gồm một loạt các hoạt động được thực hiện theo thứ tự. Các hoạt động có thể được thực hiện hàng loạt bao gồm:
- Chèn hoặc cập nhật điểm:
upsert
hoặcUpsertOperation
- Xóa điểm:
delete_points
hoặcDeleteOperation
- Cập nhật vector:
update_vectors
hoặcUpdateVectorsOperation
- Xóa vector:
delete_vectors
hoặcDeleteVectorsOperation
- Đặt payloads:
set_payload
hoặcSetPayloadOperation
- Ghi đè payloads:
overwrite_payload
hoặcOverwritePayload
- Xóa payloads:
delete_payload
hoặcDeletePayloadOperation
- Xóa payloads:
clear_payload
hoặcClearPayloadOperation
Đoạn mã ví dụ sau sử dụng tất cả các hoạt động.
REST API (Schema):
POST /collections/{collection_name}/points/batch
{
"operations": [
{
"upsert": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0],
"payload": {}
}
]
}
},
{
"update_vectors": {
"points": [
{
"id": 1,
"vector": [1.0, 2.0, 3.0, 4.0]
}
]
}
},
{
"delete_vectors": {
"points": [1],
"vector": [""]
}
},
{
"overwrite_payload": {
"payload": {
"test_payload": "1"
},
"points": [1]
}
},
{
"set_payload": {
"payload": {
"test_payload_2": "2",
"test_payload_3": "3"
},
"points": [1]
}
},
{
"delete_payload": {
"keys": ["test_payload_2"],
"points": [1]
}
},
{
"clear_payload": {
"points": [1]
}
},
{"delete": {"points": [1]}}
]
}
Để sử dụng hàng loạt điểm với một loại hoạt động duy nhất, hãy sử dụng tính năng hàng loạt trực tiếp trong hoạt động đó.