Transcription
Retrieval Augmented Generation is the key to giving your AI agent access to internal knowledge. Only then can the AI truly work with your documents, instead of just relying on training data. The problem is, many RAG systems fail because they don't use the right strategies to reproduce information precisely and reliably. If you watch N8N and RAG tutorials on YouTube, you'll quickly notice that most come from the USA and are hardly usable in practice for European companies. The reason is simple: they completely ignore the topic of data protection. In a corporate context, however, data protection is not an option, but a requirement. And that's exactly why I sat down and created a data protection-compliant RAG template, the main components of which you can even host entirely on your own server. It is not only GDPR compliant, but also technically state-of-the-art with state-of-the-art strategies such as Entic Chunking, Reranking, and Agentic Rag. And the best part is, with the integrated Mistral OCR model, not only texts but also images can be processed and made usable by the agent. And what you are seeing right now is not ChatGPT, but Open Web UI, a ChatGPT alternative that I am currently hosting on my own server. I will now show you how it all works, and we'll best start with a small demo. I have now uploaded a few files to my Nextcloud folder, and I am using Nextcloud here and not Google Drive. This is a more data protection-compliant alternative that you can also host yourself on your server. And in here I now have the following documents. An operating manual with pictures, this is now a PDF document. But I also have a normal Word document with texts and even an Excel spreadsheet with sales figures. And I will now ask the agent various questions about the documents. This data here is stored in a vector database in Superbase through this N8N automation, so that the agent can access this data. And here in Open Web UI I can then communicate with my agent. However, this doesn't have to be Open Web UI, but can also be a small chat window or widget on your website. That's entirely up to you. And I would now like to ask a question about the operating manual, for example. This is an instruction manual for a coffee machine, and as you can see, the manual also contains pictures that explain how to operate the coffee machine. And I will now give my agent the task: Explain to me the operation of the Renekaa Espresso coffee machine. The agent will then first think about it, then go into its knowledge base in Superbase and retrieve the corresponding relevant data to answer my question. And then we see here the agent generates a text with images. Here is the short overview. We see the machine. Then it goes through the individual steps and even provides us with the appropriate images so that we can understand it even better. Here then step 4, preparing espresso, and so on, and everything is nicely structured so that we can actually replicate it. And these are exactly the infos that are in the documents. Here we also see the images and the order is correct. And this has now become really comprehensive. So it has now reproduced the entire manual and it also gives me a few follow-up questions that I can ask, which fit the context. I can also ask it a question about another document, namely about Schneidersanitär und Heizungstechnik GmbH, for example. This is now a simple Word document, and here I would like to go into the prices, for example. I will now simply ask it about the costs for the craft services here. What do the craft services of Schneider GmbH cost? And then the agent generates the answer here, and that all matches up too. 80 to 90 € 40 € per service call. Let's look in here again. These are exactly the infos that are here. And the ingenious thing about the template is, if I edit the documents now and, for example, add new information or update information, such as, the prices have changed, due to inflation, everything has become a bit more expensive. Then the RAG system also updates itself in the background, namely this pipeline in the middle is executed every 5 minutes to update the RAG system. And without us having to wait 5 minutes, I will now simply trigger the whole thing. And we see here, the updated file is now analyzed again and the new values are saved. The data was then stored here in the vector database. I will explain what happens here in detail in a moment. However, if I ask it exactly the same question again, we will also see that the figures have changed, and it has now become more expensive here too, just like in the document. What this RAG system can also do, however, is that it can also reproduce tabular data. And this is a point where many RAG systems fail, because a RAG is not classically designed to output such tabular data. It's simply because we often have to perform calculations to combine multiple data points. And in a classic RAG system, it simply looks for the most similar document in the vector database or the most similar section. However, our RAG system can also process Excel data and save it correctly, and then combine and extract the tabular data correctly with the help of smart SQL queries. In this document, we now see sales figures of a company over an entire year, and I want to know how much revenue this company generated in a year, and this is not directly stated anywhere, but the AI must also meaningfully calculate these values and provide the output. We see the sum below, 248,100 €. This is the total revenue in this year. And I will now simply ask, what is the annual revenue of the company in 2024? The annual revenue for 2024 is €248,100. And it even tells me which file it got it from. Suppose I want to know the labor costs here between January and June. We are currently at 21,700 €. How high were the labor costs between January and June in 2024? According to the file, the labor costs totaled €21,700, and it even gives me the monthly breakdown, so January 2500, February 3000, and so on. These are exactly the data here. This functionality is extremely important, and many classic RAG systems fail precisely here. With this, you have now seen the system live, and I want to discuss the tech stack with you now so that you know which systems we are using in combination. And after that, we will look at the individual strategies in more detail. And don't worry, if you don't want to do the whole thing with Nextcloud, you can also do it with Google Drive, for example. That's also a bit easier if you want to get started and data protection doesn't affect you too much yet. This is what the tech stack looks like, as I am currently using it. And all the systems we use here are also fully hosted in the EU. We want to become a bit independent from the Americans and rely on European providers. And I will now explain the system from the inside out. First of all, we have the three central components: Open Web UI, N8N, and Superbase. Open Web UI is simply our frontend that we use to write with the agent. N8N is the main orchestration tool. Here all other tools are linked together, and Superbase is our PostgreSQL database where we store the vectorized data. These three services run on my own Hostinger server. This is a virtual private server that I own completely and is located in Germany. This means I have complete data control over everything that happens here. Hostinger makes it very easy for you to host all these services on your own server. That's why I use it and can highly recommend it. I will also show you how to host N8N on Hostinger shortly. However, you don't have to use Hostinger. You can also use Hetzner, for example, that works too. Our documents, which we use, also need to be stored somewhere, and as I said, I use Nextcloud for that, and you can theoretically also host Nextcloud on your own server. However, I went the route via Ionos, because with Ionos you can host Nextcloud GDPR-compliant on a German server, and the ingenious thing is, you get a lot of storage space for little money, and precisely for such file storage, the storage space is very important. And here with Hosting, you don't have that much storage, but a lot of computing power. The whole thing goes up to 400 GB, I believe. This means if you don't have too much data, you can also host Nextcloud here on your Hostinger server, for example. To read out these documents, we use Mistral as an OCR model. This model is very good at outputting complex PDF documents with images and illustrations as readable text and correctly labeling these images with their content. Therefore, we get the text and the images, and this data then needs to be vectorized, and for that we need a model, and for this we then use Microsoft Azure Services. There we can access powerful GPT-5 models, for example, as well as the embedding models to vectorize the texts. The whole thing is then also hosted in the EU on a Swedish server, and with this we can store the vectorized data here in Superbase and also store the images in the bucket, and then we can simply ask questions here via Open Web UI and also receive images and answers back. Here we see the two steps again. The whole thing happens here in N8N. So first, you know, vectorize the files. So we get the documents from Nextcloud. Mystral OCR extracts the text and annotates the images. The images are then uploaded to Superbase, and the texts are then split into individual chunks so that they can be processed better. And these chunks are converted into vectors with the help of embeddings so that a language model can understand them, because they can only understand numbers, and these vectors end up in Superbase, which is then our vector database. And as a second step, we want to query the data, and what essentially happens is, the user simply asks a question via Open Web UI, and this user message goes to our agent, but it is also converted into a vector representation with the help of embeddings and then compared with the vector database. This means the most similar documents that match the question are returned. Here the top results. This means our agent receives the top results from the vector database and also our user message, and can then generate an answer based on the message and the results to answer our question. And these data then also contain images, i.e., links to images, and these can then be output correctly with the text, also again in Open Web UI, and we see that. We will now look at the whole thing in N8N in more detail, and as usual, you can download the template here as well as the Google Drive version and the Mistral OCR pipeline in my community. There you will find all other resources. This means you can simply look in here, and here you will find the information below on how to set everything up and also the templates for it. So, if you want to start right away, link in the video description. We will now go through the essential components, and at this point I would also like to give a big shoutout to Coal Medien, who created the basis for this template in his video. I will also link that below. I have simply improved it with the data protection aspect and also connected it with Mistral OCR as well as with Open Web UI so that it can actually be used in practice. He explains the whole thing nicely again here. Therefore, definitely watch his video too. What we basically do first here is that we first execute these PostgreSQL modules. These create the necessary tables in Superbase where we will then store all the data. So here, for example, the table with the vectorized data, and here we see the table with the Excel data, you know, the sales figures and so on. Then we also have a table with the documents and the metadata, which are very important. And we actually also have a folder that helps us synchronize Nextcloud and our vector database, so that we always have the current documents available. And this N8N Chat Histories table here stores the conversation history with the agent in Open Web UI, so that it can always refer back to previous messages. This means, suppose you write in the chat one day, and then after a week you want to continue writing here, then you can simply do that, and the agent will also know why it was about before. This means it doesn't lose context. To execute these modules, you naturally need a connection to your Superbase account in this case. However, you don't necessarily have to use Superbase. Superbase is simply a PostgreSQL database in the background. Therefore, if you want to use another database, you can also do that with this template, as we only use PostgreSQL modules everywhere here. But we also store the individual images in Superbase in the bucket here, and that's why I use Superbase here. This means if you want to use a database other than Superbase here, which is also based on PostgreSQL, then simply ensure that it also has some kind of storage or bucket system where you can upload images that are then publicly available via a link. To connect Superbase via the PostgreSQL module, it depends a bit on whether you host Superbase yourself, as I am doing now, or whether you simply use it via the Superbase cloud. You can also do that as a first step if you don't want to host it yourself. If you want to use Superbase in the cloud first, then the free tier is sufficient. So you don't have to pay anything here. This version is perfectly sufficient. To connect Superbase via the PostgreSQL module, you simply click on connect at the top, and then you see the Transaction Pooler below, and this information here, as well as Host, Port, and so on, you have to enter here in N8N in the PostgreSQL module, and then you can connect. If you host it yourself, then you have to do a few more steps, but we also have a self-hosting guide in the community for that. This means if you scroll down in the self-hosting guide, we explain step by step how you can host all these open-source programs on your own server. So here Superbase as well as N8N or also, for example, here Open Web UI. And with this, you retain full control over your data. Explaining all of this here would go beyond the scope of the video. Therefore, feel free to check it out if you want to host it yourself. Once you have executed these modules, the individual tables will be created, and then you can upload data to your Nextcloud instance or to Google Drive, and this should then be vectorized. And what essentially happens here is, I check every 5 minutes for all the files in Nextcloud and also for all the files that are in this Data Sync Folder. So here, only the files that the RAG system has currently synchronized from Nextcloud are displayed. And we always see the name of the file and also when the file was last updated with new information. For example, with this code block here, we check if we have new files that appear in Nextcloud, but not in our database, or if a file has been updated because the Last Modified variable has changed. If that is the case, then we go through each new or updated file individually and update the RAG system. And what essentially happens here is, we first put the file back into our Data Sync Folder. This means the RAG system is then also practically updated and knows about it. There is a new file. Then we delete the old data of the document from our vector database, if, for example, we have updated a document. We also add the metadata of the document, you know, in Document Metadata we then have the ID of the file, the title, and also the path. Then we download the new file from Nextcloud and then look at, okay, what kind of file format is it? Because if it's an Excel or CSV, then we have to process it differently than if it's a text file or a PDF or something else. What we are doing up here is, we take each line in the Excel spreadsheet individually and insert it as a new row in our database. Here in the Document Rows table, we see each individual line of the same Excel file. It is output here once as JSON with all the information. With this, the AI agent can later extract all the lines and retrieve the corresponding information with the help of a query. If it is not an Excel file, then we follow the path below and want to analyze the text file or PDF file with the help of the Mistral OCR model. And as you can see here, I am calling a sub-workflow. And this workflow looks like this. I have already explained this workflow in detail in the following video, which I am linking above. Therefore, I will briefly go over it again. I highly recommend you watch the video. There I explain everything step by step, and you can even rebuild it yourself. Essentially, we just send the file to Mistral. It analyzes the file and returns the text, i.e., the OCR results, and the annotated images. And the second part here is actually only for processing the images correctly and uploading them to Superbase. Here in our bucket, the images have to end up, and this pipeline does that. This means if we have images, it goes through here. If we don't have images, then only the text is passed on, and in the end, the images and texts are merged so that the text also indicates when an image needs to be called up. I have now pinned the run where I processed the document with the coffee machine. It contained images. This means we have some pages with images, which went through here to process them. And on some pages, there was only text. This means it ran through here, and in the end, all items were simply merged. And if I look at it now, I see the Markdown content on the right. So this is simply the text, i.e., what was in the file. And in some places, there were also images, which are displayed here. And we now see in the text, at the corresponding place where an image was, the link to the image is already included. And this link is a publicly available link. This means if I enter it in the browser, I see the coffee machine. And because this can be displayed publicly, my agent can also display it in the chat. As I said, I explain the functionality in the video that I linked, which is about multimodal RAG. Therefore, definitely watch it to understand it even better. This is also exactly the part that I improved on CoMedien's template, because Co had simply used the N8N module Extract from File, which you can use for a text file or a PDF document, for example. The problem with this module is that it cannot read many documents well. This means, if we have documents with images, for example, they cannot be read at all, if we have complex documents, like an invoice with a strange structure or any PDF document with strange structures, they can also be read very poorly, and that naturally harms our RAG system. Therefore, I would not recommend this in practice, but rather switch to something like Mistral. I have now pinned the same run again, because we will now look at the first real RAG strategy here, namely Agentic Chunking. We now get the file contents as text with images from Mistral, and we need to split these into individual chunks, because with this, we make the processing significantly more effective. Because suppose you ask a question about a document, you don't want to read the entire document every time, but only receive specific sections that match your question to answer it. Therefore, we split the document into many individual chunks and only return the necessary ones at the end. And how we split these documents significantly influences how good our RAG system will be in the end. This means it is a major parameter, so to speak, because we want to split the documents in such a way that as little context as possible is lost. Because normally, such RAG systems often only have the setting that they make a cut every 1000 characters. This means 1000 characters, that's the first section, the next 1000, the second section, and so on. The problem with this is that you sometimes cut in the middle of a text where an idea is explained or a system is explained, you know? So a whole train of thought is simply cut in the middle, and that's naturally not good, because later, when we ask a question, we might not get certain information back at all. Therefore, we don't want to just make a cut every 1000 characters, but we want to make a cut at the right places with the help of a language model, in this case GPT-5 Mini. This means the model now analyzes with the help of this Langchain code where it should best split the document. This happens in the Langchain module via a prompt, and it is simply explained here that it should split the document in such a way that entire trains of thought remain together and ideas remain in one chunk, so that no context is lost. The ingenious thing is, you can also adjust this prompt further so that it splits the documents even better for your use case. For example, here is a chunk that starts with Introduction. Here #Introduction, that's the title. Then here the second chunk starts with the next subtitle, Technology, and it's a bit longer. This means it's cut again in the middle. But then we also have the fourth chunk with the next topic, Security. So, it always starts at logical points, so to speak, or at least tries to cut there, so that we keep as much information as possible in one chunk. These chunks then land here in our Superbase vector database, specifically here in this table. There we see the individual chunks. So, this part here in the middle is essentially what happens up here in step 1. Exactly, we've just gone through that. Now we come to step 2. We want to query the data, and that's what happens up here in the template. On the left, we see the agent, which has a somewhat unusual structure if you're not familiar with it yet. Below, the agent has a few tools with which it can query the database to, for example, correctly reproduce tabular data. We'll go into detail on that shortly. However, we also see a Basic LM Chain module above, and that actually has to do with Open Web UI. So, why the structure looks like this, I also explain in the video that I am linking above. There I show how to connect Open Web UI with N8N so that you can see the agent's answers here and also, for example, follow-up questions that fit the context, as well as the chat summaries on the left. All this information is created with this module, and our agent simply answers the user's questions. You can also chat directly with your agent in N8N and test it via this chat trigger. This means you can simply click on Open Chat. This means I can also ask it questions about the documents here, and it can also reproduce images. I will tell it here, for example, Show me a picture of the Reneka Espresso coffee machine. Then we see here, it uses the Vector Store tool to generate its answer. And then we also see here, this is the coffee machine, and it outputs the images correctly. And as I said, you don't have to use Open Web UI, you can use any other program. However, you need communication via webhooks here. Let's move on to the second important strategy, which happens during the query, namely Reranking. With the help of Reranking, we can significantly improve the information reproduction of our vector database. Currently, it's like this: our vector database returns the top results that match our query, i.e., the most relevant chunks, but these chunks are not ordered. This means we specify, for example, okay, give us the top 20 documents, and it will give them all back to us. But it's possible that certain chunks are significantly more important than others among those returned. And with the help of a reranking model, we can rank the chunks. The vector database is currently set to always return 25 chunks. However, we don't want to give all of these 25 chunks to the agent. That would overload him completely, but only the most important ones. And for that, we use this reranker. Here we set that we want to return four of the 25 chunks that fit best, and only these four will the agent see and can formulate its answer with. This means we work more efficiently and can simply provide even better information to our agent. Currently, in N8N, you can only use the Cohere Reranking model. For that, you need an API key from Cohere. This is actually a Canadian company, so it's quite good in terms of GDPR because Canada has very similar data protection requirements as the EU. Therefore, Canada is also accepted as a third country by the EU, and data transfer is also possible in a GDPR-compliant manner. To use the reranking model, you can get an API key from Cohere. You just need to create an account and can use the key for free. I am in my dashboard, and here under API Keys I see, you know, I'm on the free account, and here I can copy my API key, and you have to enter this key here, and then you simply select the Rerank V3.5 model, and that's it. This means we have intelligent chunking of documents on the one hand, intelligent reproduction of the most relevant chunks in context on the other hand, and now we come to the third point, namely Agentic Rag, i.e., the tools, so that the agent can also query the database. Cole also explains this very precisely in his video. Therefore, as I said, watch it. Essentially, it works like this: when it comes to the agent seeing that a particular document in the metadata is likely very relevant to answering a question, it can then retrieve and use all chunks belonging to that document based on the File ID to answer my question. This means, suppose the agent realizes that not all necessary chunks are coming from the vector database. Then it simply says, okay, list all documents, and then get content. This means it gets all chunks for the file and can then deliver the answer. And if it receives a question that relates to tabular data, where calculations need to be performed, for example, then it uses this Query Document Rows tool, and with it, it can perform an SQL query on the following Document Rows table. This means it can perform calculations with the help of the SQL query and doesn't have to do it itself. I would never use a language model just for calculations. It's not designed for that. It can reproduce text very, very well, but it's not good at calculations. I would rather work with SQL queries or simply with a calculator. And for this agent to be able to use these tools meaningfully, it needs a coherent system prompt. And I will show you that now. You are a personal assistant who answers questions from a corpus of documents. The documents are either text-based or tabular data. Tools are available here to perform Retrieval Augmented Generation in the Documents table, to look up available documents in the Document Metadata table, to extract the entire text from a specific document, and to query tabular data with SQL in the Document Rows table. This is very important that we explain this to the agent. Then I tell it below that it should always start with RAG, unless the question requires an SQL query for tabular data, i.e., to retrieve a sum, find a maximum, or something for which a classic RAG system would be unreliable. If the RAG system doesn't help further and doesn't provide meaningful information, then it should look at all available documents and select one that it believes is most likely to answer the question, and then it should analyze the entire document content. It should also always tell me if it doesn't know an answer to a question; that's better than hallucinating something. And at the end, I also tell it that if it sees images in the documents that it receives back from the vector database, you know, there's always a link included in the text, then it should always output them in Markdown and it should output the images in such a way that they fit the text, you know? So it shouldn't always output all images first and then the text, but text, then an image, then text again, so that it logically fits. This means with these three tools, we have the third point, Agentic. And that makes the agent really very, very strong, because it can now decide for itself, okay, do I simply use the chunks that are given to me from the vector database to answer the question? Or if there isn't enough information, can I also simply read out the entire document by querying all chunks? If it's tabular data and I need to do an SQL query, then I can also use the SQL tool here, where it writes the query itself. That's also the ingenious part. I don't have to tell it how to calculate a sum, but it understands it and writes its own SQL query that then performs the calculation for it. And with this, we have a very, very strong RAG system that also works really well in practice. And here on the bottom left, you see an important little point, namely that we check every 10 minutes if a file has been deleted in our Google Drive or in our Nextcloud folder, because up here we only check if a file has been added or
was updated, but if we no longer want a file and we simply delete it from here, for example, then the system should naturally recognize that and also delete that file from our database. And that's exactly what happens here. That means I read all files from Nextcloud and also all files in the database and then simply check, okay, which file is no longer present in Nextcloud, but is present in the database, and then I simply delete all information about this file, meaning both the vectorized data and the metadata. And here our data folder synchronization, meaning everything contained about the file, we simply delete. That means, assuming this file is no longer current. We want to delete it from here now. Zap. I delete it. We now see in the database that the file is still contained, of course. We see it down here. If I now execute the whole thing here, we see that only two files were found in Nextcloud. In the database, 3. And the one file that is no longer present is our Schneidersanitär und Heizungstechnik Word file, and this will then also be deleted from the database here. If I look in again and refresh this here, then I see here, the line is gone and here it is also gone and all vectors for the file have now also been deleted from here. That was basically it. That was the entire template, and as I said, you can also gladly do the whole thing not with Nextcloud, but with Google, if you prefer that. And here it is a bit more compact because Google offers us these triggers in N8N, namely File created and File Updated. That means we don't have to check every 5 or 10 minutes if something has happened, but the trigger automatically recognizes when a new file lands in the folder or when a file is updated. That is a bit easier here then. And down here it is exactly the same. Only here we have such a special HTTP request, where we then check which documents have been deleted from our folder, and these are then also deleted here in the database. Otherwise, the template is exactly the same. We also do the Mysteryal OCR query here and the chunking here, and reranking up here, and this via Open Web UI. So everything is the same, only at the beginning it is a bit different here. If you want to implement the whole thing yourself now, then you actually have to host N8N yourself on your own server, because on the N8N cloud version we do not have this Langchain function here. So, we cannot use the Langchain modules, we can only use them if we host N8N ourselves. Therefore, I want to show you now how I host N8N myself and also the other systems here, such as Superbase and also Open Web UI. And as I said, I do this via Hostinger. You can go to hostinger.com/wps here to this WPS page. WPS stands for Virtual Private Server. Here you can get your own server for very little money and get really good computing resources here. If you only want to host R8N on your own server for now, then the KFM2 plan is definitely sufficient here. If you also plan to host Open Web UI and Superbase and other programs on it, then I would recommend that you go for the KVM4 or 8 plan here. KVM4 is also sufficient. You can upgrade at any time anyway, but for the beginning, it is enough if we choose the KFM2 plan. Here you can then enter your period, and if we buy this directly for 24 months, then we only pay 7 € per month, which is really nothing. If you compare it, assume you want to use N8N via the official cloud now, then you pay alone here, if we go to the monthly plan, 24 € per month and also have a limited number of workflow executions and um, yes, that might be good for beginners, but if you want to work with Nachn in the long term, I would recommend hosting it yourself anyway, because you simply have unlimited workflows here. So, you only pay for the server costs and nothing else and have no restrictions. You can choose the server location here, which is already set to Germany, and down here you can then select the application you want to install. It will then be installed ready by Hostinger. We already see N8N and even N8N with 100 workflows. This is practically a template that installs N8N and 100 workflows that were built in the community, which are also verified and sensible, they will then also be simply installed on your N8N instance. But you can also host not only N8N, as I said, but also Superbase or even Nextcloud, for example. If you want to host multiple programs on your server, then I recommend Coolify. There you can manage and install various open source programs very easily. It might be a bit more technical. For that, as I said, we also have the Self Hosting Guide, where we explain the entire Coolify setup again and also things like security and so on. The very, very important thing is, if you only want to start with N8N for now, then you can simply enter N8N here and then, for example, choose the normal N8N template here, or if you already want some workflows from the community, then take the one down here, then simply click on confirm here, and if you want to save 10% and also support me a bit, then you can save 10% on your purchase with the code Julian Ivanov, written in capital letters. Then you simply click on next here, and then you naturally have to create an account. Then you will be redirected to payment here and simply enter your payment details and then click on next, and Hostiger will then really take care of everything for you. The complete setup of N8N, it will then be set up for you in a few minutes. You will then be redirected to your dashboard here. Here you see your virtual private server with N8N as the application, and then you can click on Manage App up here, and then N8N will open. And as you can see, I also use the whole thing myself via Hostinger and am very satisfied. For you, a window will first pop up here, that you have to create the account, an admin account. And then you can get started here and simply create your workflow. If an update comes out for N8N, you can update your instance like this by going to Browser Terminal here, and then you only need to enter three commands in the command line, namely once Docker Compose Pull. With this, we pull the latest Docker image of N8N. After that, we write Docker Compose down, to shut down the server. And then we write Docker Compose up - D and start the server again. And that was it. We can now close this again, and in my N8N instance, I can now refresh the whole thing here. And with that, we are now also on the latest version 1.111.1. That was it with the video. I hope you were able to learn a bit. If so, please leave a like and a subscription so that you don't miss any further content like this. If you want to delve deeper into the topic and learn the whole thing in a corporate context and also master self-hosting and so on, then you can also gladly visit the community. We are currently 161 members and are constantly growing with many different entrepreneurs from various fields. With this, you have the ideal environment to really make progress. And of course, we have a lot of courses on N8N and GDPR and also on how to build your own AI business and so on. We also have two live calls per week where we exchange ideas and look at problems, share screens, and so on. That means here you can exchange ideas with me and also with others. So, if you are interested in all of this, you are very welcome. I thank you for watching and would say, we will see you in the next video. Until then.