Учебник: семантический поиск с помощью semantic_text
Данная функция находится в стадии бета-тестирования и может быть изменена. Дизайн и код менее зрелые, чем официальные функции GA, и предоставляются как есть без каких-либо гарантий. Функции бета-версии не подпадают под SLA поддержки официальных функций GA.
Этот учебник показывает, как использовать функцию семантического текста для выполнения семантического поиска по вашим данным.
Семантический текст упрощает рабочий процесс вывода, предоставляя вывод во время загрузки и разумные значения по умолчанию автоматически. Вам не нужно определять параметры и настройки, связанные с моделью, или создавать конвейеры загрузки вывода.
Рекомендованный способ использования семантического поиска в Elastic Stack — это использование рабочего процесса semantic_text. Если вам нужен больший контроль над параметрами индексирования и запросов, вы можете использовать весь рабочий процесс вывода (см. этот учебник для ознакомления с процессом).
В этом учебнике используется elasticsearch сервис для демонстрации, но вы можете использовать любой сервис и поддерживаемые им модели, предлагаемые API вывода.
Требования
В этом учебнике для демонстрации используется elasticsearch сервис, который создается автоматически при необходимости. Чтобы использовать тип поля semantic_text с сервисом вывода, отличным от elasticsearch сервиса, необходимо создать конечную точку вывода, используя API создания API вывода.
Создайте сопоставление индекса
Необходимо создать сопоставление целевого индекса — индекса, содержащего вложения, которые конечная точка вывода сгенерирует на основе входного текста. Целевой индекс должен содержать поле с semantic_text типом поля для индексирования выходных данных используемой конечной точки вывода.
resp = client.indices.create(
index="semantic-embeddings",
mappings={
"properties": {
"content": {
"type": "semantic_text"
}
}
},
)
print(resp) const response = await client.indices.create({
index: "semantic-embeddings",
mappings: {
properties: {
content: {
type: "semantic_text",
},
},
},
});
console.log(response); PUT semantic-embeddings
{
"mappings": {
"properties": {
"content": {
"type": "semantic_text"
}
}
}
} | Имя поля для хранения сгенерированных вложений. | |
| Поле для хранения вложений — это поле |
Если вы используете веб-сканеры или коннекторы для генерации индексов, вам необходимо обновить сопоставления индексов для этих индексов, включив поле semantic_text. После обновления сопоставления необходимо запустить полное сканирование веб-сайта или полную синхронизацию коннектора. Это гарантирует, что все существующие документы будут повторно обработаны и обновлены с новыми семантическими вложениями, позволяя выполнить семантический поиск по обновленным данным.
Загрузка данных
На этом шаге вы загружаете данные, которые вы позже используете для создания вложений.
Используйте набор данных msmarco-passagetest2019-top1000, который является подмножеством набора данных MS MARCO Passage Ranking. Он состоит из 200 запросов, каждый из которых сопровождается списком соответствующих текстовых фрагментов. Все уникальные фрагменты вместе с их идентификаторами были извлечены из этого набора данных и скомпилированы в файл tsv.
Загрузите файл и загрузите его в свой кластер, используя Визуализатор данных в пользовательском интерфейсе Machine Learning. После анализа данных нажмите Переопределить настройки. В разделе Изменить имена полей присвойте id первому столбцу и content второму. Нажмите Применить, а затем Импортировать. Назовите индекс test-data и нажмите Импортировать. После завершения загрузки вы увидите индекс под названием test-data с 182 469 документами.
Переиндексирование данных
Создайте вложения из текста, переиндексировав данные из индекса test-data в индекс semantic-embeddings. Данные в поле content будут переиндексированы в поле семантического текста content целевого индекса. Переиндексированные данные будут обработаны конечной точкой вывода, связанной с полем семантического текста content.
resp = client.reindex(
wait_for_completion=False,
source={
"index": "test-data",
"size": 10
},
dest={
"index": "semantic-embeddings"
},
)
print(resp) const response = await client.reindex({
wait_for_completion: "false",
source: {
index: "test-data",
size: 10,
},
dest: {
index: "semantic-embeddings",
},
});
console.log(response); POST _reindex?wait_for_completion=false
{
"source": {
"index": "test-data",
"size": 10
},
"dest": {
"index": "semantic-embeddings"
}
} | Размер пакета по умолчанию для переиндексирования составляет 1000. Уменьшение размера до меньшего значения ускоряет процесс переиндексирования, позволяя вам внимательно следить за прогрессом и своевременно обнаруживать ошибки. |
Вызов возвращает идентификатор задачи для мониторинга прогресса:
resp = client.tasks.get(
task_id="<task_id>",
)
print(resp) const response = await client.tasks.get({
task_id: "<task_id>",
});
console.log(response); GET _tasks/<task_id>
Переиндексирование больших наборов данных может занять много времени. Вы можете протестировать этот рабочий процесс, используя только подмножество набора данных. Сделайте это, отменив процесс переиндексирования и сгенерировав вложения только для подмножества, которое было переиндексировано. Следующий запрос API отменит задачу переиндексирования:
resp = client.tasks.cancel(
task_id="<task_id>",
)
print(resp) const response = await client.tasks.cancel({
task_id: "<task_id>",
});
console.log(response); POST _tasks/<task_id>/_cancel
Семантический поиск
После обогащения набора данных вложениями вы можете запросить данные с помощью семантического поиска. Укажите имя поля semantic_text и текст запроса в запросе типа semantic. Для обработки текста запроса будет использоваться конечная точка вывода, использованная для генерации вложений для поля semantic_text.
resp = client.search(
index="semantic-embeddings",
query={
"semantic": {
"field": "content",
"query": "How to avoid muscle soreness while running?"
}
},
)
print(resp) const response = await client.search({
index: "semantic-embeddings",
query: {
semantic: {
field: "content",
query: "How to avoid muscle soreness while running?",
},
},
});
console.log(response); GET semantic-embeddings/_search
{
"query": {
"semantic": {
"field": "content",
"query": "How to avoid muscle soreness while running?"
}
}
} | Поле | |
| Текст запроса. |
В результате вы получите 10 документов, наиболее близких по смыслу к запросу из индекса semantic-embedding:
"hits": [
{
"_index": "semantic-embeddings",
"_id": "Jy5065EBBFPLbFsdh_f9",
"_score": 21.487484,
"_source": {
"id": 8836652,
"content": {
"text": "There are a few foods and food groups that will help to fight inflammation and delayed onset muscle soreness (both things that are inevitable after a long, hard workout) when you incorporate them into your postworkout eats, whether immediately after your run or at a meal later in the day. Advertisement. Advertisement.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "There are a few foods and food groups that will help to fight inflammation and delayed onset muscle soreness (both things that are inevitable after a long, hard workout) when you incorporate them into your postworkout eats, whether immediately after your run or at a meal later in the day. Advertisement. Advertisement.",
"embeddings": {
(...)
}
}
]
}
}
}
},
{
"_index": "semantic-embeddings",
"_id": "Ji5065EBBFPLbFsdh_f9",
"_score": 18.211695,
"_source": {
"id": 8836651,
"content": {
"text": "During Your Workout. There are a few things you can do during your workout to help prevent muscle injury and soreness. According to personal trainer and writer for Iron Magazine, Marc David, doing warm-ups and cool-downs between sets can help keep muscle soreness to a minimum.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "During Your Workout. There are a few things you can do during your workout to help prevent muscle injury and soreness. According to personal trainer and writer for Iron Magazine, Marc David, doing warm-ups and cool-downs between sets can help keep muscle soreness to a minimum.",
"embeddings": {
(...)
}
}
]
}
}
}
},
{
"_index": "semantic-embeddings",
"_id": "Wi5065EBBFPLbFsdh_b9",
"_score": 13.089405,
"_source": {
"id": 8800197,
"content": {
"text": "This is especially important if the soreness is due to a weightlifting routine. For this time period, do not exert more than around 50% of the level of effort (weight, distance and speed) that caused the muscle groups to be sore.",
"inference": {
"inference_id": "my-elser-endpoint",
"model_settings": {
"task_type": "sparse_embedding"
},
"chunks": [
{
"text": "This is especially important if the soreness is due to a weightlifting routine. For this time period, do not exert more than around 50% of the level of effort (weight, distance and speed) that caused the muscle groups to be sore.",
"embeddings": {
(...)
}
}
]
}
}
}
}
] Дополнительные примеры и материалы для чтения
- Если вы хотите использовать
semantic_textв гибридном поиске, обратитесь к этому ноутбуку для пошагового руководства. - Для получения дополнительной информации об оптимизации конечных точек ELSER обратитесь к разделу рекомендаций ELSER в документации по модели.
- Для получения дополнительной информации об автоматическом масштабировании моделей обратитесь к странице автоматического масштабирования обученных моделей.
© 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/semantic-search-semantic-text.html