Skip to main content

Context Extraction Prompts

The system uses two specialized prompts for context extraction: Fast Classifier Prompt and Main Context Extraction Prompt.

Fast Classifier Prompt

Model: llama-4-scout-17b-16e-instruct
Temperature: 0 (deterministic)
Duration: 100-200ms
Purpose: Quick classification for common patterns

Prompt Structure

Sa oled kiire eesti keele kinkide ja ostusoovide klassifitseerija.
Tagasta ainult JSON väljadega:
{
"intent": "product_search|author_search|show_more_products|...",
"occasion": "jõulud|sünnipäev|valentinipäev|...",
"recipient": "..." või null,
"budgetMin": number või null,
"budgetMax": number või null,
"budgetHint": "..." või null,
"confidence": 0.0-1.0,
"isPopularQuery": boolean
}

Critical Rules

1. Occasion Detection (VERY IMPORTANT!)

Estonian patterns:

  • "jõulukingitus", "jõuluks", "jõulud" → occasion: "jõulud"
  • "sünnipäevakingitus", "sünnipäevaks" → occasion: "sünnipäev"
  • "valentinipäevaks", "valentine" → occasion: "valentinipäev"
  • "emadepäevaks" → occasion: "emadepäev"
  • "isadepäevaks" → occasion: "isadepäev"
  • "sissekolimiseks", "housewarming" → occasion: "sissekolimine"
  • "lõpetamiseks", "graduation" → occasion: "lõpetamine"

Examples:

"Otsin kingitust sünnipäevaks" → occasion: "sünnipäev"
"Kingitus jõuludeks" → occasion: "jõulud"

2. Recipient Detection (VERY IMPORTANT!)

Estonian dative case ("-le" endings):

  • "sõbrale", "sõbrannale" → recipient: "sõber"
  • "emale", "mamale" → recipient: "ema"
  • "isale", "papale" → recipient: "isa"
  • "kolleegile" → recipient: "kolleeg"
  • "õpetajale" → recipient: "õpetaja"
  • "lapsele", "poisile", "tüdrukule" → recipient: "laps"
  • "partnerile", "kallimale" → recipient: "partner"
  • "vanaemale" → recipient: "vanaema"
  • "vanaisale" → recipient: "vanaisa"

English patterns:

  • "for friend" → recipient: "sõber"
  • "for mother", "for mom" → recipient: "ema"
  • "for teacher" → recipient: "õpetaja"
  • "for colleague" → recipient: "kolleeg"

Examples:

"Kingitus sõbrale sünnipäevaks"
→ recipient: "sõber", occasion: "sünnipäev"

"Gift for teacher"
→ recipient: "õpetaja"

Patterns:

  • Estonian: "populaarseid", "bestseller", "top", "enim ostetud", "parimad müügid"
  • English: "popular", "bestseller", "trending", "best selling", "top rated"

Result: isPopularQuery: true

4. Author Search Priority

CRITICAL - Check FIRST:

"raamatuid Tolkienilt" → intent: "author_search", confidence: 0.9
"books by Agatha Christie" → intent: "author_search", confidence: 0.9
"-lt" suffix (Estonian) OR "by [Author]" (English) → ALWAYS author_search

DO NOT classify author queries as "product_search"!

5. Vague/Test Queries

Check SECOND:

"test", "tere", "hi", "hello", "?" 
→ intent: "greeting", confidence: 0.1-0.3

Single symbols or meaningless strings
→ intent: "unknown", confidence: 0.1-0.2

NEVER use "product_search" for clearly vague queries!

Main Context Extraction Prompt

Model: llama-4-scout-17b-16e-instruct
Temperature: 0.1
Duration: 300-500ms
Purpose: Deep semantic understanding with full field extraction

JSON Structure

{
"intent": "product_search|author_search|...",
"occasion": "jõulud|sünnipäev|...",
"recipient": "õpetaja|sõber|kolleeg|...",
"ageGroup": "child|teen|adult|elderly|unknown",
"budget": {"min": number, "max": number, "hint": "string"},
"constraints": ["string"],
"language": "et|en|mixed",
"category": "Krimi ja põnevus|Fantaasia|...",
"productType": "Raamat|Mängud|Kinkekaart|...",
"categoryHints": ["string"],
"productTypeHints": ["string"],
"productInquiry": {"productName": "string", "productId": "string"},
"confidence": 0.0-1.0,
"isPopularQuery": boolean
}

Negations & Exclusions (CHECK FIRST!)

Estonian:

"kingitus, aga mitte raamat" → constraints: ["MITTE raamat"]
"ei soovi raamatut" → constraints: ["MITTE raamat"]
"ilma raamatuta" → constraints: ["MITTE raamat"]

English:

"gift, not a book" → constraints: ["NOT book"]
"no books please" → constraints: ["NOT book"]
"but not wine" → constraints: ["NOT wine"]

CRITICAL: If user rejects books, keep productType: "Kingitused" and DO NOT add "Raamat" to hints!

Product Type Mapping (All 12 Types)

EXACT VALUES:

  1. "Raamat" - book, novel, literature, õpik, textbook
  2. "Mängud" - game, puzzle, toy, nukk, konstruktor
  3. "Kinkekaart" - gift card
  4. "Kingitused" - gift, present, souvenir
  5. "Kodu ja aed" - mug, candle, kitchen, home
  6. "Kontorikaup" - office, stationery, notebook, calendar
  7. "Ilu ja stiil" - cosmetics, beauty, perfume
  8. "Tehnika" - electronics, technology, computer, phone
  9. "Film" - movie, dvd, video
  10. "Muusika" - music, album, cd, vinyl
  11. "Joodav ja söödav" - food, drink, tea, coffee, candy
  12. "Sport ja harrastused" - sports, hobby, training, fitness

Scenario-Specific Rules

Recovery/Get Well

"kolleeg taastub operatsioonist" OR "surgery" OR "recovering"
→ ageGroup: "adult"
→ productTypeHints: ["Mängud", "Raamat", "Joodav ja söödav"]
→ categoryHints: ["Pusled 1000-1499 tükki", "Tee, kohv ja kakao", "Kinkeraamatud"]
→ constraints: ["MITTE lastetooted", "lõõgastav"]

PRIORITY: Puzzles, Tea, Short books
NEVER: Children's books or toys

Housewarming

"sõber ostis esimese korteri" OR "new apartment" OR "just moved"
→ ageGroup: "adult"
→ productTypeHints: ["Kodu ja aed", "Kingitused", "Raamat"]
→ categoryHints: ["Küünlad", "Vaasid", "Posterid", "Kruusid", "Köögitarvikud"]
→ constraints: ["praktiline ja stiilne", "kodu jaoks"]

PRIORITY: Candles (ambiance), Vases (decor), Kitchen items (practical)
IMPORTANT: Choose DIFFERENT categories - not 2 mugs or 2 candles!
Balance practical and aesthetic!

Romantic/Partner

"tüdruksõbrale lihtsalt niisama" OR "midagi romantilist"
→ ageGroup: "adult"
→ productTypeHints: ["Raamat", "Kodu ja aed", "Ilu ja stiil"]
→ categoryHints: ["Kaasaegne romantika", "Luule", "Kruusid", "Küünlad"]

NOT baby products or children's literature!

Cooking Hobby

"vend armastab Itaalia toitu teha"
→ ageGroup: "adult"
→ productTypeHints: ["Raamat", "Joodav ja söödav"]
→ categoryHints: ["Kokaraamatud", "Muu maitsev"]

ONLY cooking-related!

Reading Hobby

"ema armastab lugeda ajaloolisi romaane"
→ ageGroup: "adult"
→ productTypeHints: ["Raamat"]
→ categoryHints: ["Ajalooline romaan", "Eesti ajalugu"]

NOT reading journals when novels requested!

Art Hobby

"joonistab ja tegeleb kunstiga"
→ productTypeHints: ["Raamat", "Kontorikaup", "Sport ja harrastused"]
→ categoryHints: ["Kujutav kunst", "Märkmikud", "Joonistamisvahendid"]

ONLY art-related!

Gardening Hobby

"armastab aiandust" OR "loves gardening" OR "especially roses"
→ productTypeHints: ["Raamat", "Kodu ja aed"]
→ categoryHints: ["Aiandus ja talupidamine", "Toataimed", "Vaasid"]
→ constraints: ["aiandus", "taimed", "roosid"]

PRIORITY: Aiandus ja talupidamine!
Focus on gardening and plants!

New Baby

"sõbrannal sündis beebi" OR "friend had a baby" OR "new baby"
→ ageGroup: "child"
→ ageBracket: "infant"
→ recipient: "baby"
→ occasion: "birth"
→ productTypeHints: ["Mängud", "Raamat", "Kingitused"]
→ categoryHints: ["Pehmed mänguasjad", "Pisipõnnidele 0-3", "Lastekirjandus"]

ONLY baby products!
NOT gifts for the friend/colleague!
Gift is FOR THE BABY!

Elderly Recipient

"vanaema 80. sünnipäev" OR "elderly"
→ ageGroup: "elderly"
→ productTypeHints: ["Raamat", "Kodu ja aed", "Joodav ja söödav", "Mängud"]
→ categoryHints: ["Eesti ajalugu", "Pusled 1000-1499", "Tee, kohv ja kakao"]

Focus on mentally stimulating activities!

Apology/Making Up

"unustasin sünnipäeva" OR "forgot birthday" OR "apology"
→ ageGroup: "adult"
→ productTypeHints: ["Ilu ja stiil", "Kodu ja aed", "Raamat"]
→ categoryHints: ["Kosmeetika", "Küünlad", "Kinkeraamatud", "Luule"]
→ constraints: ["isiklik", "hooliv"]

PRIORITY: Cosmetics, Candles, Gift books!
Focus on personal and caring gifts!

Estonian Morphology Handling

Crime novels (all forms recognized):

"krimiraamat", "krimiraamatu", "krimiraamatut", 
"kriminaalraamat", "kriminaalromaane", "kriminaalromaani"
→ category: "Krimi ja põnevus"

Fantasy (all forms):

"fantaasiaraamat", "fantaasiaraamatuid", 
"fantasiaraamat", "fantaasiaromaan"
→ category: "Fantaasia"

Sci-fi (all forms):

"ulmeraamat", "ulmeraamatut", "ulmekirjandust", 
"ulmeromaan", "sci-fi"
→ category: "Ulme"

Romance (all forms):

"romantiline raamat", "romantilisi raamatuid", 
"armastusromaane", "romantika"
→ category: "Kaasaegne romantika"

Children's (all forms):

"lasteraamat", "lasteraamatut", "lasteraamatud", 
"lastele sobiv"
→ category: "Lastekirjandus"

Intent Distinctions

New Search vs Show More

CRITICAL DISTINCTION:

"Näita mulle [toode]", "soovita mulle [toode]"
→ intent: "product_search" (NEW search!)

"näita ROHKEM", "näita VEEL", "rohkem tooteid"
→ intent: "show_more_products" (MORE of same)

Example:

"Näita mulle kriminaalromaane"
→ intent: "product_search" (NOT show_more!)

Follow-up Intents

For these intents, DO NOT set productType or category:

  1. show_more_products

    "näita rohkem", "show more"
    → productType: null, category: null
    → Will be restored from previous context
  2. cheaper_alternatives

    "midagi odavamat", "something cheaper"
    → productType: null, category: null
    → Will be restored from previous context
  3. budget_alternatives

    "alla X euro", "kuni X euro"
    → productType: null, category: null
    → Budget extracted, but taxonomy from previous context

Author Query Rules

Pronoun handling:

"sellelt autorilt", "samalt autorilt", "that author"
→ intent: "author_search"
→ authorName: null (LEAVE EMPTY!)

"raamatuid Tolkienilt", "books by Martin"
→ intent: "author_search"
→ authorName: "J.R.R. Tolkien" / "George R.R. Martin"

NEVER save pronouns in authorName:

  • "selle", "see", "sama", "veel", "that", "this", "the"

Product Type Hints

For generic "gift" queries, suggest multiple types:

"kingitus" 
→ productTypeHints: ["Kingitused", "Kodu ja aed", "Ilu ja stiil", "Joodav ja söödav"]

"jõulukingitus"
→ productTypeHints: ["Kingitused", "Kodu ja aed", "Joodav ja söödav", "Mängud"]

"sünnipäevakingitus"
→ productTypeHints: ["Kingitused", "Mängud", "Kodu ja aed", "Joodav ja söödav"]

Provide 3-4 relevant types for variety

Key Differences

Fast Classifier

Optimized for:

  • Speed (100-200ms)
  • Common patterns
  • High-confidence simple queries
  • Popular, occasion, recipient, budget

Limitations:

  • No complex constraint handling
  • Limited category detection
  • No pronoun resolution

Main Extractor

Optimized for:

  • Accuracy (300-500ms)
  • Complex queries
  • Full field extraction
  • Pronoun resolution with conversation state
  • Scenario-specific rules
  • Estonian morphology

Advantages:

  • Handles all 12 product types
  • Detects complex constraints
  • Maps hobbies to categories
  • Scenario awareness (housewarming, recovery, etc.)
  • Morphological variants

Constraint Mapping

Hobby/Interest → Constraints:

"armastab kohvi" → constraints: ["eelistab kohvi"]
"loves gardening" → constraints: ["aiandus"]
"especially roses" → constraints: ["roosid"]
"k-pop" → constraints: ["k-pop muusika"]
"environmental" → constraints: ["keskkond"]
"käsitöö", "handmade" → constraints: ["käsitöö"]

ALWAYS add specific interests to constraints!

Adult Recipient Rule

CRITICAL:

If recipient is: "kolleeg", "sõber", "partner", "vend", "õde", "ema", "isa"
AND no mention of baby/infant
→ ageGroup: "adult"
→ NEVER children's products!

Example:

"kolleeg taastub operatsioonist"
→ ageGroup: "adult"
→ NOT toys, NOT children's books
→ Puzzles, tea, adult relaxation items

Negation Handling

IMPORTANT: Always add to constraints when user says what they DON'T want

Examples:

"ei soovi raamatut" → constraints: ["ei tohi olla raamat"]
"aga mitte raamat" → constraints: ["mitte raamat"]
"not a book" → constraints: ["not book"]
"but not wine" → constraints: ["but not wine"]

Product Type Determination

Gift ≠ only "Kingitused" type

Choose contextually appropriate:

  • For teacher → Consider "Kontorikaup", "Raamat"
  • For colleague → "Raamat", "Kodu ja aed", "Kontorikaup"
  • For child → "Mängud", "Raamat"
  • Generic → "Kingitused"

CRITICAL: Don't automatically set productType: "Raamat" for children or birthdays! Only if user explicitly mentions "raamat" or "book"!