Найти ближайший

Описание

Выполняет поиск ближайшего соседа по вектору в заданном поле 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"
  }));
Быстрый
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 расстояние между векторами. Подробнее см. раздел «Евклидово расстояние» .
  • cosine : сравнивает векторы на основе угла между ними, что позволяет измерять сходство, не основанное на величине векторов. Мы рекомендуем использовать dot_product с нормализованными векторами вместо расстояния косинусного сходства, которое математически эквивалентно и обеспечивает лучшую производительность. Подробнее см. раздел «Косинусное сходство» .
  • dot_product : Аналогично cosine , но зависит от величины векторов. Подробнее см. Скалярное произведение .

Выберите меру расстояния

В зависимости от того, нормализованы ли все ваши векторные представления, вы можете определить, какую меру расстояния использовать для вычисления меры расстояния. Нормализованное векторное представление имеет величину (длину) ровно 1,0.

Кроме того, если вам известно, с какой мерой расстояния была обучена ваша модель, используйте эту меру расстояния для вычисления расстояния между вашими векторными представлениями.

Нормализованные данные

Если у вас есть набор данных, в котором все векторные представления нормализованы, то все три меры расстояния дают одинаковые результаты семантического поиска. По сути, хотя каждая мера расстояния возвращает разное значение, эти значения сортируются одинаково. Когда векторные представления нормализованы, 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. Для хранения индексов большего размера используйте уменьшение размерности .