Как компания, занимающаяся поисковыми системами, мы в значительной степени полагаемся на ES
Помогал с задачами, включая отзыв статей, разделение источников данных, управление объектами и тегами и т. д., и все получили хорошие результаты.
Недавно нам нужно было смоделировать отраслевую базу знаний, которая может включать в себя несколько методов отзыва и оценки, таких как сопоставление сущностей, нечеткий поиск, векторный поиск и т. д. Наконец, мы решили использовать ES 7.X
(Окончательный выбор 7.10) Новая функция в Dense vector Помогите, пожалуйста, выполнить эту часть требований.
query
анализировать результаты query
заявление на отзыв данныхОпределив сценарий использования данных, мы определили, что структура данных будет примерно включать следующие поля:
Чтобы удовлетворить вышеуказанные требования к использованию, мы сравнили ES
、Faiss
ждать Различные решения. Это середина,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 | высокий | в целом | Необходимо вторичное развитие |
ES
query
Модуль понимания выполняет анализ условий поиска.ES
середина ПоискSettings
:{
"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"
]
}
}
}
}
translog
Интервал отправки увеличен для ускорения написания.sort field
Сохраните эти два поляMapping
:{
"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"
]
}
}
}
}
farady
Сегментатор слов выполняет обработку сегментации слов для каждой части элемента знаний.Модель А
из статьи середина найти запись знанийМодель Б
знание Запись преобразуется ввекторМодель А
Модель Б
Для самостоятельно разработанной модели алгоритмы, включая расчет плотности знаний и bert
tersonflow
и т. д. рамкаES
query понимать
Компоненты для анализаquery
внутрииз Классификацияинформацияждатьпосле намерения,создан, чтобы помнитьизвектори Связанныйиз Критерии фильтраES
из query
Фильтруйте базу знаний на основе условий и корректируйте результаты на основе достоверности и т. д.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": [ ... ]
}
}
}
}
}
query
изсостояние、Параметры предназначены только для иллюстрации и относятся к реальному онлайн-использованию в целях десенсибилизации.、Упрощенная версияpipeline
середина обрабатывается, что упрощает обработку граничных условий середины и логику части оценки.потому чтонеобходимо провестивекторвычислить,ES
Расчет расстояния занимает много времени и ресурсов, поэтому мы произвели следующие оптимизации:
bert
Вывод кадровизвектор Кусочекчислоlabel
из Точность определяется16
Кусочек Перехвачено как5
Кусочек小числоX%
),Но сильно сократилось Низкийдоступивычислитьвремя(о Y%
)query
намереваться заранее、возможный Классификацияпровести анализquery
Перед сборкой оригинала query
контент-анализquery
iКлассификация совпадений с разным весом изX%
),но повышает точность(о Y%
),Также упомянитевысокий Частичновычислитьэффективность(о Z%
)ES
Необходимость обработки логики работыES
Время ответа (ок. X%
),В то же время провести внешнюю корректировку формулы оценки.,косвенныйизнестивысокийточность(о Y%
)Поскольку элементы знаний извлекаются по алгоритму,Более того, знания будут иметь определенную своевременность.,Может вызвать проблему с неточными знаниями,С этой целью мы сделали следующие оптимизации:
X
Пакетная итерация, знание правильности Y%
Тивысокий прибыл Z%
из
)разницаиз Фильтровать по элементам знаний、слитьX
Категория из Y
кусочки экспертных знаний и в то же время грубо пропускают человеческое вмешательство Z%
из Знания, знания изправильностиот W%
Тивысокий прибыл K%
Эта статья основана на сценариях использования нашей компании и обсуждает окружающие ES
вектор Поле(Dense vector
)Строитьиз Система описана примерно,В то же время объясняются некоторые общие проблемы и решения.
В настоящее время это решение поддерживает нашу базу знаний и соответствующие функции поиска.,По сравнению с предыдущим, основанным исключительно на распознавании сущности и ngram
Общая точность и скорость повторения схемы сопоставления были улучшены почти на двузначный процент.
В будущем мы улучшим скорость реагирования и стабильность всей системы, а также продолжим работу над эффективностью построения базы знаний и точностью знаний.
Ривал Вэнь, сертифицированный инженер Elastic, поисковый архитектор, опыт работы более 10 лет, окончил Фуданьский университет.
Блог: https://blog.csdn.net/weixin_40601534
Github:https://github.com/godlockin