DevGang
Авторизоваться

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

В этом посте показан простой пример схемы GraphQL с векторными вложениями и соответствующей мутацией и запросом.

Разверните следующую схему GraphQL:

type Project {
  id: ID!
  title: String! @id
  title_v: [Float!] @embedding @search(by: ["hnsw(metric: euclidean, exponent: 4)"])
}

В этой схеме поле title_v представляет собой вложение, в котором алгоритм HNSW используется для создания индекса векторного поиска. Метрикой, используемой для вычисления расстояния между векторами (в этом примере), является евклидово расстояние. Была введена новая директива @embedding для обозначения одного или нескольких полей как векторных вложений. Директива @search была расширена для определения индекса HNSW на основе евклидова расстояния. Значение exponent используется для установки разумных значений по умолчанию для внутренних параметров настройки HNSW. Это целое число, представляющее приблизительное количество векторов, ожидаемых в индексе, в степени 10. Значение по умолчанию — «4» (10^4 вектора).

Схема GraphQL развернута
Схема GraphQL развернута

После успешного развертывания:

Схема успешно развернута
Схема успешно развернута

Давайте добавим некоторые данные с помощью автоматически сгенерированного addProject типа mutation.

mutation {
addProject(input: [
{ title: "iCreate with a Mini iPad", title_v: [0.12, 0.53, 0.9, 0.11, 0.32] },
{ title: "Resistive Touchscreen", title_v: [0.72, 0.89, 0.54, 0.15, 0.26] },
{ title: "Fitness Band", title_v: [0.56, 0.91, 0.93, 0.71, 0.24] },
{ title: "Smart Ring", title_v: [0.38, 0.62, 0.99, 0.44, 0.25] }]) 
  {
    project {
      id
      title
      title_v
    }
  }
}
Mutation для вставки данных
Mutation для вставки данных

Автоматически сгенерированный querySimilarProjectByEmbedding запрос позволяет нам выполнить семантический поиск (он же поиск по сходству), используя векторный индекс, указанный в нашей схеме.

Выполните запрос:

query {    
    querySimilarProjectByEmbedding(by: title_v, topK: 3, vector: [0.1, 0.2, 0.3, 0.4, 0.5]) {
        id
        title
        vector_distance
     }
}
Запуск автоматически сгенерированного запроса
Запуск автоматически сгенерированного запроса

Результаты, полученные для querySimilarProjectByEmbedding функции, включают 3 ближайших проекта, упорядоченных по векторному расстоянию. vector_distance — это евклидово расстояние между title_v вектором внедрения и входным вектором, используемым в нашем запросе.

Примечание: вы можете опустить vector_distance предикат в запросе, результат все равно будет упорядочен по векторному расстоянию.

Используемая метрика расстояния указывается при создании индекса. В этом примере мы использовали:

title_v: [Float!] @embedding @search(by: ["hnsw(metric: euclidian, exponent: 4)"])

Мы также можем запросить объекты, похожие на существующий объект, учитывая его id, используя функцию getSimilar<Object>ById.

query {
  querySimilarProjectById(by: title_v, topK: 3, id: "0xef7") {
    id
    title
    vector_distance
  }
}
Запрос с использованием существующего объекта на основе id
Запрос с использованием существующего объекта на основе id

В приведенном ниже примере мы используем title для идентификации проекта, для которого мы хотим найти похожие проекты. В этом случае title поле представляет собой внешний идентификатор и аннотируется с помощью @id директивы в схеме. Вы можете назначить несколько полей внешними идентификаторами, используя директиву @id.

query {
  querySimilarProjectById(by: title_v, topK: 3, title: "Smart Ring") {
    title
    vector_distance
  }
}
Запрос с использованием существующего объекта на основе заголовка
Запрос с использованием существующего объекта на основе заголовка

Источник:

#GraphQL
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу