Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Поиск данных ›Семантический поиск

Использование собственных плотных векторных вложений в Elasticsearch

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

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

Это пример расширенного использования. Обратитесь к Семантическому поиску для обзора доступных вариантов семантического поиска с Elasticsearch.

Шаг 1: Создание индекса с картой dense_vector

Каждый документ в нашем простом наборе данных будет содержать:

  • Обзор: хранится в поле review_text
  • Вложение этого обзора: хранится в поле review_vector

    • Поле review_vector определено как тип данных dense_vector.

Тип dense_vector по умолчанию автоматически использует квантование int8_hnsw, чтобы уменьшить объем памяти, необходимый для поиска векторов с плавающей точкой. Узнайте больше о балансировании производительности и точности в Квантовании плотных векторов.

resp = client.indices.create(
    index="amazon-reviews",
    mappings={
        "properties": {
            "review_vector": {
                "type": "dense_vector",
                "dims": 8,
                "index": True,
                "similarity": "cosine"
            },
            "review_text": {
                "type": "text"
            }
        }
    },
)
print(resp)
const response = await client.indices.create({
  index: "amazon-reviews",
  mappings: {
    properties: {
      review_vector: {
        type: "dense_vector",
        dims: 8,
        index: true,
        similarity: "cosine",
      },
      review_text: {
        type: "text",
      },
    },
  },
});
console.log(response);
PUT /amazon-reviews
{
  "mappings": {
    "properties": {
      "review_vector": {
        "type": "dense_vector",
        "dims": 8, 
        "index": true, 
        "similarity": "cosine" 
      },
      "review_text": {
        "type": "text"
      }
    }
  }
}

Параметр dims должен соответствовать длине вектора вложения. Здесь мы используем простое 8-мерное вложение для наглядности. Если не указано иначе, dims будет динамически рассчитано на основе первого индексируемого документа.

Параметр index установлен на true для включения использования запроса knn.

Параметр similarity определяет функцию сходства, используемую для сравнения запрошенного вектора с векторами документов. cosine является функцией сходства по умолчанию для полей dense_vector в Elasticsearch.

Шаг 2: Индексация документов с вложениями

Индексация одного документа

Сначала проиндексируем один документ, чтобы понять структуру документа.

resp = client.index(
    index="amazon-reviews",
    id="1",
    document={
        "review_text": "This product is lifechanging! I'm telling all my friends about it.",
        "review_vector": [
            0.1,
            0.2,
            0.3,
            0.4,
            0.5,
            0.6,
            0.7,
            0.8
        ]
    },
)
print(resp)
const response = await client.index({
  index: "amazon-reviews",
  id: 1,
  document: {
    review_text:
      "This product is lifechanging! I'm telling all my friends about it.",
    review_vector: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
  },
});
console.log(response);
PUT /amazon-reviews/_doc/1
{
  "review_text": "This product is lifechanging! I'm telling all my friends about it.",
  "review_vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] 
}

Размер массива review_vector равен 8, что соответствует количеству dims, указанному в схеме.

Массовая индексация нескольких документов

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

Вот пример индексации нескольких документов в одном запросе _bulk.

resp = client.bulk(
    operations=[
        {
            "index": {
                "_index": "amazon-reviews",
                "_id": "2"
            }
        },
        {
            "review_text": "This product is amazing! I love it.",
            "review_vector": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8
            ]
        },
        {
            "index": {
                "_index": "amazon-reviews",
                "_id": "3"
            }
        },
        {
            "review_text": "This product is terrible. I hate it.",
            "review_vector": [
                0.8,
                0.7,
                0.6,
                0.5,
                0.4,
                0.3,
                0.2,
                0.1
            ]
        },
        {
            "index": {
                "_index": "amazon-reviews",
                "_id": "4"
            }
        },
        {
            "review_text": "This product is great. I can do anything with it.",
            "review_vector": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8
            ]
        },
        {
            "index": {
                "_index": "amazon-reviews",
                "_id": "5"
            }
        },
        {
            "review_text": "This product has ruined my life and the lives of my family and friends.",
            "review_vector": [
                0.8,
                0.7,
                0.6,
                0.5,
                0.4,
                0.3,
                0.2,
                0.1
            ]
        }
    ],
)
print(resp)
const response = await client.bulk({
  operations: [
    {
      index: {
        _index: "amazon-reviews",
        _id: "2",
      },
    },
    {
      review_text: "This product is amazing! I love it.",
      review_vector: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
    },
    {
      index: {
        _index: "amazon-reviews",
        _id: "3",
      },
    },
    {
      review_text: "This product is terrible. I hate it.",
      review_vector: [0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1],
    },
    {
      index: {
        _index: "amazon-reviews",
        _id: "4",
      },
    },
    {
      review_text: "This product is great. I can do anything with it.",
      review_vector: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
    },
    {
      index: {
        _index: "amazon-reviews",
        _id: "5",
      },
    },
    {
      review_text:
        "This product has ruined my life and the lives of my family and friends.",
      review_vector: [0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1],
    },
  ],
});
console.log(response);
POST /_bulk
{ "index": { "_index": "amazon-reviews", "_id": "2" } }
{ "review_text": "This product is amazing! I love it.", "review_vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] }
{ "index": { "_index": "amazon-reviews", "_id": "3" } }
{ "review_text": "This product is terrible. I hate it.", "review_vector": [0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1] }
{ "index": { "_index": "amazon-reviews", "_id": "4" } }
{ "review_text": "This product is great. I can do anything with it.", "review_vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8] }
{ "index": { "_index": "amazon-reviews", "_id": "5" } }
{ "review_text": "This product has ruined my life and the lives of my family and friends.", "review_vector": [0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1] }

Шаг 3: Поиск документов с помощью вложений

Теперь вы можете запросить эти векторы документов, используя knn индексатор. knn — это тип поиска по векторам, который находит k наиболее похожих документов на вектор запроса. Здесь для демонстрации мы просто используем сырой вектор для текста запроса.

resp = client.search(
    index="amazon-reviews",
    retriever={
        "knn": {
            "field": "review_vector",
            "query_vector": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8
            ],
            "k": 2,
            "num_candidates": 5
        }
    },
)
print(resp)
const response = await client.search({
  index: "amazon-reviews",
  retriever: {
    knn: {
      field: "review_vector",
      query_vector: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
      k: 2,
      num_candidates: 5,
    },
  },
});
console.log(response);
POST /amazon-reviews/_search
{
  "retriever": {
    "knn": {
      "field": "review_vector",
      "query_vector": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8], 
      "k": 2, 
      "num_candidates": 5 
    }
  }
}

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

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

Параметр num_candidates необязателен. Он ограничивает количество кандидатов, возвращаемых узлом поиска. Это может улучшить производительность и снизить затраты.

Дополнительная информация

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

Для этого вам потребуется развернуть модель встраивания текста в Elasticsearch и использовать параметр query_vector_builder. В качестве альтернативы вы можете сгенерировать векторы на стороне клиента и отправить их непосредственно с запросом на поиск.

Узнайте, как использовать развернутую модель встраивания текста для семантического поиска.

Если вы только начинаете работать с поиском по векторам в Elasticsearch, обратитесь к Семантическому поиску.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/bring-your-own-vectors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API