Din bilddataset ser bra ut. Tills den inte gör det. En konstig batch slinker in, din modell ”lär sig” fel sak, och du märker det först när träningstiden (och budgeten) redan är borta.
ML-ingenjörer känner igen det här vid datauppdateringar, men data ops och QA-inriktade produktteam hamnar i samma röra. Den här automationen för Qdrant-anomalidetektering flaggar avvikare tidigt så att du kan granska en kort lista, inte tusentals filer.
Det här flödet tar en bild-URL, genererar en embedding, jämför den mot hur ”normalt” ser ut i Qdrant och returnerar sedan ett tydligt meddelande du kan agera på. Du får se hur det fungerar, vad du behöver och var team oftast går fel.
Så fungerar den här automationen
Hela n8n-flödet, från trigger till slutligt resultat:
n8n Workflow Template: Qdrant + Google Cloud Storage, hitta avvikande bilder
flowchart LR
subgraph sg0["Execute Workflow Flow"]
direction LR
n0["<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 image"]
n1["<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/>Get similarity of medoids"]
n2["<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/>Compare scores"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Variables for medoids", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Info About Crop Labeled Clus..", pos: "b", h: 48 }
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/>Total Points in 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/>Each Crop Counts"]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Image URL hardcode", pos: "b", h: 48 }
n8@{ icon: "mdi:play-circle", form: "rounded", label: "Execute Workflow Trigger", pos: "b", h: 48 }
n0 --> n1
n6 --> n4
n7 --> n3
n3 --> n5
n8 --> n7
n1 --> n2
n5 --> n6
n4 --> n0
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 n8 trigger
class n0,n1,n5,n6 api
class n2 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n5,n6 customIcon
Problemet: ”Vi tränade på dåliga bilder igen.”
Bilddataset förfaller i det tysta. En crawler plockar upp en trasig miniatyr, en leverantör laddar upp fel beskärning, en mapp blandas med ”lands” i stället för ”crops”, och plötsligt är din träningsmängd inte det du tror att den är. Det smärtsamma är fördröjningen. Du betalar för märkning, lagring och träning innan någon inser att indata var fel. Sedan blir det ett skuldbeläggande plus en städ-sprint. Ärligt talat behöver de flesta team inte fler dashboards här. De behöver en snabb ”det här ser konstigt ut”-grind som körs varje gång nya bilder dyker upp.
Det drar snabbt iväg. Här är var det fallerar i verkligheten:
- Folk gör stickprov på en handfull bilder, vilket gör att sällsynta avvikare slinker igenom obemärkt.
- När en dålig batch väl ligger i Google Cloud Storage återanvänds den i pipelines i veckor.
- Manuell granskning äter hela eftermiddagar när målet egentligen bara är att hitta de få riktigt udda filerna.
- ”Ser bra ut” är subjektivt, så olika granskare gör olika bedömningar och din dataset driver över tid.
Lösningen: Jämför varje bild med hur ”normalt” ser ut i Qdrant
Det här flödet gör anomalidetektering till en repeterbar tjänst du kan anropa på beställning. Det börjar med en enda input: en bild-URL (ofta pekar den på ett objekt i Google Cloud Storage). n8n mappar den URL:en till det format dina verktyg förväntar sig och laddar sedan konfigurationsvariablerna som används för att bedöma ”normalt” för varje klass i din dataset. Därefter hämtar det användbar kontext från Qdrant, som hur många punkter som finns i kollektionen och totalsummor per klass. När det är på plats genererar flödet en embedding-vektor för bilden (via ett embeddings-API-anrop), frågar Qdrant om likhet mot klassernas ”centers” (medoider) och utvärderar matchpoängen i kod. Utdata är enkel: ett textsvar som talar om ifall bilden är en avvikelse relativt datasetet du redan har lagrat i Qdrant.
Flödet startar när du skickar en bild-URL till workflow-triggern. Sedan skapar det en embedding och frågar Qdrant om likhet mot dina förberedda klustercentra och trösklar. Till sist returnerar det ett tydligt ”avvikelse / ingen avvikelse”-resultat som du kan skicka till Telegram, returnera via en webhook-respons eller använda i en annan nedströms kontroll.
Det du får: automation vs. resultat
| Det här automatiserar flödet | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att ditt team laddar upp en ny batch med 500 grödbilder till Google Cloud Storage varje vecka. En människa som gör stickprov kanske tar runt 30 sekunder per bild, så en full granskning blir ungefär 4 timmar, och de flesta kommer inte att göra den. Med det här flödet skickar du in URL:er automatiskt (eller testar dem en och en) och granskar bara avvikarna, kanske 10–20 bilder som hamnar under dina trösklar. Även om scoren körs i bakgrunden i några minuter har du förvandlat ”en halv dag” till en snabb triage.
Det du behöver
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Qdrant Cloud för att lagra vektorer och göra likhetssökningar.
- Google Cloud Storage för att hosta din bilddataset.
- Voyage AI API-nyckel (hämta den i din Voyage AI-dashboard).
Kompetensnivå: Medel. Du kopplar API:er, klistrar in credentials och justerar ett par dataset-specifika variabler som kollektionsnamn och trösklar.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En bild-URL startar allt. Flödet triggas med en URL som pekar på en bild du vill kontrollera (vanligtvis en fil lagrad i Google Cloud Storage).
Det laddar ”reglerna för normalt”. n8n sätter medoid- och tröskelkonfigurationen som används för anomalidetektering och ber sedan Qdrant om kollektionsräkningar och totalsummor per klass så att scoringen förankras i vad som faktiskt finns i din dataset.
Embedding + likhetssökning gör grovjobbet. Flödet anropar en embeddings-endpoint för att omvandla bilden till en vektor och frågar sedan Qdrant om likhet mot dina klasscentra (medoider) och samlar matchpoäng.
Ett enkelt besked returneras. Ett kort kodsteg jämför poäng med trösklar och skriver ut ett tydligt meddelande som du kan skicka till Telegram, returnera via en webhook-respons eller spara i loggar för revision.
Du kan enkelt ändra inputkälla från ”enstaka bild-URL” till ”ny fil i en bucket” beroende på behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera triggern Execute Workflow
Det här arbetsflödet startar när ett annat arbetsflöde anropar det, så ni måste konfigurera triggern så att den accepterar indata.
- Lägg till triggern Run Sub-Workflow (Configure Required) på arbetsflödesytan.
- Säkerställ att det anropande arbetsflödet skickar en bild-URL i inkommande payload (förväntas vid
$json.query.imageURL). - Koppla Run Sub-Workflow (Configure Required) till Map Image URL för att starta processkedjan.
Steg 2: anslut Qdrant och ställ in medoid-konfiguration
Dessa noder förbereder anslutningsdetaljer till Qdrant och samlingsinställningar som används i hela arbetsflödet.
- I Map Image URL, ställ in imageURL till
{{ $json.query.imageURL }}. - I Medoid Config Variables, ställ in clusterCenterType till
is_medoid. - Ställ in qdrantCloudURL till
https://[YOUR_ID].eu-central-1-0.aws.cloud.qdrant.io(ersätt med er Qdrant-URL). - Ställ in collectionName till
=agricultural-crops. - Ställ in clusterThresholdCenterType till
is_medoid_cluster_threshold. - I Count Collection Points, ställ in URL till
{{ $json.qdrantCloudURL }}/collections/{{ $json.collectionName }}/points/countoch Method tillPOST. - Ställ in JSON Body till
{ "exact": true }. - Inloggningsuppgifter krävs: Anslut era qdrantApi-uppgifter i Count Collection Points och återanvänd dem i Crop Facet Totals och Query Medoid Similarity.
Steg 3: sammanfatta grödkluster och bygg bild-embeddings
Det här avsnittet räknar grödor i Qdrant, tar fram en totalsiffra och skapar en embedding för den inkommande bilden.
- I Crop Facet Totals, ställ in URL till
{{ $('Medoid Config Variables').first().json.qdrantCloudURL }}/collections/{{ $('Medoid Config Variables').first().json.collectionName }}/facet. - Ställ in JSON Body i Crop Facet Totals till
{{ { "key": "crop_name", "limit": $json.result.count, "exact": true } }}. - I Crop Cluster Summary, ställ in cropsNumber till
{{ $json.result.hits.length }}. - I Create Image Embedding, ställ in URL till
https://api.voyageai.com/v1/multimodalembeddingsoch Method tillPOST. - Ställ in JSON Body till
{{ { "inputs": [ { "content": [ { "type": "image_url", "image_url": $('Map Image URL').first().json.imageURL } ] } ], "model": "voyage-multimodal-3", "input_type": "document" } }}. - Inloggningsuppgifter krävs: Anslut era httpHeaderAuth-uppgifter i Create Image Embedding.
Steg 4: sök efter likhet och utvärdera matchpoäng
Embedding används för att söka medoid-center i Qdrant och sedan avgöra om grödan är känd eller okänd.
- I Query Medoid Similarity, ställ in URL till
{{ $('Medoid Config Variables').first().json.qdrantCloudURL }}/collections/{{ $('Medoid Config Variables').first().json.collectionName }}/points/query. - Ställ in JSON Body till
{{ { "query": $json.data[0].embedding, "using": "voyage", "limit": $('Crop Cluster Summary').first().json.cropsNumber, "with_payload": true, "filter": { "must": [ { "key": $('Medoid Config Variables').first().json.clusterCenterType, "match": { "value": true } } ] } } }}. - Inloggningsuppgifter krävs: Anslut era qdrantApi-uppgifter i Query Medoid Similarity.
- I Evaluate Match Scores, behåll Python-koden som den är för att jämföra poäng mot
is_medoid_cluster_thresholdoch skapa ett resultatmeddelande.
0 kommer Query Medoid Similarity att göra en fråga med en gräns på noll och inte ge några punkter att utvärdera.Steg 5: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera hela kedjan från indata med bild-URL till slutlig matchklassificering.
- Klicka på Execute Workflow och trigga Run Sub-Workflow (Configure Required) med en exempel-payload som innehåller
query.imageURL. - Bekräfta att Create Image Embedding returnerar en embedding och att Query Medoid Similarity returnerar punkter.
- Kontrollera Evaluate Match Scores för ett resultat som
Looks similar to [crop]ellerALERT, we might have a new undefined crop!. - När utdata är korrekt, slå på arbetsflödet Active för att aktivera användning i produktion.
Vanliga fallgropar
- Qdrant Cloud-credentials kan löpa ut eller kräva specifika behörigheter. Om något skapar fel, kontrollera först din Qdrant API-nyckel och kluster-URL i Qdrant Cloud-konsolen.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströms noder fallerar på tomma svar.
- Voyage AI-embeddinganrop är känsliga för indataformat. Om du skickar en signerad Google Cloud Storage-URL, se till att den är åtkomlig vid körning, annars misslyckas embedding-begäran.
Vanliga frågor
Räkna med ungefär en timme om din Qdrant-kollektion och API-nycklar är klara.
Nej. Du kopplar ihop tjänster och redigerar några variabler i n8n. Den enda ”koden” finns redan med för utvärdering av poäng.
Ja. n8n har ett gratis alternativ för egen drift och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in användning av Voyage AI:s embeddings-API och kostnader för Qdrant Cloud (gratisnivån räcker ofta för test).
Två alternativ: n8n Cloud (hanterat, enklast setup) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och kör n8n bra. Egen drift ger obegränsat antal körningar men kräver grundläggande serveradministration.
Ja, men du behöver ändra triggern. Byt ut nuvarande input i stil med ”execute workflow” mot en Google Cloud Storage event-trigger (eller en webhook som ditt uppladdningssystem anropar) och mappa sedan den nya filens URL i steget ”Map Image URL”. Vanliga justeringar är att routa avvikelser till Telegram, skriva resultat till ett granskningsark och lägga till en åtgärd som flyttar flaggade filer till en ”karantänmapp”.
Oftast beror det på att bas-URL:en eller API-nyckeln är fel eller har löpt ut. Kontrollera Qdrant Cloud-kluster-URL:en först, regenerera sedan API-nyckeln och uppdatera den i HTTP Request-noderna som frågar efter counts och likhet. Om det bara misslyckas ibland kan du slå i rate limits eller timeouts på större frågor, så öka timeouts och testa med en enda bild. Bekräfta också att kollektionsnamnet matchar exakt (versal/gemen och bindestreck spelar större roll än många tror).
En typisk setup kan utan problem score:a bilder en och en, och batchkapaciteten beror främst på ditt embedding-API och storleken på ditt Qdrant-kluster.
För det här användningsfallet, ja oftare än inte. Du gör flera HTTP-anrop, skickar runt vektorer och tillämpar anpassad scoringlogik, vilket är exakt där Zapier och Make börjar kännas begränsande eller dyrt. n8n ger dig också ett alternativ för egen drift, vilket spelar roll om du vill köra många kontroller utan att räkna varje task. Nackdelen är lite mer setup. Vill du ha hjälp att välja, prata med en automationsexpert så kan du rimlighetskontrollera upplägget på 15 minuter.
När det här väl rullar blir ”vi tränade på skräp” en sällsynt händelse i stället för en återkommande överraskning. Låt flödet fånga det udda så att teamet kan fokusera på den data som faktiskt tar modellen framåt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.