Tier classifier v1
Production-промпт из intel-collector pipeline/tier_classify.py. Классифицирует news items в трёхтиерную схему для сортировки по релевантности к AI-консалтингу в банковской вертикали.
System prompt
Ты классификатор AI/enterprise новостей. Tier 1 (core): AI agents, multi-agent, LLM orchestration (LangGraph, LangChain), RAG advances (semantic chunking, reranker, eval), observability (Langfuse, Phoenix, RAGAS), process intelligence/mining, enterprise AI deployment кейсы с метриками. Tier 2 (adjacent): data engineering pipelines, banking/fintech AI, on-prem/sovereign AI, vendor moves (Big-4 AI practices, локальные интеграторы ME), регуляторы (EU AI Act, SDAIA KSA, 152-ФЗ, qai Катар). Tier 3 (broad): M&A AI/data $100M+, raises $50M+, regulatory вне наших регионов, крупные enterprise tech trends, breakthrough academic research. Если совсем off-topic — tier 3 с rationale "off-topic". Возвращай строго по схеме.
Pydantic response_format
class TierClassification(BaseModel): tier: Literal[1, 2, 3] = Field( description="1=core AI/process intel; 2=adjacent enterprise; 3=broad signal only" ) topic_tags: list[str] = Field( description="2-5 short kebab-case tags, e.g. 'rag', 'agents', 'banking-ai', 'eu-ai-act'", min_length=1, max_length=8, # ЭТО OK — max_length на list, не на str, ограничивает число элементов ) rationale: str = Field(description="1 sentence why this tier") # НЕ ставим max_length на rationale — см. [../skills/no-max-length-on-llm-output](/../skills/no-max-length-on-llm-output)
User prompt template
Title: {item.title}
Abstract: {item.abstract or '(no abstract)'}
Настройки вызова
await gemini_structured( model="gemini/gemini-2.5-flash", prompt=user_prompt, response_model=TierClassification, system=CLASSIFIER_SYSTEM, temperature=0.2, # низкая — детерминированность важнее креативности reasoning_effort="disable", # simple задача — не нужен thinking expected_output_tokens=300, )
Что реально классифицирует (observed 2026-07-02)
Скачал 87 items (HN + Arxiv) → все успешно классифицированы (100%). Примеры:
- "Claude Sonnet 5 release" → T1 (llm, foundation-model, enterprise-ai)
- "Claude Code steganography" → T1 (llm-security, observability, steganography)
- "TabFM: zero-shot foundation model for tabular data" → T1 (foundation-models, zero-shot)
- "Department of Commerce lifted export controls" → T2 (ai-regulation, government-policy)
- "Claude Code 5x more expensive" → T2 (llm-pricing, vendor-moves)
- "Claude Desktop on Linux" → T3 (product-release, consumer)
- Arxiv paper "TRIAGE credit assignment for agents" → T1 (reinforcement-learning, multi-agent)
Известные квирки
- Строгое применение промпта — если у items нет abstract'а (HN posts), классификатор осторожничает и уходит в T3. Это правильно, но означает что HN-only без URL-scraping даёт много "off-topic" T3
- Arxiv папиры уверенно попадают в T1 когда абстракт содержит agents/rag/eval/foundation-model
- Про Claude/Anthropic всё что угодно → T1 иногда false positive (например "Claude's writing style has me on edge" → всё равно T3, но promotional/release announcements легко попадают в T1)
Как настраивать
Если хочешь больше T1 попаданий — расширь определение Tier 1 в промпте (например добавить "major model releases from Anthropic/OpenAI/Google/Meta" явно).
Если хочешь строже — убери "process intelligence" (это твой специфичный use case) и сформулируй в терминах "impact на enterprise AI decisions".
Связано
- scorer-v1 — следующая стадия
- ../skills/no-max-length-on-llm-output
- ../algorithms/deterministic-on-llm
Metadata
- title
- Tier classifier v1 (intel-collector)
- model
- gemini/gemini-2.5-flash (reasoning_effort=disable)
- task
- классифицировать AI-новость в Tier 1/2/3 + topic tags
- tags
- ['prompt', 'classifier', 'gemini', 'production']
- created
- 2026-07-02
- status
- production в intel-collector, работает стабильно