🚀 Pro-сообщество тут:
https://t.me/iishenka_pro_bot
⭐️ Бесплатные материалы из этого видео тут:
https://t.me/+W1SnvvkcV6A3NWMy
В этом видео я расскажу, как организовать RAG на основе Ранжирования (Reranking & Metadata) и Предварительной Фильтрации. Что особенного в этом видео? Мы не только изучим, как усилить RAG, но и научимся делать автоматизации на основе этих знаний.
🔥 Независимо от того, работаете ли вы с AI-агентами или только начинаете осваивать автоматизации в n8n, этот урок поможет вам овладеть процессом настройки ИИ для любых задач.
💡 Не забудьте поставить лайк и подписаться, чтобы не пропустить новые уроки по n8n и AI-агентам. Давайте сделаем AI-автоматизации простыми! 🙌
Тайм-коды:
00:01 - Введение. Схема работы
03:30 - Подключаем Ранжирование к n8n
05:00 - Настраиваем предварительную фильтрацию в n8n
12:02 - Настраиваем векторизацию с метаданными
Я — Илья Бовкунов, основатель и СЕО Sendforsign — это компания, занимающаяся AI-автоматизацией договоров и документооборота. В прошлом был Директором по продукту и продуктовому дизайну в международных AI-стартапах.
Позвать в подкаст или предложить другое сотрудничество aiiszdes@gmail.com
Не забудьте поставить лайк, подписаться и нажать на колокольчик, чтобы не пропустить новые видео об AI-агентах и автоматизациях!
делать наш рак ещё более умным на N8N. И для этого не потребуется практически никакого дополнительного сетапа. Мы посмотрим, каким образом работает викторизация вместе с ренкером, реаранжированием, каким образом он выдаёт relevance score, а также посмотрим, каким образом осуществляется предварительная фильтрация для векторизованных данных. Будет круто. Поэтому сразу ставь лайк, подписывайся, коммент оставляй и давай смотреть вместе. В классическом исполнении рак работает следующим образом. У нас есть какой-то документ или набор документов, которые мы разбиваем на какие-то кусочки. Обычно их называют чанки. Эти чанки могут быть обогащены метаданными, могут быть нет. И дальше с помощью какой-то нейронки, модели для имбедингов, мы векторизуем эти чанки и получаем векторы, которые записываем в векторную базу данных. А что происходит, когда юзер оставляет свой вопрос или проomт? На самом деле происходит очень похожий механизм. Прот user сначала векторизуется с помощью моделей для имеединга, а потом осуществляется векторный поиск similarity search для того, чтобы найти самые близкие расстояния между вектором пользователя и векторами, которые есть в нашей векторной базе данных. Самые близкие несколько чанков выбираются и возвращаются обратно агенту как контекст. И агент на основе этого контекста уже формирует ответ на наш вопрос. А что происходит, когда мы используем ренкер? По сути, он делает перепроверку данных и их переаранжирования. мы получаем какие-то векторы, которые получили с помощью similarity search. И после этого специальная нейронка начинает сравнивать эти векторы с оригинальным промотом пользователя и выставлять дополнительные коэффициенты relevant score для них для того, чтобы понять, какой из этих уже предварительно выбранных чанков соответствует наибольшим образом нашему промту. Таким образом, он определяет самые релевантные чанки, которые должны быть использованы агентом для последующего ответа. Это сильно-сильно увеличивает качество и точность ответов наших агентов. И, конечно же, в N8N есть механизмы, которые позволяют использовать переранжирование, ренкеры для повышения качества ответов. У меня есть какой-то документ, который лежит на моём Google Драйве, который я только что векторизовал. Специально сделал маленькие чанки по 100 символов. И давайте спросим что-нибудь, допустим, про скидки на тюльпаны, чтобы увидеть, каким образом работает Рнкер. Откроем наш чат и спросим: "Расскажи про скидки на тюльпаны". Давайте посмотрим, каким образом отрабатывает векторная база. И мы видим, что был задействованкер. Если мы откроем полные логи того, как был произведён поиск, мы увидим сразу несколько интересных моментов. Сначала мы увидим три чанка, которые изначально были выбраны с помощью векторного поиска из нашей базы данных. Смотрите, что-то сразу попало про тюльпаны верные, да? И потом ещё было что-то тоже про скидки, но явно это были скидки не про тюльпаны. Но, естественно, так как это было возвращено нашей векторной базой, всё это будет подано на нейронку, чтобы она использовала это для ответ. каким образом отрабатывает ренкер. Если мы перейдём на него, то мы увидим, каким образом он отработал наш кейс. Обратите внимание, что он получил все чанки, которые были выбраны из векторной базы данных, и проставил relevant score. Смотрите, это явно чан, где сказано про скидки на тюльпаны, и он проставил relevant score 0,8. Другие чанки, где тоже что-то есть про скидки, но это явно не скидки про тюльпаны, получили relevant score 0,2. И здесь аналогичная скидка, но не про тюльпаны. Здесь вообще 0,17. То есть Ренкер получил все чанки из векторной базы данных, потом их сравнил с оригинальным промтом и на основе этого сравнения проставил relevant score. И уже после этого отдал их нашей неронке, чтобы она сформировала финальный ответ. Скидка на тюльпаны 10%. Что есть очень точно. Каким образом добавляются ренкеры в наше workflow? Нам потребуется классическая нода AI agent
которая будет подключена модель для чатов и в которую мы должны будем добавить Tool, который называется Supase Vector Store. Для этого видео мы сделаем простой systemдж, скажем, что всегда использую векторный store. И дальше в векторном сторе мы делаем desption, что это RC Tool и это вектор Store. Целимся в нужную нам таблицу. Я здесь предполагаю, что вы уже умеете настраивать Superbase. Если нет, то посмотрите вот это видео, там полностью описано, каким образом это делается. И здесь нам понадобится отметить поле results. Как только мы выбираем это поле, у нас добавляется дополнительный выход, который называется раuner. Если мы сюда нажмём, то мы увидим, что есть умолчательная нода в NV CM, которая называется раuner. Это раunкер от какой-то компании, да, которая называется Coем Sign in. Видим здесь поле API ключи. И видим, что для нас уже сгенерирован API ключ в режиме trial keys, да, то есть ключи для пробы, работает всё бесплатно, поэтому мы можем его забрать, вернуться в Nem и здесь добавить новые креды и сюда добавить уже API ключ, который мы забрали в предыдущем туле. Всё. После этого реранкер начнёт работать. Когда у нас ранкер активен, это значит, что мы в нашем Векторсторе можем выбрать намного больше чанков, например, 20 или 40, потому что мы уверены, что все чанки, которые вернутся, будут перепроверены реранкером, и им будет выставлен специальный скор, который позволит агенту отвечать намного точнее. То есть мы увидим их отсортированными пузырьком, и наверху будут самые-самые релевантные
чанки. Параллельно с ренкером следует использовать ещё один подход, который увеличивает качество нашего рака. Он называется предварительная фильтрация. Классический рак работает так, что если мы что-то спросим, например, про скидки на тюльпаны, он найдёт релевантный чанк и вернёт нам его, и наша моделька ответит довольно хорошо. Ну, допустим, если представить, что у нас пункт про весенний фестиваль цветов очень большой, и в него вмещаются сразу много-много чанков, то если мы спросим у модели: "Расскажи мне всё про весенний фестиваль цветов", то в модель вернутся какие-то дватричетыре пять релевантных чанков. Но если чанков, которые поместились в этот пункт, например, было 40 или 50, то модель не расскажет всё про фестиваль цветов, а только релевантную информацию, которая вернула и векторная база данных. С этим тоже можно работать, и это круто сочетается с реранкером. Каким образом осуществляется предварительная фильтрация? Предварительная фильтрация начинается на моменте векторизации, а не использования уже векторной базы данных и готовых векторов. Давайте добавим механизм забора файлов с Google Драйва. Мы сделаем два триггера на file created, то есть на создание файла в какой-то специфической папке. Допустим, это у меня будет тест. И на изменение файла также. Каждый раз, когда добавляется файл и когда изменяется файл, триггер будет отрабатывать и flow будет инициироваться. Мы добавимOP, который будет отслеживать, сколько было изменений и отрабатывать каждое изменение по одному. Также мы добавим ноду Setile ID, в которой будем записывать всю ключевую информацию, которая будет возвращать нам предыдущая нода. То есть нам понадобятся файл ID, файл Type, файл title и URL этого файла. Также мы добавим специальную ноду, которая будет обеспечивать актуальность базы данных. То есть, если, например, какой-то файл был изменён или удалён, мы сначала удалим все релевантные записи из векторной базы данных и перезапишем их уже с новыми данными для того, чтобы не было дублирования информации. После этого мы скачиваем файл, достаём из него все данные и дальше уже работаем вручную и обеспечиваем предварительную фильтрацию. Давайте посмотрим, каким образом это отрабатывает сейчас. Если мы вернёмся в этот файл и сделаем какое-то изменение, просто напишем 1 2 3 и вернёмся в наш invo идее уже должен отрабатывать триггер file updated, потому что только что был какой-то файл изменён на нашем Google диске в заданной папке. Давайте запустим этот эту ноду. Да, мы видим, что он обнаружил, что было изменение в каком-то из файлов. И если мы проскролим вниз, то мы увидим, что это как раз акции магазина. Это тот самый файл, в который мы только что внесли изменения. Давайте пройдём по флоу, инициируем loop. Да, он говорит: "Я нашёл один элемент". Дальше заполним все наши данные. То есть мы видим, что мы из большого массива информации, который нам вернул, вернул Google Drive, достаём файл ID, файл Type, File Title, File URL, то есть всё, что нам потребуется в будущем. Дальше мы идём в нашу векторную базу данных. И так как мы предварительно знаем, что нам нужно удалить записи с определённым файл ID, выполним этот шаг и видим, что прямо он нашёл всёвсёвсё, что было в нашей базе данных с этим файл ID и удалил. Прекрасно. Давайте перепроверим нашу векторную базу данных. Вот мы видим, что всё у нас удалилось, релевантно этому файлу. Дальше скачиваем файл. Скачиваем сразу в PDF, потому что, как показывает мой опыт, если забирать просто контент этого файла, то теряются, например, списки и списочные формы, что может быть критичным для нас. В PDF это всё остаётся. После этого достаём весь контент этой PDFки, посмотрим, как это выглядит. Мы видим, что вот он текст, да, где сохранены все наши пункты и списки. Вот пункт один, пункт два, новогодняя акция. Перепроверяем. О, вот он наш пункт два, новогодняя акция. То есть контент сохраняется. А дальше напишем небольшой код. Этот код мы уже использовали в предыдущих видео, когда мы делали рак с Яндекс-диском. Кстати, напомню, что вот эта автоматизация и все автоматизации, которые мы строим на нашем YouTube канале, они после записи видео скачиваются и помещаются в нашу бесплатную Telegram-группу. Ссылка на неё будет в описании. И также посмотрите на нашу Прогруппу. Прогруппа у нас состоит, по сути, из трёх частей. Первая часть - это проматериалы, это конкретные автоматизации, которые работают в реальных бизнесах, в реальных компаниях. Это автоматизации, которые сделаны основателями сообщества, некоторые лично мной. Также там автоматизации, которые сделаны участниками сообщества, которые прямо в своих бизнесах их используют. Вторая часть - это Прочат. К прогруппе прилагается доступ к прочату, где всевсевсе участники обсуждают их насущные проблемы, насущные вызовы и автоматизации, каким образом они решают те или иные кейсы. Третья часть - это возможность задавать прямые вопросы участникам сообщества и основателям сообщества и бронировать звонки с основателями сообщества и лично со мной также. И четвёртая часть, которая будет добавляться этой осенью - это материалы для новичков, которые будут неотъемлемой частью про сообщества и которые позволят вам сначала сделать шаг от нуля к единице и потом уже углубляться в тему искусственного интеллекта и автоматизации с помощью прочата и проматериалов. Обязательно подписывайтесь сегодня на прогруппу, потому что как только добавятся новые курсы и новые материалы, стоимость участия в группе значительно вырастет для новых участников. Ну а для всех текущих она, естественно, останется на их уровне. Поэтому посмотрите её тоже по ссылке в описании, там очень круто. Так, а мы возвращаемся к нашей автоматизации. Мы только что извлекли весь текст из нашей пдфки. И дальше делаем специальный скрипт, который разбивает весь текст начанки по 100 символов и дальше проходит их в цикле и возвращает нам эти кусочки. Давайте выполним этот шаг и видим, что нам вернулся массив, который называется чанки и в котором весь текст разбит на нужный нам кусочек. Дальше мы используем ноду Splitout для того, чтобы разбить наш массив из нескольких чанков на несколько элементов. То есть мы теперь получили 11 элементов, каждый из которых содержит свой кусочек текста. Для чего нам это нужно? Теперь мы можем сделать мегаважную вещь для будущей предварительной фильтрации. Теперь мы используем нейронку. Кстати, вот этот механизм мы использовали в очень популярном видео в контекстуальном ретривале. Посмотрите его тут, и оттуда вы получите все базовые знания. Но в общем и целом мы хотим сравнивать каждый чанк с нашим исходным документом. И мы просим возвращать именно номер абзаца, в котором содержится конкретно этот чанк. Как это работает? Обратите внимание, что нам вернула неронка, да, текст 1 2 2. Это что значит? Она прошлась по каждому чанку и определила, в каком абзаце или в каком пункте документа содержится этот чанк. Если мы посмотрим на оригинальный документ, то мы видим, что здесь есть явно три чанка, и он для первых трёх чанков указал, что они все содержатся в пункте один. Для следующих двух чанков он определил, что они содержатся в пункте два. Мне кажется, вы уже начинаете догадываться, каким образом это может быть круто использовано. Ну давайте вернёмся в автоматизацию и завершим её. Теперь мы организуем векторизацию этих данных, но уникальным способом. Мы хотим векторизовать изначально чанк. То есть мы пройдёмся по
всем одиннадцати чанкам, которые есть у нас на входе, и добавим оттуда из предыдущих нот такие вещи, как файл title, то есть название самого документа, акции магазина, ID документа. Мы им будем пользоваться для того, чтобы держать нашу векторизацию в актуальном состоянии. И дальше close number, то есть номер абзаца, в котором этот чанк был найден. Это значит, что если мы сейчас запустим всю нашу векторизацию, давайте попробуем, мы увидим, что он прошёл 11 раз, то есть по всем чанкам. Возвращаемся в нашу суbase и смотрим, что произошло. Смотрите, чанк, скидка на день рождения. Наши, кстати, изменения, которые мы только что внесли, да, для того, чтобы запустить workflow. Размер скидки 15. Условия при предъявлении документа с датой. И дальше, если мы посмотрим в метод данные, мы видим самую важную вещь. Мы видим, что здесь файл title, да, акции магазина и close number 1. Если мы посмотрим в следующий чанк, то также увидим cluse number 1. Но если мы посмотрим куда-то подальше, например, 15 декабря, 7 января, да, вот 15 декабря, 7 января, по идее в базе данных должно содержаться, что это чанк из пункта номер два. Давайте проверять. Смотрим, что у нас в метод данных. И здесь написано Clause number 2. Это мегаважно. Теперь у нас в каждом чанке есть номер абзаца, из которого это было взято. Кстати, в прогруппе мы недавно обсуждали юридические кейсы. То есть там очень частый кейс, что нам нужно понимать, из какого пункта нормативного акта был забран тот или иной чанк. И этот механизм позволяет прекрасно отрабатывать такие автоматизации. Каким образом мы теперь можем воспользоваться этим? Если мы вернёмся в нашего агента, откроем нашу Superabase, здесь у нас будет кнопочка Add Option. Нажимаем сюда, и здесь у нас есть опция фильтр метаданных. Это мегаважная штука. Добавляем поле. И здесь есть название методанных и их значения. Как называются наши метаданные? Они называются cl number. Забираем это название, вставляем сюда. И давайте посмотрим, как это работает. Например, мы знаем, что все чанги из пункта пять, счастливые часы будут склоз number 5. Давайте пропишем здесь пть. и зададим какой-то вопрос нашему агенту, который не касается пункта номер пять. Допустим, зададим опять тот же самый вопрос: что там с тюльпанами и какие на них скидки? Открываем наш чат и задаём вопрос: есть ли скидки на тюльпаны? Смотрим, как работает автоматизация. И мы видим, что он отвечает, что в магазине действуют скидки 10% на все готовые букеты на витрине по пятницам с 6сти до 8ми. И говорит, что это может включать тюльпаны, но он не уверен, почему это произошло. Давайте посмотрим, какие результаты нам вернула Супайс. Мы видим, что супай вернула нам несколько чанков, но numberра в них строго пять. Здесь конкретно против паны ничего нету. Если мы посмотрим сюда, мы видим, что именно оперирует пунктами и чанками из этого пункта номер пять, но не смотрит на все остальные данные. Это мегаценная вещь, потому что, как вы видите, этот value может быть динамическим. Допустим, самый популярный подход. У вас есть обычная простая таблица, где есть ваши пункты. из вашего документа и их соответствующие номера. При конкретном вопросе по пункту вы сначала идёте в таблицу, получаете номер этого пункта и передаёте этот номер сюда в фильтрацию с помощью агента. И после этого ваш векторный поиск будет осуществляться с предварительной фильтрацией по этому пункту, и ваш агент будет работать только с чанками, которые соответствуют этому конкретному пункту. Это очень удобный и ценный механизм. Как я обещал, я сейчас скачиваю этот файл, помещаю в свой бесплатный Telegram-канал и, конечно же, обратите внимание на нашу прогруппу. Всем пока и до скорых встреч.