5 recurring mistakes when adopting LLMs in B2B companies
From poorly designed RAG pipelines to hardcoded prompts in production: five patterns that stall or kill LLM projects in B2B enterprises.
Published on August 31, 2026 · 7 min read
The model is not the problem
In 2024, roughly 60% of enterprise LLM pilot projects never reached production (source: Gartner, Hype Cycle for AI, 2024). Not because the models underperform. The models work. The failure is architectural and organisational.
Here are the five patterns we see repeated, with concrete guidance on how to fix them.
---
1. RAG built without retrieval evaluation
The most common pattern: a Retrieval-Augmented Generation system is assembled, company documents are indexed, three test questions are asked, it seems to work. Production deployment follows.
The problem: nobody measured retrieval quality separately from final answer quality. If the retriever returns the wrong chunks, the model produces plausible but incorrect responses — not obvious hallucinations, but almost-right answers that no human reviewer catches until damage is done.
What to do. Build a retrieval-specific test suite before touching the model. For each reference query, verify that expected chunks appear in the top-k results. Minimum metrics: Recall@5, MRR. Only then evaluate end-to-end with RAGAS or equivalent.
# Minimal retrieval evaluation with LlamaIndex
from llama_index.core.evaluation import RetrieverEvaluator
evaluator = RetrieverEvaluator.from_defaults(
retriever=retriever,
metrics=["mrr", "hit_rate"]
)
result = await evaluator.aevaluate_dataset(eval_dataset)
print(result.metric_vals_dict)---
2. Prompts hardcoded in production
A prompt is application logic. Treating it as a string literal in source code is equivalent to hardcoding a SQL query in a controller.
We see systems where the system prompt contains business rules ("Never mention competitor X", "Always use the Q3 2023 price list"), versioned alongside application code. Every change requires a deploy. Every test requires a full CI cycle.
What to do. Separate prompts from code from day one. Tools like LangSmith, PromptLayer, or even a simple database table allow you to version, A/B test, and roll back prompts without touching code. The prompt becomes an artefact with its own lifecycle.
---
3. No output guardrails
An LLM integrated into a B2B workflow — quote generation, ticket responses, contract data extraction — must produce structured and verifiable output. Relying on the model's good behaviour is not a strategy.
Real case: a quote generation system where the model returned prices in free-text format. Downstream parsing failed silently on 12% of responses. No alert, no structured log. The sales team was correcting errors manually without knowing it.
What to do. Enforce structured output using JSON mode or function calling where supported. Always validate against a schema (Pydantic, JSON Schema). If validation fails: automatic re-prompt or explicit fallback — never silent failure.
from pydantic import BaseModel
from openai import OpenAI
class Quote(BaseModel):
net_price: float
currency: str
validity_days: int
client = OpenAI()
completion = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
response_format=Quote,
)
quote = completion.choices[0].message.parsed---
4. Latency ignored at design time
A frontier model like GPT-4o or Claude 3.5 Sonnet typically responds in 2–8 seconds for medium-length prompts. Acceptable in an internal chat interface. Not acceptable in a synchronous pipeline that blocks the user, or in an ERP integration waiting on a response before proceeding.
The pattern we observe: the PoC is built synchronously, it works in the lab, it reaches production with real volumes, and latency becomes a structural problem that is expensive to fix retroactively.
What to do. Decide from the start whether the use case tolerates latency (batch processing, overnight reports) or not (user interfaces, real-time webhooks). For synchronous cases: evaluate smaller, faster models (GPT-4o mini, Gemini Flash, Mistral Small), use client-side streaming, or decouple generation into an async job with notification.
---
5. No observability
Perhaps the most expensive mistake: going to production without knowing what is happening. No structured logs of model calls, no latency percentile metrics, no error tracking, no per-tenant cost attribution.
In a production LLM system, model behaviour drift between versions is normal — providers update models without detailed notice. Without monitoring, you cannot detect it.
What to do. Implement a dedicated observability layer from day one. LangSmith, Langfuse, Helicone, or even a simple wrapper that logs inputs, outputs, latency, and token counts into an existing telemetry stack (Datadog, Grafana). Minimum metrics: p50/p95 latency, token consumption, error rate, fallback rate.
# Minimal wrapper with Langfuse
from langfuse.openai import openai
# Drop-in replacement: same API, automatic logging
response = openai.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
metadata={"tenant_id": tenant_id, "use_case": "quote"}
)---
Operational take-away
LLM projects in B2B do not fail because of the models. They fail because of architectural decisions that get deferred and become technical debt the moment volumes scale.
Minimum checklist before going to production:
- [ ] Retrieval evaluated with quantitative metrics (if RAG)
- [ ] Prompts externalised and versioned
- [ ] Output validated against a schema, zero silent failures
- [ ] Latency analysed, architecture consistent with sync vs async requirements
- [ ] Observability active from day one
This is not an exhaustive list. It is the floor, not the ceiling.
---
Evviva Group supports B2B companies integrating LLMs into production environments — from initial architecture to operational monitoring, in white-label mode. If you are evaluating a similar project, we are available for a no-commitment technical discussion.