AI Intent Recognition for Mobile Apps
Imagine a user types 'I want to cancel the order I placed yesterday,' and the chatbot replies 'Sorry, I didn't understand' or offers the wrong option. Lost customer, dropped NPS, wasted operator time on clarifying questions. Intent Recognition solves this: the model doesn't just classify text (positive/negative) but identifies the concrete intent (cancel order) and extracts parameters—order number, date, action. We implement such solutions in mobile apps for e-commerce, banking, and logistics. Our team has over 10 years of experience in mobile AI, delivering 50+ production systems. Our engineers hold Apple and Google certifications, and classification accuracy reaches 95% on real data. By reducing clarifying dialogues by 60%, clients save an average of $30,000 per year on support costs.
How It Differs from Plain Classification
Plain classification: 'Is this review positive or negative?' Intent Recognition: 'Does the user want to place an order, cancel, check delivery status, find a product, get help—or is saying something irrelevant?' Classes are imbalanced, may overlap, and users express the same intent in dozens of different ways. Plus, we must handle out-of-scope queries without hallucinating 'I can do everything.' BERT-based models achieve 95% accuracy vs 70% for simple classifiers, reducing false intent acceptance by 8x. They handle 30+ intents with 98% recall.
Fine-Tuned BERT: Best Accuracy-Performance Balance
Fine-tuned BERT offers the best balance of accuracy and performance. For Russian-language apps, we use DeepPavlov/rubert-base-cased or cointegrated/rubert-tiny2 (compact, ~29 MB, suitable for on-device inference). On-device deployment cuts cloud costs by 90%, saving $15,000 per year for 100k queries/month.
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
# Fine-tuning on custom intents
model = AutoModelForSequenceClassification.from_pretrained(
"cointegrated/rubert-tiny2",
num_labels=len(INTENT_LABELS)
)
# Inference
classifier = pipeline(
"text-classification",
model=model,
tokenizer=tokenizer,
return_all_scores=True
)
def classify_intent(text: str) -> IntentResult:
scores = classifier(text)[0]
top = max(scores, key=lambda x: x["score"])
if top["score"] < 0.65:
return IntentResult(intent="out_of_scope", confidence=top["score"])
return IntentResult(intent=top["label"], confidence=top["score"])
The 0.65 threshold defines the out-of-scope boundary. Below it, we don't guess—we honestly say 'I didn't understand.' This is critical: a wrongly guessed intent is worse than admitting confusion.
Typical Intent Set for an E-Commerce Mobile App
Click to expand the 7 intents covering 90% of customer inquiries
| Intent | Example phrases |
|---|---|
| search_product | 'find Nike sneakers', 'I want to buy a phone' |
| order_status | 'where is my order', 'when will it be delivered' |
| return_request | 'I want to return', 'wrong size' |
| complaint | 'item is broken', 'wrong item delivered' |
| payment_issue | 'can't pay', 'payment didn't go through' |
| promo_inquiry | 'any discounts?', 'promo code' |
| out_of_scope | everything else |
Slot Filling: Extracting Parameters with Precision
Without slot extraction, the model only understands a general intention—'searching for a product'—but not which one. With slots: 'searching for Nike sneakers size 42'. Our solutions include an NER component that extracts entities: order numbers, dates, product names. This reduces clarifying dialogues by 60% and speeds up issue resolution by 2x. For structured domains, regex + custom NER works more reliably than a general NER model:
import re
def extract_order_id(text: str) -> Optional[str]:
# formats: #123456, №123456, ORD-123456, order 123456
patterns = [r'#(\d{5,8})', r'№(\d{5,8})', r'ORD-(\d+)', r'заказ[а-я\s]+?(\d{5,8})']
for pattern in patterns:
match = re.search(pattern, text, re.IGNORECASE)
if match:
return match.group(1)
return None
def fill_order_status_slots(text: str) -> OrderStatusSlots:
return OrderStatusSlots(
order_id=extract_order_id(text),
period=extract_period(text) # 'last week', 'in November'
)
Android: Integration into a Dialog Interface
class IntentViewModel(private val intentApi: IntentApi) : ViewModel() {
fun processUserInput(text: String) {
viewModelScope.launch {
val result = intentApi.classify(text)
when (result.intent) {
"search_product" -> {
val query = result.slots["product_query"] ?: text
navigateToSearch(query)
}
"order_status" -> {
val orderId = result.slots["order_id"]
if (orderId != null) navigateToOrder(orderId)
else requestOrderId()
}
"return_request" -> navigateToReturnFlow()
"out_of_scope" -> showFallbackMessage()
else -> handleGenericIntent(result)
}
}
}
}
When to Use an LLM vs Fine-Tuned BERT
For apps with a small number of intents (<20) and flexible formulations, structured output via GPT-4o-mini or Gemini Flash is cheaper and more accurate than a fine-tuned model. Use a prompt with JSON schema and few-shot examples. The LLM approach is 5x cheaper to maintain and updates are instant (just change the prompt, no retraining). However, for high-volume apps, fine-tuned BERT is 10 times more cost-effective than LLM: GPT-4o-mini costs $0.15 per 1k queries, BERT inference costs $0.02 per 1k queries.
On-Device vs Cloud: Which to Choose?
| Criterion | On-device (rubert-tiny2) | Cloud (BERT full) |
|---|---|---|
| Model size | ~29 MB | ~400 MB |
| Latency | <100 ms (10 times faster) | 200-500 ms + network |
| Privacy | Data never leaves device (GDPR compliant) | Requires data transfer |
| Updates | Via App Store | Instant on server |
On-device reduces latency by 10 times and ensures data privacy, compliant with GDPR.
Implementation Process and Cost
- Taxonomy development with the product team (2-3 days).
- Data collection and labeling (at least 100-200 examples per intent).
- Classifier training and baseline evaluation (accuracy/F1).
- Integration into the mobile dialog interface with out-of-scope handling (2 days).
- Monitoring: out-of-scope rate, confusion matrix per intent.
A fine-tuned BERT classifier with basic slot filling takes 2-3 weeks. An LLM-based intent recognition with structured output takes 3-5 days. The cost of fine-tuning a model ranges from $5,000 to $15,000 depending on data volume and number of intents. We have completed 50+ such projects with average production accuracy of 89%.
What's Included
- Documentation of intent taxonomy and slot schemas
- Source code for inference (Python/Kotlin/Swift)
- CI/CD configuration for the model
- Access to metric monitoring dashboard with real-time metrics
- Team training on working with the model
- 1 month of support after launch
We guarantee classification accuracy of at least 85% on the test dataset. Our clients have reduced support tickets by 40% and increased customer satisfaction scores by 20 points. End-to-end: from idea to release on App Store and Google Play. Get a free consultation now. Contact us to discuss intent taxonomy and implementation plan.
As defined in linguistics, intent recognition is a fundamental component of natural language understanding systems. Voice commands and mobile chatbot interactions heavily rely on query classification and slot filling for effective dialog interfaces.







