LLM 可观测性:Tracing、Logging 与调试

0 0

前言

传统 Web 应用的 observability 三件套——Logging / Metrics / Tracing——已经成熟。但 LLM 应用把它们全部颠覆了:

  • 同一段 prompt 每次输出不一样——metrics 的”错误率”不再适用
  • 故障不在代码,在 prompt——传统 debug 看不到根因
  • 成本是变量——一次 API 调用可能花 $0.001,也可能花 $1
  • 延迟是概率分布——同样的问题,LLM 可能在 200ms 内回答,也可能在 4s 内回答

这些特性让”上线后没人知道发生了什么”成了 LLM 应用的头号痛点。这一篇覆盖:

  1. LLM observability 为什么不一样
  2. 三大主流平台:Langfuse / LangSmith / OpenLLMetry
  3. 5 个必备的 trace 维度
  4. 生产排错实战

一、传统 vs LLM Observability

维度传统 Web 应用LLM 应用
错误信号HTTP 500、异常堆栈状态码 200 + 答非所问
根因定位断点 + stack traceprompt 内容 + 模型推理过程
性能指标固定 RT(p50/p99)概率分布(200ms-4s)
成本固定每次调用浮动(取决于 token 数)
回归单元测试必须看实际输出质量

[Mermaid] 视觉化对比:

图 1:传统 vs LLM Observability

二、3 个主流 LLM Observability 平台

平台 1:Langfuse(开源,TypeScript 友好)

Langfuse 是目前最活跃的开源 LLM observability 平台:

  • Tracing:捕获每个请求的 prompt、response、token 用量、延迟、工具调用、检索步骤
  • 异步上报:不影响主流程延迟
  • Prompt 管理:版本化 prompt,A/B 测试
  • LLM-as-Judge 评估:自动跑质量评估
  • 自托管 / 云端:两种部署
  • 多框架集成:OpenAI / LangChain / Vercel AI SDK / LlamaIndex
import { Langfuse } from 'langfuse';

const langfuse = new Langfuse({
  publicKey: process.env.LANGFUSE_PUBLIC_KEY,
  secretKey: process.env.LANGFUSE_SECRET_KEY,
});

// 自动 trace OpenAI 调用
import { openai } from '@ai-sdk/openai';
import { observeOpenAI } from '@langfuse/openai';

const tracedOpenAI = observeOpenAI(openai);

// 每次 generateText 都会自动上报
const result = await generateText({
  model: tracedOpenAI('gpt-4o'),
  prompt: '...',
});

平台 2:LangSmith(LangChain 生态)

LangSmith 是 LangChain 官方的可观测平台,深度集成 LangChain / LangGraph:

  • 自动 trace 链 / agent / 工具调用
  • 数据集管理(用于评估)
  • A/B 测试
  • 在线 debugging

适合:已经在用 LangChain / LangGraph 的团队。

平台 3:OpenLLMetry(OpenTelemetry 标准)

基于 OpenTelemetry 的 LLM instrumentation:

  • OTel 原生:可以接入现有的 Datadog / Grafana / Honeycomb
  • 多语言 SDK:Python / JS / Go
  • GenAI 语义约定:标准化的 trace 字段名
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OpenAIInstrumentation } from '@traceloop/instrumentation-openai';

const sdk = new NodeSDK({
  instrumentations: [
    new OpenAIInstrumentation(),
  ],
});
sdk.start();

// OpenAI 调用自动 trace 到你的 OTel backend

适合:已有 OTel 基础设施的企业,要统一 LLM + 传统服务的 observability。

选型决策

场景推荐
开源 + TypeScript 生态Langfuse
已用 LangChain / LangGraphLangSmith
已有 OTel 基础设施OpenLLMetry
全云端托管 + 企业级 SLALangSmith / Arize

三、5 个必备的 trace 维度

光”trace” 不够——你需要 trace 携带正确的信息。下面 5 个维度是生产必备:

1. 用户上下文

// Langfuse v3+:trace 改用 startActiveSpan / startObservation 创建
// 下面字段作为 span 的 attribute 传递
await langfuse.startActiveSpan('chat', async (span) => {
  span.setAttributes({
    'langfuse.user.id': 'u_123',
    'langfuse.session.id': 'sess_abc',
    'langfuse.tags': ['production', 'v2.3'],
    source: 'web',
    userTier: 'premium',
  });
});

为什么:生产里你经常需要”按用户查 trace”、“按 session 查完整对话”。

2. Prompt 版本

const prompt = langfuse.getPrompt('customer-support-v3');
// 自动记录 prompt 名称 + 版本 + hash

为什么:prompt 改了之后回归对比。如果没有版本,不知道是 prompt 改了还是模型行为变了。

3. Token 成本

// Langfuse 自动从 API response 提取 usage 信息
// 以下为自动提取后的结果示例
{
  usage: {
    promptTokens: 234,
    completionTokens: 567,
    totalTokens: 801,
    cost: 0.012,  // Langfuse 根据模型自动计算
  },
}

为什么:成本失控是 LLM 应用头号死法。必须按 query / user / feature 维度统计。

4. 工具调用详情

{
  tool_calls: [
    { name: 'search_web', input: {...}, output: '...', latencyMs: 340 },
    { name: 'query_db', input: {...}, output: '...', latencyMs: 120 },
  ],
}

为什么:agent 的故障 80% 在工具调用(超时 / 错参数 / 返回结构对不上)。

5. 输出质量(异步评估)

// 不阻塞主流程,异步评估输出质量
// 假设已获取 traceId 和 trace 数据
const traceId = currentTrace.id;
const trace = await langfuse.getTrace(traceId);

await langfuse.score({
  traceId,
  name: 'relevance',
  value: await evaluateRelevance(trace.output, trace.input),
});

为什么:延迟 / 成本只能反映”程序行为”,质量必须另外评估(LLM-as-Judge / 人工反馈)。

四、生产排错实战

案例 1:用户说”答案不对”

第一步:拿到 traceId,从 Langfuse 拉完整 trace:

# Langfuse UI / API
GET /api/traces/{traceId}

第二步:看 prompt 和 response:

Prompt:
  system: "你是客服"
  user: "我订单有问题"
  tools: [searchOrder, refund]

Trace steps:
  1. LLM: decide to call searchOrder → ok
  2. searchOrder: returns order #123 status=shipped
  3. LLM: response "您的订单已发货,预计明天到达"

问题:用户问的是退款,模型搜了订单状态。可能是 prompt 没说清"用户意图是退款"。

解决方案:优化 prompt,明确”先判断用户意图,再决定调哪个工具”。

案例 2:成本突然翻 10 倍

第一步:从 Langfuse 看 token 用量趋势,按 tag / user 聚合:

Tag "experiment-batch-2026-07-07": 5M tokens in 1 hour
其他 tag: 0.5M tokens in 1 hour

第二步:定位到具体是哪个 experiment 占用了 token。

解决方案:关闭该 experiment 或限流。

案例 3:p99 延迟突然飙到 10s

第一步:看 latency 分布:

p50: 800ms
p95: 2s
p99: 10s  ← 异常

第二步:看是 LLM 调用慢还是工具调用慢:

LLM call: 800ms (p99)
search_web tool: 9s (p99)  ← 异常

解决方案:search_web 第三方 API 不稳定,加超时 + 重试 + fallback。

五、生产 checklist

上线前必做的 5 件事:

  1. ✅ 集成 Langfuse / LangSmith / OpenLLMetry,全量 trace
  2. ✅ 按 user / session / tag 标记,方便查询
  3. ✅ Token 成本按 feature 聚合,避免失控
  4. ✅ 工具调用单独 trace,便于排错
  5. ✅ 异步质量评估,每周 review 抽样 trace

踩坑提醒

  1. 不要只 trace HTTP 状态。LLM 返回 200 但内容垃圾是常事,必须 trace 实际输出。
  2. 不要等出问题才上 observability。上线第一天就要有 trace,否则出问题无从回溯。
  3. 不要忽略 token 成本。一次 prompt 改动可能让成本翻倍,成本监控和功能监控同等重要。
  4. 不要把 trace 数据存太久。GDPR / 数据合规要求下,90 天后自动清理。
  5. 不要把 trace 当日志用。Trace 是结构化的事件流,日志是文本流,用途不同。

总结

5 个 takeaway:

  • LLM observability 不一样:错误信号在内容里、根因在 prompt、延迟是概率分布、成本是变量。
  • 三大平台选型:Langfuse(开源 TS)/ LangSmith(LangChain 生态)/ OpenLLMetry(OTel 集成)。
  • 5 个必备 trace 维度:用户上下文 / prompt 版本 / token 成本 / 工具调用 / 输出质量。
  • 生产排错三步:拿 traceId → 看 prompt + response → 优化 prompt 或工具调用。
  • 上线第一天就要有 observability,不要等出问题。

下一篇:LLM 应用的评估体系:Metrics、LLM-as-Judge 与 A/B 测试 — 当 observability 有了数据,怎么判断”哪个 prompt 更好”。

参考资料

🔗 原文链接 分享让更多人看到

评论