Выполните поиск сходства векторов с помощью Vertex AI

Добро пожаловать в векторный поиск по сходству Firebase Data Connect — реализацию семантического поиска Firebase, которая интегрируется с Google Vertex AI .

В основе этой функции лежат векторные внедрения, которые представляют собой массивы чисел с плавающей запятой, представляющие семантическое значение текста или мультимедиа. Запустив поиск ближайшего соседа с использованием внедрения входного вектора, вы можете найти весь семантически схожий контент. Для этой возможности Data Connect использует расширение PostgreSQL pgvector .

Этот мощный семантический поиск может использоваться в таких случаях, как системы рекомендаций и поисковые системы. Это также ключевой компонент генерации с расширенным поиском в генеративных потоках ИИ. Документация Vertex AI — отличное место для получения дополнительной информации .

Вы можете положиться на встроенную поддержку Data Connect для автоматического создания векторных векторных представлений с помощью API-интерфейса Vertex AI Embeddings или использовать этот API для их создания вручную.

Предварительные условия

  • Настройте Data Connect для своего проекта.

  • Включите API Vertex AI .

Настраивать

Вы можете выбрать между локальным потоком разработки (если вы веб-разработчик, Kotlin Android или iOS-разработчик) или потоком IDX (для веб-разработчиков). Для разработки вы можете использовать локальную базу данных или рабочий проект Data Connect и его экземпляр Cloud SQL для PostgreSQL.

В этих инструкциях предполагается, что вы создали проект Data Connect , следуя краткому руководству .

Интеграция с локальным PostgreSQL

  1. Настройте локальный экземпляр PostgreSQL.
  2. Предоставьте себе роль IAM пользователя Vertex AI .
  3. Настройте учетные данные приложения Google Cloud по умолчанию в своей среде.
  4. Установите расширение pgvector в свой локальный экземпляр PostgreSQL.
  5. Включите расширение, используя CREATE EXTENSION vector согласно инструкциям репозитория pgvector .

Интеграция с IDX

  1. Настройте свое рабочее пространство IDX с помощью шаблона Data Connect.
  2. Предоставьте себе роль IAM пользователя Vertex AI .
  3. Включите расширение, используя CREATE EXTENSION vector согласно инструкциям репозитория pgvector .

Создайте свою схему

Для выполнения векторного поиска добавьте в схему новое поле типа Vector . Например, если вы хотите выполнить семантический поиск с использованием описаний фильмов, добавьте поле для хранения векторных векторных представлений, связанных с описанием фильма. В эту схему добавлено descriptionEmbedding для хранения векторных внедрений для поля description .

type Movie @table {
 id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
 title: String!
 description: String
 descriptionEmbedding: Vector! @col(size:768)
 // ...
}

Генерация и извлечение вложений

Data Connect обеспечивает интегрированную поддержку векторных вложений с помощью значения сервера _embed . Это предписывает Data Connect генерировать векторные встраивания путем внутреннего вызова API-интерфейсов встраивания Vertex AI. Значение сервера _embed можно использовать как в мутациях, так и в запросах.

Мутации

Создайте и сохраните внедрение через Data Connect

В вашем приложении векторного поиска вы, вероятно, захотите запросить создание вложений сразу после добавления записей в базу данных. Здесь мутация createMovie добавляет запись фильма в таблицу Movie , а также передает описание фильма с указанной model внедрения.

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

В некоторых случаях вам может потребоваться обновить описание и встраивание фильма.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

Чтобы вызвать последнюю мутацию от клиента:

import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';

await updateMovieDescriptionWithEmbed({ id: movieId, description: description});

// Use the response

Запросы

Получите векторные представления, используя запрос, подобный следующему. Обратите внимание, что descriptionEmbedding , возвращаемое запросом, представляет собой массив чисел с плавающей запятой, который обычно не читается человеком. Таким образом, пакеты SDK, созданные Data Connect не поддерживают его прямой возврат.

Вы можете использовать возвращенные векторные представления для поиска по сходству, как описано в следующем разделе.

query getMovieDescription($id: String!) @auth(is: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

Выполнить поиск по сходству

Теперь мы можем выполнить поиск по сходству.

Для каждого поля Vector Data Connect генерирует функцию GraphQL, реализующую поиск по сходству. Имя этой сгенерированной функции — ${pluralType}_${vectorFieldName}_similarity . Он поддерживает несколько параметров, как показано в следующих примерах и в списке ссылок .

Вы можете определить функцию GraphQL, которая вызывает поиск по сходству. Как упоминалось выше, значение сервера _embed предписывает Data Connect генерировать векторные внедрения с использованием API-интерфейсов внедрения Vertex AI, в данном случае для создания внедрений для строки поиска, используемой для сравнения с внедрениями описания фильма.

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

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      method: L2,
      within: 2,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
      }
  }

Вызов запроса на сходство

Чтобы вызвать поиск по сходству из клиентского кода:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

Используйте пользовательские внедрения

Data Connect также позволяет работать с внедрениями непосредственно как с Vector , а не с использованием значения сервера _embed для их создания.

Сохранение пользовательского внедрения

Используя API Vertex Embeddings, укажите соответствующую модель и запросите результаты внедрения правильного измерения.

Затем приведите возвращенный массив чисел с плавающей запятой к Vector , чтобы передать его операции обновления для хранения.

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

Выполнение поиска по сходству с использованием пользовательских вложений

Выполните ту же операцию, чтобы получить вложения для поисковых запросов и преобразовать их в Vectors .

Затем вызовите запрос _similarity для выполнения каждого поиска.

query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare: $compare,
      method: L2,
      within: $within,
      where: {content: {ne: $excludesContent}}, limit: $limit)
      {
        id
        title
        description
      }
  }

Развертывание в производство

Разверните свою схему и соединитель

Последним шагом типичной итерации Data Connect является развертывание ресурсов в рабочей среде.

При развертывании схемы, содержащей типы Vector , в CloudSQL с помощью команды firebase deploy интерфейс командной строки Firebase предпринимает необходимые шаги, чтобы включить генерацию встраивания на основе Vertex AI в вашем экземпляре CloudSQL.

firebase deploy --only dataconnect

Если вы хотите вручную включить поддержку внедрения в свой экземпляр CloudSQL или столкнулись с ошибкой CLI, следуйте этим инструкциям .

Синтаксис векторного поиска

Расширения схемы

Тип данных Data Connect Vector сопоставляется с vector типом PostgreSQL, как определено расширением pgvector . Тип vector pgvector хранится в PostgreSQL как массив чисел одинарной точности с плавающей запятой.

В Data Connect тип Vector представлен как массив чисел JSON. Входные данные преобразуются в массив значений float32 . Если приведение не удается, возникает ошибка.

Используйте параметр size директивы @col , чтобы установить размеры вектора.

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

size поддерживается только для Vector типов. Vector операции, такие как поиск по сходству, требуют, чтобы все Vector имели одинаковое количество измерений.

directive @col(
  # … existing args
  """
  Defines a fixed column size for certain scalar types.

  - For Vector, size is required.
  - For all other types, size is currently unsupported and hence supplying it will result in a schema error.
  """
  size: Int
) on FIELD_DEFINITION

Значение сервера _embed для запросов и мутаций

_embed

Это значение сервера указывает службе Data Connect генерировать и сохранять внедрения с помощью API-интерфейсов внедрения Vertex AI . Это значение сервера можно использовать как для запросов, так и для мутаций.

Параметры Для поиска по сходству

method: COSINE|INNER_PRODUCT|L2

Функция расстояния, используемая для поиска ближайших соседей. Поддерживаемые в настоящее время алгоритмы являются подмножеством алгоритмов поиска pgvector .

within: float

Ограничение на расстояние, в пределах которого выполняется поиск ближайшего соседа.

where: FDC filter condition

См . руководство по схемам, запросам и мутациям .

limit: int

Количество возвращаемых результатов.