Использование собственных плотных векторных вложений в 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"
}
}
}
} | Параметр | |
| Параметр | |
| Параметр |
Шаг 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]
} | Размер массива |
Массовая индексация нескольких документов
В производственной среде вы захотите индексировать сразу много документов, используя конечную точку _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
}
}
} | В этом простом примере мы отправляем сырой вектор в качестве текста запроса. В реальном сценарии вы не будете знать текст запроса заранее. Вам нужно будет генерировать векторы запросов на лету, используя ту же модель встраивания, которая сгенерировала векторы документов. | |
| Параметр | |
| Параметр |
Дополнительная информация
В этом простом примере мы отправляем сырой вектор в качестве текста запроса. В реальном сценарии вы не будете знать текст запроса заранее. Вам нужно будет генерировать векторы запросов на лету, используя ту же модель встраивания, которая сгенерировала векторы документов.
Для этого вам потребуется развернуть модель встраивания текста в 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