Сухая информация | Инженерная практика векторного поиска Elasticsearch
Сухая информация | Инженерная практика векторного поиска Elasticsearch

1. Предыстория

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

Недавно нам нужно было смоделировать отраслевую базу знаний, которая может включать в себя несколько методов отзыва и оценки, таких как сопоставление сущностей, нечеткий поиск, векторный поиск и т. д. Наконец, мы решили использовать ES 7.X (Окончательный выбор 7.10) Новая функция в Dense vector Помогите, пожалуйста, выполнить эту часть требований.

2. Выбор технологии

2.1 Требования к решению

  1. Поддержка векторного поиска
  2. Поддержка многомерного скрининга и фильтрации
  3. Пропускная способность
  4. Стоимость обучения и использования
  5. Затраты на эксплуатацию и техническое обслуживание

2.2 Разработка сценария использования

  1. Оффлайн подготовка данных
    1. После создания автономных данных они сохраняются в движке.
    2. Движок индексирует каждое поле данных середина
  2. Онлайн-отзыв данных
    1. в соответствии с query анализировать результаты query заявление на отзыв данных
    2. Фильтровать результаты в определенной степени
    3. Сортировка результатов по определенному баллу

2.3 Проектирование структуры данных

Определив сценарий использования данных, мы определили, что структура данных будет примерно включать следующие поля:

  1. только id: Используется для удаления дубликатов и быстрого получения знаний.
  2. сущность、свойство、Значение: используется для описания конкретного содержания знаний.
  3. Уверенность: используется для описания достоверности знаний.
  4. Флаг категории: основные категории знаний и рекомендуемые категории и т. д.
  5. Векторное представление: сходство как знание、отзыв релевантности、Основа оценки
  6. Справочная информация: используется для возврата и анализа/получения знаний и исходной информации.
  7. другойсвойство:включая вступление в силу、удалить、время модификацииждатьподдерживающийиз Универсальныйсвойство

2.4 Сравнение решений

Чтобы удовлетворить вышеуказанные требования к использованию, мы сравнили ESFaiss ждать Различные решения. Это середина,Faiss и SPTAG Только основная библиотека алгоритмов,Необходимо провести вторичную разработку и упаковать ее в сервисы;Milvus из 1.x Можно сохранить только версию id и вектор,Он не может полностью удовлетворить наши потребности в использовании, исходя из соображений стабильности кластера и удобства обслуживания;,Относительно пост-плагина после развертывания,Мы предпочитаем использовать ES из Собственный функциональный, так что выбирайте ES Наш окончательный выбор — встроенная функция поиска векторов.

Ссылка для сравнения:

тип

язык реализации

Поддержка клиентов

Повторный вызов нескольких условий

стоимость обучения

Введите стоимость

Затраты на эксплуатацию и техническое обслуживание

распределенный

производительность

Сообщество

Примечание

Elasticsearch

Java

Java/Python

yes

Низкий

Низкий

середина

yes

середина

активный

Собственный функционал

Faiss

Python

Python

no

середина

высокий

высокий

no

высокий

в целом

Необходимо вторичное развитие

Milvus

Python + GoLang

Python/Java/GoLang

no

середина

середина

середина

no

высокий

в целом

1.x не полностью функционален

OpenDistro Elasticsearch KNN

Java + C++

Java/Python

yes

середина

середина

середина

yes

середина

в целом

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

SPTAG

C++

Python + C#

no

высокий

середина

середина

no

высокий

в целом

Необходимо вторичное развитие

3. Процесс передачи данных

3.1 Часть обработки данных в автономном режиме

  1. Собирайте данные из нескольких источников данных
  2. Очистка и предварительная обработка данных
  3. Извлекайте знания с помощью алгоритмических механизмов
  4. Преобразуйте знания в векторы с помощью алгоритма
  5. знаниеиз Основная информация вместе свектор Хранение данных ES

3.2 Часть онлайн-вызова данных

  1. Получить критерии поиска из внешнего интерфейса
  2. проходить query Модуль понимания выполняет анализ условий поиска.
  3. от ES середина Поиск
  4. Корректировка результатов
  5. Вернуться к интерфейсу

4. Примеры использования поиска векторов ES

4.1 Дизайн индекса

Settings
Язык кода:javascript
копировать
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2,
        "index": {
            "routing": {
                "allocation": {
                    "require": {
                        "node_group": "hot" // 1)
                    }
                }
            },
            "store": {
                "preload": [ // 2)
                    "knowledge",
                    "category",
                    "available",
                    "confidence",
                    "del",
                    "kid"
                ]
            },
            "search": {
                "slowlog": {
                    "threshold": {
                        "query": {
                            "warn": "1s" // 3)
                        },
                        "fetch": {
                            "warn": "1s" // 3)
                        }
                    }
                }
            },
            "translog": {
                "flush_threshold_size": "512mb", // 4)
                "sync_interval": "5m", // 4)
                "durability": "async" // 4)
            },
            "sort": {
                "field": [ // 5)
                    "kid",
                    "confidence"
                ],
                "order": [ // 5)
                    "asc",
                    "desc"
                ]
            }
        }
    }
}
  • проиллюстрировать:
  1. потому чтовектор Данные большие,Так что лучше весь индекс разместить на узле производительность оборудования.
  2. Для поддержки фильтрации высокой производительности общие поля предварительно загружаются в память середина.
  3. Включите журналы медленных запросов, чтобы облегчить последующее расследование проблем.
  4. База знаний по реконструкции оффлайн,Будет много записей при обновлении,Так правильно translog Интервал отправки увеличен для ускорения написания.
  5. В реальном использовании серединакид — это идентификатор с автоматическим приращением.,В то же время знания из уверенности могут быть отсортированы.,Так что буду использовать sort field Сохраните эти два поля
Mapping
Язык кода:javascript
копировать
{
    "mappings": {
        "properties": {
            "kid": {
                "type": "keyword"
            },
            "knowledge": {
                "type": "keyword"
            },
            "knowledge_phrase": { // 1)
                "type": "text",
                "analyzer": "faraday"
            },
            "attribue": { // 1)
                "type": "keyword",
                "fields": {
                    "phrase": {
                        "type": "text",
                        "analyzer": "faraday"
                    }
                }
            },
            "value": { // 1)
                "type": "keyword",
                "fields": {
                    "phrase": {
                        "type": "text",
                        "analyzer": "faraday"
                    }
                }
            },
            "confidence": { // 2)
                "type": "double"
            },
            "category": {
                "type": "keyword"
            },
            "vector": { // 3)
                "type": "dense_vector",
                "dims": 512
            },
            "ref": {
                "type": "text",
                "index": false
            },
            "available": {
                "type": "keyword"
            },
            "del": {
                "type": "keyword"
            },
            "create_timestamp": {
                "type": "date",
                "format": [
                    "strict_date_hour_minute_second",
                    "yyyy-MM-dd HH:mm:ss"
                ]
            },
            "update_timestamp": {
                "type": "date",
                "format": [
                    "strict_date_hour_minute_second",
                    "yyyy-MM-dd HH:mm:ss"
                ]
            }
        }
    }
}
  • проиллюстрировать:
  1. Помимо полного поиска элементов знаний из,Также потребуется нечеткий поиск,Мы использовали собственную разработкуиз farady Сегментатор слов выполняет обработку сегментации слов для каждой части элемента знаний.
  2. Некоторые элементы знаний в базе знаний будут проверяться и поддерживаться экспертами/руководствами, поэтому для разных элементов будут установлены разные уровни достоверности.
  3. После предварительной обработки данных они будут преобразованы в 512 Кусочекизвектор Это поле существуетсередина

4.2 Поток данных

  • Оффлайн раздел:
  1. Сбор и очистка данных
  2. проходить Модель А из статьи середина найти запись знаний
  3. проходить Модель Б знание Запись преобразуется ввектор
    1. здесь Модель А Модель Б Для самостоятельно разработанной модели алгоритмы, включая расчет плотности знаний и bert tersonflow и т. д. рамка
  4. Вставка основного контента, такого как исходный текст и элементы знаний, в базу данных.
  5. Соберите основной контент знаний, векторы и т. д. в блоки поиска и вставьте их. ES
  6. Группа экспертов рассмотрит, изменит и повторит базу данных серединаиз элементов знаний.
  7. Команда алгоритма встретится соответствии Запись знаний из обновлений и других аннотаций. Повторение модели канала передачи данных серединаиз и обновление онлайн-базы знаний.
  • Онлайн-раздел:
  1. Вызывается после того, как интерфейсная часть получает запрос query понимать Компоненты для анализа
  2. После удаления недопустимого контента найдите query внутрииз Классификацияинформацияждатьпосле намерения,создан, чтобы помнитьизвектори Связанныйиз Критерии фильтра
  3. проходить Собери это вместеиз ES из query Фильтруйте базу знаний на основе условий и корректируйте результаты на основе достоверности и т. д.
  4. Выполняйте различные стратегии, корректируйте оценки и сортируйте результаты отзыва.,Наконец вывод на передний конец

4.3 Пример запроса

Язык кода:javascript
копировать
POST knowledge_current_reader/_search
{
    "query": {
        "script_score": {
            "query": {
                "bool": {
                    "filter": [
                        {
                            "term": {
                                "del": 0
                            }
                        },
                        {
                            "term": {
                                "available": 1
                            }
                        }
                    ],
                    "must": {
                        "bool": {
                            "should": [
                                {
                                    "term": {
                                        "category": "type_1",
                                        "boost": 10
                                    }
                                },
                                {
                                    "term": {
                                        "category": "type_2",
                                        "boost": 5
                                    }
                                }
                            ]
                        }
                    },
                    "should": [
                        {
                            "match_phrase": {
                                "knowledge_phrase": {
                                    "query": "some_query",
                                    "boost": 10
                                }
                            }
                        },
                        {
                            "match": {
                                "attribute": {
                                    "query": "some_query",
                                    "boost": 5
                                }
                            }
                        },
                        {
                            "match": {
                                "value": {
                                    "query": "some_query",
                                    "boost": 5
                                }
                            }
                        },
                        {
                            "term": {
                                "knowledge": {
                                    "value": "some_query",
                                    "boost": 30
                                }
                            }
                        },
                        {
                            "term": {
                                "attribute": {
                                    "value": "some_query",
                                    "boost": 15
                                }
                            }
                        },
                        {
                            "term": {
                                "value": {
                                    "value": "some_query",
                                    "boost": 10
                                }
                            }
                        }
                    ]
                }
            },
            "script": {
                "source": "cosineSimilarity(params.query_vector, 'vector') + sigmoid(1, Math.E, _score) + (1 / Math.log(doc['confidence'].value))",
                "params": {
                    "query_vector": [ ... ]
                }
            }
        }
    }
}
  • проиллюстрировать:
  1. выше query изсостояние、Параметры предназначены только для иллюстрации и относятся к реальному онлайн-использованию в целях десенсибилизации.、Упрощенная версия
  2. Формула расчета представляет собой определенную версию итерации середина, последующие корректировки и обновления не отражаются.
  3. Граничные условия и нулевые значения во вспомогательных сервисах pipeline середина обрабатывается, что упрощает обработку граничных условий середины и логику части оценки.

5. Возникшие проблемы

5.1 Длительное время отклика

потому чтонеобходимо провестивекторвычислить,ES Расчет расстояния занимает много времени и ресурсов, поэтому мы произвели следующие оптимизации:

  1. Собственные значения округляются до десятичных знаков.Кусочекчисло:
    1. Чтобы обеспечить функцию представления, мы не настраивали bert Вывод кадровизвектор Кусочекчисло
    2. Взвесив эффективность доступа, точность данных и скорость вычислений, мы label из Точность определяется16Кусочек Перехвачено как5Кусочек小число
    3. Хотя при этом теряется некоторая точность (примерно X%),Но сильно сократилось Низкийдоступивычислитьвремя(о Y%
  2. в ходе выполнения query намереваться заранее、возможный Классификацияпровести анализ
    1. Чтобы уменьшить объем данных сортировки, включаемых в расчет, будем query Перед сборкой оригинала query контент-анализ
    2. Взаимодействовать с поведением пользователей и фокусироваться на экспертах и ​​предшествующих знаниях.,Выполните знания примерно. Классификация,И чтобы query iКлассификация совпадений с разным весом из
    3. Хотя это снижает скорость запоминания (примерно X%),но повышает точность(о Y%),Также упомянитевысокий Частичновычислитьэффективность(о Z%
  3. оптимизироватьвычислитьчиновник
    1. Экстернализуйте часть логики расчета баллов, чтобы сделать ее максимально упрощенной. ES Необходимость обработки логики работы
    2. Добавьте различные стратегии подсчета очков после отзыва, укажите конфигурацию для приложения, операцию ожидания регулировки веса.
    3. Вот как это падает Низкий ES Время ответа (ок. X%),В то же время провести внешнюю корректировку формулы оценки.,косвенныйизнестивысокийточность(о Y%

5.2 Качество знаний варьируется

Поскольку элементы знаний извлекаются по алгоритму,Более того, знания будут иметь определенную своевременность.,Может вызвать проблему с неточными знаниями,С этой целью мы сделали следующие оптимизации:

  1. продолжениеизитерация алгоритма:
    1. в соответствии с скрытой пользователем информацией и информацией аннотаций для непрерывной итерации модели.
    2. Выбирайте более качественные результаты извлечения знаний для выполнения полного/добавочного обновления онлайн-данных.
    3. пройти X Пакетная итерация, знание правильности Y% Тивысокий прибыл Z%
  2. Вывод в модельиз知识进行后置处理
    1. 将仅存在部分助词(нравитьсяиз)разницаиз Фильтровать по элементам знаний、слить
    2. Установите срок годности для некоторых популярных элементов знаний и вмешайтесь в создание элементов знаний путем проверки вручную.
    3. Поддерживайте базу экспертных знаний, чтобы отмечать проверенные знания и повышать привилегии.
    4. поддерживается X Категория из Y кусочки экспертных знаний и в то же время грубо пропускают человеческое вмешательство Z% из Знания, знания изправильностиот W% Тивысокий прибыл K%

Выводы и перспективы

Эта статья основана на сценариях использования нашей компании и обсуждает окружающие ES вектор Поле(Dense vector)Строитьиз Система описана примерно,В то же время объясняются некоторые общие проблемы и решения.

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

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

Представление автора

Ривал Вэнь, сертифицированный инженер Elastic, поисковый архитектор, опыт работы более 10 лет, окончил Фуданьский университет.

Блог: https://blog.csdn.net/weixin_40601534

Github:https://github.com/godlockin

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose