Evaluating LLM Assistants for Work: Consumer Chat vs. Production Productivity
\{"type": "custom_tool_call", "status": "required", "tool_name": "file_search", "arguments": {"query": "eval"}}
The most common mistake in LLM selection is judging an assistant by how it performs in personal chat rather than on the tasks that matter most for production. This article explains how consumer use and professional work stress models differently, the capabilities that matter most for production (effective long context, format-stable output, deep code work, verifiable answers, latency budgets), how to build a reproducible evaluation pipeline, how to structure a layered, model-agnostic integration, and the governance practices enterprises need before rollout. The code samples include an evaluation case and scoring script, a model-agnostic backend interface with fallback routing, and RAG design guidance.## Why “Good for Chatting” Is Not “Good for Working”Once general-purpose models became widely available, teams making selection decisions most often made one mistake: treating their own subjective experience from casual use as the technical basis for a production decision. But the two kinds of use place fundamentally different demands on a model.- Consumer use: short context, open-ended expression, and a high tolerance for error. Users want output that “reads fluently and is roughly right,” and if one generation disappoints, they can simply ask again.
- Production work: long context, strict constraints, and a low tolerance for error. Code generated in one pass has to compile. An analysis document has to cite traceable sources. Data extracted in one pass has to pass schema validation by the downstream system.
A pattern that keeps showing up in industry observations is this: tools built around general conversation draw the vast majority of their traffic from non-work uses such as writing, Q&A, and casual chat. Tools positioned for professional workflows see their usage concentrate on tasks such as coding, research, and professional document processing. This difference in distribution is not the result of marketing positioning. It is a natural reflection of what each model is actually better at, expressed through real demand.
To judge whether an assistant belongs in your workflow, look not at its average score but at its floor on your most critical task.
Five Core Capabilities Behind Production-Grade Use### Long-Context Effectiveness, Not Just Context Length
Context window size is the most easily misread metric. The advertised length and what is actually usable are clearly different things. Three layers deserve attention:
- Position sensitivity: when key information sits in the middle of the input, models typically recall it less accurately than information at the beginning or end (the “lost in the middle” effect). Ways to reduce the problem include moving key information to the front, summarizing in chunks, and injecting passages retrieved on demand.
- Semantic fidelity after context reduction: documents that exceed the window must be split into chunks, and the chunking strategy directly determines answer quality. Fixed-length splitting cuts across argument chains that span multiple sections. Split on semantic boundaries instead (sections, functions, or paragraphs), and keep an overlap between chunks.
- Cost that grows linearly with context: repeatedly stuffing full documents into the prompt is the leading cause of worsening latency and cost.
Instruction Following and Output Format Stability
Whether an engineering integration succeeds or fails often comes down to whether the model can consistently produce results that programs can parse. Evaluation should cover:
- Handling stacked constraints: can the model make trade-offs when several constraints apply at once (e.g., “no more than 200 words and must contain three key points”)?
- Holding its ground: does it refuse unreasonable requests, for example by not abandoning a correct conclusion just because the user pushes back?
- Schema compliance rate for structured output: how often are fields missing, types wrong, or extra text added?
- Instruction decay over long conversations: by the tenth turn, is it still following the role and rules set in the first turn?
Layered Evaluation of Code Ability
“Can write code” is too coarse a judgment. Evaluate coding by task type instead:
- single-function implementation
- cross-file refactoring
- defect localization and repair
- test case generation
- code explanation and migration
Cross-file refactoring and defect localization place the highest demands on context integration and are the best at revealing how far a model’s capabilities actually go.
Hallucination Rate and Verifiability
Hallucinations cannot be eliminated completely. Engineering can only constrain them. One effective approach is to turn “generative answers” into “evidence-grounded answers”:
- Require the model to cite its sources in every response.
- Use a program to check that each citation exists and actually supports the claim.
When a model is asked for information it does not have, it must explicitly state that there is “insufficient information” rather than filling in an answer that looks plausible. Count this kind of refusal as a positive score rather than a failure.
Latency and Throughput Budgets
Interactive scenarios can tolerate a time-to-first-token in the seconds range. Batch scenarios, by contrast, should optimize token throughput. When benchmarking, always record P50 and P95 latency, not just the average. Tail latency determines how much capacity you need to plan for asynchronous task queues.
Building a Reproducible Evaluation Process### A Three-Step Method
- Profile the tasks: list the five task types that will occur most often in the next three months. For each one, note the distribution of input lengths, the output format requirements, and the tolerance level for errors.
- Build a business evaluation set: sample 100–300 items from real historical data. De-identify them and freeze them into a set of test cases with reference answers, covering routine, boundary, and exceptional cases.
- Combine offline scoring with online canary releases: use scripts to score candidates offline and narrow the field. Then roll them out to a share of traffic online and make business metrics, such as ticket resolution rate and human edit rate, the final deciding factor.
Evaluation Set Structure and a Scoring Script
{"id": "case-017","task": "intent_extraction","input": "Group this quarter's refund tickets by reason and return the result as JSON","expected_schema": {"categories": "array<string>","counts": "object<string,int>"},"must_include": ["reason", "count"],"forbidden": ["guess customer names"]}
import json, re, statistics, timefrom concurrent.futures import ThreadPoolExecutordef score_one(case, model_client):t0 = time.time()raw = model_client.chat(messages=[{"role": "system", "content": "Answer only from the provided material; state clearly when information is insufficient."},{"role": "user", "content": case["input"]},],response_format={"type": "json_object"}, # Force structured outputtemperature=0.0, # Turn off randomness during evaluation)latency = time.time() - t0result = {"id": case["id"], "latency": latency, "checks": {}}# 1) Structural validitytry:payload = json.loads(raw)result["checks"]["json_valid"] = 1.0except json.JSONDecodeError:result["checks"]["json_valid"] = 0.0return result# 2) Coverage of required fieldskeys_ok = all(k in payload for k in case["expected_schema"])result["checks"]["schema_ok"] = float(keys_ok)# 3) Required information presenttext = json.dumps(payload, ensure_ascii=False)result["checks"]["content_ok"] = float(all(kw in text for kw in case.get("must_include", [])))# 4) Forbidden content (out-of-scope inference, fabricated fields)result["checks"]["safety_ok"] = float(not any(kw in text for kw in case.get("forbidden", [])))return resultdef evaluate(cases, model_client, workers=8):with ThreadPoolExecutor(max_workers=workers) as pool:rows = list(pool.map(lambda c: score_one(c, model_client), cases))report = {}for key in ["json_valid", "schema_ok", "content_ok", "safety_ok"]:report[key] = round(statistics.mean(r["checks"][key] for r in rows), 4)report["p95_latency"] = round(statistics.quantiles([r["latency"] for r in rows], n=20)[18], 3)return report
A key design principle: every scored item must be something a program can decide. Leave dimensions that depend on subjective judgment, such as writing style and persuasiveness, to small-scale blind human review. In that review, several reviewers who do not know which model produced which output should score each one independently.
A Layered Architecture for Engineering Integration
When a selection decision reaches implementation, business code should not depend directly on a single model provider. A five-layer structure works well:
| Layer | Responsibility | Key design considerations |
|---|---|---|
| Access gateway | Authentication, rate limiting, quotas, de-identification | One unified protocol that hides the differences between providers |
| Orchestration | Prompt templates, tool calls, multi-turn state | Version-control templates so every run can be traced back |
| Retrieval | Hybrid vector and keyword search with reranking | Kept separate from the model so it can be optimized on its own |
| Model routing | Scheduling by task difficulty and cost tier | Simple tasks go to small models, complex tasks to stronger ones |
| Observability and audit | Logs, token metering, quality monitoring | Full-chain tracing with regression baselines |
A Model-Agnostic Abstraction Interface
from dataclasses import dataclassfrom typing import Protocol@dataclassclass GenRequest:messages: list[dict]max_tokens: int = 1024temperature: float = 0.0response_format: dict | None = Noneclass ModelBackend(Protocol):def chat(self, req: GenRequest) -> str: ...def health(self) -> bool: ...class FallbackRouter:"""Fall back to the secondary backend when the primary model times out or is rate-limited, keeping business operations running."""def __init__(self, primary: ModelBackend, secondary: ModelBackend,max_retry: int = 2):self.primary, self.secondary = primary, secondaryself.max_retry = max_retrydef chat(self, req: GenRequest) -> str:last_err = Nonefor backend in (self.primary, self.secondary):for _ in range(self.max_retry):try:return backend.chat(req)except Exception as exc: # In production, distinguish retryable errorslast_err = excraise RuntimeError(f"all backends failed: {last_err}")
Doing RAG the Right Way
- Chunking: split on semantic boundaries, use chunks of 300–800 tokens, and overlap adjacent chunks by 10–15%.
- Hybrid retrieval: combine vector recall with keyword recall. This covers both semantic similarity and exact matches on proper nouns.
- Reranking: retrieve 20–50 chunks, rerank them with a cross-encoder, and inject only the top 3–5 into the prompt.
- Citation constraints: require the model to include a document ID in its output, and have the program verify that each citation really exists.
Tool Calling and Structured Output
Give deterministic work to programs, and limit the model to making decisions and expressing results. For example, implement “query the database,” “call the payment API,” and “send a notification” as restricted tools. The model chooses which tool to call and what arguments to pass, while the program side validates the arguments against a whitelist and enforces idempotency. Every write operation must go through human confirmation or a second round of verification. Model output should never directly trigger side effects that cannot be undone.
Four Governance Requirements for Enterprise Adoption
- Data security: Prefer service offerings that support not using customer data for training, as well as encryption in transit and at rest. De-identify sensitive fields, or replace them with placeholders, before the data reaches the model. Stored prompts and responses must meet audit requirements and the applicable retention periods. For enterprises that deploy proprietary models, an inference cluster can be built inside their own cloud environment. General-purpose cloud capabilities such as object storage, message queues, container platforms, logging, and monitoring and alerting can support that cluster. Platforms such as Baidu AI Cloud typically offer these categories of general infrastructure to support private inference and data-processing pipelines.
- Cost governance: Set up a token metering dashboard, with usage attributed to each business line. Enable semantic caching for frequent, repeated requests. Send batch jobs through low-priority queues and more economical model tiers. Set a max_tokens cap on each request to prevent runaway output.
- Stability: Set separate timeouts for time-to-first-token and total response time, and add circuit breakers and backoff retries. Treat every external model call as an unreliable dependency, with a fallback path and static default answers.
- Quality and regression: Add the evaluation scripts to CI so that any prompt or model version change triggers a regression run. Sample production traffic for human review, and watch for sudden shifts in three core metrics: refusal rate, format error rate, and human rewrite rate.
Common Pitfalls
- Judging only by leaderboard scores: public benchmarks differ greatly from real business traffic. A business evaluation set predicts real-world performance far better than a general-purpose leaderboard.
- Using long context instead of retrieval: it costs more and recall is unstable. The retrieval layer gives a better return on investment.
- Migrating everything in one pass: without canary releases and rollback in place, switching models often ends in a quality regression.
- Ignoring prompt version management: when prompts are hard-coded into business code, it becomes impossible to pinpoint what caused a change in quality.
Conclusion
To decide whether an AI assistant can enter a professional workflow, don’t compare marketing claims. Go back to three measurable questions:
- How low is its success rate on your most critical tasks? That floor matters more than its average.
- Can your programs consume its output reliably?
- Do its cost and latency fit within your business budget?
Build the evaluation set from your own real business data. Use a layered architecture to isolate the differences between models. Use governance mechanisms to keep risk under control. This methodology still holds no matter which specific provider you choose, and that is the right way to approach technical selection.
