ค้นหาอินฟลูเอนเซอร์ด้วยภาษาธรรมชาติ (ไทย/อังกฤษ) — Search influencers in plain language.
v1 embeds each KOL as one mean-pooled 512-dim vector and retrieves by cosine — a creator’s few on-topic posts get washed out, and it can’t tell doing from selling. v2 replaces that vector with structured per-post dimensions extracted offline, a GPT-4o router that decomposes the query, an exact dimension match, and a content-only LLM rerank. No embeddings at query time.
Every post is read from its RAW signals — full transcript + title + description + OCR — and distilled into structured, searchable dimensions. The “understanding” happens once, here, per post (not one averaged vector per KOL).
data/post-dimensions.json · 100 KOLs · 3,695 postsOne LLM call segments the (space-less) Thai query and splits it into a content niche and profile filters: intents, keywords, ~10 Thai + ~10 English sense-preserving variants, exclude (anti-sense), and facets (platform / followers / gender / age / location / role / brand).
gpt-4o (cacheable per query)Hard gates (gender / age / platform / followers / role) filter the 100 KOLs; then each surviving post’s dimensions are substring-matched against the variants → grounded posts. exclude terms demote wrong-sense posts (selling, survival-game). Brands match in post dimensions (the profile brand list is only a recall fallback).
For a content query, each candidate’s distinct dimensions are deduped (no repeated terms) and sent with the query to the LLM, which ranks by genuine niche relevance and writes a Thai whyMatch. This fixes vertical precision (a heavy-promo account no longer tops a beauty query). Name / brand / pure-filter queries skip this — they’re already exact.
gpt-4o · input = deduped dimensions (≤30 terms/KOL), not raw transcriptsSame display payload as v1 (avatar, channels, categories). The exact posts v2 matched are badged by URL — so the “MATCH” posts are the ones whose dimensions hit the query — and the real matched fields are shown (Posts / Brand / Platform / …).
Token usage and price for the most recent search, broken down by each LLM call in the pipeline (classify → rank). Prices are per the model's input/output rate.
Everything we stored for this post — the offline-extracted dimensions used for matching.