Приемы крупнейших игроков в области масштабирования становятся все более актуальными для остальных, что выражается в распространении инверсии архитектуры, пишет на портале The New Stack Джон Братсет, основатель и генеральный директор Vespa.ai.

Вы когда-нибудь задумывались, как крупнейшие мировые интернет- и социально-медийные компании могут так быстро доставлять алгоритмизированный контент столь большому количеству пользователей?

Представьте себе, что нужно делать таким, как TikTok, чтобы обеспечивать людей бесконечным потоком персонализированных видеоклипов на их телефоны. У них есть некая модель, представляющая пользователя, и они должны использовать ее, чтобы найти среди миллиардов альтернатив наиболее подходящие клипы для показа именно этому пользователю. А поскольку у них миллиарды пользователей, им нужно делать это миллионы раз в секунду.

Традиционные решения

Наивный способ решить проблему TikTok — сравнить модель пользователя с каждым видеоклипом, чтобы определить, насколько каждый из них подходит данному пользователю. Многие понимают, что такой подход не работает — при миллиарде видео и миллионе запросов в секунду это превращается в квадриллион сравнений в секунду!

Очевидным решением этой проблемы является индексирование: поддержка структуры данных, которая позволяет находить подходящие согласно модели пользователя видеоклипы без необходимости рассматривать каждый клип. Например, если в модели пользователя отмечается предпочтение англоязычных видеороликов, видеоролики можно проиндексировать с помощью B-дерева, которое указывает непосредственно на англоязычные видеоролики, а остальные можно игнорировать. Или, если пользователь представлен в виде векторного вложения его интересов, можно использовать векторный индекс, например алгоритм Hierarchical Navigable Small World (HNSW), чтобы найти видео с похожими векторами, не обращая внимания на остальные.

Реальные системы будут использовать комбинацию таких индексов. Сейчас эти индексы дают лишь приблизительное представление о том, какие видео могут подойти пользователю. Чтобы действительно определить контент, который пользователи считают наиболее интересным или полезным, необходимо провести более точное сравнение между пользовательской моделью и каждым элементом-кандидатом — в наши дни это часто делается с помощью нейронных сетей. Вот тут-то и начинается самое интересное.

Масштабирование без ущерба для качества

Обычный способ повторной оценки заключается в передаче элементов-кандидатов, полученных из индексов, другому компоненту в вашей архитектуре, выполняющему детальный скоринг каждого из них. Сколько элементов должно быть пересчитано таким образом? Это должна быть определенная доля всех кандидатов.

Чтобы представить себе это, надо понимать, что индексированный поиск плюс повторный скоринг — это приближение к оценке всех кандидатов полным перебором, и нам нужно учитывать потери качества от этой оптимизации. Это можно выразить в терминах вероятности того, что данное видео, которое было бы показано пользователю при полном переборе, присутствует в наборе, подлежащем повторному ранжированию.

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

Давайте конкретизируем и скажем, что мы хотим повторно оценить 1% кандидатов и что каждый элемент содержит 2 Кб данных, полезных для окончательного скоринга (примерно один вектор и сто свойств). При миллиарде элементов это означает 10 млн. элементов для повторной оценки на один запрос, а при миллионе запросов в секунду это означает, что для повторного скоринга нам нужно перемещать 20 Пб данных в секунду! Даже на этом небольшом масштабе метод явно далек от жизнеспособности, так что же делают крупные игроки?

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

Зачем инверсия архитектуры нужна остальным?

Почему это должно волновать остальных, ведь мы не обладаем большинством из миллиардов пользователей, которыми обременены TikTok, Google и им подобные? Инверсию архитектуры делает актуальной ряд факторов:

  • Алгоритмы MО совершенствуются, как и локальные вычислительные мощности, а это значит, что полный скоринг элементов дает больший прирост качества и, в конечном счете, прибыли, чем это было раньше.
  • С появлением векторных вложений сигналы, потребляемые такими алгоритмами, выросли на один-два порядка, что делает узкие места в сети более серьезной проблемой.
  • Применение все большего количества данных для решения задач становится все более экономически выгодным, а это значит, что для поддержания постоянного уровня потери качества необходимо повторно обрабатывать все больше данных.
  • Поскольку потребителями данных из таких систем становятся в основном не люди, а LLM в RAG-решениях, становится выгодным быстрее предоставлять бóльшие объемы скоринговых данных в большем количестве приложений, чем раньше. Это приведет к тому, что большинство приложений будут поставлять LLM высококачественные данные для рассуждений в длинных цепочках, чтобы они могли принимать высококачественные бизнес-решения в нечеловечески быстром темпе.

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

Чтобы действительно реализовать это, вам также нужна платформа, которая может управлять данными, индексацией и вычислениями соответствующим образом. В качестве примера приведу Open Source-платформу Vespa.ai, которая начала свой путь как решение Yahoo для инверсии архитектуры, когда Yahoo была одним из крупных игроков. Платформа позволяет вместе хранить и индексировать структурированные данные, векторы/тензоры и полный текст на любом количестве машин и выполнять любые тензорные вычисления и МО-выводы локально в месте хранения данных.