คำอธิบาย
ทำการค้นหาเวกเตอร์เพื่อนบ้านที่ใกล้ที่สุดในช่อง embedding ที่ระบุโดยใช้
distance_measure ที่ขอ
ตัวอย่าง
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();
พฤติกรรม
การวัดระยะทาง
ระยะ find_nearest(...) รองรับตัวเลือกต่อไปนี้สำหรับการวัดระยะทางเวกเตอร์
euclidean: วัดระยะทางeuclideanระหว่างเวกเตอร์ ดูข้อมูลเพิ่มเติมได้ที่ Euclideancosine: เปรียบเทียบเวกเตอร์ตามมุมระหว่างเวกเตอร์ ซึ่งช่วยให้คุณวัดความคล้ายคลึงที่ไม่ขึ้นอยู่กับขนาดของเวกเตอร์ได้ เราขอแนะนำให้ใช้dot_productกับเวกเตอร์ที่ทำให้เป็นหน่วยแทนระยะทาง COSINE ซึ่งเทียบเท่ากันทางคณิตศาสตร์และมีประสิทธิภาพดีกว่า ดูข้อมูลเพิ่มเติมได้ที่ ความคล้ายคลึงแบบโคไซน์dot_product: คล้ายกับcosineแต่ได้รับผลกระทบจากขนาดของเวกเตอร์ ดูข้อมูลเพิ่มเติมได้ที่ Dot product
เลือกการวัดระยะทาง
คุณสามารถกำหนดการวัดระยะทางที่จะใช้ในการวัดระยะทางได้โดยพิจารณาว่าเวกเตอร์การฝังทั้งหมดได้รับการทำให้เป็นมาตรฐานหรือไม่ เวกเตอร์การฝังที่ทำให้เป็นมาตรฐานแล้วจะมีขนาด (ความยาว) เป็น 1.0 พอดี
นอกจากนี้ หากทราบว่าโมเดลได้รับการฝึกด้วยการวัดระยะทางใด ให้ใช้การวัดระยะทางนั้นเพื่อคำนวณระยะทางระหว่างเวกเตอร์การฝัง
ข้อมูลที่ทำให้เป็นมาตรฐานแล้ว
หากคุณมีชุดข้อมูลที่เวกเตอร์การฝังทั้งหมดได้รับการทำให้เป็นมาตรฐานแล้ว การวัดระยะทางทั้ง 3 แบบจะให้ผลการค้นหาเชิงความหมายเหมือนกัน กล่าวคือ แม้ว่าการวัดระยะทางแต่ละแบบจะแสดงค่าที่แตกต่างกัน แต่ค่าเหล่านั้นจะเรียงลำดับในลักษณะเดียวกัน เมื่อมีการทำให้เวกเตอร์การฝังเป็นมาตรฐานแล้ว dot_product มักจะมีประสิทธิภาพในการคำนวณมากที่สุด แต่ความแตกต่างนั้นเล็กน้อยในกรณีส่วนใหญ่ อย่างไรก็ตาม หากแอปพลิเคชันของคุณมีความละเอียดอ่อนต่อประสิทธิภาพอย่างมาก dot_product อาจช่วยในการปรับประสิทธิภาพได้
ข้อมูลที่ยังไม่ได้ทำให้เป็นมาตรฐาน
หากคุณมีชุดข้อมูลที่เวกเตอร์การฝังยังไม่ได้ทำให้เป็นมาตรฐาน การใช้ dot_product เป็นการวัดระยะทางจะไม่ถูกต้องทางคณิตศาสตร์เนื่องจาก dot product ไม่ได้วัดระยะทาง การวัดระยะทาง cosine หรือ euclidean จะให้ผลการค้นหาที่อาจดีกว่าการวัดระยะทางอื่นๆ ขึ้นอยู่กับวิธีสร้างเวกเตอร์การฝังและประเภทการค้นหาที่ต้องการ
คุณอาจต้องทดลองใช้ cosine หรือ euclidean เพื่อพิจารณาว่าวิธีใดดีที่สุดสำหรับกรณีการใช้งานของคุณ
ไม่แน่ใจว่าข้อมูลเป็นข้อมูลที่ทำให้เป็นมาตรฐานแล้วหรือยังไม่ได้ทำให้เป็นมาตรฐาน
หากไม่แน่ใจว่าข้อมูลของคุณเป็นข้อมูลที่ทำให้เป็นมาตรฐานแล้วหรือไม่ และต้องการใช้ dot_product เราขอแนะนำให้ใช้ cosine แทน
cosine คล้ายกับ dot_product แต่มีการทำให้เป็นมาตรฐานในตัว
ระยะทางที่วัดโดยใช้ cosine จะมีค่าตั้งแต่ 0 ถึง 2 ผลลัพธ์ที่ใกล้เคียงกับ 0 แสดงว่าเวกเตอร์มีความคล้ายคลึงกันมาก
จำกัดผลลัพธ์
คุณสามารถจำกัดจำนวนเอกสารที่ส่งคืนโดยการค้นหาได้โดยการตั้งค่าช่อง limit
Node.js
const results = await db.pipeline()
.collection("cities")
.findNearest({
field: "embedding",
vectorValue: vector([1.5, 2.345]),
distanceMeasure: "euclidean",
limit: 10,
})
.execute();
การดึงระยะทางเวกเตอร์ที่คำนวณได้
คุณสามารถดึงระยะทางเวกเตอร์ที่คำนวณได้โดยกำหนดชื่อพร็อพเพอร์ตี้เอาต์พุต a
distance_field ในระยะ find_nearest(...) ดังที่แสดงในตัวอย่างต่อไปนี้
ตัวอย่างเช่น สำหรับคอลเล็กชันต่อไปนี้
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])});
ทำการค้นหาเวกเตอร์ด้วยเอาต์พุตที่ขอ 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();
ซึ่งจะสร้างเอกสารต่อไปนี้
{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}
ข้อจำกัด
โปรดทราบข้อจำกัดต่อไปนี้เมื่อใช้เวกเตอร์การฝัง
- มิติข้อมูลการฝังที่รองรับสูงสุดคือ 2048 หากต้องการจัดเก็บดัชนีขนาดใหญ่ ให้ใช้ การลดมิติข้อมูล