Что такое RAG в LLM и причём тут векторные базы данных — Transcript
Full transcript
- 0:00Здравствуйте. При работе с LM-моделями
- 0:03вы всё чаще и чаще можете слышать такое
- 0:06понятие, как рак или раксистема. В этом
- 0:09видео я постараюсь объяснить и на
- 0:12примерах показать, что такое рексистема,
- 0:15как она работает и как правильно
- 0:18работать с текстами для получения
- 0:20наилучшего результата. Но для начала
- 0:22давайте определимся, что же такое
- 0:24система. Ну, вообще
- 0:27Retrieval Retrieval Augmented
- 0:29generation. И меня в комментах ругают за
- 0:32моё произношение,
- 0:36поэтому это дополненная генерация
- 0:39поиска. Какую же проблему она решает?
- 0:42Перейдём в код. В этом видео я буду
- 0:44показывать примеры на Python. Да, знаю,
- 0:47многие подписались на меня по моим
- 0:49роликам по N8N, но я думаю, что эта
- 0:52информация будет полезна и вам.
- 0:54Допустим, мы по А работаем с
- 0:56LLM-моделью. В моём случае это Мистраль.
- 1:00И давайте попросим её рассказать о нашем
- 1:03магазине в городе Киров. ООО Ромашка.
- 1:06Делаем запрос и видим ответ, что у
- 1:09модели нет актуальной информации о
- 1:12графике работы конкретной организации.
- 1:14Ну и она предлагает нам различные
- 1:16варианты, где мы эту информацию можем
- 1:18получить. Ну, в принципе, честно, не
- 1:20соврала. Номо модель не то чтобы не
- 1:23знает о нашей организации, она даже не
- 1:25знает более фундаментальные вопросы.
- 1:28Если мы спросим, кто сейчас президент
- 1:29США, то ответ будет более чем
- 1:32интересный. И здесь модель не врёт и
- 1:35честно говорит нам, что данная модель
- 1:38обучена на данных октября двадцать
- 1:40третьего года. И то, что произошло после
- 1:42октября двадцать третьего года, она не
- 1:44знает и не может знать, ровно как она и
- 1:47не знает о работе вашего бизнеса. Ну или
- 1:50о вас. Так как же нам сделать так, чтобы
- 1:53модель всё-таки имела какое-то
- 1:56представление о нужных нам данных и
- 2:00работала с ними? Как раз-таки здесь и
- 2:01используется рексистема. Мы можем помочь
- 2:05модели, передав в наш промт те данные,
- 2:09на основании которых она должна
- 2:10подготавливать ответ. Вот пример такого
- 2:12запроса. У нас есть System Promt, где мы
- 2:15задаём модели роль
- 2:16продавца-консультанта.
- 2:17Она должна отвечать только на основании
- 2:19представленного контекста. То есть
- 2:21появляется у нас некий контекст, в
- 2:23который мы будем передавать нужную нам
- 2:26информацию. И здесь инструкция, что
- 2:29нужно передать. Сам контекст выглядит
- 2:31вот так. Режим работы с 8 до 20. Шоурум
- 2:35на улице Ленина, пункт выдачи на улице
- 2:37Пушкина. Ну и вопрос всё тот же самый.
- 2:40Расскажи график работы о Ромашка в
- 2:42городе Киров. В инструкции это дело
- 2:44описано. У него есть контекст и вопрос.
- 2:48Сам запрос к модели выглядит абсолютно
- 2:50так же. Попробуем запустить и видим, что
- 2:52ответ уже совершенно другой. Модель уже
- 2:55знает про нас, про наш бизнес и
- 2:57рассказывает, что режим работы такой-то,
- 3:01и даже подсказывает, что нас может
- 3:03заинтересовать. Рассказывает про шоурум
- 3:06и пункт выдачи. Далее задаёт вопрос: "В
- 3:09целом к реализован? Вся суть РК я уже
- 3:13показал. И в принципе, если в рамках
- 3:17ваших запросов объём информации
- 3:19небольшой, ну, действительно, например,
- 3:21режим работы, там, график доставки и так
- 3:25далее, ну, то есть объём информации не
- 3:28превышает, ну, на мой взгляд, 1.000
- 3:30символов, то в целом можно так всё и
- 3:33оставить. Описываете промт, указываете
- 3:36контекст, просто переменный, даже его
- 3:37передаёте сюда, прямо вот сюда, и с этим
- 3:40и работаете. Никакая дополнительная
- 3:42система вам не нужна. Но всё-таки,
- 3:44скорее всего, у вас есть большой объём
- 3:46информации. Возможно, это магазин, где
- 3:50есть сотни тысяч наименований товаров, и
- 3:53про каждый нужно рассказать. Возможно,
- 3:55это какой-то продукт, и там большое
- 3:59количество вопросов, может быть,
- 4:01возникнуть по этому продукту. Ну, я не
- 4:02знаю. Либо же вы сдаёте в аренду
- 4:04квартиру, где вы в описании должны
- 4:07предусмотреть ответы на все вопросы,
- 4:10которые могут возникнуть. Поэтому вам
- 4:11нужна уже непосредственно система. Как
- 4:14она строится? Как вы уже поняли, наша
- 4:17задача передать некий контекст в system.
- 4:21Этот контекст нам откуда-то нужно взять.
- 4:24Мы же не можем поместить всю нашу базу
- 4:26данных, там 1.000 строк прямо в
- 4:29контекст. Ну это просто запутал модель.
- 4:32И результат будет не очень хороший. Мы
- 4:34должны передавать только то, что нужно.
- 4:36Ну, приходит на ум построить некую
- 4:38систему, где у нас будет информация
- 4:41храниться и извлекаться, исходя из,
- 4:44собственно, самого вопроса. Если мы
- 4:46здесь спрашиваем по график работы, то
- 4:49именно график работы как поисковый
- 4:51запрос должен пойти в базу, на основании
- 4:53этого поискового запроса выдать нам
- 4:55информацию о режиме работы и передать в
- 4:58контекст. И, конечно же, мы здесь можем
- 5:00использовать любые базы. Ну, тот же
- 5:03самый постгрес, например, с поиском по
- 5:04шаблону. Но это очень сложная и заведомо
- 5:08провальная стратегия, потому что уже всё
- 5:10придумано, а именно векторные базы
- 5:13данных. Что же такое векторные базы
- 5:15данных и, в принципе, что такое вектор?
- 5:18Попробую объяснить максимально просто. И
- 5:20да, кто знаком с темой, могут сказать,
- 5:22что я слишком сильно упростил, но не
- 5:24кидайте в меня помидорами. Пытаюсь
- 5:26объяснить максимально доступно.
- 5:28Предположим, что у нас есть несколько
- 5:31предложений. Привет, как дела? Как
- 5:33делать прикорм и как приготовить кашу? И
- 5:36каким-то образом нам нужно сравнивать
- 5:39эти предложения. Ну, первое, что
- 5:42приходит на ум - это каким-то образом
- 5:44отцифровать данные буквы. Ну, так как
- 5:47это русский алфавит, мы можем сделать
- 5:50оцифровку таким образом. Каждой букве
- 5:53представить её номерное значение в
- 5:55алфавите. Ну, например, привет - это 17,
- 5:5818, 10, 3 6 20. а на пробел поставить
- 6:02ноль. И теперь наши предложения, они
- 6:04превратились в некий набор чисел. Вот мы
- 6:07можем их посмотреть. Далее эти числа мы
- 6:09можем уже между собой сравнивать. И вот,
- 6:11например, у нас есть привет. При есть и
- 6:15в прикорме, при есть и в слове
- 6:17приготовить. То же самое и дела, и
- 6:21делать, как и ка. И, очевидно, если мы
- 6:25сравниваем все эти три фразы, то первая
- 6:29фраза имеет больше общего именно что со
- 6:32второй фразой. Здесь совпадений явно
- 6:35больше, чем в третьей фразе. Ну, если
- 6:38посмотреть, то при таком подходе слова
- 6:41привет, прикорм и приготовить у нас
- 6:43совпадают, хотя в них заложен совершенно
- 6:46иной смысл. Поэтому обычным простым
- 6:49сравнением некого кодового представления
- 6:52буквы или фразы дело не
- 6:55ограничивается. При работе используется
- 6:57именно что вектор. Что же такое вектор?
- 7:00Вот мы разобрали наше слово,
- 7:02предложение, ну либо вообще весь
- 7:04документ. Я показываю на примере слова.
- 7:07И буква П, она не просто имеет значение
- 7:1117, да, как в алфавите. Ну, понятное
- 7:14дело, что не 17. Опять-таки повторюсь,
- 7:15что здесь я максимально упростил, и это
- 7:18работает сильно сложнее, чем я
- 7:20показываю. И не просто 17, да, у него
- 7:23значение, а эта буква, она находится в
- 7:26неком пространстве. И пространство её
- 7:29нужно высчитать. Ну, примерно как
- 7:30координата GPS, что она не просто
- 7:32находится здесь, а она находится на
- 7:35каком-то удалении от R, на каком-то
- 7:38удалении от I и на каком-то удалении от
- 7:41пробела, либо же от следующей. Ну, уже
- 7:43здесь Г, да, например, будет либо уже от
- 7:45следующей буквы. И длины удалений букв,
- 7:50ну, по большому счёту, координаты. Это и
- 7:52есть векторное представление. То есть мы
- 7:55собираем не просто значение некоторое, а
- 7:58именно вот этот вот порядок слов. Ну,
- 8:01если мы приводим к вектору только буквы,
- 8:04там, конечно, будут только буквы, да?
- 8:05Если мы приводим целые выражения и
- 8:07фразы, то они таким же образом будут
- 8:09выстраиваться в некий вектор, в некую
- 8:12последовательность. И мы можем замерять
- 8:14длины до тех или иных кусочков. И в
- 8:17итоге P у нас превращается не просто в
- 8:1917, а в набор чисел, набор длин до тех
- 8:24или иных букв. И, естественно, вот эта
- 8:27P, она будет сильно отличаться от этой
- 8:30или от этой. А далее, так как мы имеем
- 8:34значение этих векторов, мы их можем
- 8:36сравнить. методов сравнения векторов
- 8:39существует большое количество, но самым
- 8:41популярным является косинусное сходство,
- 8:44которое показывает, насколько вектора
- 8:46схожи между собой. Давайте посмотрим,
- 8:49как выглядит этот самый вектор. Я здесь
- 8:51описал какие-то числа, нумера букв
- 8:53алфавите. Естественно, это выглядит не
- 8:55так, а намного сложнее. Ну давайте всё
- 8:57то же самое слово привет. Привет и
- 8:59пробел. И посмотрим. И вот таким образом
- 9:02выглядит слово привет с использованием
- 9:06трекмоделей. Видите, какой большой
- 9:08словарь? С большим количеством чисел с
- 9:10плавающей точкой, ну, а точнее, там 1024
- 9:14значения. Данный вектор был создан
- 9:17процессом embбединга с помощью открытой
- 9:21модели от Сбера. Давайте рассмотрим, что
- 9:24это за модель. Это открытая модель. Она
- 9:26свободно распространяется, выложена на
- 9:28huging face и также может и вызываться
- 9:31через huging face interfей. Она
- 9:33представляет собой модель для работы с
- 9:37русским языком и с поддержкой неких
- 9:40инструкций. Почему именно эта модель, а
- 9:42не, например, не edдин модель от чата
- 9:45GPT?
- 9:46Beding модель чата GPT, конечно, тоже
- 9:48хороша, но исходя из исследований для
- 9:52работы с русским языком эта модель
- 9:55является наилучшей. Но оно и понятно. Я
- 9:58тестировал различные мультиязычные
- 10:00модели. Да, если у вас текст смешанный,
- 10:03то смело используйте чат GPT. Но если вы
- 10:06хотите добиться наилучшего результата,
- 10:08то предлагается именно эта модель.
- 10:11Причём она может быть развёрнута и
- 10:13локально. У меня как раз здесь два
- 10:16варианта. Это локальное её
- 10:18представление. Я её просто скачал. При
- 10:21первом скачивании вам нужно будет
- 10:23указать авторизацию на hgging face. Ну а
- 10:26после скачивания, после первого запуска
- 10:28вы можете её запускать уже без
- 10:30авторизации. Напомню, она абсолютно
- 10:32бесплатно и работает на локальной
- 10:35машине. Есть ещё и представление по апи,
- 10:38где мы также можем работать с этой
- 10:40моделью, но уже по апи запросу. Модель
- 10:43на вход принимает некий текст в виде
- 10:46инпута, ну либо здесь в виде просто
- 10:49текста, а на выходе возвращает как
- 10:51раз-таки список с вектором, с которым мы
- 10:55уже дальше можем работать. А что делать
- 10:57с этим вектором? Ну, по большому счёту,
- 10:59его нужно поместить куда-то в базу
- 11:02данных. Я, в принципе, видел в своей
- 11:04практике варианты, когда подобные
- 11:06вектора помещали и в базу данных Redis,
- 11:09и просто в постгрес без какого-то Vector
- 11:12Store. Но для работы с векторами
- 11:15существуют специализированные базы
- 11:17данных. Их большое количество. Это может
- 11:19быть и Supase, это может быть и Mongo DB
- 11:23Vector Store. Но одним из
- 11:26профессиональных решений является
- 11:29векторная база данных Квадрант. Она
- 11:31также openсоourсная и доступная, но
- 11:33помимо этого на своём сайте они
- 11:36предоставляют бесплатные лимиты в виде
- 11:38одно гигабта хранения данных бесплатно,
- 11:42так что её можно использовать и в
- 11:44облаке, в том числе я её развернул
- 11:46локально в докер и производил различные
- 11:49тесты. Для теста я решил взять
- 11:52Telegram-канал и из этого
- 11:54Telegram-канала вытащить посты. Так как
- 11:56в моём Telegram-канале не так много
- 11:59постов, результат бы получился
- 12:01неинтересным. Поэтому я взял одного
- 12:04знаменитого инфобизнесмена, который
- 12:07своей рекламой заполонил всю мою ленту
- 12:10на YouTube. И я решил, ну, пусть хоть
- 12:12какую-то пользу принесёт. Я взял
- 12:14полностью Telegram-канал, вытащил все
- 12:17сообщения, проработал с текстом этих
- 12:20сообщений и отмбедил их. Давайте
- 12:24посмотрим. Первым делом вычитываем JON.
- 12:26Кстати, откуда взялся этот JSON? Любой
- 12:28пользователь Telegram может скачать
- 12:30любой Telegram-канал себе на компьютер,
- 12:33просто выкачив историю всех постов и
- 12:37сохранив их в формате JSON. И вы
- 12:40получите нечто подобное. Далее смотрим
- 12:42количество сообщений всего. Вытаскиваем
- 12:45количество сообщений, вытаскиваем
- 12:48Message ID, оно нам понадобится. И далее
- 12:51работаем с текстом. Ну, так как текст в
- 12:53сообщениях в Телеграме представлен вот
- 12:55таким вот блоком. Это такой словарь, где
- 12:59указаны куски текста, мы их собираем в
- 13:02единый текст, а потом сливаем их в
- 13:05единую строку. После этого нам нужно
- 13:08поместить этот текст в базу Квадрант.
- 13:12Сама по себе база квадрант, она
- 13:14представляет собой набор неких
- 13:16коллекций. Ну, грубо говоря, это как бы
- 13:18таблицы, но так как это всё-таки
- 13:20векторная база данных и там нет ни
- 13:22иерархии, ничего, по большому счёту, и
- 13:25записи-то там нет, то это именно что
- 13:28коллекции. Для создания коллекций
- 13:30используется функция create collection,
- 13:33которая принимает в себя подключение к
- 13:35базе данных. Далее создаётся коллекция с
- 13:39именем коллекции и конфигурация для
- 13:43векторов. Данная конфигурация принимает
- 13:45в себя два параметра. Это по какому
- 13:48принципу будет происходить поиск. Ну,
- 13:51как раз-таки косинусное сходство и есть
- 13:54некий сайз, то есть размерность этой
- 13:56коллекции. Что такое размерность?
- 13:59Размерность - это какое количество
- 14:02значений вектора будет в одном векторе.
- 14:04Как я и показывал выше, данная модель
- 14:07отдаёт векторы в размере 1024 элемента.
- 14:12Есть embeding модели, которые отдают
- 14:14вектор меньше или больше. Вообще это
- 14:16очень важный момент. Если мы готовим
- 14:19данные к векторизации, а потом
- 14:21векторизуем, то в процессе мы и должны
- 14:24использовать эту модель. То есть мы не
- 14:26можем создать векторы одной моделью, а
- 14:29искать их другой. Поэтому раз мы выбрали
- 14:32одну модель, её и используем. И вот этот
- 14:35вектор сайз, он передаётся в вектор
- 14:38параметр. Хорошо, коллекция создана.
- 14:41Далее в эту коллекцию мы добавляем
- 14:44данные. Я описал это в методе addpint.
- 14:47Давайте рассмотрим его. Также на клиенте
- 14:50вызываем метод obsert, указываем
- 14:53collection name и добавляем некий point.
- 14:56По большому счёту, это та самая запись в
- 14:59базу данных, но так как это векторная
- 15:02база данных, это не какая-то строка, это
- 15:05не row, это именно что point, то есть
- 15:08точка вот в этом вот векторном
- 15:10пространстве. Поэтому она называется и
- 15:12point. Сам по себе point на вход
- 15:15принимает три параметра. Это ID,
- 15:18собственно, сам вектор. Ну, как работает
- 15:21вектор, мы уже определились. Мы передаём
- 15:23туда текст, получаем словарь с данными и
- 15:26кладём его в значение вектор и некий
- 15:29pilot. Что нам класть в pilot? Ну, по
- 15:32большому счёту, можете класть туда всё,
- 15:34что угодно. Pelo представляет собой JSON
- 15:38формат, и по большому счёту, вы можете
- 15:40положить туда хоть целое сообщение, хоть
- 15:43любой контент, всё, что хотите, но по
- 15:46логике вещей вы должны класть туда
- 15:49данные, относящиеся непосредственно к
- 15:50самому вектору. И да, важный момент, при
- 15:53сравнении этих самых поинтов, при поиске
- 15:56информации будут сравниваться именно что
- 15:58вектора. То есть у нас будет один вектор
- 16:00и второй вектор, и мы будем искать между
- 16:02ними как раз-таки косинусное сходство. И
- 16:05pilout он не будет учитываться, но при
- 16:08этом сам вектор мы обратно в текст
- 16:11превратить уже не сможем. И именно
- 16:13поэтому мы должны будем вычитывать этот
- 16:16самый контент из пайлоуда. В моём случае
- 16:20Pload выглядит таким образом. Есть некий
- 16:23контент, как раз-таки туда попадает
- 16:25текст и есть некая метадата, куда я
- 16:28помещаю, ну, собственно, метадату. Мета
- 16:30у меня одна, это message ID, ну, данного
- 16:33канала. Почему именно в таком варианте?
- 16:36Это связано с тем, что обычно поиск по
- 16:39векторным базам данных и, в принципе,
- 16:41база данных квадрант, она используется
- 16:44при работе с LM моделями и при вычетке
- 16:47данных из базы данных. LLM модели нужен
- 16:51именно что такой формат, где у нас есть
- 16:53контент и есть метадата. Да, здесь это
- 16:56не указано и такой формат не указан, но
- 17:01нужно указывать именно так. Хорошо,
- 17:03добавили. Теперь, ну, я сейчас запускать
- 17:06этот код не буду, я его уже запускал, у
- 17:08меня уже данные есть, данные уже
- 17:10записаны. И понятное дело, что я это уже
- 17:12дело уже запускал, а было собрано
- 17:162.668 точек. Давайте посмотрим, как
- 17:19выглядят эти самые точки. Вот у нас есть
- 17:21здесь некий ID. Здесь есть тот самый
- 17:23текст, который мы передаём, вектор и,
- 17:26собственно, длина этого самого вектора.
- 17:28Можем посмотреть, вот найти, например,
- 17:30похожие. Даже здесь это дело возможно. И
- 17:33можем здесь, а, вычитать ту или иную
- 17:36информацию. Ну, давайте попробуем
- 17:38вычитать это с помощью Python. Для этого
- 17:40у меня оформлена функция findк. И
- 17:43попробуем что-нибудь найти. Данная
- 17:45функция принимает в себя collection name
- 17:48и делает поиск с указанием collection
- 17:50name. Далее тот текст, который мы ищем,
- 17:54ну, ищем мы, естественно, ближайший
- 17:56текст, она его превращает в векторное
- 17:59представление, ну, в этом случае уже по
- 18:01апи. И именно, что вектор является
- 18:04значением query, значением того, что мы
- 18:07ищем. А на выходе мы в результате
- 18:09получаем количество точек, где мы можем
- 18:12посмотреть их схожесть. Как раз-таки вот
- 18:15этот вот point scope, это и будет
- 18:18схожестью. И можем вычитать pilot.
- 18:21Давайте попробуем. Возьмём модель Clear
- 18:24Embatings. Это та модель, которую я и
- 18:27собирал с функцией, которая была описана
- 18:30выше. Давайте сделаем запрос и смотрим
- 18:32на результаты. Запрос был точки роста
- 18:35бизнеса. Ну, так как это инфо-бизнесмен,
- 18:37спрашиваем мы его о бизнесе. Первый
- 18:41вариант - это сходство 0,65. И здесь
- 18:44видим ответ. Далее, следующая точка уже
- 18:47идёт по нисходящей. Тоже 0,65, но уже
- 18:52меньше подходящая. Ну и так далее.
- 18:55Можете поставить на паузу результат,
- 18:57посмотреть самостоятельно, попало или не
- 18:59попало. Но в целом, а, да, здесь,
- 19:02наверное, вау эффекта не получится, но
- 19:05что-то более-менее связанное-то он
- 19:07отдал. Мы что-то дополучили. Давайте
- 19:10попробуем ещё этот вопрос. И здесь уже,
- 19:13да, сильно лучше, вроде как, даже по
- 19:15теме. Опять-таки можете сами оценить и
- 19:18посмотреть. Вообще, наверное,
- 19:19действительно вау эффекта не получится,
- 19:21потому что когда я тестировал
- 19:24мультиязычные модели, а точнее чат GPT
- 19:27small версии на запросы о маркетинговой
- 19:31стратегии, точке роста бизнеса, как
- 19:34заработать миллион и так далее, он мне
- 19:35выдавал, конечно, абсолютную чушь. И,
- 19:38например, на запрос заработать миллион
- 19:41он мне выдал Мальдивы. Здесь более-менее
- 19:43даже нормально, хотя тоже в выдаче
- 19:46попадается какой-то несвязанный бред.
- 19:49Вообще, с чем это связано? Вот как бы
- 19:51такой неудовлетворительный результат. А
- 19:53связано это с тем, что да, точки мы
- 19:55добавили, мы их собрали, взяли текст,
- 19:58сделали его имбединг, но с текстом мы не
- 20:01поработали. Мы его взяли сырым,
- 20:03оттембедили и отправили. И на выходе
- 20:06получили, ну вот результат, который
- 20:08получили. Как же делать правильно? Есть
- 20:11несколько путей. Первый путь - это
- 20:13простая очистка текста и более глубокая.
- 20:16Если у нас большое количество
- 20:18информации, ну или информация такая вот
- 20:20шуточная, да, условно говоря, потому что
- 20:22в реальности я-то не буду нигде это
- 20:23использовать. Я взял, чтобы показать вам
- 20:26в качестве примера. Поэтому здесь
- 20:29достаточно убрать лишние пробелы,
- 20:31специальные символы и привести всё к
- 20:34нижнему регистру, так, чтобы все буквы у
- 20:37нас были в нужном одном
- 20:40регистрелов. По-хорошему ещё очистить
- 20:43эмодзи, так как это всё-таки посты в
- 20:45Telegram-канале, там очень много эмодзи,
- 20:48которые тоже могут мешать, давать те
- 20:51самые шумы и мешать бедингу. Второй
- 20:53путь, который тоже подойдёт - это
- 20:56очищение текста с помощью LLM-модели. Ну
- 20:59вот, например, рассмотрим про МТ. Ты
- 21:02эксперт по подготовке текстов данных для
- 21:04создания векторных представлений. То
- 21:06есть мы ему задаём роль. Далее удаляем
- 21:09все лишние элементы: HTML, теги,
- 21:13специальные символы и так далее. Приведи
- 21:16сокращение к полной форме. Тоже важно. У
- 21:18нас не должно быть никаких сокращений.
- 21:21Удали стопслова. Конечно же, если у нас
- 21:25идёт запрос от пользователя, а запрос
- 21:27может быть: "Добрый день, а подскажите,
- 21:30пожалуйста, как работает ваш магазин?"
- 21:32Понятное дело, что вот фразы добрый день
- 21:35там, подскажите, пожалуйста, это всё
- 21:36лишние слова, лишние фразы, и это
- 21:38эмбедить не нужно. Это для эмбединга
- 21:41является мусорными словами, и от них
- 21:43нужно избавляться. Также нужно указать
- 21:46явные связи. И, конечно же, в тексте не
- 21:49должно быть указания в никуда, да? То
- 21:52есть мы не можем говорить, что у нас всё
- 21:54работает быстро, да? Мы должны указать,
- 21:56где, что и как конкретно, иначе
- 21:59семантика будет опознана неверно. В
- 22:02целом данный промт может являться не
- 22:04только инструкцией для LLM-модели, а в
- 22:06том числе и для вас. На мой взгляд, он
- 22:09отработал средненькую. Я смотрел и
- 22:12сравнивал, что текст до очистки с
- 22:15LLM-моделью и после, ну, где-то в 20
- 22:19процентах он, конечно, генерировал чушь
- 22:22и сам генерировал этот самый мусор. И
- 22:25поэтому в идеале, конечно же, лучше
- 22:28подготавливать тексты руками, очищать,
- 22:31приводить к нормальной форме, удалять
- 22:33лишнее и так далее. Но если текста
- 22:35много, либо он не особо важен, то можно
- 22:38и воспользоваться данным промтом. Ну,
- 22:40здесь всё просто. Мы задаём ему прот,
- 22:42задаём ему текст и result этот
- 22:44записываем. Это вот второй путь. После
- 22:48этого результаты будут сильно лучше. Но
- 22:52в этом примере были Telegram-посты, и
- 22:55они, конечно, не особо большие. Там, в
- 22:57принципе, максимум 1.00 символов, хотя
- 22:59это тоже много, и лучше бы их тоже
- 23:02разбивать. Проблема эмбединга в том, что
- 23:05у нас текст, который мы передаём на
- 23:07бединг, он может быть большой. Ну,
- 23:09допустим, там 1.500 символов, а запрос
- 23:12от пользователя всего лишь там
- 23:13три-четыре слова. И, естественно, вектор
- 23:17трёх-четырёх слов и вектор 1.500
- 23:19символов по размерности он будет
- 23:22одинаковый. И, конечно же, в таком
- 23:24случае будет сложно найти нужную нам
- 23:27информацию. Поэтому существует наиболее
- 23:30лучший и удачный подход - это разбиение
- 23:33текстов начанки. Да, мы применяем всё то
- 23:35же самое. Также очищаем текст, приводим
- 23:39его к нижнему регистру, очищаем его с
- 23:43помощью lmмодели, а лучше руками. Если у
- 23:46вас небольшое количество текста,
- 23:48поработайте с ним руками. Не надо
- 23:50полагаться на LLM-моделях в этом случае.
- 23:52А дальше разбиваем текст на чанке. Что
- 23:55такое чанки? Так как работа с
- 23:58embedдингом она не нова, всё уже
- 24:00придумано до нас. В библиотеке Linkchain
- 24:03есть такой инструмент, как текст
- 24:06splitter, который разбивает наш большой
- 24:08текст на различные кусочки. Он принимает
- 24:11в себя текст. Далее мы указываем размер
- 24:15этого кусочка и каково должно быть
- 24:18перекрытие. И указываем сепараторы, ну,
- 24:21то есть разделители, где мы должны
- 24:22делить этот самый текст. В ответ он
- 24:25возвращает список с текстом. Но
- 24:28опять-таки он делит его не просто по 300
- 24:32символов, а он возьмёт, конечно, где-то
- 24:34больше, где-то меньше, плюс добавит ещё
- 24:36по 50 символов перекрытия, таким
- 24:38образом, чтобы не терялся контекст. И
- 24:41уже вот эти маленькие кусочки в 300
- 24:43символов, они, конечно же, сильно ближе
- 24:46по размеру к задаваемому вопросу от
- 24:49пользователя. Ну, навряд ли пользователь
- 24:51распишет вам вопрос на 1.00 символов.
- 24:54Скорее всего, там будет, ну, максимум
- 24:56одно или два предложения, из которого
- 24:58половина ещё и будет мусор. Поэтому
- 25:00подход с чинкованием текста выдаёт прямо
- 25:04очень хороший результат. После этого мы
- 25:07проходимся по всем чанкам и загружаем
- 25:11каждый чанк на ме. Но при этом в
- 25:16контекст мы помещаем весь наш текст
- 25:19целиком. То есть, допустим, изчи
- 25:22символов у нас получилось, ну, пускай
- 25:24будет пять чанков. Мы эти пять чанков
- 25:27отдельным образом передаём в бей, а в
- 25:30пайлоуде, в контексте мы храним полную
- 25:34нашу информацию, полный текст. И в таком
- 25:37случае как бы будет происходить поиск,
- 25:40ну, чуть ли не по предложениям. Ну, по
- 25:42предложениям делить тоже плохо. Всё-таки
- 25:45они должны быть именно что чанками, да,
- 25:46вот этими кусками. по предложениям
- 25:48делить тоже плохо, но тем самым мы,
- 25:52вытащив нужную информацию, найдя нужную
- 25:54информацию в базе, мы её вытаскиваем, а
- 25:57в LM моделям передаём уже полностью
- 25:59текст без потери контекста и, ну,
- 26:02основную мысли, да. Поэтому чанки нужно
- 26:05использовать. Ну, естественно, если вы
- 26:07переводите в векторное представление,
- 26:10там целую книгу, то целую книгу, конечно
- 26:12же, в контекст передавать не нужно.
- 26:14Здесь нужно нечто другое, может быть,
- 26:16как-то абзац передавать, а либо главу,
- 26:19если глава небольшая. Но, конечно, не
- 26:21целую книгу в контент нужно передавать,
- 26:24но на примере с Telegram-каналом, я
- 26:26думаю, вы поняли, часть предложений мы
- 26:28передаём в Aing, но в контексте храним
- 26:32полную информацию. Ну и давайте
- 26:34посмотрим на на результаты самой хорошей
- 26:37модели, которая и очищенная, и с
- 26:40чанками. запустим и вы сами сможете
- 26:42оценить вопрос. Маркетинговая стратегия
- 26:44магазина максимум результат быстро. Ну,
- 26:47это именно вот так как бы будет
- 26:48выглядеть. И здесь видим, да, быстрый
- 26:50рост новых продаж, первый прорыв в
- 26:52продажах. Вот какие-то кэвы пошли, то
- 26:54есть уже что-то более-менее меняемое,
- 26:57да, то есть какая-то даже стратегия тут
- 27:00вырисовывается. Я правда не знаю, что
- 27:01это такое. Не вы, не лулайк. Я не
- 27:04маркетолог. Ну, видимо, что-то полезное.
- 27:06Результаты, результаты продавцов. Ну,
- 27:09что-то даже более-менее, опять-таки,
- 27:10оцените сами. Но мне результат нравится
- 27:13сильно больше. Тут вроде как даже что-то
- 27:16интересное. И, наверное, lмо модель,
- 27:17куда мы это будем передавать, наверное,
- 27:19поймёт. А давайте зададим второй вопрос
- 27:21точки роста бизнеса. Рост бизнеса - это
- 27:24тесты. У каждого бизнеса есть ключевые
- 27:26педали для роста и прибыли. В принципе,
- 27:28да. В принципе, да. Из этого, наверное,
- 27:30поста можно сделать какой-то ответ.
- 27:32Разобрался в вопросе зарплат. Ну, здесь
- 27:33что-то про зарплаты. Ну, наверное, тоже
- 27:35про рост. Компания не может расти
- 27:37быстро. У владельца нет видения своей
- 27:39жизни. Ну, в целом, да, понятное дело,
- 27:41что контент я подобрал вот максимально
- 27:44такой, поэтому мы и получаем такие
- 27:45ответы. Ну давайте спросим, как
- 27:47заработать миллион. Всё-таки получится
- 27:48ли у меня с помощью эмбединга понять,
- 27:51могу ли я заработать миллион или нет.
- 27:52Надо было добавить заработать миллион
- 27:54быстро. Так, ну здесь он 1 млн руб.
- 27:57чистой прибыли - это какой-то продукт с
- 27:59какой-то маржинальностью. Надо сделать
- 28:01продажи. Ну, понятное дело, чтобы
- 28:02заработать миллион, надо сделать
- 28:03продажи. Но в целом, да, в целом
- 28:05неплохо. В целом неплохо. Даже на
- 28:07основании этого можно передать. То есть
- 28:10если мы, например, делаем какой-то
- 28:11генератор контента, да, на основании
- 28:13чужого контента, мы сделали эмбединг, а,
- 28:16чужого Telegram-канала и просто в
- 28:20чатбот, не знаю, присылаем, да, сделай
- 28:23пост о том, как заработать миллион. И он
- 28:26нам на основании вот умных мыслей, ну,
- 28:28не знаю, насколько они умные, но на
- 28:30основании вот этих вот умных мыслей мы
- 28:31можем получить некую информацию, даже
- 28:33ещё и стилистику, может быть, даже можем
- 28:35как-то скопировать. То есть, в принципе,
- 28:37это работает. И результатом в целом я
- 28:39доволен. А, понятное дело, что у меня
- 28:41был такой шуточный пример относительно,
- 28:44но если вы хотите передать в LM модель
- 28:47именно свои данные, то, конечно же, с
- 28:49ними нужно работать, их нужно очищать.
- 28:51Вот, кстати, здесь проникли эмодзи, в
- 28:54том числе, да, здесь даже вот эмодзи не
- 28:57отображается, и, естественно, это влияет
- 29:00на работу эмбединга, и это является
- 29:03мусором. Но в целом вы можете это
- 29:06использовать, и это отлично работает. Но
- 29:10вы могли заметить, что у меня помимо
- 29:11здесь то, что это очищенный с чанками,
- 29:15есть ещё и префикс. Что такое префикс?
- 29:17Префикс есть не во всех моделях. Та же
- 29:20самая модель от OpenI, она не использует
- 29:22никакие префиксы, а это некие
- 29:25инструкции. И модель от Сбера, она
- 29:29использует эти префиксы. И у нас и при
- 29:32добавлении документа в Eden, когда мы
- 29:35загружаем, мы указываем prefix search
- 29:38докумен, а на вычитку, когда мы его
- 29:41вычитываем и пытаемся найти, мы
- 29:43указываем search query. И это, на мой
- 29:46взгляд, действительно повышает качество
- 29:48этого самого имбединга. Вообще это не
- 29:50обязательно, это просто совет, да, как
- 29:53использовать. А в целом, если это не
- 29:55использовать, оно тоже будет работать.
- 29:57А, но я протестировал различные
- 29:59варианты. Вы видите, да, у меня есть no
- 30:02prefix, clear, no prefix, no clear. То
- 30:05есть у меня не очищенные, не очищенные,
- 30:07а, и с префиксом чистые, потом с чанками
- 30:11и с префиксом, но не очищенный. Да, я
- 30:14тестировал, а, абсолютно по-разному. Все
- 30:17эти тесты показывать не особо хочу.
- 30:19просто чтобы, ну, и так видео уже
- 30:21получается долгим. Но я думаю, что вы и
- 30:24так могли убедиться, что в целом это
- 30:27работает и работает довольно-таки
- 30:29хорошо. Ну и ещё важный момент. Если мы
- 30:33в обычном нашем режиме у нас получалось
- 30:361.357 точек, то вот с разделением
- 30:38начанки, а, количество информации
- 30:40оставалось всё тем же самым, то точек
- 30:42уже получилось 5.493.
- 30:45То есть у нас модель отмб дела, весь наш
- 30:48текст, весь наш объём информации, объём
- 30:50информации не менялся, и при этом
- 30:52поинтов сильно больше, и поиск по этим
- 30:55поинтам становится сильно точнее. В
- 30:58целом по работе с нимоделями у меня всё.
- 31:02Надеюсь, вам стало более-менее понятно.
- 31:04Если непонятно, то
- 31:06пишите и задавайте свои вопросы. Можете
- 31:09здесь в комментариях можете писать мне в
- 31:12группу в Telegram, у нас там есть чат. и
- 31:15можете задавать свои вопросы по
- 31:17настройке этой системы, по работе с
- 31:20endдингмоделями. Ну а в следующих видео
- 31:23мы, конечно же, настроим всю эту
- 31:26систему, но уже в N8N. А на сегодня у
- 31:30меня всё. Спасибо за внимание.
- 31:32Подписывайтесь на канал и на
- 31:33Telegram-канал тоже. Всего доброго. M.
About this transcript
This page contains the full transcript of Что такое RAG в LLM и причём тут векторные базы данных by Rustam Kamalov | Python LLM и автоматизация, generated from the public captions YouTube serves with the video. The transcript has 4,366 words across 724 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.
What you can do with it
Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to choose a caption track available on the video.
Free YouTube transcript tool
YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, caption language selection, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.