Index local documents for RAG using Ollama embeddings and Qdrant
Go to WorkflowDescription
Quick overview
This workflow ingests a local document file, splits it into chunks, generates embeddings with Ollama (nomic-embed-text), and stores the vectors in a Qdrant collection for on-prem RAG indexing.
How it works
Runs manually when you click Execute workflow in n8n.
Reads a document from disk from the n8n host/container file system.
Extracts text content from the file (configured for PDF extraction).
Splits the extracted text into overlapping chunks using a recursive character splitter.
Generates embeddings for each chunk with Ollama using the nomic-embed-text model.
Inserts the chunk texts and their embeddings into a specified Qdrant collection.
Setup
Self-host n8n with a mounted volume and update the file path to a container-accessible path in the Read/Write Files from Disk step.
Run Ollama locally, pull the nomic-embed-text model, and add an Ollama credential in n8n pointing to your Ollama instance.
Set up a Qdrant instance, create a Qdrant API credential in n8n (URL and API key), and set the target collection name (for example, handbook) in the Qdrant step.
Requirements
Self-hosted n8n (Docker or npm-based) this workflow will not run on n8n Cloud, since it depends on the local-filesystem "Read/Write Files from Disk" node.
Ollama installed and running locally, with the nomic-embed-text model pulled (ollama pull nomic-embed-text).
A Qdrant instance (local or cloud) with a URL and API key you can register as an n8n credential.
A document file (PDF by default; swap the extraction node's operation for other formats) accessible on the n8n host/container filesystem.
Customization
Swap the embedding model by changing the Ollama credential/model name to a different local embedding model.
Point the "Extract from File" node at a different format (DOCX, CSV, HTML) instead of PDF.
Adjust chunk size/overlap on the Recursive Character Text Splitter for longer or shorter context windows.
Swap Qdrant for another n8n-supported vector store if you'd rather not self-host Qdrant.
Replace the manual trigger with a Schedule Trigger or Webhook to automate ingestion of new files as they arrive.
Additional info
Pairs with a companion template, "Local RAG Query Chatbot," which queries the same Qdrant collection this workflow populates — run this Indexer first, then use that template to ask questions about the indexed content. Runs entirely on local models (Ollama + Qdrant), so there's no per-query API cost once set up.
Known limitation: retrieval quality on the companion query template depends on the Vector Store Retriever's Top K setting. With the default value, questions needing multiple facts at once may retrieve an incomplete set of chunks, and the assistant will correctly decline rather than guess. Increase Top K on the retriever node if you need broader recall.