AI problem framing becomes useful when the work improves measurable task utility rather than merely producing a polished output. This Artificial Intelligence lesson shows how to write a decision-first AI brief with an explicit non-AI baseline.
It is written for a practitioner who needs inspectable data, fixed evaluation cases and evidence that survives review. You will apply the method to Classify support requests, challenge one assumption deliberately, and retain a frozen test set, traceable sources, latency and cost so the result can be checked without private explanation.
What you will be able to do
By the end, you will produce a one-page AI problem brief for a support-ticket triage system. The brief will state what should improve for a user, what decision the system supports, which inputs are allowed, what happens after an output, how success is measured and where a person must remain in control.
- The goal makes sense without the words AI, machine learning or a model name.
- You compare AI with at least one non-AI baseline.
- You separate the product outcome from model-quality measurements.
- You name an unacceptable failure and the human response to it.
- Another learner can run your baseline and reproduce its output.
AI problem framing starts before the model
AI problem framing is the work of deciding whether an AI system is appropriate and, if it is, defining the job precisely enough to evaluate. “Add a chatbot,” “automate support” and “use our data” are solution ideas, not problem statements. They omit the affected user, current pain, desired action and cost of failure.
Google’s current ML problem-framing guidance begins with a non-ML goal, asks whether predictive ML, generative AI or a simpler approach is suitable, and then defines output and success measures. NIST’s AI Risk Management Framework adds context: intended use, users, deployment setting, benefits, limitations and potential impacts should be understood and documented. Those two views belong together. A technically possible model can still be the wrong product decision.
The seven-part problem brief
| Part | Question to answer | Weak answer | Useful answer |
|---|---|---|---|
| 1. User and moment | Who needs help, and at what point in the workflow? | Customers | A support coordinator assigning new tickets during the morning queue |
| 2. Current problem | What observable delay, error or cost exists now? | Support is slow | Coordinators read every ticket before choosing a queue; urgent cases may wait behind routine requests |
| 3. Desired outcome | What should improve, stated without AI terminology? | Classify with AI | Route routine tickets faster without allowing ambiguous or sensitive cases to bypass review |
| 4. Input and output | What enters the system, and what exactly leaves it? | Text in, answer out | Ticket subject and body in; suggested queue, confidence signal and reason out |
| 5. Action | What will a person or product do with the output? | Show prediction | Auto-route only permitted low-risk cases; send every other case to a coordinator |
| 6. Success | Which user outcome and quality measures determine value? | High accuracy | Shorter median assignment time, acceptable per-queue recall, and no increase in missed urgent tickets |
| 7. Boundaries | What must not happen? | Be secure | Do not expose ticket text, infer protected traits, auto-close requests or route safety threats without review |
Choose the simplest approach that can meet the goal
AI is useful when relevant patterns cannot be captured reliably with a small set of explicit rules, when sufficient representative examples exist, and when the output can drive a helpful action. It is a poor default when exact behavior is required, the data is unavailable, errors cannot be recovered, or a normal software rule already solves the task.
| Approach | Good fit | Support-triage example |
|---|---|---|
| Manual workflow | Low volume, rare decisions, or high-stakes judgment | A trained coordinator handles threats, legal requests and unusual account cases |
| Deterministic rules | Stable vocabulary and behavior that must be explainable | Messages containing an order number and “refund” go to billing review |
| Conventional software | Known inputs and exact transformations | A form requires product, account and urgency fields before submission |
| Predictive ML | Historical labeled examples contain patterns that generalize | A classifier predicts a queue from previously resolved tickets |
| Generative AI | Language understanding or generation is needed and output can be checked | An LLM proposes a short summary and routing reason for coordinator review |
A baseline is not throwaway work. It tells you whether the added cost, latency and maintenance of AI buy a meaningful improvement. If a dozen transparent rules perform well enough, shipping a model may be an engineering downgrade.
Product success is not the same as model performance
A classification score describes behavior on a test set; it does not prove that the workflow improved. Keep two scorecards:
- Product measures: assignment time, manual-review workload, reassignment rate and missed urgent cases.
- Model measures: precision and recall for each queue, confusion matrix, abstention rate and performance on new language or ticket types.
Suppose overall accuracy rises because billing tickets dominate the dataset while rare security tickets are still missed. The model score can look better while the operational risk becomes worse. Evaluate important slices separately and connect each measure to an action.
Worked example: frame support-ticket triage
Start with the vague request: “Build an AI system that automatically handles support.” It combines routing, answering and case resolution, provides no failure boundary, and encourages automation before anyone has measured the current workflow.
A reviewable first version is narrower:
For English-language tickets submitted through the help form, suggest one of three queues:billing, technical or account:or return manual-review. The suggestion helps a support coordinator assign work; it never closes a ticket or sends a customer response. We will compare it with the existing manual process and a keyword-rule baseline.
Inputs, outputs and decisions
- Allowed input: ticket subject and message after secrets and unnecessary personal data are removed.
- Output: one allowed queue, a confidence/abstention signal and a short routing reason.
- Decision: a coordinator confirms or changes the suggestion during the pilot.
- Non-goals: diagnosing customer intent, measuring employee performance, drafting final replies or resolving safety/legal cases.
- Failure response: ambiguous, unsupported or high-risk messages go to manual review.
Create a small evaluation set before building
Collect representative, permissioned examples and have qualified reviewers assign expected queues. Keep this evaluation set separate from examples used to design rules or prompts. Include short messages, spelling mistakes, multiple issues in one ticket and messages that belong nowhere. A four-row demo proves only that code runs; it does not establish production quality.
Build the non-AI baseline first
The following program routes four synthetic tickets with transparent keyword rules. It deliberately returns manual-review when no rule matches or when two queues tie. That abstention behavior is part of the product design, not a coding accident.
Choose the language you already use. Every tab implements the same behavior with standard libraries and requires no API key.
JavaScript : Node.js 18+
const rules = {
billing: ["charged", "refund", "invoice"],
technical: ["crash", "error", "login"],
account: ["email", "password", "profile"]
};
const tickets = [
"I was charged twice for order 1042",
"The app crashes after login",
"Please change the email on my profile",
"I have a suggestion about your pricing"
];
function classify(text) {
const value = text.toLowerCase();
const scores = Object.entries(rules)
.map(([label, words]) => [label, words.filter(w => value.includes(w)).length])
.sort((a, b) => b[1] - a[1]);
if (scores[0][1] === 0 || scores[0][1] === scores[1][1]) return "manual-review";
return scores[0][0];
}
for (const ticket of tickets) console.log(`${classify(ticket)} | ${ticket}`);Run: save as main.js, then run node main.js.
Python : Python 3.10+
RULES = {
"billing": ("charged", "refund", "invoice"),
"technical": ("crash", "error", "login"),
"account": ("email", "password", "profile"),
}
TICKETS = [
"I was charged twice for order 1042",
"The app crashes after login",
"Please change the email on my profile",
"I have a suggestion about your pricing",
]
def classify(text: str) -> str:
value = text.lower()
scores = sorted(
((sum(word in value for word in words), label) for label, words in RULES.items()),
reverse=True,
)
if scores[0][0] == 0 or scores[0][0] == scores[1][0]:
return "manual-review"
return scores[0][1]
for ticket in TICKETS:
print(f"{classify(ticket)} | {ticket}")Run: save as main.py, then run python main.py.
PHP : PHP 8.1+ CLI
<?php
$rules = [
"billing" => ["charged", "refund", "invoice"],
"technical" => ["crash", "error", "login"],
"account" => ["email", "password", "profile"],
];
$tickets = [
"I was charged twice for order 1042",
"The app crashes after login",
"Please change the email on my profile",
"I have a suggestion about your pricing",
];
function classify(string $text, array $rules): string {
$value = strtolower($text);
$scores = [];
foreach ($rules as $label => $words) {
$scores[$label] = count(array_filter($words, fn($word) => str_contains($value, $word)));
}
arsort($scores);
$values = array_values($scores);
if ($values[0] === 0 || $values[0] === $values[1]) return "manual-review";
return array_key_first($scores);
}
foreach ($tickets as $ticket) echo classify($ticket, $rules) . " | " . $ticket . PHP_EOL;Run: save as main.php, then run php main.php.
Java : JDK 17+
import java.util.*;
public class Main {
static final Map<String, List<String>> RULES = Map.of(
"billing", List.of("charged", "refund", "invoice"),
"technical", List.of("crash", "error", "login"),
"account", List.of("email", "password", "profile")
);
static String classify(String text) {
String value = text.toLowerCase(Locale.ROOT);
List<Map.Entry<String, Integer>> scores = new ArrayList<>();
RULES.forEach((label, words) ->
scores.add(Map.entry(label, (int) words.stream().filter(value::contains).count()))
);
scores.sort((a, b) -> Integer.compare(b.getValue(), a.getValue()));
if (scores.get(0).getValue() == 0 || scores.get(0).getValue().equals(scores.get(1).getValue()))
return "manual-review";
return scores.get(0).getKey();
}
public static void main(String[] args) {
List<String> tickets = List.of(
"I was charged twice for order 1042",
"The app crashes after login",
"Please change the email on my profile",
"I have a suggestion about your pricing"
);
tickets.forEach(ticket -> System.out.println(classify(ticket) + " | " + ticket));
}
}Run: save as Main.java, run javac Main.java, then java Main.
C# / .NET : .NET 8 SDK
var rules = new Dictionary<string, string[]>
{
["billing"] = ["charged", "refund", "invoice"],
["technical"] = ["crash", "error", "login"],
["account"] = ["email", "password", "profile"]
};
string[] tickets =
[
"I was charged twice for order 1042",
"The app crashes after login",
"Please change the email on my profile",
"I have a suggestion about your pricing"
];
string Classify(string text)
{
var value = text.ToLowerInvariant();
var scores = rules
.Select(pair => new { pair.Key, Score = pair.Value.Count(value.Contains) })
.OrderByDescending(item => item.Score)
.ToArray();
if (scores[0].Score == 0 || scores[0].Score == scores[1].Score) return "manual-review";
return scores[0].Key;
}
foreach (var ticket in tickets) Console.WriteLine($"{Classify(ticket)} | {ticket}");Run: create a console project with dotnet new console -n TriageBaseline, replace Program.cs, then run dotnet run --project TriageBaseline.
All five versions should print:
billing | I was charged twice for order 1042
technical | The app crashes after login
account | Please change the email on my profile
manual-review | I have a suggestion about your pricingMake the baseline fail on purpose
Try “I cannot sign in and need a refund.” It matches both technical and billing terms. The program abstains because the top scores tie. That is safer than silently picking a queue, but it also shows why keyword rules may create too much manual work. Record this case; it becomes part of the evaluation set for a later AI prototype.
Next, try spelling variation, Urdu or Roman Urdu, a product-specific term and a message containing two unrelated issues. Do not immediately add more keywords. First decide whether each case belongs within the project’s intended scope.
Classify support requests: isolate the AI problem framing decision
- Choose a low-risk workflow you understand. Examples: route documentation feedback, group public product reviews, or flag duplicate FAQ questions.
- Observe or describe the current workflow. Name the user and the decision they make.
- Write the seven parts of the problem brief.
- Implement a manual or rule-based baseline. Use the code above only if ticket routing matches your chosen problem.
- Create at least 20 synthetic test cases, including ambiguity and out-of-scope inputs.
- Record baseline results. Do not summarize failure as “inaccurate”; name which cases fail and why.
- Decide: keep the simple solution, test predictive ML, test generative AI, or stop the project.
Use this brief template
USER AND MOMENT:
CURRENT WORKFLOW:
OBSERVED PROBLEM:
DESIRED OUTCOME (no AI terms):
ALLOWED INPUTS:
REQUIRED OUTPUT:
ACTION AFTER OUTPUT:
NON-GOALS:
SIMPLE BASELINE:
PRODUCT SUCCESS MEASURES:
MODEL/OUTPUT QUALITY MEASURES:
UNACCEPTABLE FAILURE:
HUMAN REVIEW AND OVERRIDE:
PRIVACY/SECURITY BOUNDARIES:
DECISION AFTER BASELINE:Common framing mistakes
- Choosing a model first: model names change; the user problem should remain understandable.
- Using “accuracy” as the only goal: averages can hide expensive or harmful failures.
- Predicting without an action: a score that changes no decision creates no user value.
- Automating the whole workflow: start with a narrow assistive step and an override.
- Ignoring the baseline: without it, you cannot show that AI is worth its cost.
- Testing on design examples: memorized examples exaggerate quality. Keep evaluation cases separate.
- Treating abstention as failure: refusing uncertain cases can be a deliberate safety feature.
Checkpoint and scoring rubric
Answer these using your own project, not the support example:
- What user decision becomes easier if the project succeeds?
- Which simpler approach is your baseline, and what would make it sufficient?
- What output will the system return when it is uncertain?
- Which failure matters more than the average score suggests?
- What data is unavailable, unreliable or inappropriate to use?
- Who can override the system, and how will corrections be recorded?
| Area | 0 : Missing | 1 : Partial | 2 : Ready |
|---|---|---|---|
| Problem | Names a tool | Names a task | Names user, moment, problem and desired outcome |
| Alternatives | No comparison | Mentions another option | Runs a measurable simple baseline |
| Success | “Accurate” | One model metric | Product and model measures linked to decisions |
| Risk | No failure boundary | Generic warning | Specific unacceptable failure, review and override |
| Evidence | Claim only | Screenshots | Inputs, expected outputs, results and limitations are reproducible |
Pass standard: score at least 8/10 with no zero in Risk. A lower score does not mean “add more AI.” It means narrow the project or gather better evidence.
Professional field method: Write a decision-first ai brief with an explicit non-ai baseline
At professional level, AI problem framing is not judged by how many terms you can repeat. It is judged by whether it improves measurable task utility while preventing unsupported output reaching a consequential decision. For the project “Classify support requests,” write that operating objective at the top of the work log before opening Python. This keeps the tool subordinate to the decision.
The advanced move in this lesson is to write a decision-first AI brief with an explicit non-AI baseline. Apply it to the same normal case and edge case used earlier, then add a counterexample designed to break your current assumption. Preserve a frozen test set, traceable sources, latency and cost. A reviewer should be able to distinguish the input, your prediction, the observed result, the diagnosis and the exact correction.
Do not optimize away a difficult AI problem framing result. The known novice trap here is Choosing a model before defining the problem. If it appears, freeze the failing input, reduce it to the smallest reproducible case and change one factor only. Record why the change should work before running it. That prediction is what turns trial-and-error into a professional experiment.
| Control | What to record for AI problem framing | Release question |
|---|---|---|
| Invariant | The property that must remain true when the input, user or environment changes. | Which automated or manual check proves it? |
| Failure injection | One missing, delayed, malformed, adversarial or unusually large case relevant to Artificial Intelligence. | Does the system fail safely and explainably? |
| Decision threshold | The minimum evidence needed to accept, revise or reject the current approach. | Was the threshold written before seeing the result? |
| Residual risk | What remains uncertain after the corrected test and who must own it. | Would a real stakeholder know when to stop or escalate? |
Advanced checkpoint: defend the decision without the tutorial
- Rebuild the smallest AI problem framing example from a blank file or document.
- State the invariant and predict the failure-injection result before testing.
- Run the test, preserve the failed evidence and make one justified correction.
- Compare the corrected approach with one credible alternative using the same acceptance criteria.
- Write a 150-word handoff explaining the decision, limitation, monitoring signal and rollback or recovery action.
AI problem framing reviewer drill: ask another practitioner to challenge the evidence, not the presentation. If they cannot reproduce the result or identify the boundary where it should not be trusted, this Artificial Intelligence lesson is not complete.
Portfolio evidence worth publishing
Create a small repository or case-study page with:
problem-brief.mdcontaining the completed template;- your baseline program and exact run instructions;
test-cases.csvwith synthetic inputs, expected queue and actual result;- a short failure analysis, including ambiguous and out-of-scope cases;
- a decision memo explaining whether AI is justified and what you would test next.
This is stronger than claiming you “built an AI app.” It demonstrates product judgment, reproducible engineering and awareness of failure:all before expensive implementation begins.
Primary references
- Google for Developers: Machine Learning Problem Framing
- Google for Developers: Understand the Problem
- Google for Developers: Frame an ML Problem
- NIST AI RMF Core: Map
- People + AI Guidebook: User Needs and Defining Success
These sources describe a method, not a guarantee that a particular system is safe or production-ready. Recheck requirements when the users, data, model, deployment setting or potential impact changes.
Created and reviewed by Muhammad Azhar, Lead Software Engineer with more than 16 years of software-development experience.
Share this page
Share this page with the people who will use it next.
Discussion
No comments yet. Add the first useful question or observation.
You must log in to post a comment.