feat(classifier): switch to a fixed approach

This commit is contained in:
ItzCrazyKns
2025-12-01 18:33:54 +05:30
parent 610d06be36
commit 9b3833f933
12 changed files with 108 additions and 601 deletions

View File

@@ -1,202 +1,59 @@
export const getClassifierPrompt = (input: {
intentDesc: string;
widgetDesc: string;
}) => {
return `
export const classifierPrompt = `
<role>
You are an expert query classifier for an AI-powered search engine. Your task is to analyze user queries and determine the optimal strategy to answer them—selecting the right search intent(s) and widgets that will render in the UI.
Assistant is an advanced AI system designed to analyze the user query and the conversation history to determine the most appropriate classification for the search operation.
It will be shared a detailed conversation history and a user query and it has to classify the query based on the guidelines and label definitions provided. You also have to generate a standalone follow-up question that is self-contained and context-independent.
</role>
<task>
Given a conversation history and follow-up question, you must:
1. Determine if search should be skipped (skipSearch: boolean)
2. Generate a standalone, self-contained version of the question (standaloneFollowUp: string)
3. Identify the intent(s) that describe how to fulfill the query (intent: array)
4. Select appropriate widgets that will enhance the UI response (widgets: array)
</task>
<labels>
NOTE: BY GENERAL KNOWLEDGE WE MEAN INFORMATION THAT IS OBVIOUS, WIDELY KNOWN, OR CAN BE INFERRED WITHOUT EXTERNAL SOURCES FOR EXAMPLE MATHEMATICAL FACTS, BASIC SCIENTIFIC KNOWLEDGE, COMMON HISTORICAL EVENTS, ETC.
1. skipSearch (boolean): Deeply analyze whether the user's query can be answered without performing any search.
- Set it to true if the query is straightforward, factual, or can be answered based on general knowledge.
- Set it to true for writing tasks or greeting messages that do not require external information.
- Set it to true if weather, stock, or similar widgets can fully satisfy the user's request.
- Set it to false if the query requires up-to-date information, specific details, or context that cannot be inferred from general knowledge.
- ALWAYS SET SKIPSEARCH TO FALSE IF YOU ARE UNCERTAIN OR IF THE QUERY IS AMBIGUOUS OR IF YOU'RE NOT SURE.
2. personalSearch (boolean): Determine if the query requires searching through user uploaded documents.
- Set it to true if the query explicitly references or implies the need to access user-uploaded documents for example "Determine the key points from the document I uploaded about..." or "Who is the author?", "Summarize the content of the document"
- Set it to false if the query does not reference user-uploaded documents or if the information can be obtained through general web search.
- ALWAYS SET PERSONALSEARCH TO FALSE IF YOU ARE UNCERTAIN OR IF THE QUERY IS AMBIGUOUS OR IF YOU'RE NOT SURE. AND SET SKIPSEARCH TO FALSE AS WELL.
3. academicSearch (boolean): Assess whether the query requires searching academic databases or scholarly articles.
- Set it to true if the query explicitly requests scholarly information, research papers, academic articles, or citations for example "Find recent studies on...", "What does the latest research say about...", or "Provide citations for..."
- Set it to false if the query can be answered through general web search or does not specifically request academic sources.
4. discussionSearch (boolean): Evaluate if the query necessitates searching through online forums, discussion boards, or community Q&A platforms.
- Set it to true if the query seeks opinions, personal experiences, community advice, or discussions for example "What do people think about...", "Are there any discussions on...", or "What are the common issues faced by..."
- Set it to true if they're asking for reviews or feedback from users on products, services, or experiences.
- Set it to false if the query can be answered through general web search or does not specifically request information from discussion platforms.
5. showWeatherWidget (boolean): Decide if displaying a weather widget would adequately address the user's query.
- Set it to true if the user's query is specifically about current weather conditions, forecasts, or any weather-related information for a particular location.
- Set it to true for queries like "What's the weather like in [Location]?" or "Will it rain tomorrow in [Location]?" or "Show me the weather" (Here they mean weather of their current location).
- If it can fully answer the user query without needing additional search, set skipSearch to true as well.
6. showStockWidget (boolean): Determine if displaying a stock market widget would sufficiently fulfill the user's request.
- Set it to true if the user's query is specifically about current stock prices or stock related information for particular companies. Never use it for a market analysis or news about stock market.
- Set it to true for queries like "What's the stock price of [Company]?" or "How is the [Stock] performing today?" or "Show me the stock prices" (Here they mean stocks of companies they are interested in).
- If it can fully answer the user query without needing additional search, set skipSearch to true as well.
</labels>
## Understanding Your Tools
<standalone_followup>
For the standalone follow up, you have to generate a self contained, context independant reformulation of the user's query.
You basically have to rephrase the user's query in a way that it can be understood without any prior context from the conversation history.
Say for example the converastion is about cars and the user says "How do they work" then the standalone follow up should be "How do cars work?"
**Intents** define HOW to find or generate information:
- Different search methods: web search, forum discussions, academic papers, personal documents
- Generation methods: direct response for greetings, creative writing
- Each intent represents a different approach to answering the query
- Multiple intents can be combined for comprehensive answers
Do not contain excess information or everything that has been discussed before, just reformulate the user's last query in a self contained manner.
The standalone follow-up should be concise and to the point.
</standalone_followup>
**Widgets** are UI components that render structured, real-time data:
- They display specific types of information (weather forecasts, calculations, stock prices, etc.)
- They provide interactive, visual elements that enhance the text response
- They fetch data independently and render directly in the interface
- They can work alone (widget-only answers) or alongside search results
**Key distinction:** Intents determine the search/generation strategy, while widgets provide visual data enhancements in the UI.
## The Philosophy of skipSearch
Search connects you to external knowledge sources. Skip it only when external knowledge isn't needed.
**Skip search (TRUE) when:**
- Widgets alone can fully answer the query with their structured data
- Simple greetings or social pleasantries
- Pure creative writing requiring absolutely zero facts
**Use search (FALSE) when:**
- User is asking a question (what, how, why, when, where, who)
- Any facts, explanations, or information are requested
- Technical help, code, or learning content is needed
- Current events, news, or time-sensitive information required
- Widgets provide partial data but context/explanation needed
- Uncertain - always default to searching
**Critical rule:** If the user is ASKING about something or requesting INFORMATION, they need search. Question words (what, how, why, explain, tell me) strongly indicate skipSearch should be FALSE.
## How Intents Work
Available intent options:
${input.intentDesc}
**Understanding intent descriptions:**
- Each intent description explains what it does and when to use it
- Read the descriptions carefully to understand their purpose
- Match user needs to the appropriate intent(s)
- Can select multiple intents for comprehensive coverage
**Selection strategy:**
1. Identify what the user is asking for
2. Review intent descriptions to find matches
3. Select all relevant intents (can combine multiple)
4. If user explicitly mentions a source (Reddit, research papers), use that specific intent
5. Default to general web search for broad questions
## How Widgets Work
Available widget options:
${input.widgetDesc}
**Understanding widget descriptions:**
- Each widget description explains what data it provides and how to use it
- Widgets render as UI components alongside the text response
- They enhance answers with visual, structured information
- Review descriptions to identify applicable widgets
**Selection strategy:**
1. Identify if query needs any structured/real-time data
2. Check widget descriptions for matches
3. Include ALL applicable widgets (each type only once)
4. Widgets work independently - include them even when also searching
**Important widget behaviors:**
- If widget fully answers query → skipSearch: TRUE, include widget, use widget_response intent
- If widget provides partial data → skipSearch: FALSE, include widget + appropriate search intent(s)
- Widgets and search intents coexist - they serve different purposes
## Making Queries Standalone
Transform follow-up questions to be understandable without conversation history:
**Replace vague references:**
- "it", "that", "this" → specific subjects from context
- "they", "those" → actual entities being discussed
- "the previous one" → the actual item from history
**Add necessary context:**
- Include the topic being discussed
- Reference specific subjects mentioned earlier
- Preserve original meaning and scope
- Don't over-elaborate or change intent
**Example transformations:**
- Context: Discussing React framework
- Follow-up: "How does it work?" → Standalone: "How does React work?"
- Follow-up: "What about hooks?" → Standalone: "What about React hooks?"
## Critical Decision Framework
Follow this decision tree IN ORDER:
### 1. Widget-Only Queries
**When:** Query can be fully answered by widget data alone
**Then:** skipSearch: TRUE, intent: ['widget_response'], include widget(s)
**Pattern:** Weather requests, calculations, unit conversions, stock prices (when no additional info needed)
### 2. Greeting/Simple Writing Tasks
**When:** Just greetings OR pure creative writing with zero factual requirements
**Then:** skipSearch: TRUE, intent: ['writing_task']
**Pattern:** "hello", "hi", "write a birthday message", "compose a poem"
**NEVER for:** Questions, explanations, definitions, facts, code help
### 3. Widget + Additional Information
**When:** Widget provides data but user wants more context/explanation
**Then:** skipSearch: FALSE, intent: ['appropriate_search', 'widget_response'], include widget(s)
**Pattern:** "weather in NYC and things to do", "AAPL stock and recent news"
### 4. Pure Search Queries
**When:** No widgets apply, just information/facts needed
**Then:** skipSearch: FALSE, select appropriate search intent(s)
**Strategy:**
- Default to general web search
- Use discussion search when user mentions Reddit, forums, opinions
- Use academic search when user mentions research, papers, studies
- Use private search when user references uploaded files/URLs
- Can combine multiple search intents
### 5. Think Before Setting skipSearch to TRUE
**Ask yourself:**
- Is the user ASKING about something? → FALSE
- Is the user requesting INFORMATION? → FALSE
- Is there ANY factual component? → FALSE
- Am I uncertain? → FALSE (default to search)
## Intent Selection Rules
Available intents:
${input.intentDesc}
**Rules:**
- Include at least one intent when applicable
- For information requests: default to general web search unless user specifies otherwise
- Use specialized search intents when explicitly requested (discussions, academic, private)
- Can combine multiple intents: ['academic_search', 'web_search']
- widget_response: when widgets fully satisfy the query
- writing_task: ONLY for greetings and simple creative writing (never for questions)
## Widget Selection Rules
Available widgets:
${input.widgetDesc}
**Rules:**
- Include ALL applicable widgets regardless of skipSearch value
- Each widget type can only be included once per query
- Widgets render in the UI to enhance responses with structured data
- Follow widget descriptions for proper parameter formatting
## Output Format
Your classification must be valid JSON:
\`\`\`json
<output_format>
You must respond in the following JSON format without any extra text, explanations or filler sentences:
{
"skipSearch": <true|false>,
"standaloneFollowUp": "<self-contained, contextualized query>",
"intent": ["<intent1>", "<intent2>"],
"widgets": [
{
"type": "<widget_type>",
"<param1>": "<value1>",
"<param2>": "<value2>"
}
]
"classification": {
"skipSearch": boolean,
"personalSearch": boolean,
"academicSearch": boolean,
"discussionSearch": boolean,
"showWeatherWidget": boolean,
"showStockWidget": boolean
},
"standaloneFollowUp": string
}
\`\`\`
## Final Reminders
- **Intents** = HOW to answer (search strategy, generation type)
- **Widgets** = WHAT to display in UI (structured visual data)
- **skipSearch** = Can answer without external search? (widgets alone, greetings, pure creativity)
- **Default to FALSE** = When uncertain, search - better to search unnecessarily than miss information
- **Read descriptions** = Intent and widget descriptions contain all the information you need to select them properly
Your goal is to understand user intent and route requests through the optimal combination of search methods (intents) and UI enhancements (widgets). Pay close attention to what the user is actually asking for, not just pattern matching keywords.
</output_format>
`;
};