Федор Романенко Качество поиска Яндекса,
ведущий менеджер-эксперт
Поиск: что там внутри?
Как он ищет?
Поиск
4
Робот
Вы ищете во всем интернете? Так быстро?
• нет, мы скачиваем странички, обрабатываем и
кладем в индекс
• по индексу ищем быстро: 100мс, 200 млн. / день
• неизбежна задержка: скачивание, обработка,
выкладывание на поиск
• основная проблема задержек: нужна переагрегация
данных
5
Структура инвертированного индекса
Было: сортировка по документам и позициям
(word, d, s, w, f)+
Стало: по словам, потом - документам и позициям
(word, (d, s, w, f)+ )+
Классическая структура инвертированного индекса
Ключи:
prefix-compression( (key, offset)+ )
Скип-лист:
(d, offset)+
Инвертированный индекс:
( differential-compression( posting lists ) )+
6
Поиск – дерево запроса
(студент && ( мгу || (московский && государственный &&
университет) ) )
7
Поиск – ленивые итераторы Дерево ленивых итераторов - идем по номерам документов по
возрастанию:
• узел - curDoc :="мин. номер документа >= curDoc"
• И - curDoc:=Max(curDoc(i))
• ИЛИ - curDoc:=Min(сurDoc(i))
(
[2, 3, 5, 13 ] или
[2, 6, 21 ]
) и
[ 3, 7, 14, 21 ]
=>
[ 3, 21 ]
Результат: документ + набор “хитов”
8
Фильтрация
Документ нашелся = допущен в ранжирование
• есть нужные слова запроса в тексте или
ссылках
• стоят на нужном расстоянии / подряд
• кворум для длинных запросов
sum(idf(hits)) >= Q(sum(idf(query words)), query)
9
Оптимизации
Для одной машины (индекс 3M документов)
Прюнинг (для широких запросов)
• документы отсортированы по убыванию статранка
• рассматриваем не более 50K отфильтрованных
• ограничиваем время выполнения
ФастРанк (легкая формула)
• считаем легкую формулу на легких факторах
• отправляем в ранжирование Top 1000 лучших
10
Ранжирование
• считаем все тяжелые факторы, всего 800
• 10K бинарных деревьев глубины 6
• получаем ранг документа
• выбираем Top10 по рангу
11
Метапоиск: слияние, кеширование и
сниппеты
• управляем нагрузкой и репликами
• собираем Top10 с каждой машины
• считаем Top10(Top10(i))
• кешируем
• запрашиваем сниппеты для Top10
12
Построение выдачи
• собираем TopN от вертикалей
• считаем классификаторы по – оффлайн данным
– запросу
– ответам
– статистике ответа
• строим выдачу из вертикалей и
колдунщиков
13
Надежность и производительность
• достигается распределением нагрузки и репликацией
• сетевые балансеры направляют запросы в 7 ДЦ (по IP)
• в ДЦ запрос попадает на 1 из 200 метапоисков (по IP)
• метапоиск отправляет на 1 из 100 кеширующих
метапоисков (по запросу)
• метапоиски мониторят загрузку и производительность
базовых поисков
• выбирают 2000 базовых из 10 реплик
• перезадают запрос, принимают решение о выдаче
частичного результата
Разве еще не всё написали?
Качество поиска
15
История
• Яндекс-поиск в интернете - 1997
• рост отдела качества поиска - 2006
• MatrixNet – 2009
• 1000 инженеров - 2013
16
Алгоритм поиска?
Нет одного алгоритма, их десять тысяч
• обход и индексация интернета
• производительность
• лингвистика
• разработка факторов и анализ данных
• очистка данных и антиспам
• определение целевой метрики
• алгоритмы машинного обучения
• смешивание выдачи
17
Качество
• у почти всех алгоритмов есть "качество", т.е.
выбор из нескольких вариантов – плохих и
получше
• мы непрерывно занимаемся улучшением
качества
• будем им заниматься всегда
• качество измеряется числовыми метриками
• метрика хороша, если показывает наше
плохое качество
18
Базовая метрика качества поиска
Для ответа:
• оценки: IR (0%), R- (7%), R+ (14%), U (40%), V (61%)
Для десятки:
• Gain: rel(i) - релевантность одного документа [0..1]
• Cumulative G: sum(1..10, rel(i)) - сложим для десятки
• Discounted CG: rel(1) + sum(2..10, rel(i) / log2(i)) - с
дискаунтом за позицию
• Normalized DCG - DCG / IDCG - нормализуем на
максимум
Для поиска:
• среднее по репрезентативной корзине запросов
19
Метрика pFound
Каскадная модель удовлетворенности
пользователя
• с вероятностью R удовлетворяется ответом
• с вероятностью (1-R)*0.15 устает
• с вероятностью (1-R)*0.85 читает дальше
20
Обучение с учителем
• асессоры оценивают ответы по инструкции
• инструкция (150 страниц) описывает наше
продуктовое видение
• 1000 асессоров
• 10 млн. ручных оценок за 2 года
• настоящих запросов все равно больше (200 млн/д)
• учим машину на примерах
21
Модель ранжирования
• факторы ранжирования (числа), считаются для пары
(запрос, документ)
• на них считаем формулу релевантности, берем top10
• модель: (f1(q, d), f2(q, d), ... , fn(q, d)) -> rank(q, d)
• Специфическая модель: не призвана отражать реальный
мир, просто сложная штука с кучей параметров
22
MatrixNet
• MatrixNet: 10K бинарных деревьев глубины 6
• количество параметров огромно: 10K * (64*3) ~ 2 млн.
• сложная и гибкая, но не переобучается ...
-4025627,483990,-36437960,39979596,
-92842056,-50086892,-100233272,243162224,
-22282850,57163664,-24991620,-9889194,
...
vars[5699] = fFactorInt[376] > 1060970280 ? 1 : 0; // 0.738757
vars[5700] = fFactorInt[376] > 1061923687 ? 1 : 0; // 0.795584
vars[5701] = fFactorInt[376] > 1049721454 ? 1 : 0; // 0.284137
vars[5702] = fFactorInt[376] > 948291011 ? 1 : 0; // 6.37877e-05
...
,{376, .0f}
,{376, 0.6251018047f}
,{-1, .0}
,{376, 0.05682743713f}
,{376, 0.4546194971f}
...
23
Машинное обучение ранжирования
• сталкиваем Модель Пользователя и Модель
Ранжирования
• подбираем параметры модели ранжирования
• максимизируем метрику жадной оптимизацией
• MLR находит скрытые закономерности в данных и
ожидания пользователей
• метрика = удовлетворение модельного юзера,
работающего с моделью ранжирования
• использует возможность посчитать счастье на огромном
кол-ве отличающихся поисков без экспериментов
Никак не влезет на одну машину
Много данных
25
Откуда данные?
• каждый ответ поиска (200 млн/день) и клики записываются
• логи всех сервисов
• данные от браузера и счетчиков Метрики
• от партнеров
• любые данные могут быть полезны в качестве
Огромная коллекция – 20 петабайт, нужно уметь с ней
работать!
26
Распределенные вычисления
• большинство таблиц не влезает на одну машину
• нужны распределенные вычисления
• вручную можно внедрить 5 алгоритмов за карьеру
• нужна надежность хранения
• проблема эффективной загрузки серверов
• общий кластер -> приоритизация и планирование
500 задач одновременно на 2000 серверах!
27
Парадигма MapReduce
• входная таблица с независимыми записями
• Map(record) -> (key, value)+
• сортировка по key
• Reduce(key, (value)+) -> result(key)
• Map - выборка нужных данных, определение ключей
• Reduce - агрегация по ключу
28
MapReduce
29
Пример WordCount
Найти 100 самых частотных слов в коллекции документов
• На входе: таблица с документами Docs
• Map: считаем слова в документе, =>
(word, tf)
• Reduce1: для word суммируем частоты tf =>
(hash(word) % 1000, (word, count))
• Reduce2: для 0..999 вычисляем Top100 самых частотных =>
("result", (word, count)+)
• Reduce3: сливаем 1000 Top100 пар (word, count) =>
("output", (word, count)+)
Простая реализация (не тестировалась ;)
mapreduce -map "tr -cs '[:alnum:]' '\n'" -reduce "uniq -c“ –src Docs –dst Stat mapreduce –read Stat | sort +0nr | head -n 100
30
Реализация MapReduce
Yandex MapReduce:
• тройная репликация или Reed Solomon Code
• сжатие чанков ZIP (сжатие 4.31)
• последовательная почанковая обработка
• умный шедулер
Real-Time MapReduce:
• нужен для свежести и RT-персонализации
• инкрементальное обновление результата при изменении
входных данных
• мгновенная инвалидация и пересчет по цепочке
• RT база данных в основе
Что вы имели в виду?
Свежесть и разнообразие
32
Свежесть
Страница в интернете, почему же она не находится?
Поиск страницы по узкому запросу:
• найти и проиндексировать
Поиск новостей на свежую тему:
• не так просто, само не найдется!
• свежее составляет 0.1% от базы, но нужно в 20% случаев
• не накопились факторы: ссылки и пользовательское
поведение
33
Real-Time робот
• распределенная RT-архитектура
• непрерывное обновление веб-графа
• CrawlRank (aka OPIC) алгоритм - RT PageRank
• адаптивный переобход хабов для поиска нового
• десятки фидов об обновлениях
• RT-индексация и поиск
Выкладываем лучшие документы с задержкой в
секунды
34
Новости по широкому запросу
• найти новости по [навальный] ранжированием не
получится
• вероятность << 0.1%
• если были новости, то нужно много свежего
• если нет, то свежее - вряд ли хорошее
• нужен "семантический" триггер
• величина "свежего интента“ - вероятность, что
пользователь с таким запросом хочет свежее – [захват автобуса норвегия] = 90%
– [цискаридзе] = 40%
– [задорнов] = 10%
35
Детектор свежести
• классификатор наличия потребности в свежем
• самый большой в поиске, на 150 факторах: – изменение частоты запросов
– появление новостных сюжетов
– увеличение кол-ва релевантных свежих
– клики на свежее
– всплеск слова в Твиттере
– новостные слова (взрыв, заявил, путин)
• 10% - немного свежего (0.2)
• 6% - много свежего (0.4)
• 2% - только свежее (0.9)
36
Разнообразие при неоднозначности
• один запрос - одна выдача - много интентов
• удовлетворить разных пользователей одной
страницей => разнообразие
• смешиваем вертикали: веб-поиск, свежесть, видео,
региональная ...
• метрика WidepFound (расширение pFound): – вероятности интентов
– релевантности документов для интентов
37
Спектр - универсальное разнообразие
• учимся понимать запросы [объект потребность]:
[битлз mp3 скачать]
• считаем вероятности потребностей по логам
запросов
• смешиваем по запросу [битлз] выдачи для – [битлз слушать онлайн]
– [битлз видео]
– [битлз фото]
– [битлз википедия]
Это для начала!
Top Related