Ditt bildsökprojekt är inte ”svårt” i början. Sedan växer datasetet, filnamn glider isär, metadata blir inkonsekvent, och plötsligt bygger du om embeddings igen eftersom något inte stämde.
Marketing ops-team märker det när taggningen faller sönder. Produkt-team märker det när sökkvaliteten sjunker. Och byråfolk märker det när kundernas dataset fortsätter att förändras. Den här automatiseringen för Qdrant image upload gör en stökig bild-bucket till en sökbar, repeterbar pipeline.
Du får se hur arbetsflödet kontrollerar/skapar en Qdrant-collection, hämtar bilder från Google Cloud Storage, genererar embeddings i batchar och laddar upp allt med konsekventa payload-fält så att du faktiskt kan lita på resultaten.
Så fungerar automatiseringen
Här är hela arbetsflödet som du kommer att sätta upp:
n8n Workflow Template: Google Cloud Storage till Qdrant, redo för bildsök
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Google Cloud Storage", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get fields for Qdrant", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Qdrant cluster variables", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Embed crop image"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Qdrant Collection"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Check Qdrant Collection Exis.."]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batches in the API's format", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Batch Upload to Qdrant"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Split in batches, generate u.."]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If collection exists", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Payload index on crop_name"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filtering out tomato to test..", pos: "b", h: 48 }
n4 --> n8
n1 --> n2
n10 --> n1
n10 --> n5
n2 --> n12
n5 --> n11
n3 --> n6
n11 --> n1
n7 --> n4
n6 --> n10
n0 --> n3
n12 --> n9
n9 --> n7
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n10,n12 decision
class n4,n5,n6,n8,n11 api
class n9 code
classDef customIcon fill:none,stroke:none
class n4,n5,n6,n8,n9,n11 customIcon
Varför det här är viktigt: att göra bildsök ”redo” är oftast den svåra delen
Att ladda upp bilder till en vektordatabas låter enkelt tills du gör det mer än en gång. Ena veckan embed:ar du 5 000 bilder, nästa vecka uppdateras datasetet och nu vet du inte vilka objekt som redan finns, vilket metadataschema du använde sist eller varför halva frågorna känns ”off”. Den verkliga kostnaden är inte compute. Det är stopp-och-start-arbetet: formatera om fält, felsöka trasiga batchar och försöka sy ihop en pålitlig pipeline medan teamet väntar på att ”sök” ska bli användbart.
Friktionen byggs på. Och den dyker nästan alltid upp på samma ställen.
- Du tvingas embed:a om dataset eftersom payload-fälten var inkonsekventa mellan uppladdningarna.
- Batchjobb misslyckas utan tydlig signal, så du upptäcker saknade vektorer först när sökresultaten ser fel ut.
- Manuell collection-setup upprepas för varje miljö, vilket gör att drift mellan dev/prod i praktiken är garanterad.
- Filtrering och logik för ”exkludera de här klasserna” ligger i någons notebook, inte i pipelinen som teamet kan återanvända.
Det du bygger: en repeterbar Google Cloud Storage → Qdrant ingest-pipeline
Det här arbetsflödet tar ett bilddataset som ligger i Google Cloud Storage och laddar in det i Qdrant på ett sätt som är byggt för att hålla i verklig drift. Du startar det manuellt när du är redo att ingest:a (perfekt för backfills av dataset eller schemalagda körningar senare). Först sätter det dina centrala Qdrant-variabler och kontrollerar sedan om target-collection redan finns. Om den inte gör det skapar arbetsflödet den och lägger till ett payload-index så att Qdrant kan hantera senare filtreringsförfrågningar effektivt. Därefter hämtar det dina Cloud Storage-objekt, mappar varje objekt till konsekventa Qdrant-klara fält, filtrerar bort oönskade poster (i den här mallen: icke-tomat-relaterad logik för avvikelse-testning), batchar allt med UUID:er, genererar embeddings via ett multimodalt embeddings-API och laddar upp vektorerna plus metadata till Qdrant i batchar.
Körningen börjar med collection-hygien (verifiera, skapa vid behov). Sedan kommer dataset-import och rensning, så att bara de bilder du faktiskt vill ha embed:as. Till sist genereras embeddings och laddas upp i batchar, vilket håller processen stabil även när datasetet är stort.
Det du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du behöver ingest:a 5 000 bilder från Cloud Storage. Manuellt kan du lägga cirka 2 minuter per bild på nedladdning, embedding, payload-formatering och uppladdning, vilket kan bli långt över hundra timmar av hackigt stopp-och-start-arbete. Med det här arbetsflödet triggar du en körning, låter det batcha datasetet, generera embeddings och ladda upp till Qdrant medan du övervakar progress. Den ”hands-on”-tid som krävs sjunker ofta till under en timme eftersom du granskar i stället för att göra de repetitiva stegen.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Cloud Storage för att hosta objekten i ditt bilddataset.
- Qdrant Cloud för att lagra vektorer och sökbar payload-metadata.
- Voyage AI API-nyckel (hämta den i din Voyage AI-dashboard).
Svårighetsgrad: Medel. Du kopplar några konton och klistrar in API-nycklar samt rimlighetskontrollerar ett payload-schema.
Vill du att någon bygger detta åt dig? Prata med en automationsspecialist (gratis 15-minuters konsultation).
Steg för steg
En manuell körning startar allt. Du kör arbetsflödet när du är redo att ingest:a ett dataset eller uppdatera en befintlig collection. Det är perfekt för backfills, proof of concept eller kontrollerade produktionskörningar.
Qdrant förbereds först. Arbetsflödet laddar konfigurationsvariabler, kontrollerar om din Qdrant-collection finns och skapar den vid behov. Det sätter också upp ett payload-index, vilket gör senare filtrerade frågor mycket mer pålitliga.
Ditt dataset importeras och rensas. Bilder hämtas från Google Cloud Storage, fält mappas till en konsekvent struktur och sedan tar ett filter bort poster du inte vill ha med (mallen exkluderar tomat-relaterade objekt för test av avvikelsedetektering).
Embeddings och uppladdning sker i batchar. Objekt delas upp i batchar med UUID:er, formateras för embeddings-API:t, skickas för multimodal embedding-generering och laddas sedan upp till Qdrant via batch-requests så att du inte hamnar med partiella, inkonsekventa inserts.
Du kan enkelt justera filtreringsreglerna för att inkludera andra etiketter eller klasser utifrån dina behov. Se hela implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera den manuella triggern
Detta workflow startar på begäran så att ni kan styra när dataset laddas upp till Qdrant.
- Lägg till och öppna Manual Launch Trigger.
- Lämna standardinställningarna för att köra workflowet manuellt under test och uppsättning.
Steg 2: Anslut Qdrant och lagringstjänster
Dessa noder skapar er Qdrant-collection och ansluter till Google Cloud Storage för att hitta bilder.
- Öppna Qdrant Config Vars och ställ in qdrantCloudURL till
=https://[YOUR_ID].eu-central-1-0.aws.cloud.qdrant.io. - Ställ in collectionName till
=agricultural-crops. - Ställ in VoyageEmbeddingsDim till
1024och batchSize till4. - Öppna Verify Collection Presence och behåll URL:en som
={{ $json.qdrantCloudURL }}/collections/{{ $json.collectionName }}/exists. - Inloggningsuppgifter krävs: Anslut era qdrantApi-credentials i Verify Collection Presence.
- Öppna Initialize Qdrant Collection och behåll Method som
PUTmed JSON body satt till={{ { "vectors": { "voyage": { "size": $('Qdrant Config Vars').first().json.VoyageEmbeddingsDim, "distance": "Cosine" } } } }}. - Inloggningsuppgifter krävs: Anslut era qdrantApi-credentials i Initialize Qdrant Collection.
- Öppna Create Crop Payload Index och behåll Method som
PUTmed JSON body={ "field_name": "crop_name", "field_schema": "keyword" }. - Inloggningsuppgifter krävs: Anslut era qdrantApi-credentials i Create Crop Payload Index.
- Öppna Retrieve Cloud Storage Objects och ställ in Bucket Name till
n8n-qdrant-demo, Return All tilltrueoch Prefix tillagricultural-crops. - Inloggningsuppgifter krävs: Anslut era googleCloudStorageOAuth2Api-credentials i Retrieve Cloud Storage Objects.
Steg 3: Konfigurera mappning och filtreringslogik
Dessa noder formar cloud storage-objekt till Qdrant-klara poster och tar bort oönskade grödor.
- Öppna Map Qdrant Fields och ställ in publicLink till
=https://storage.googleapis.com/{{ $json.bucket }}/{{ $json.selfLink.split('/').splice(-1) }}. - Ställ in cropName till
={{ $json.id.split('/').slice(-3, -2)[0].toLowerCase()}}i Map Qdrant Fields. - Öppna Exclude Tomato Records och behåll villkoret cropName notEquals
tomatomed={{ $json.cropName }}.
Steg 4: Sätt upp batchbearbetning och embeddings
Dessa noder batchar bilderna, lägger till UUID:er och förbereder payloads för embedding och uppladdning.
- Öppna Batch Splitter with UUIDs och behåll Python-koden som använder
batch_size = int(_('Qdrant Config Vars').first()['json']['batchSize'])för att dela upp poster. - Öppna Format API Batches och ställ in batchVoyage till
={{ $json.batch.map(item => ({ "content": ([{"type": "image_url", "image_url": item["publicLink"]}])}))}}. - Ställ in batchPayloadQdrant till
={{ $json.batch.map(item => ({"crop_name":item["cropName"], "image_path":item["publicLink"]})) }}. - Ställ in uuids till
={{ $json.uuids }}.
Steg 5: Konfigurera embedding och uppladdning till Qdrant
Generera image embeddings och ladda upp vektordatan till Qdrant.
- Öppna Generate Image Embeddings och ställ in URL till
https://api.voyageai.com/v1/multimodalembeddingsmed MethodPOST. - Behåll JSON body som
={{ { "inputs": $json.batchVoyage, "model": "voyage-multimodal-3", "input_type": "document" } }}. - Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-credentials i Generate Image Embeddings.
- Öppna Upload Batch to Qdrant och behåll Method
PUTmed JSON body={{ { "batch": { "ids" : $('Format API Batches').item.json.uuids, "vectors": {"voyage": $json.data.map(item => item["embedding"]) }, "payloads": $('Format API Batches').item.json.batchPayloadQdrant } } }}. - Inloggningsuppgifter krävs: Anslut era qdrantApi-credentials i Upload Batch to Qdrant.
Steg 6: Testa och aktivera ert workflow
Kör ett manuellt test för att verifiera att collections skapas, embeddings genereras och att points infogas i Qdrant.
- Klicka på Execute Workflow för att trigga Manual Launch Trigger.
- Bekräfta att Verify Collection Presence returnerar
trueeller att Initialize Qdrant Collection och Create Crop Payload Index körs utan fel. - Kontrollera att Generate Image Embeddings har en giltig
data-array och att Upload Batch to Qdrant ger ett lyckat svar. - När allt är validerat, slå på workflowet till Active för användning i produktion.
Tips för felsökning
- Qdrant-inloggningsuppgifter kan löpa ut eller kräva specifika behörigheter. Om det strular, kontrollera först din Qdrant Cloud API-nyckel och cluster-URL i n8n:s credential-inställningar.
- Om du använder batch-uppladdningar och extern embedding-generering varierar processtiderna. Minska batchstorleken (eller lägg in en kort väntan) om embeddings-requesten returnerar tomma svar och upload-noden faller.
- Standardmappning för payload är sällan det du vill ha på sikt. Lås ett konsekvent metadataschema tidigt (datasetnamn, källsökväg, klassetikett, UUID), annars får du reindexera senare.
Snabba svar
Cirka en timme om dina API-nycklar och din bucket är redo.
Nej. Du kopplar mest konton, klistrar in API-nycklar och justerar några mapping-fält.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna in användning av Voyage AI:s embeddings-API samt kostnader för lagring/throughput i Qdrant Cloud.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärt och hanterar n8n bra. Self-hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du. De flesta byter sökvägen till Google Cloud Storage-datasetet, ändrar filtret som exkluderar poster (steget ”Exclude Tomato Records”) och justerar mappingen i ”Map Qdrant Fields” så den matchar deras metadataschema. Om du vill byta embeddings-leverantör senare kan du ersätta HTTP-requesten ”Generate Image Embeddings” och behålla resten av batch- och uppladdningslogiken intakt.
Oftast beror det på en ogiltig API-nyckel eller fel cluster-URL. Uppdatera Qdrant-credentials i n8n och kör sedan om enbart requesten ”Verify Collection Presence” för att bekräfta att den når collection-endpointen. Om det fungerar men uppladdningar misslyckas kan det vara problem med payload-schema (fel vektorstorlek för collectionen) eller problem med request-storlek från batchar som är för stora.
Mycket, så länge du batchar vettigt. På n8n Cloud Starter begränsas du av månadsvisa executions, medan self-hosting inte har något tak (det handlar främst om din server och API-gränser). I praktiken kör de flesta team detta i delar om några hundra bilder per batch och schemalägger flera körningar för väldigt stora dataset.
Ofta, ja, eftersom det här arbetsflödet behöver batchning, villkorligt skapande av collections och strukturerad payload-mappning, och det blir snabbt klumpigt (och dyrt) i enklare automationsverktyg. n8n gör det också enklare att hålla hela ingest-pipelinen på ett ställe i stället för att sprida den över flera ”zaps”. Å andra sidan kan Zapier eller Make fungera för små uppladdningar eller enkla notiser. Den här pipelinen ligger närmare data engineering än ”koppla app A till app B”. Om du är osäker, prata med en automationsspecialist så pekar vi dig mot det enklaste alternativet som inte kommer att skapa problem senare.
När det här väl är på plats slutar ingest av dataset att vara en hjälteinsats. Du laddar in bilder, embeddings förblir konsekventa och Qdrant-sök beter sig som du förväntade dig från början.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.