AutomationFlowsAI & RAG › Document Q&a with Rag: Query PDF Content Using Weaviate and Openai

Document Q&a with Rag: Query PDF Content Using Weaviate and Openai

ByMary Newhauser @maryn on n8n.io

This workflow allows you to upload a PDF file and ask questions about it using the Question and Answer Chain and the Weaviate Vector Store nodes.

Chat trigger trigger★★★★☆ complexityAI-powered17 nodesWeaviate Vector StoreDocument Default Data LoaderOpenAI EmbeddingsText Splitter Recursive Character Text SplitterChat TriggerChain Retrieval QaRetriever Vector StoreOpenAI Chat
AI & RAG Trigger: Chat trigger Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #7170 — we link there as the canonical source.

This workflow follows the Chainretrievalqa → Retrievervectorstore recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "hWxVTNvDEcGofp5O",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "rag-with-weaviate",
  "tags": [],
  "nodes": [
    {
      "id": "4cfa559c-9cec-4a74-84d5-9cf4a2d7915a",
      "name": "Weaviate Vector Store",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreWeaviate",
      "position": [
        432,
        288
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "textKey": "text"
        },
        "weaviateCollection": {
          "__rl": true,
          "mode": "id",
          "value": "FileUpload"
        }
      },
      "credentials": {
        "weaviateApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c87c8fe2-56bf-405f-a91a-3b1af7cf2e8c",
      "name": "Default Data Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        512,
        496
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {}
            ]
          }
        },
        "jsonData": "={{ $json.text }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "ac0c796a-3b1d-4ba6-83e5-23a673e4628d",
      "name": "Embeddings OpenAI",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        384,
        496
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d89bd8be-a275-4a57-a1a6-6006302ba3dd",
      "name": "Recursive Character Text Splitter1",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "position": [
        544,
        656
      ],
      "parameters": {
        "options": {},
        "chunkSize": 500
      },
      "typeVersion": 1
    },
    {
      "id": "dcabfdff-749b-4442-933d-409b1479d2c8",
      "name": "Extract from File",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -48,
        288
      ],
      "parameters": {
        "options": {
          "maxPages": 99
        },
        "operation": "pdf",
        "binaryPropertyName": "PDF_File"
      },
      "typeVersion": 1
    },
    {
      "id": "779add5c-4770-472a-a2e9-934e1e2e4569",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        128,
        288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d719d94d-6597-402c-8958-dd270de82ce6",
              "name": "text",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "eda536c5-d88f-45e4-9505-d3b1e6c5fa27",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        992,
        288
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "94ed5f2b-fb86-42e8-a778-ab51d7a49d42",
      "name": "Weaviate Vector Store1",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreWeaviate",
      "position": [
        1280,
        624
      ],
      "parameters": {
        "options": {},
        "weaviateCollection": {
          "__rl": true,
          "mode": "list",
          "value": "FileUpload",
          "cachedResultName": "FileUpload"
        }
      },
      "credentials": {
        "weaviateApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "ae3a9b66-a5c8-4108-980c-1c3ace05e528",
      "name": "Question and Answer Chain",
      "type": "@n8n/n8n-nodes-langchain.chainRetrievalQa",
      "position": [
        1168,
        288
      ],
      "parameters": {
        "text": "=Using only the attached Weaviate vector store collection (and no external knowledge), answer the following query:\n{{ $json.chatInput }}",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.6
    },
    {
      "id": "d9110fef-f3ae-4c3a-bfc0-b3bfe0f6fcb0",
      "name": "Vector Store Retriever",
      "type": "@n8n/n8n-nodes-langchain.retrieverVectorStore",
      "position": [
        1280,
        480
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "79aaa15c-f0d6-4c88-bd15-ff7835131b2b",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1152,
        480
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9f961ef2-5466-475d-9ccb-1436469dee00",
      "name": "Embeddings OpenAI1",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        1360,
        768
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d46d3a49-ec16-40aa-928e-291fc90b9f2d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        176
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 336,
        "content": "## Part 1: Manually upload data \nIn this example, we manually upload a 100+ page article from arXiv called [\"A Survey of Large Language Models\"](https://arxiv.org/pdf/2303.18223).\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n_**Note: This is a simple implementation of loading data. You can replace this block with your own (more advanced) data pipeline!**_"
      },
      "typeVersion": 1
    },
    {
      "id": "9b192882-6d54-43c5-9ccb-cca0bcf456f4",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        176
      ],
      "parameters": {
        "color": 6,
        "width": 640,
        "height": 736,
        "content": "## Part 3: Perform RAG over PDF file with Weaviate\nEnter your query by running the Chat Node and get a RAG response grounded in context."
      },
      "typeVersion": 1
    },
    {
      "id": "431f55e3-9599-4de7-a363-2e82e6581101",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        -128
      ],
      "parameters": {
        "color": 4,
        "width": 992,
        "height": 288,
        "content": "# RAG over a PDF file with Weaviate\nThis workflow allows you to upload a PDF file and ask questions about it using the Question and Answer Chain and the Weaviate Vector Store nodes. \n\n## Prerequisites\n1.  **An existing Weaviate cluster.** You can view instructions for setting up a **local cluster** with Docker [here](https://weaviate.io/developers/weaviate/installation/docker-compose#starter-docker-compose-file) or a **Weaviate Cloud** cluster [here](https://weaviate.io/developers/wcs/quickstart).\n2.  **API keys** to generate embeddings and power chat models. We use [OpenAI](https://openai.com/), but feel free to switch out the models as you like.\n3.  **Self-hosted n8n instance.** See this [video](https://www.youtube.com/watch?v=kq5bmrjPPAY&t=108s) for how to get set up in just three minutes.\n\n\n\ud83d\udc9a  Sign up [here](https://console.weaviate.cloud/?utm_source=recipe&utm_campaign=n8n&utm_content=n8n_arxiv_template) for a 14-day free trial of Weaviate Cloud (no credit card required)."
      },
      "typeVersion": 1
    },
    {
      "id": "588d9eee-f769-4c6b-9b16-2b1790118a4d",
      "name": "Upload PDF",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -224,
        288
      ],
      "parameters": {
        "options": {},
        "formTitle": "Upload your file here",
        "formFields": {
          "values": [
            {
              "fieldType": "file",
              "fieldLabel": "PDF File",
              "multipleFiles": false,
              "requiredField": true,
              "acceptFileTypes": ".pdf"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4d4244ef-c4af-4eb1-8389-6bd95cc5613e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        176
      ],
      "parameters": {
        "color": 3,
        "width": 624,
        "height": 688,
        "content": "## Part 2: Embed and load data into Weaviate collection\nWe generate embeddings for the full-text of the article and store them in Weaviate.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n_**Note: We don't add any metadata to Weaviate in this example. To add metadata, click on the Default Data Loader node \u2192 `Add Option` \u2192 `Metadata`.**_"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "61bb6430-21b1-4443-8924-34a83eab6965",
  "connections": {
    "Upload PDF": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Weaviate Vector Store",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI": {
      "ai_embedding": [
        [
          {
            "node": "Weaviate Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Extract from File": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Question and Answer Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Embeddings OpenAI1": {
      "ai_embedding": [
        [
          {
            "node": "Weaviate Vector Store1",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Default Data Loader": {
      "ai_document": [
        [
          {
            "node": "Weaviate Vector Store",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Weaviate Vector Store": {
      "main": [
        []
      ]
    },
    "Vector Store Retriever": {
      "ai_retriever": [
        [
          {
            "node": "Question and Answer Chain",
            "type": "ai_retriever",
            "index": 0
          }
        ]
      ]
    },
    "Weaviate Vector Store1": {
      "ai_vectorStore": [
        [
          {
            "node": "Vector Store Retriever",
            "type": "ai_vectorStore",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "Question and Answer Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Recursive Character Text Splitter1": {
      "ai_textSplitter": [
        [
          {
            "node": "Default Data Loader",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow allows you to upload a PDF file and ask questions about it using the Question and Answer Chain and the Weaviate Vector Store nodes.

Source: https://n8n.io/workflows/7170/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Advanced Ai Demo Presented At Ai Developers 14 Meetup. Uses slack, stickyNote, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi. Chat trigger; 39 nodes.

Slack, Text Splitter Recursive Character Text Splitter, OpenAI Embeddings +14
AI & RAG

Advanced Ai Demo (Presented At Ai Developers #14 Meetup). Uses slack, stickyNote, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi. Chat trigger; 39 nodes.

Slack, Text Splitter Recursive Character Text Splitter, OpenAI Embeddings +14
AI & RAG

Workflow 2358. Uses slack, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi, documentDefaultDataLoader. Chat trigger; 39 nodes.

Slack, Text Splitter Recursive Character Text Splitter, OpenAI Embeddings +14
AI & RAG

2358. Uses slack, textSplitterRecursiveCharacterTextSplitter, embeddingsOpenAi, documentDefaultDataLoader. Chat trigger; 39 nodes.

Slack, Text Splitter Recursive Character Text Splitter, OpenAI Embeddings +14
AI & RAG

This workflow was presented at the AI Developers meet up in San Fransico on 24 July, 2024. Categorize incoming Gmail emails and assign custom Gmail labels. This example uses the Text Classifier node,

Slack, Text Splitter Recursive Character Text Splitter, OpenAI Embeddings +14