From c63afad6728dcdfe8492c22602d4df5db5e3fc49 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Mon, 11 May 2026 10:35:30 +0200 Subject: [PATCH] feat: Enhance category suggestion logic with improved matching rules and disambiguation guidelines --- backend/src/ai/ai.service.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/backend/src/ai/ai.service.ts b/backend/src/ai/ai.service.ts index b13affa1..4383ef17 100644 --- a/backend/src/ai/ai.service.ts +++ b/backend/src/ai/ai.service.ts @@ -160,22 +160,31 @@ Regler: Tillgängliga kategorier (format: [id] Sökväg): ${categoryList} -KWICK-MATCHNING (gör detta först): + PRIORITERINGSORDNING (måste följas): + 1. Regelmatch (keyword + sortlexikon) + 2. Synonym/semantisk match inom livsmedelsdomän + 3. Fallback enligt regler nedan + + SNABBMATCHNING (gör detta först): - Kött/fläsk: Sök efter ord som "fläsk", "flaskytterfile", "bacon", "kotlett", "karré" → Kött, chark & fågel > Fläsk - Fågel: Sök efter "kyckling", "kalkon", "drumstick", "filé" → Kött, chark & fågel > Fågel -- Äpplen/fruktsorter: Sök efter "äpple", "apple", "granny smith", "pink lady", "royal gala", "golden delicious", "jonagold", "fuji" → Frukt & Grönt > Frukt > Äpplen (eller Frukt om Äpplen saknas) + - Äpplen/fruktsorter: Sök efter "äpple", "apple", "granny smith", "pink lady", "royal gala", "golden delicious", "jonagold", "fuji", "braeburn", "aroma", "red moon" → Frukt & Grönt > Frukt > Äpplen (eller Frukt om Äpplen saknas) - Choklad/spreads: Sök efter "nutella", "choklad", "kakao", "spreads" → Sötsaker & snacks > Choklad & spreads - Bröd: Sök efter "bröd", "toast", "brödrost", "limpa" → Bröd & bakvaror > Bröd + DISAMBIGUERING: + - Om ett ord kan vara både varumärke och livsmedelssort, välj livsmedelstolkning ENDAST om ordet finns i sort/keyword-reglerna eller tydligt matchar kategoriträdet. + - Om ingen tydlig livsmedelsmatch finns, gå till fallback istället för att gissa aggressivt. + Regler: -1. Använd KEYWORD-MATCHNING först innan annat. + 1. Använd SNABBMATCHNING först innan annat. 2. Om ingen keyword-match, välj den mest specifika underkategorin som passar. 3. Om ingen specifik kategori passar, välj en underkategori under "Övrigt" om möjligt. 4. Om ingen underkategori under "Övrigt" passar, välj "Övrigt" (den kategori vars sökväg är exakt "Övrigt"). 5. Du MÅSTE alltid returnera ett svar — aldrig null eller tomt. 6. Svara ENDAST med giltig JSON i detta format: { "categoryId": , "confidence": "high" | "medium" | "low" } - - "high": keyword-match ELLER uppenbart matchande kategori - - "medium": trolig matchning + - "high": regelmatch (keyword/sort) ELLER uppenbart exakt kategoriträff + - "medium": trolig semantisk matchning inom livsmedelsdomän - "low": osäker, används fallback (Övrigt eller underkategori till Övrigt)`; const userPrompt = `Produkt: "${productName}"`;