Workflow: Building RAG Chatbot for Movie Recommendations with Qdrant and Open AI
Integrations: aggregate, executeWorkflowTrigger, extractFromFile, github, httpRequest, manualTrigger, merge, set, splitOut, stickyNote

{"id": "a58HZKwcOy7lmz56", "meta": {"instanceId": "178ef8a5109fc76c716d40bcadb720c455319f7b7a3fd5a39e4f336a091f524a", "templateCredsSetupCompleted": true}, "name": "Building RAG Chatbot for Movie Recommendations with Qdrant and Open AI", "tags": [], "nodes": [{"id": "06a34e3b-519a-4b48-afd0-4f2b51d2105d", "name": "When clicking \u2018Test workflow\u2019", "type": "n8n-nodes-base.manualTrigger", "position": [4980, 740], "parameters": {}, "typeVersion": 1}, {"id": "9213003d-433f-41ab-838b-be93860261b2", "name": "GitHub", "type": "n8n-nodes-base.github", "position": [5200, 740], "parameters": {"owner": {"__rl": true, "mode": "name", "value": "mrscoopers"}, "filePath": "Top_1000_IMDB_movies.csv", "resource": "file", "operation": "get", "repository": {"__rl": true, "mode": "list", "value": "n8n_demo", "cachedResultUrl": "https://github.com/mrscoopers/n8n_demo", "cachedResultName": "n8n_demo"}, "additionalParameters": {}}, "credentials": {"githubApi": {"id": "VbfC0mqEq24vPIwq", "name": "GitHub n8n demo"}}, "typeVersion": 1}, {"id": "9850d1a9-3a6f-44c0-9f9d-4d20fda0b602", "name": "Extract from File", "type": "n8n-nodes-base.extractFromFile", "position": [5360, 740], "parameters": {"options": {}}, "typeVersion": 1}, {"id": "7704f993-b1c9-477a-8b5a-77dc2cb68161", "name": "Embeddings OpenAI", "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi", "position": [5560, 940], "parameters": {"model": "text-embedding-3-small", "options": {}}, "credentials": {"openAiApi": {"id": "deYJUwkgL1Euu613", "name": "OpenAi account 2"}}, "typeVersion": 1}, {"id": "bc6dd8e5-0186-4bf9-9c60-2eab6d9b6520", "name": "Default Data Loader", "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader", "position": [5700, 960], "parameters": {"options": {"metadata": {"metadataValues": [{"name": "movie_name", "value": "={{ $('Extract from File').item.json['Movie Name'] }}"}, {"name": "movie_release_date", "value": "={{ $('Extract from File').item.json['Year of Release'] }}"}, {"name": "movie_description", "value": "={{ $('Extract from File').item.json.Description }}"}]}}, "jsonData": "={{ $('Extract from File').item.json.Description }}", "jsonMode": "expressionData"}, "typeVersion": 1}, {"id": "f87ea014-fe79-444b-88ea-0c4773872b0a", "name": "Token Splitter", "type": "@n8n/n8n-nodes-langchain.textSplitterTokenSplitter", "position": [5700, 1140], "parameters": {}, "typeVersion": 1}, {"id": "d8d28cec-c8e8-4350-9e98-cdbc6da54988", "name": "Qdrant Vector Store", "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant", "position": [5600, 740], "parameters": {"mode": "insert", "options": {}, "qdrantCollection": {"__rl": true, "mode": "id", "value": "imdb"}}, "credentials": {"qdrantApi": {"id": "Zin08PA0RdXVUKK7", "name": "QdrantApi n8n demo"}}, "typeVersion": 1}, {"id": "f86e03dc-12ea-4929-9035-4ec3cf46e300", "name": "When chat message received", "type": "@n8n/n8n-nodes-langchain.chatTrigger", "position": [4920, 1140], "webhookId": "71bfe0f8-227e-466b-9d07-69fd9fe4a27b", "parameters": {"options": {}}, "typeVersion": 1.1}, {"id": "ead23ef6-2b6b-428d-b412-b3394bff8248", "name": "OpenAI Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [5040, 1340], "parameters": {"model": "gpt-4o-mini", "options": {}}, "credentials": {"openAiApi": {"id": "deYJUwkgL1Euu613", "name": "OpenAi account 2"}}, "typeVersion": 1}, {"id": "7ab936e1-aac8-43bc-a497-f2d02c2c19e5", "name": "Call n8n Workflow Tool", "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "position": [5320, 1340], "parameters": {"name": "movie_recommender", "schemaType": "manual", "workflowId": {"__rl": true, "mode": "id", "value": "a58HZKwcOy7lmz56"}, "description": "Call this tool to get a list of recommended movies from a vector database. ", "inputSchema": "{\n\"type\": \"object\",\n\"properties\": {\n\t\"positive_example\": {\n \"type\": \"string\",\n \"description\": \"A string with a movie description matching the user's positive recommendation request\"\n },\n \"negative_example\": {\n \"type\": \"string\",\n \"description\": \"A string with a movie description matching the user's negative anti-recommendation reuqest\"\n }\n}\n}", "specifyInputSchema": true}, "typeVersion": 1.2}, {"id": "ce55f334-698b-45b1-9e12-0eaa473187d4", "name": "Window Buffer Memory", "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow", "position": [5160, 1340], "parameters": {}, "typeVersion": 1.2}, {"id": "41c1ee11-3117-4765-98fc-e56cc6fc8fb2", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [5640, 1600], "parameters": {}, "typeVersion": 1}, {"id": "db8d6ab6-8cd2-4a8c-993d-f1b7d7fdcffd", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [6540, 1500], "parameters": {"mode": "combine", "options": {}, "combineBy": "combineAll"}, "typeVersion": 3}, {"id": "c7bc5e04-22b1-40db-ba74-1ab234e51375", "name": "Split Out", "type": "n8n-nodes-base.splitOut", "position": [7260, 1480], "parameters": {"options": {}, "fieldToSplitOut": "result"}, "typeVersion": 1}, {"id": "a2002d2e-362a-49eb-a42d-7b665ddd67a0", "name": "Split Out1", "type": "n8n-nodes-base.splitOut", "position": [7140, 1260], "parameters": {"options": {}, "fieldToSplitOut": "result.points"}, "typeVersion": 1}, {"id": "f69a87f1-bfb9-4337-9350-28d2416c1580", "name": "Merge1", "type": "n8n-nodes-base.merge", "position": [7520, 1400], "parameters": {"mode": "combine", "options": {}, "fieldsToMatchString": "id"}, "typeVersion": 3}, {"id": "b2f2529e-e260-4d72-88ef-09b804226004", "name": "Aggregate", "type": "n8n-nodes-base.aggregate", "position": [7960, 1400], "parameters": {"options": {}, "aggregate": "aggregateAllItemData", "destinationFieldName": "response"}, "typeVersion": 1}, {"id": "bedea10f-b4de-4f0e-9d60-cc8117a2b328", "name": "AI Agent", "type": "@n8n/n8n-nodes-langchain.agent", "position": [5140, 1140], "parameters": {"options": {"systemMessage": "You are a Movie Recommender Tool using a Vector Database under the hood. Provide top-3 movie recommendations returned by the database, ordered by their recommendation score, but not showing the score to the user."}}, "typeVersion": 1.6}, {"id": "e04276b5-7d69-437b-bf4f-9717808cc8f6", "name": "Embedding Recommendation Request with Open AI", "type": "n8n-nodes-base.httpRequest", "position": [5900, 1460], "parameters": {"url": "https://api.openai.com/v1/embeddings", "method": "POST", "options": {}, "sendBody": true, "sendHeaders": true, "authentication": "predefinedCredentialType", "bodyParameters": {"parameters": [{"name": "input", "value": "={{ $json.query.positive_example }}"}, {"name": "model", "value": "text-embedding-3-small"}]}, "headerParameters": {"parameters": [{"name": "Authorization", "value": "Bearer $OPENAI_API_KEY"}]}, "nodeCredentialType": "openAiApi"}, "credentials": {"openAiApi": {"id": "deYJUwkgL1Euu613", "name": "OpenAi account 2"}}, "typeVersion": 4.2}, {"id": "68e99f06-82f5-432c-8b31-8a1ae34981a6", "name": "Embedding Anti-Recommendation Request with Open AI", "type": "n8n-nodes-base.httpRequest", "position": [5920, 1660], "parameters": {"url": "https://api.openai.com/v1/embeddings", "method": "POST", "options": {}, "sendBody": true, "sendHeaders": true, "authentication": "predefinedCredentialType", "bodyParameters": {"parameters": [{"name": "input", "value": "={{ $json.query.negative_example }}"}, {"name": "model", "value": "text-embedding-3-small"}]}, "headerParameters": {"parameters": [{"name": "Authorization", "value": "Bearer $OPENAI_API_KEY"}]}, "nodeCredentialType": "openAiApi"}, "credentials": {"openAiApi": {"id": "deYJUwkgL1Euu613", "name": "OpenAi account 2"}}, "typeVersion": 4.2}, {"id": "ecb1d7e1-b389-48e8-a34a-176bfc923641", "name": "Extracting Embedding", "type": "n8n-nodes-base.set", "position": [6180, 1460], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "01a28c9d-aeb1-48bb-8a73-f8bddbd73460", "name": "positive_example", "type": "array", "value": "={{ $json.data[0].embedding }}"}]}}, "typeVersion": 3.4}, {"id": "4ed11142-a734-435f-9f7a-f59e2d423076", "name": "Extracting Embedding1", "type": "n8n-nodes-base.set", "position": [6180, 1660], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "01a28c9d-aeb1-48bb-8a73-f8bddbd73460", "name": "negative_example", "type": "array", "value": "={{ $json.data[0].embedding }}"}]}}, "typeVersion": 3.4}, {"id": "ce3aa9bc-a5b1-4529-bff5-e0dba43b99f3", "name": "Calling Qdrant Recommendation API", "type": "n8n-nodes-base.httpRequest", "position": [6840, 1500], "parameters": {"url": "https://edcc6735-2ffb-484f-b735-3467043828fe.europe-west3-0.gcp.cloud.qdrant.io:6333/collections/imdb_1000_open_ai/points/query", "method": "POST", "options": {}, "jsonBody": "={\n \"query\": {\n \"recommend\": {\n \"positive\": [[{{ $json.positive_example }}]],\n \"negative\": [[{{ $json.negative_example }}]],\n \"strategy\": \"average_vector\"\n }\n },\n \"limit\":3\n}", "sendBody": true, "specifyBody": "json", "authentication": "predefinedCredentialType", "nodeCredentialType": "qdrantApi"}, "credentials": {"qdrantApi": {"id": "Zin08PA0RdXVUKK7", "name": "QdrantApi n8n demo"}}, "typeVersion": 4.2}, {"id": "9b8a6bdb-16fe-4edc-86d0-136fe059a777", "name": "Retrieving Recommended Movies Meta Data", "type": "n8n-nodes-base.httpRequest", "position": [7060, 1460], "parameters": {"url": "https://edcc6735-2ffb-484f-b735-3467043828fe.europe-west3-0.gcp.cloud.qdrant.io:6333/collections/imdb_1000_open_ai/points", "method": "POST", "options": {}, "jsonBody": "={\n \"ids\": [\"{{ $json.result.points[0].id }}\", \"{{ $json.result.points[1].id }}\", \"{{ $json.result.points[2].id }}\"],\n \"with_payload\":true\n}", "sendBody": true, "specifyBody": "json", "authentication": "predefinedCredentialType", "nodeCredentialType": "qdrantApi"}, "credentials": {"qdrantApi": {"id": "Zin08PA0RdXVUKK7", "name": "QdrantApi n8n demo"}}, "typeVersion": 4.2}, {"id": "28cdcad5-3dca-48a1-b626-19eef657114c", "name": "Selecting Fields Relevant for Agent", "type": "n8n-nodes-base.set", "position": [7740, 1400], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "b4b520a5-d0e2-4dcb-af9d-0b7748fd44d6", "name": "movie_recommendation_score", "type": "number", "value": "={{ $json.score }}"}, {"id": "c9f0982e-bd4e-484b-9eab-7e69e333f706", "name": "movie_description", "type": "string", "value": "={{ $json.payload.content }}"}, {"id": "7c7baf11-89cd-4695-9f37-13eca7e01163", "name": "movie_name", "type": "string", "value": "={{ $json.payload.metadata.movie_name }}"}, {"id": "1d1d269e-43c7-47b0-859b-268adf2dbc21", "name": "movie_release_year", "type": "string", "value": "={{ $json.payload.metadata.release_year }}"}]}}, "typeVersion": 3.4}, {"id": "56e73f01-5557-460a-9a63-01357a1b456f", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [5560, 1780], "parameters": {"content": "Tool, calling Qdrant's recommendation API based on user's request, transformed by AI agent"}, "typeVersion": 1}, {"id": "cce5250e-0285-4fd0-857f-4b117151cd8b", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [4680, 720], "parameters": {"content": "Uploading data (movies and their descriptions) to Qdrant Vector Store\n"}, "typeVersion": 1}], "active": false, "pinData": {"Execute Workflow Trigger": [{"json": {"query": {"negative_example": "horror bloody movie", "positive_example": "romantic comedy"}}}]}, "settings": {"executionOrder": "v1"}, "versionId": "40d3669b-d333-435f-99fc-db623deda2cb", "connections": {"Merge": {"main": [[{"node": "Calling Qdrant Recommendation API", "type": "main", "index": 0}]]}, "GitHub": {"main": [[{"node": "Extract from File", "type": "main", "index": 0}]]}, "Merge1": {"main": [[{"node": "Selecting Fields Relevant for Agent", "type": "main", "index": 0}]]}, "Split Out": {"main": [[{"node": "Merge1", "type": "main", "index": 1}]]}, "Split Out1": {"main": [[{"node": "Merge1", "type": "main", "index": 0}]]}, "Token Splitter": {"ai_textSplitter": [[{"node": "Default Data Loader", "type": "ai_textSplitter", "index": 0}]]}, "Embeddings OpenAI": {"ai_embedding": [[{"node": "Qdrant Vector Store", "type": "ai_embedding", "index": 0}]]}, "Extract from File": {"main": [[{"node": "Qdrant Vector Store", "type": "main", "index": 0}]]}, "OpenAI Chat Model": {"ai_languageModel": [[{"node": "AI Agent", "type": "ai_languageModel", "index": 0}]]}, "Default Data Loader": {"ai_document": [[{"node": "Qdrant Vector Store", "type": "ai_document", "index": 0}]]}, "Extracting Embedding": {"main": [[{"node": "Merge", "type": "main", "index": 0}]]}, "Window Buffer Memory": {"ai_memory": [[{"node": "AI Agent", "type": "ai_memory", "index": 0}]]}, "Extracting Embedding1": {"main": [[{"node": "Merge", "type": "main", "index": 1}]]}, "Call n8n Workflow Tool": {"ai_tool": [[{"node": "AI Agent", "type": "ai_tool", "index": 0}]]}, "Execute Workflow Trigger": {"main": [[{"node": "Embedding Recommendation Request with Open AI", "type": "main", "index": 0}, {"node": "Embedding Anti-Recommendation Request with Open AI", "type": "main", "index": 0}]]}, "When chat message received": {"main": [[{"node": "AI Agent", "type": "main", "index": 0}]]}, "Calling Qdrant Recommendation API": {"main": [[{"node": "Retrieving Recommended Movies Meta Data", "type": "main", "index": 0}, {"node": "Split Out1", "type": "main", "index": 0}]]}, "When clicking \u2018Test workflow\u2019": {"main": [[{"node": "GitHub", "type": "main", "index": 0}]]}, "Selecting Fields Relevant for Agent": {"main": [[{"node": "Aggregate", "type": "main", "index": 0}]]}, "Retrieving Recommended Movies Meta Data": {"main": [[{"node": "Split Out", "type": "main", "index": 0}]]}, "Embedding Recommendation Request with Open AI": {"main": [[{"node": "Extracting Embedding", "type": "main", "index": 0}]]}, "Embedding Anti-Recommendation Request with Open AI": {"main": [[{"node": "Extracting Embedding1", "type": "main", "index": 0}]]}}}