Mô tả
Thực hiện tìm kiếm vectơ lân cận gần nhất trên trường embedding đã cho bằng cách sử dụng distance_measure được yêu cầu.
Ví dụ
Node.js
const results = await db.pipeline() .collection("cities") .findNearest({ field: "embedding", vectorValue: [1.5, 2.345], distanceMeasure: "euclidean" }) .execute();
Web
const results = await execute(db.pipeline() .collection("cities") .findNearest({ field: "embedding", vectorValue: [1.5, 2.345], distanceMeasure: "euclidean" }));
Swift
let results = try await db.pipeline() .collection("cities") .findNearest( field: Field("embedding"), vectorValue: VectorValue([1.5, 2.345]), distanceMeasure: .euclidean ) .execute()
Kotlin
val results = db.pipeline() .collection("cities") .findNearest( "embedding", doubleArrayOf(1.5, 2.345), FindNearestStage.DistanceMeasure.EUCLIDEAN ) .execute()
Java
Task<Pipeline.Snapshot> results = db.pipeline() .collection("cities") .findNearest( "embedding", new double[] {1.5, 2.345}, FindNearestStage.DistanceMeasure.EUCLIDEAN ) .execute();
Python
from google.cloud.firestore_v1.vector import Vector from google.cloud.firestore_v1.base_vector_query import DistanceMeasure results = ( client.pipeline() .collection("cities") .find_nearest( field="embedding", vector_value=Vector([1.5, 2.345]), distance_measure=DistanceMeasure.EUCLIDEAN, ) .execute() )
Java
Pipeline.Snapshot results = firestore .pipeline() .collection("cities") .findNearest( "embedding", new double[] {1.5, 2.345}, FindNearest.DistanceMeasure.EUCLIDEAN, new FindNearestOptions()) .execute() .get();
Hành vi
Đo khoảng cách
Giai đoạn find_nearest(...) hỗ trợ các lựa chọn sau cho khoảng cách vectơ:
euclidean: Đo khoảng cácheuclideangiữa các vectơ. Để tìm hiểu thêm, hãy xem phần Euclidean.cosine: So sánh các vectơ dựa trên góc giữa chúng, cho phép bạn đo lường độ tương đồng không dựa trên độ lớn của vectơ. Bạn nên sử dụngdot_productvới các vectơ được chuẩn hoá đơn vị thay vì khoảng cách COSINE. Khoảng cách này tương đương về mặt toán học với hiệu quả tốt hơn. Để tìm hiểu thêm, hãy xem bài viết Độ tương đồng cosine.dot_product: Tương tự nhưcosinenhưng chịu ảnh hưởng của độ lớn của các vectơ. Để tìm hiểu thêm, hãy xem bài viết Tích vô hướng.
Chọn đơn vị đo khoảng cách
Tuỳ thuộc vào việc tất cả các mục nhúng vectơ của bạn có được chuẩn hoá hay không, bạn có thể xác định biện pháp khoảng cách cần sử dụng để tìm biện pháp khoảng cách. Một vectơ nhúng được chuẩn hoá có độ lớn (chiều dài) chính xác là 1.0.
Ngoài ra, nếu bạn biết mô hình của mình được huấn luyện bằng phương pháp đo khoảng cách nào, hãy sử dụng phương pháp đo khoảng cách đó để tính khoảng cách giữa các vectơ nhúng.
Dữ liệu được chuẩn hoá
Nếu bạn có một tập dữ liệu mà tất cả các vectơ nhúng đều được chuẩn hoá, thì cả 3 phép đo khoảng cách đều cung cấp cùng một kết quả tìm kiếm ngữ nghĩa. Về cơ bản, mặc dù mỗi phép đo khoảng cách trả về một giá trị khác nhau, nhưng các giá trị đó sắp xếp theo cùng một cách. Khi các vectơ nhúng được chuẩn hoá, dot_product thường là hiệu quả tính toán nhất, nhưng sự khác biệt là không đáng kể trong hầu hết các trường hợp. Tuy nhiên, nếu ứng dụng của bạn có độ nhạy cao về hiệu suất, thì dot_product có thể giúp điều chỉnh hiệu suất.
Dữ liệu chưa được chuẩn hoá
Nếu bạn có một tập dữ liệu mà các vectơ nhúng không được chuẩn hoá, thì việc sử dụng dot_product làm thước đo khoảng cách là không chính xác về mặt toán học vì tích vô hướng không đo khoảng cách. Tuỳ thuộc vào cách tạo các vectơ nhúng và loại tìm kiếm được ưu tiên, thước đo khoảng cách cosine hoặc euclidean sẽ tạo ra kết quả tìm kiếm chủ quan tốt hơn so với các thước đo khoảng cách khác.
Bạn có thể cần thử nghiệm với cosine hoặc euclidean để xác định lựa chọn nào phù hợp nhất với trường hợp sử dụng của mình.
Không chắc chắn liệu dữ liệu có được chuẩn hoá hay không
Nếu không chắc chắn liệu dữ liệu của mình có được chuẩn hoá hay không và bạn muốn sử dụng dot_product, thì bạn nên sử dụng cosine.
cosine giống như dot_product nhưng có thêm tính năng chuẩn hoá.
Khoảng cách đo được bằng cosine dao động từ 0 đến 2. Kết quả gần với 0 cho biết các vectơ rất giống nhau.
Giới hạn kết quả
Bạn có thể giới hạn số lượng tài liệu mà truy vấn trả về bằng cách đặt trường limit.
Node.js
const results = await db.pipeline()
.collection("cities")
.findNearest({
field: "embedding",
vectorValue: vector([1.5, 2.345]),
distanceMeasure: "euclidean",
limit: 10,
})
.execute();
Truy xuất khoảng cách vectơ đã tính
Bạn có thể truy xuất khoảng cách vectơ đã tính bằng cách chỉ định tên thuộc tính đầu ra distance_field trên giai đoạn find_nearest(...), như trong ví dụ sau:
Ví dụ: đối với bộ sưu tập sau:
Node.js
await db.collection("cities").doc("SF").set({name: "San Francisco", embedding: vector([1.0, -1.0])});
await db.collection("cities").doc("TO").set({name: "Toronto", embedding: vector([5.0, -10.0])});
await db.collection("cities").doc("AT").set({name: "Atlantis", embedding: vector([2.0, -4.0])});
Thực hiện tìm kiếm vectơ bằng đầu ra được yêu cầu distance_field:
Node.js
const results = await db.pipeline()
.collection("cities")
.findNearest({
field: "embedding",
vectorValue: vector([1.3, 2.345]),
distanceMeasure: "euclidean",
distanceField: "computedDistance",
})
.execute();
Điều này tạo ra các tài liệu sau:
{name: "San Francisco", embedding: vector([1.0, -1.0]), computedDistance: 3.3584259705999178},
{name: "Atlantis", embedding: vector([2.0, -4.0]), computedDistance: 6.383496299051172},
{name: "Toronto", embedding: vector([5.0, -10.0]), computedDistance: 12.887553103673328}
Hạn chế
Khi làm việc với các vectơ nhúng, hãy lưu ý giới hạn sau:
- Kích thước nhúng tối đa được hỗ trợ là 2048. Để lưu trữ các chỉ mục lớn hơn, hãy sử dụng giảm chiều.