N8N RAG Ассистент: автоматическое обновление базы знаний | Синхронизация Данных в Реальном Времени

N8N RAG Ассистент: автоматическое обновление базы знаний | Синхронизация Данных в Реальном Времени37:13

Информация о загрузке и деталях видео N8N RAG Ассистент: автоматическое обновление базы знаний | Синхронизация Данных в Реальном Времени

Автор:

Ivan Nevermind

Дата публикации:

17.11.2025

Просмотров:

372

Описание:

Привет! В этом полном no‑code гайде вы узнаете, как создать RAG‑ассистента в N8N, который навсегда решит проблему актуальности данных. Мы покажем, как настроить автоматическое обновление базы знаний при любых изменениях, добавлении или удалении исходных документов, хранящихся в Google Docs. Такая синхронизация данных в реальном времени критически важна для бизнеса: ваш AI‑ассистент всегда будет оперировать актуальными офферами, скидками и условиями из «книги продаж», исключая ошибки, улучшая качество обслуживания клиентов за счёт свежей информации и создавая полностью автономного RAG‑бота на Low‑Code платформе N8N. В этом воркфлоу вы изучите детальную логику работы RAG‑системы, обработку множества файлов в цикле, использование уникального идентификатора hash / revisionId из Google Docs для отслеживания изменений, решение задачи удаления документов и очистки базы знаний, а также интеграцию с AI и векторной базой данных. Смотрите до конца, чтобы настроить самого актуального AI‑ассистента на базе N8N + Google Docs.

Транскрибация видео

Всем привет!

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

Это очень полезная тема, как минимум потому, что тебе ничего не нужно будет делать руками.

Мы настроим в этом у себя workflow, который будет автоматически все подхватывать и применять.

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

К примеру, всякие скидки, оферы особые для клиентов и так далее.

И на основе этого можно будет в дальнейшем создать бота-ассистента для отдела продаж, чтобы отдел продаж мог написать в бота, спросить, какие у нас актуальные скидки на такой-то такой-то продукт.

Ну и бот соответственно их вывел, потому что ты их обновил буквально 5 минут назад.

Ну либо второй вариант применения, можно будет создать бота протажника, к которому будет писать пользователь, спрашивать вопросы и так далее.

Ну и бот сам выдаст всю информацию, которая нужна, ну и конечно же при этом ограничив его определенным системным промтом.

К этому мы вернемся в следующих видео.

Для того, чтобы в этом видео у тебя все получилось, тебе нужна связка N8n и Supabase.

Где-то будет сноска вот тут, в этой части экрана.

Зайди, посмотри свежо, если ты еще этого не сделал.

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

Поэтому перемещаемся в блок-схему.

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

Надеюсь, тебе будет полезно.

Полетели дальше.

Смотри, на экране ты видишь блок-схему того, как вся эта история у нас будет выглядеть.

Ну и давай разбираться вообще, что тут такое.

Выглядит страшно, но на самом деле все достаточно просто.

Так вот, у нас будут некоторые особенности.

Первая особенность это то, что файлов у нас может быть в одной папке много.

Следовательно, файлы могут изменяться.

И тут мы будем использовать Revision ID.

И файлы могут удаляться.

И для этого нам нужно будет отслеживать всю эту историю.

У нас все файлы будут лежать в одной папке.

Ну, например, я ее назвал n8n-rak-что-то-там.

И внутри будет папка delete.

В нее мы будем перемещать документы, которые нам нужно удалить из нашей базы знаний.

Также у нас будет две таблички в базе данных.

Первая табличка это...

Documents стандартная, которую мы сделали с тобой в прошлом видео.

Ссылочка опять же будет и в описании, и в сноске.

И второй момент это будет табличка Documents Base, в которой мы будем хранить соответственно наш Revision ID, потому что мы сравнивать его потом будем.

И Document ID для того, чтобы мы могли нормально обращаться в дальнейшем в нужных нам нодах.

Поэтому переходим к нашей блок-схеме.

Первое, что мы видим, как всегда, у нас все начинается с базового триггера.

В нашем случае триггером будет выступать нода schedule.

Не знаю, как правильно произносится, простите.

И в ней мы будем обновлять данные один раз в n секунд.

Да, в Google есть нода, которая может отслеживать обновления, но она работает не так, как нам необходимо.

Поэтому у нас в первую очередь стартует триггер.

После этого мы должны каким-то образом получить список файлов.

Соответственно, мы обращаемся в Google Drive App и получаем список файлов в нашей папке.

Папку я уже сказал, как я у себя назвал.

У тебя эта папка может называться как душе угодно.

Далее мы получили, допустим, n файлов.

И так как у нас файлов много и файлы могут меняться, у нас сейчас пойдет вот это большое полотно направо.

И будем его разбирать с тобой.

Нам нужно все будет проделывать в цикле.

Вот эту веточку мы пока не смотрим, я в конце объясню.

Переходим сюда.

Первое, что нам нужно сделать, для хранения данных нам нужно будет получить Revision ID.

Revision ID мы можем получить через Docs API.

Поэтому мы делаем ноту Docs API, получаем Revision ID, Documents ID и все-все-все, что нам нужно.

После этого нам нужно проверить в Supabase, обратиться к табличке.

Я ее назвал база файлов, то есть это будет табличка Documents Base в дальнейшем.

Нам нужно будет получить файл, соответственно, по его хэшу.

И смотри, дальше мы получаем JSON-ответ и у нас идет проверка файла.

Если у нас ответ пустой, значит файл новый и мы идем по одной ветке.

Если у нас в JSON-ответе хэш отличается от того, что у нас есть в базе данных,

В таком случае мы файл обновляем.

И как ты видишь, мы передаем в следующую ноту, ноду с UPP, где мы получаем файл из базы файлов.

Мы передаем Revision ID для сравнения.

Поэтому он у нас тут будет.

И, соответственно, если у нас не подходит ни под первое, ни под второе условие, значит файл у нас остался таким же и не поменялся.

Поэтому мы просто возвращаемся проверять второй файл.

И так у нас все проходит по цепочке.

столько раз, сколько у нас есть файлов.

Далее, смотри, пойдем по ветке, когда у нас появился новый файл в папке.

Когда появляется новый файл в папке, мы добавляем ноду supabase и добавляем этот файл в

базу файлов изначально.

То есть мы будем записывать его хэш и его документ ID для того, чтобы мы могли отслеживать.

Табличку мы создадим далее под это.

Все увидишь, все просто повторишь.

И после этого мы переходим, получаем уже содержимое нашего файла и записываем в векторное хранилище.

Но что делать, если у нас файл обновился?

Тут уже логика будет несколько другая, чуть-чуть посложнее.

Для начала нам нужно будет удалить файл из векторного хранилища.

И как раз таки тут нам пригодится Document ID, который мы будем записывать в метаданные нашего файла.

После этого мы должны удалить этот файл.

Это важно.

Мы сначала его должны удалить и потом добавить заново.

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

И даем запрос на получение уже содержимого файла, чтобы его добавить заново в векторное хранилище.

То есть запомните, когда мы обновляем в векторном хранилище, мы сначала удаляем старые содержимые файла.

И добавляем заново новое содержимое этого же файла.

Вот, надеюсь, все понятно.

Ну и возвращаемся, соответственно, внутрь нашего цикла и продолжаем работу уже с остальными файлами.

Тут все достаточно просто.

Ну, должно быть понятно во всяком случае.

Но что делать, если у нас файл удаляется?

Я проверил несколько вариантов.

И вариант, когда я просто беру и по ID удаляю файл, не работает.

По одной простой причине.

Когда мы отправляем в Google Docs файл в корзину,

то у нас все еще доступ к этому файлу по ID-шнику есть.

Поэтому эта история не сработает.

А нам нужно четко знать, что файл удален.

И чтобы не делать лишних действий, мы просто создали папку delete, я ее назвал.

И те файлы, которые нам надо удалить, мы перемещаем в папку delete в Google диске.

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

И да, тут я не изменил, удаляем его из нашей базы файлов.

Вот, соответственно, примерно у нас вот такая схема.

Выглядит, может быть, ужасно, но работает и работает хорошо, все было проверено.

Поэтому сейчас мы с тобой пойдем создавать workflow и реализовывать всю эту историю по нашей блок-схеме.

Давай для начала я тебе продемонстрирую, как у нас вся эта история будет работать.

Вот такой вот у нас flow получится.

Это неправильный вариант как раз-таки, который я протестировал с удалением файлов.

И как это будет?

Я из базы данных, у нас видишь document-based documents, я все просто удалил.

И сейчас мы запустим отсюда.

У нас получился файл, получился хэш.

Угу.

И пошло по ветке, так как у нас пусто, файлов у нас нет в базе данных.

Все, добавилось два файла.

Как это выглядит в базе данных?

Обновить.

Вот, у нас в документах наших, в векторном хранилище, давай увеличим.

В векторном хранилище у нас появилось все, то есть Embedding, Vector, два файла, вот проверял изменения.

В Document Base у нас появилось, как я говорил, мы записываем сюда Document ID и хэш наш.

Соответственно, все эти данные будут у нас тут храниться в таком виде.

Ну и будем постепенно все реализовывать, прям пошагово.

Поэтому я перехожу, обязательно сохраняем, потому что что-то я изменил, забыл вот что.

Жмем Create Workflow и, соответственно, начинаем прям с самого нуля.

Первый шаг мы с тобой реализуем просто добавление файлов в наш RAC-контейнер.

Поэтому мы добавляем ноду.

Пока что мы добавим, да, прям сразу.

Добавляем ноду «Оне щедуль».

Как правильно читается, я не знаю.

После этого мы идем и добавляем через Google Drive наши файлы.

То есть сначала мы получаем папку.

Тоже увеличу, чтобы тебе было лучше видно.

Google Drive.

И выбираем ноду «Search files and folders».

Смотри, тут есть очень один хитрый момент, который я не предусмотрел изначально, когда делал, но ты уже будешь знать, как не совершить ошибку.

Для начала нам нужно добавить ноду Search Files and Folders, мы добавляем через Add Filter, добавляем фолдер, который нам нужен.

И я назвал папку n8n for что-то там rack.

Да, n8n rack data.

И тут обязательно, так как у нас там есть еще папка, и папка тоже пойдет добавляться в rack container, что нам не нужно ни в коем случае.

Нам нужно добавить фильтр.

Вот to search выбираем.

И выбираем files.

Только файлы.

В чем отличие?

Смотри.

Execute step.

У нас получилось три элемента.

Это документ.

Вот давай в table.

Документ, документ и папка.

Папка нам тут не нужна.

Закрываем, переходим дальше.

А если мы добавим в фильтре what to search, выберем только files, у нас получатся только файлы.

Вот, обязательно в filters добавляй what to search filter.

И выбираем файлы.

Смотри, дальше у нас все тривиально просто.

Мы получили файлы.

Теперь нам нужно получить содержимое этих файлов.

Содержимое этих файлов мы получаем через Google Docs и ноду Get a Document.

В ноду Get a Document мы просто берем и переносим ID, потому что мы получаем тут файлы через Doc ID или URL.

Отлично.

Давай мы сделаем Execute.

Супер, мы с тобой получили вот два айтема, наши файлики, которые все есть тут.

После того, как мы получили вот документы, нам нужно добавить в Supabase Vector Store.

Добавляем в Supabase Vector Store и Add Document to Vector Store.

Выбираем табличку Documents, которую мы создали.

В описании будет запрос для создания в MySQL, ой, в Supabase.

Выполнишь его, и она создастся.

Если нет, если не понимаешь, как это делать, в предыдущем видео на канале есть полная инструкция.

И смотри, у нас теперь есть две настройки, Embedding и Document.

Embedding это, собственно, модель, которая будет нам векторизировать наш текст.

Я использую модель от OpenAI.

И выбираю текст Embedding Tree Small.

Моделька нормальная, подойдет, подробно углубляться не будем.

В общем, она векторизирует по своему словарику все это.

И в Document нам нужно теперь загрузить этот документ.

Мы выбираем Default Data Loader.

И смотри.

Тут есть два момента.

Первый момент это mod.

У нас написано load all input data.

Если мы оставим это так, то у нас на один документ будет выделяться две записи.

Первая это document id и вторая это content.

То есть у нас два документа и будет четыре записи в базе данных.

Но нам это не надо, потому что нам не нужно хламить нашу векторную базу данных лишними файлами.

Поэтому мы в mod выбираем load specific data и в data перетаскиваем только исключительно content.

И второй момент, крайне важный, который нам необходимо понимать и знать, это текст сплитинг.

Разделитель.

SimpleMode стоит сейчас.

В SimpleMode он загружает 1000 символов и делает наложение в 200 символов.

Что это значит?

У тебя текст, например, 5000 символов.

Он берет первые 1000 символов, загружает первый наш чанк, то есть контейнер символов разделения, и в следующие 1000 символов добавляет 200 символов из предыдущего.

Это используется для лучшей связки данных в векторном хранилище.

Поэтому мы нажимаем на текст «Splitting» и выбираем «Custom».

Очень важно этот момент не забыть.

Теперь, когда ты выйдешь, у тебя появится функция «TextSplitter».

И нам нужно добавить, собственно, как у нас будет разделяться текст.

Смотри, character text splitter, это не подходит, потому что он будет разделять текст по текстовому разделителю, по особому символу.

Нам это не надо.

Token splitter, это ты будешь указывать, какое количество токенов можно использовать, и он по токенам добавит.

Тоже не нужно.

Идеальнее всего нам подходит Recursive Character Text Splitter.

Тут мы можем указать сами количество символов, которые будут использоваться при разделении текста.

Я поставлю 7000 символов.

Почему 7000?

Потому что я знаю, что в моем документе меньше 7000 символов.

Образно говоря.

И я хочу, чтобы у меня один документ был одной строчкой в базе данных.

Давайте я продемонстрирую, как это будет, если мы поставим 500 символов.

Execute workflow.

Сейчас проверок никаких нет.

Он добавит нам много-много всего.

И мы когда перейдем в базу данных, нажмем Refresh.

Зайдем в Documents.

Видишь, сколько у нас записей появилось.

Так делать неправильно.

Поэтому мы берем и сейчас удаляем все.

Но если мы сейчас поменяем всю эту историю на всего лишь 5-7 тысяч символов, у нас будет только 2 записи.

так 7000 вот и летим проверять все прошло отлично и теперь переходим в базу данных и мы видим что у нас добавилось только две записи нам именно это и надо это как бы ускоряет поиск оптимизирует его и меньше токен используется и так далее так что мы делаем дальше с первым этапом мы с тобой закончили

Второй этап, мы будем с тобой разбираться, каким образом нам не добавлять лишние, скажем так, файлы.

Потому что, смотри, допустим, Documents Base, мы забываем о существовании этой таблички.

Смотри, что будет.

Если я запущу сейчас Execute Workflow еще раз...

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

Нам нужно ввести проверку на существование файла и если этот файл уже загружен, в таком случае мы просто его игнорируем.

В общем-то, как нам добавить несколько файлов в базу данных, чтобы они не дублировались?

Давай приступим.

Отключаем вот нодус по BaseVectorStore и откидываем ее в сторонку.

Что нам нужно сделать?

Для этого нам нужно добавить новую базу данных.

Я ее назвал DocumentsBase.

Давай я ее удалю и создадим заново.

Переходим в Database, Tables, жмем New Table.

Называем ее DocumentsBase.

И нам нужно добавить строчку, которая будет хранить Document ID.

Жмем Add Column.

Document.

ID прописываем.

Выбираем тип данных текст.

И в настройках, вот тут в шестеренке, нам нужно снять галочку из Nullable.

Нужно, чтобы она всегда была заполнена.

Жмем Save.

Отлично, у нас создалась наша табличка.

Вот, Documents Base.

И давай перейдем к уже Flow в N8N.

Смотри, для того, чтобы нам несколько файлов добавить, логично, что нам нужно их обработать в цикле.

Поэтому мы добавляем ноду Loop Over Items.

Удалим ненужные связи.

И смотри, в первую очередь мы обратимся к нашей базе данных Supabase, прописываешь в поиске Supabase и добавляешь get a row.

В get a row нам нужно выбрать табличку documents-base и добавить условие, что у нас document-id должен быть чему-то, собственно, равен.

Давай мы нажмем execute workflow, чтобы данные передались, и я могу перетащить.

Мы передаем вот id, document-id наш.

И execute step.

Смотри, сейчас тут no output data returned.

Нам нужно соответственно эти данные каким-то образом вывести.

Ну даже если данных нет, нам нужно вывести пустой массив.

Переходим в setting и жмем always output data.

Смотри, execute step и у нас появился пустой массив.

То есть вот в JSON вот так он выглядит.

После этого нам нужно добавить ноду if и проверить, что если у нас массив пустой, значит нам нужно добавить новый файл, а если массив не пустой, соответственно делаем какие-то другие действия.

Для того, чтобы это проверить, нам нужно прописать вот такую переменную JSON, потому что все данные записываются в переменную JSON в n8n.

Переходим в Object и набираем isEmpty.

Если документ пустой и условие соблюдается, значит мы его добавляем в базу.

executes the true брать все переменная пустая нам нужно добавить теперь этот файл в нашу базу файлов всех именно в базу не векторную а вот документ боится табличку пишем снова супа bass а create a row и

Выбираем нашу табличку Documents Base и в Fields to Send мы добавляем Document ID.

У нас вот в Loop Over Items есть наш, получается, да, Document ID.

И после этого уже мы этот Document ID передаем в Supabase, в наш Data Loader.

Только нам нужно все данные сейчас прогнать.

Ага, прогнали, создалась табличка и уже из этой ноды, ну, кстати, можно было из loop over items передать, получить этот файл.

Да, кстати, у меня пропала нода получения файла, поэтому мы сейчас его сначала получим.

Снова добавляем docs.

get a document и получаем наш документ по нужному айдишнику.

Вот открываем loop over items, вставляем id, жмем execute step.

Да, сейчас нужно почистить табличку, потому что там добавилось все.

Delete row.

Execute workflow.

вот данные получили в get a document смотри отлично и соединяем supabase-vector-store снова тут уже у нас все настроено вот у тебя уже скорее всего эта нода есть вот я потому что ошибся и удалил случайно тебе не нужно будет добавлять и json-контент добавляется

И после этого нам нужно соединить снова с loop over items, чтобы он пошел делать второй файл.

Давай мы tidy up workflow сделаем, чтобы он был красивенький и проверим, как это будет выглядеть.

Почистим нашу document base, потому что сейчас там запись произвелась.

Delete row.

И запускаем.

Первый файл добавился, второй файл добавился.

Шикарно.

В Document Base, смотри, файлы есть, и тут файлы есть.

И теперь, если мы еще раз погоним, да, ветку false нам надо соединить тоже с loop over items, потому что там же файлы уже существуют, чтобы он дальше их прогонял.

Execute workflow.

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

Но что же нам делать, что же нам делать, если у нас...

Файл изменился.

Это очень важный момент.

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

Так, неожиданная вставка на монтаже.

Я понял, что я в тупнике, который ловил во время записи видео, забыл показать.

Как?

Где нам добавить в Document Base Revision ID?

Вот, вот это вот поле.

Короче, мы заходим в Database.

Мы заходим в Tables.

Находим наш Document Base.

И вот тут, вот тут нажимаем на три точки.

Edit Table.

Жмешь Add Column, нажимаешь Revision ID, выбираешь тип данных текст и в настройках включаешь Is Nullable и жмешь Save.

Извини за несостыковочку.

Теперь смотри, так как мы с тобой на прошлом шаге добавили наш Revision ID, у нас сейчас, если мы прогоним Workflow для добавления и так далее, Create a Row не сработает, потому что нам нужно еще добавить Revision ID.

Где нам это сделать?

Давай вот это все переместим и добавим получение Revision ID.

Нам нужно перед get a row добавить еще один get a document, только с особым параметром.

Поэтому get a docs, get a document.

Мы в loop over the items передаем id.

Но, но, смотри, очень важный момент.

открывайся не забудь выключить галочку simplify когда мы отключаем галочку simplify мы получаем более развернутый ответ жмем execute workflow и смотри что мы сейчас получим мы получим с тобой вот такое полотно данных если мы скроем все ненужное то

Мы увидим тут Revision ID.

Когда у нас обновляется файл, Revision ID становится новым.

Поэтому мы теперь берем, соединяем с Get Arrow.

У нас все дальше пройдет.

Давай загоним сюда.

Прогоним заново.

И словили ошибку в Creator.

А тут ошибка, потому что нам теперь обязательно нужно передать Revision ID.

Жмем Add Field.

Выбираем Revision ID.

И теперь смотри, раскрывай ноду Get a Document 1.

Скрывай вот это все ненужное.

И перетаскиваем сюда Revision ID.

Включение на монтаже номер 2.

Зайди сейчас в Default Data Loader.

Смотри, тут у тебя ничего не будет.

Скопирую.

Нажимаешь Add Property.

Пишешь Document ID

И вставляешь expression.

То есть loop over items json id.

Вот можно взять вот тут.

Перенести просто.

И у тебя все будет работать.

Важно сделай.

Забыл сказать.

Запутался.

И теперь у нас все пройдет отлично.

Давай execute workflow.

И сейчас прогоним с добавленной revision id.

Покажу где он находится.

Переходим в нашу базу данных.

Обновляем.

И теперь когда мы зайдем в метадата.

У нас появилась строчка Document ID.

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

К сожалению, мы не можем обновить строку, поэтому мы будем удалять ее и добавлять заново.

Так, и что мы делаем дальше?

Document 1.

Все, хорошо, тут все работает.

Мы добавили Revision ID.

Но что же делать, если файл обновился?

Тут уже нода if нас не спасет, и мы ноду if заменим на другую ноду.

После вот этого get a row мы жмем на плюсик и добавляем ноду switch.

И смотри, у нас будет несколько условий.

Первое условие остается такое же, как было.

Если у нас JSON empty.

Это значит, что у нас новый файл.

Rename давай назовем new.

Следующий routing rule.

Это если у нас получается get a document 1.

Если у нас revision id этот.

Так, сначала мы с тобой прогоним всю эту историю, чтобы у нас до getro прошло, мы данные передали.

Смотри, второе условие, это если у нас revision id отсюда.

Так, скрываем.

Is not equal, то есть у нас это будет текст.

string is not equal to, а тут мы пропишем условие json.hash.

Так, что-то у нас сбилось, и я не могу понять, что в getrow, а, getrow у нас не получается, json.id,

Поэтому мы передадим из GetDocument1 Передадим DocumentID И теперь смотри, что будет Мы запустим ExecuteWorkflow И у нас добавилось Что у нас Ага, хэш И смотри Мы добавили поле RevisionID, а не хэш И мы теперь после выполнения В GetArrow записываем RevisionID Вот, прогоняем еще раз

Отлично.

Теперь свитч у нас отработал, что оно у нас equal.

Давай это будет output.

Назовем changed.

И нам нужно сделать еще одно условие, когда у нас, скажем так, ничего не поменялось.

Мы в options добавляем add options, fallback output, extra output выбираем.

Rename Fallback Output и пишем Not Changed.

Смотри, жмем еще раз execute, получил документ и написал, что not changed.

Not changed мы добавляем сюда в loop over the items.

Если у нас файл new, вот этот create row на создание нового файла, мы сразу же тоже соединяем.

Но тут нам надо будет поменять парочку моментов.

Мы в следующем прогоне поменяем данные.

И смотри, что будет, если у нас будет changed.

Я тут сразу же добавлю несколько моментов из уже протестированного flow.

Вот эти две ноды.

Сейчас я, не переживай, объясню, что за что отвечает.

Первая нода это удаление из documents.

И смотри, так как мы будем делать запрос, он будет достаточно геморройный условно, я написал его за тебя.

Вот, Metadata, Document ID, Like и Document.

И мы будем удалять из документов, то есть из векторной нашей базы данных мы удаляем файл.

И после удаления нам нужно обновить его хэш.

То есть мы еще одну ноду Supabase добавляем.

И в апдейте, у нас только филд не хэш, а revision id, нам нужно обновить, поставить новый хэш.

Новый хэш мы можем взять из getDocument.

И вот тут прописываем revision id.

Ну и дальше соединяем с getDocument.

В getDocument из лупа мы берем id и так далее и тому подобное.

Смотри, что будет происходить теперь в данном случае.

ага вот давай мы удалим сейчас все прогоним еще раз справим ошибочки которые у нас возникают потому что они сейчас возникнут execute workflow

Получили, добавили новый файл, новый файл заработал.

Все.

У нас получилась вот такая история.

Documents и Documents Base у нас есть.

Все.

Теперь, когда мы перейдем в наш nvcmn-rackdata папочку...

Давай зайдем в бар и изменим что-то.

Ну, то есть просто название.

Что у нас будет происходить?

Когда у нас что-то изменилось, мы идем по ветке Changed.

И вот в обновлении у нас совершилась ошибочка.

Давай чуть-чуть раздвинем, посмотрим, что у нас.

Item ушел.

Удаление у нас из Documents по стрингу.

Да, Select Type у нас стринг идет.

А, да, смотри, я поле тут по-другому назвал.

Document, нижнее подчеркивание, ID.

Поэтому переходим и прописываем.

Document, нижнее подчеркивание, ID.

Я забыл.

Вот, смотри, у нас файл поменялся.

Execute workflow.

Он удалил, обновил наш хэш, но теперь getDocument ему неоткуда брать, потому что у нас item.json.id обвалился.

Поэтому мы из getDocument1 просто передадим данные нашего файла id.

Вот document.id, вот этот.

Так, очистим базу данных и заново все прогоним.

Так, execute workflow.

Сейчас два файла добавится.

Так, все отлично отработало.

Проверим базу данных.

Два разных файла.

И тут два разных файла.

Перейдем теперь в наш файл и поменяем что-то.

Вот просто в нем.

Сохранилось.

И теперь changed.

Угу.

Да, точно, мы JSON метадата, Document ID не передали.

Из предыдущей ноды, удаления из Document ID, берем вот этот Document ID.

Все, давай еще раз, финальный раз удаляем.

Теперь точно все сработает.

Все, прогоним по новой.

Так, execute workflow, добавляются два новых файла, переместимся, поменяем что-то внутри файла, changed, get a document и файл у нас поменялся.

Все отлично, у нас все работает, файл изменился и два файла остались без, ну один файл остался без изменений, один с изменениями.

Теперь мы с тобой переходим к финальному шагу.

Это, соответственно, удаление наших файлов.

Тут вообще все мега просто и будем сейчас делать.

Смотри, добавим с тобой новый триггер.

Я добавлю триггер manually пока что.

И смотри, нам нужно будет вот это скопировать.

Вот это скопировать.

И loop over the items скопировать.

Так, вот так.

И тут мы уже выбираем папку delete, которую мы создали внутри.

Если что, вот папочка delete.

И получаем files.

Соединяем с loop over the items 1.

Loop соединяем вот так.

Только нам уже обновление хэша не надо, нам нужно будет удаление хэша.

И теперь смотри.

Удаление из documents.

Вот.

Вот что будет происходить.

Мы получили.

Отлично.

Сейчас там файлов нет.

Давай перейдем и переместим, например, бар в папку delete.

Еще раз.

Вот.

Первые данные передались.

Нам нужно первое удалить под документ ID.

И тут нам нужно заменить наш JSON на другой.

То есть между двумя звездочками вставляем ID.

Ой, не вставилось.

Вот так.

Все, отлично.

И дальше нам нужно, только это будет не обновление, а удаление.

Operation меняем на Delete.

Из Document Base удаляем поле с определенным Document ID.

И мы с тобой выберем также из Loop Over The Items наш Document ID.

Все.

Ну и соответственно соединяем все это в луп.

Смотри, что будет происходить.

Жмем, он нашел файл и удалил его.

Все просто отлично.

Перейдем в базу данных, проверим, что получилось.

Остался один файл и тут остался также один файл.

Давай теперь мы все полностью проверим на корректность работы.

Документ мы тоже заходим и удаляем.

Такс.

И перейдем, переместим из папки delete все.

Смотри.

Запускаем вот этот, верхний.

У нас добавится два новых файла.

Один, два.

Супер.

Изменим теперь файл.

пойдет по ветке ченничества.

Один файл изменили, один не изменили.

И давай так, вот мы сейчас Refresh, Refresh, все хорошо.

И теперь мы переходим в этот и удалим вот этот файл.

Execute Trigger, сейчас он просто Not Changed, у нас один файл, и Workflow для удаления мы закинули на удаление.

Перейдем в базу данных, Refresh, остался один файл.

Мы удалили, получается, пиццу, оставили баррель.

Все отлично, все работает.

И давай быстренько объясню, как сделать.

У нас есть schedule trigger.

Извините.

И мы можем поставить, что у нас hours и 1 час будет.

То есть hours between triggers это что 1 раз в выбранный час.

И также мы можем делать на удаление, что 1 раз в час там будет проверяться и все делается.

Также соединяем.

Только давай не час, сделаем 1 час и в 1 час 10 минут будет повторяться.

Все, и теперь у нас будет workflow полностью работать.

Ну и спасибо большое, что ты посмотрел это видео.

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

Именно поэтому в Telegram-канале у тебя будет JSON с workflow, со всеми подписанными инструкциями и полностью рабочий.

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

Ну и, конечно же, лайк, подписка, колокольчик и комментарии от 4 и более слов будут очень полезны для развития канала.

Всем пока!