Идея простая:



Подготовка:



1. Берётся база знаний как некий набор текстов (documents). Тексты бьются на кусочки, скажем, по 64 или 128 токена (их называют чанками или нодами).



2. Каждый кусочек текста прогоняем через некоторую маленькую вспомогательную предобученную модель (embedding model), которая трансформирует каждый кусочек в вектор ("смысл кусочка", или на инженерском, эмбеддинг).



3. Эти вектора (и исходные кусочек текста и документ откуда они взяты) складываются в некое хранилище, которое называется "векторной базой данных" или "индексом".



Инференс:



1. Retrieval. От пользователя приходит запрос или вопрос. С помощью всё той же вспомогательной модели превращаем его в вектор, находим 2-3-5 самых похожие: либо напрямую, через kNN (k nearest neighbors, k ближайших соседей), либо через ANN (approximate nearest neighbors, приближённый поиск ближайших соседей) – на случай если база знаний очень большая и точный поиск затруднён.



2. Далее с найденными релевантными кусочками текста можно делать что угодно: можно вытащить весь исходный документ (особенно если они небольшие, скажем, по 500-1000 токенов), можно вытащить некую окрестность ближайших кусочков токена в том же документе, в котором нашли данный.



3. Наконец, формулируем промпт для базовой модели (GPT): вставляем исходный вопрос, далее говорим, мол, "вот что тебе может пригодиться при ответе" (ставить подтянутый контекст до или после – сильно зависит от ваших юзкейсов, подумайте, почему), – и далее случается магия, при генерации своего ответа теперь GPT будет опираться на наш контекст из базы знаний, какого бы размера она не была.



Впервые Я услышал эту идею в лекции Игоря Котенкова про модель RETRO (Retrieval-Enhanced Transformer) от DeepMind из статьи "Improving language models by retrieving from trillions of tokens".



Завести описанный пайплайн несложно, это займёт у вас не больше 1 вечера. Ваши друзья здесь: LlamaIndex и LangChain, под это дело там и там есть специальные утилиты, если не сориентируетесь – у них есть языковая модель поверх... документации, которая тоже работает по описанному принципу. Задайте вопрос – и она поможет найти и разобраться.



P.S. Как-то Александр Дьяконов пошутил, что лучший алгоритм в машинном обучении – это kNN, а остальные модели – это попытки его аппроксимировать, нивелировав те или иные недостатки. Тут же мы прямо возвращаемся назад к истокам.