Добро пожаловать в функцию векторного поиска сходства Firebase Data Connect — реализацию семантического поиска от Firebase, интегрированную с Google Vertex AI .
В основе этой функции лежат векторные представления, представляющие собой массивы чисел с плавающей запятой, отражающие семантическое значение текста или медиафайлов. Выполнив поиск ближайших соседей с использованием входного векторного представления, вы можете найти весь семантически похожий контент. Для этой возможности Data Connect использует расширение pgvector из PostgreSQL.
Этот мощный семантический поиск может использоваться в таких системах, как рекомендательные и поисковые системы. Он также является ключевым компонентом в генерации с расширенными возможностями поиска в процессах генеративного ИИ. Документация Vertex AI — отличное место для получения дополнительной информации .
Вы можете положиться на встроенную поддержку Data Connect для автоматического создания векторных эмбеддингов с помощью API Embeddings от Vertex AI , или использовать этот API для их создания вручную.
Предварительные требования
Настройте Data Connect для своего проекта.
Включите API Vertex AI .
Настраивать
Вы можете выбрать между локальным процессом разработки (если вы веб-разработчик, разработчик на Kotlin, Android или iOS) или процессом IDX (для веб-разработчиков). Для разработки можно использовать локальную базу данных или ваш производственный проект Data Connect и его экземпляр Cloud SQL for PostgreSQL.
В этих инструкциях предполагается, что вы создали свой проект Data Connect , следуя руководству по быстрому запуску .
Интеграция с локальной базой данных PostgreSQL
- Настройте локальный экземпляр PostgreSQL.
- Предоставьте себе роль IAM пользователя Vertex AI .
- Настройте учетные данные по умолчанию для приложений Google Cloud в вашей среде.
- Установите расширение
pgvectorв локальном экземпляре PostgreSQL. - Включите расширение, используя
CREATE EXTENSION vectorв соответствии с инструкциями репозиторияpgvector.
Интеграция с IDX
- Настройте рабочее пространство IDX, используя шаблон Data Connect.
- Предоставьте себе роль IAM пользователя Vertex AI .
- Включите расширение, используя
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($title: String!, $description: String!) {
movie_insert(data: {
title: $title,
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
В некоторых случаях может потребоваться обновить описание фильма и его встроенное видео.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Чтобы вызвать последнюю мутацию из клиентского приложения:
import { updateMovieDescription } from 'lib/dataconnect-sdk/';
await updateMovieDescription({ id: movieId, description: description});
// Use the response
Запросы
Получите векторные представления, используя запрос, подобный следующему. Обратите внимание, что возвращаемое запросом descriptionEmbedding представляет собой массив чисел с плавающей запятой, который обычно нечитаем для человека. Поэтому SDK, сгенерированные Data Connect не поддерживают его прямую передачу.
Вы можете использовать полученные векторные представления для поиска сходства, как описано в следующем разделе.
query getMovieDescription($id: String!) @auth(level: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Выполните поиск сходства
Теперь мы можем выполнить поиск по сходству.
Для каждого поля Vector Data Connect генерирует функцию GraphQL, реализующую поиск сходства. Имя этой сгенерированной функции — ${pluralType}_${vectorFieldName}_similarity . Она поддерживает несколько параметров, как показано в следующих примерах и в списке литературы .
Вы можете определить функцию GraphQL, которая запускает поиск сходства. Как упоминалось выше, значение сервера _embed указывает Data Connect генерировать векторные представления с использованием API Embedding от Vertex AI, в данном случае для создания представлений для поисковой строки, используемой для сравнения с представлениями описания фильма.
В этом примере поиск по сходству вернет до 5 фильмов, описание которых семантически наиболее близко к входному запросу. Набор результатов отсортирован в порядке возрастания расстояния — от ближайшего к наибольшему.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Настройте запрос на сходство
Значения по умолчанию для параметров поиска, таких как method и within хорошо работают в большинстве случаев. Однако, если вы заметили, что ваш запрос возвращает слишком непохожие результаты или не включает результаты, которые вы хотите включить, попробуйте настроить эти параметры.
Чтобы найти подходящее значение для within , мы можем добавить _metadata.distance к выбранным полям, чтобы увидеть, насколько далеко от вектора запроса находится каждый результат. На основе возвращаемых значений distance мы можем установить параметр within ; будут включены только результаты, у которых расстояние меньше значения within :
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Вы также можете поэкспериментировать с различными функциями расстояния, задав параметр method .
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
within: .5,
method: COSINE,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Обратите внимание, что разные методы возвращают совершенно разные значения расстояния: если вы задали значение within , вам потребуется снова настроить это значение после изменения method .
Вызовите запрос на сходство
Для вызова поиска сходства из клиентского кода:
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 CLI выполняет необходимые шаги для включения генерации встраивания на основе Vertex AI в вашем экземпляре CloudSQL.
firebase deploy --only dataconnectЕсли вы хотите вручную включить поддержку встраивания в свой экземпляр CloudSQL или столкнулись с ошибкой CLI, следуйте этим инструкциям .
Синтаксис векторного поиска
Расширения схемы
Тип данных Vector в Data Connect соответствует типу vector в PostgreSQL, определенному расширением pgvector . В PostgreSQL тип vector хранится как массив чисел с плавающей запятой одинарной точности.
В 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
Количество результатов, которые необходимо вернуть.