HelloAI
L7 Chapter 9 🐥 🕒 15 min

LLMOps Panorama: Observability / Eval / Monitoring / Experiments

The real work begins after LLM apps ship — Langfuse, Helicone, OpenTelemetry, continuous eval, A/B experiments. The complete 2026 LLMOps stack.

A
Alai
9/29/2026

L7-05 covered “how to deploy a model.” L7-07 covered “basic monitoring.” This piece: what to do after launch — the LLMOps panorama.

The biggest difference from traditional software — shipping is just the start. Long-term operation is continuous eval + continuous optimization.

Why LLMOps differs from MLOps

DimensionTraditional MLOpsLLMOps
Model sourceTrained in-houseMostly API calls
Retraining frequencyDaily / weeklyAlmost never (unless fine-tuning)
Core painModel driftPrompt drift / API changes / cost spikes
Eval difficultyHas ground truthNo reference answer — needs LLM-as-judge
Failure modesAccuracy dropHallucination / jailbreak / cost spike / tool failure

LLMOps is a brand-new engineering field, only mature since 2024-2026.

Full LLMOps stack (2026)

┌─────────────────────────────────────────────────┐
│  App layer: your LLM product                     │
└─────────────────────┬───────────────────────────┘

        ┌─────────────┼─────────────┐
        ↓             ↓             ↓
  ┌─────────┐  ┌─────────────┐  ┌─────────┐
  │ Routing │  │   Caching   │  │  RAG    │
  │OpenRouter│ │  Redis /    │  │ pgvector│
  │ LiteLLM │  │ Prompt cache│  │ Pinecone│
  └────┬────┘  └─────────────┘  └────┬────┘
       │                              │
       ↓                              │
  ┌─────────────────────────────┐     │
  │     LLM providers (many)     │←───┘
  │ OpenAI/Anthropic/Google/...  │
  └─────────┬───────────────────┘


  ┌──────────────────────────────────────┐
  │       Observability layer             │
  │  Langfuse / Helicone / LangSmith     │
  │  - Trace (full request lifecycle)    │
  │  - Token / cost / latency            │
  │  - Prompt / response full logs       │
  └────────────┬─────────────────────────┘


  ┌──────────────────────────────────────┐
  │       Eval layer                      │
  │  - Offline eval (before each deploy) │
  │  - Online eval (sample in real time) │
  │  - LLM-as-judge / human review       │
  └────────────┬─────────────────────────┘


  ┌──────────────────────────────────────┐
  │       Experimentation / iteration     │
  │  - Prompt version control            │
  │  - A/B testing                       │
  │  - Model swap experiments            │
  └──────────────────────────────────────┘

Tools cheat sheet

Observability (trace + logs)

ToolNicheOpen sourcePricing
LangfuseSelf-host-friendly OS first choiceFree / Cloud $29+
HeliconeOpenAI-style proxyFree / Pro $20+
LangSmithLangChain officialFree + Plus
Phoenix (Arize)Notebook + productionFree
W&B WeaveW&B’s offeringFree + paid

Core capability: capture every LLM call’s full trace (input / output / model / latency / cost / tool calls).

Eval

ToolNiche
Langfuse Datasets + EvalIntegrated
promptfooYAML config + CI integration
Inspect AI (UK AISI)Serious safety eval
RAGASRAG-specific eval
TruLensMulti-dimension RAG eval

Prompt management

ToolNiche
LatitudePrompt version control + collab
PromptLayerMainstream
Langfuse PromptsIntegrated with trace + prompt
Self-hosted git repoSimple and reliable

LLM gateway / routing

ToolNiche
OpenRouterUnified API + multi-vendor routing
LiteLLMSelf-host proxy
PortkeyCommercial gateway (routing + cache + retry)

Practical: minimal viable LLMOps stack

Goal: know how much each LLM call costs, how fast it is, how good it is.

1. Add Langfuse trace (10 minutes)

from langfuse import Langfuse
from langfuse.decorators import observe

langfuse = Langfuse(public_key="pk-...", secret_key="sk-...")

@observe()
def answer_user_question(query: str):
    # Your existing LLM call
    response = openai.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": query}]
    )
    return response.choices[0].message.content

Auto-captures: input / output / model / token usage / cost / latency / trace ID.

2. Build an eval set (30 minutes)

# Collect 50-200 real user requests (anonymized) + expected answers
dataset = langfuse.create_dataset(name="customer_support_v1")
dataset.create_item(input="how do I get a refund", expected_output="...")
# ... 50+ items

3. Run eval before each deploy

# In CI
for item in dataset.items:
    pred = answer_user_question(item.input)
    score = llm_judge(pred, item.expected_output)
    if score < 0.7:
        raise Exception(f"Regression on {item.id}!")

4. Add online monitoring & alerts

# Sample 10% of production requests for LLM-as-judge in real time
# Alert when hallucination rate > 5% or cost > $X/h

Eval levels

1. Unit eval

One metric per capability:

  • Classification accuracy
  • JSON schema compliance
  • Refusal rate (does it refuse sensitive queries?)

2. System eval

The entire LLM app:

  • Task success rate
  • User satisfaction (NPS)
  • Average time to resolution

3. Safety eval

Targeting misuse / attacks:

  • Jailbreak attack success rate
  • Hallucination rate
  • Privacy leak rate

4. Business eval

Ultimate business metrics:

  • Customer retention
  • Conversion
  • AOV (average order value)

5 must-monitor metrics

Daily:

  1. Cost: total daily spend + avg per request
  2. Latency: P50 / P95 / P99
  3. Hallucination rate: sample + human review or LLM-as-judge
  4. Error rate: API failures + timeouts + parse errors
  5. User feedback: thumbs up/down ratio

A/B experiments (prompt / model swap)

LLM product A/B is different from traditional software:

# 50% users go through prompt v1, 50% through prompt v2
prompt_version = "v2" if hash(user_id) % 2 == 0 else "v1"
prompt = load_prompt(f"customer_support_{prompt_version}")

# Tag the trace
with langfuse.trace(metadata={"prompt_version": prompt_version}):
    response = llm(prompt + query)

Evaluation windows:

  • Offline eval: immediate (pre-deploy)
  • User satisfaction: 1-2 weeks (statistical significance)
  • Long-term retention: 1-3 months

Common production incidents (real cases)

1. Cost runaway

Dev wrote wrong max_tokens → each user burns 100K tokens → one night’s bill explodes. Defense: per-request cost alert + per-user quota.

2. Prompt injection

User puts “ignore previous instructions” in input. Defense: input filter + stronger system prompt + output review.

3. Model version silently changed

OpenAI repointed gpt-4 alias → answer quality shifts. Defense: pin exact versions (gpt-4-2024-08-06), keep eval running.

4. Hallucination surge

New scenario, model frequently confabulates → customer complaints. Defense: in-line LLM-as-judge sampling + RAG.

5. API rate limiting

Provider’s rate limit insufficient → 429 storm. Defense: multi-model fallback + queue + retry with backoff.

Team roles (mature LLMOps team)

RoleResponsibility
LLM EngineerPrompt engineering + Agent / RAG / tools
Eval EngineerTest sets / auto eval / regression monitoring
AI Safety / Red TeamAttack testing / misuse monitoring / content moderation
Prompt Designer / PMBusiness understanding + prompt productization
Traditional SREInfra / cost / latency

Small teams collapse these roles; mid-large companies make each an independent position.

💡 An observation

LLMOps is the most underrated engineering field of 2025-2027:

  • Low bar: Python + LLM use is enough to start
  • Rare: real LLMOps experts are scarcer than LLM engineers
  • High value: directly determines LLM product success post-launch

Analogy: in the early 2010s, “DevOps engineers” were rare. Five years later they became “basic requirements.” 2026 today’s “LLMOps engineer” = those early DevOps people.

If you invest 6-12 months going deep on LLMOps now — in 2027-2028 you’ll be among the most valuable engineers on the market.

  • HelloAI L4-08 LLM Evaluation
  • HelloAI L7-05 Deployment
  • HelloAI L7-07 Monitoring
  • HelloAI L4-12 LLM Cost Optimization
  • Langfuse official docs
  • OpenAI Evals repo
  • Papers: “How we evaluate models” from OpenAI / Anthropic

🚧 3 Common Pitfalls

⚠️ Real-world traps

Pitfall 1: Ship first, observability later No observability = black box — when problems strike, you don’t know where. Day-one connect Langfuse / Helicone.

Pitfall 2: Eval only pre-deploy, not in production Production data distribution continuously drifts — sample and eval continuously online, not just once.

Pitfall 3: Treat LLM-as-judge as ground truth LLM judging LLM has systematic biases (favors own model / long outputs) — calibrate periodically with humans.