ค้นหาที่ใกล้ที่สุด

คำอธิบาย

ทำการค้นหาเวกเตอร์เพื่อนบ้านที่ใกล้ที่สุดในembeddingฟิลด์distance_measureที่ระบุโดยใช้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();
Go
snapshot := client.Pipeline().Collection("cities").
	FindNearest("embedding", []float64{1.5, 2.345}, firestore.PipelineDistanceMeasureEuclidean).
	Execute(ctx)

พฤติกรรม

การวัดระยะทาง

find_nearest(...) สเตจรองรับตัวเลือกต่อไปนี้สำหรับเวกเตอร์ ระยะทาง

  • euclidean: วัดeuclideanระยะทางระหว่างเวกเตอร์ ดูข้อมูลเพิ่มเติมได้ที่ Euclidean
  • cosine: เปรียบเทียบเวกเตอร์ตามมุมระหว่างเวกเตอร์ ซึ่งช่วยให้คุณวัดความคล้ายคลึงที่ไม่ขึ้นอยู่กับขนาดของเวกเตอร์ได้ เราขอแนะนำให้ใช้ dot_product กับเวกเตอร์ที่ทำให้เป็นหน่วยแทนระยะทางโคไซน์ ซึ่งเทียบเท่ากันในทางคณิตศาสตร์และมีประสิทธิภาพดีกว่า ดูข้อมูลเพิ่มเติมได้ที่ ความคล้ายกันของโคไซน์
  • dot_product: คล้ายกับ cosine แต่ได้รับผลกระทบจากขนาดของเวกเตอร์ ดูข้อมูลเพิ่มเติมได้ที่ ดอทโปรดักต์

เลือกการวัดระยะทาง

คุณสามารถ ระบุการวัดระยะทางที่จะใช้เพื่อค้นหาการวัดระยะทางได้ โดยขึ้นอยู่กับว่ามีการทําให้การฝังเวกเตอร์ทั้งหมดเป็นปกติหรือไม่ การฝังเวกเตอร์ที่ทำให้เป็นมาตรฐาน มีขนาด (ความยาว) เท่ากับ 1.0

นอกจากนี้ หากคุณทราบว่าโมเดลได้รับการฝึกด้วยการวัดระยะทางใด ให้ใช้การวัดระยะทางนั้นเพื่อคำนวณระยะห่างระหว่างการฝังเวกเตอร์

ข้อมูลที่ปรับให้เป็นมาตรฐาน

หากคุณมีชุดข้อมูลที่การฝังเวกเตอร์ทั้งหมดได้รับการทำให้เป็นมาตรฐานแล้ว การวัดระยะทางทั้ง 3 แบบจะให้ผลการค้นหาเชิงความหมายเดียวกัน กล่าวโดยสรุปคือ แม้ว่าการวัดระยะทางแต่ละครั้งจะแสดงค่าที่แตกต่างกัน แต่ค่าเหล่านั้นจะเรียงลำดับในลักษณะเดียวกัน เมื่อมีการทําให้การฝังเป็นมาตรฐาน 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();

การดึงข้อมูลระยะทางเวกเตอร์ที่คำนวณแล้ว

คุณเรียกข้อมูลระยะทางเวกเตอร์ที่คำนวณแล้วได้โดยกำหนด 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 หากต้องการจัดเก็บดัชนีขนาดใหญ่ ให้ใช้การลดมิติ