Skip to content

观测是“能否优化”的前提;调试要支持回放与对比。

🎯 文章目标

  • 设计 LLM 应用的观测维度与数据结构
  • 给出调试回放流程与工具
  • 形成指标看板与报警规则

📚 背景/前置

  • LLM 结果具随机性,需要“固定版本/提示”与“采样控制”
  • 问题定位依赖“请求上下文/模型版本/模板/工具调用流水”

🔧 核心内容

1) 观测数据模型

  • 请求:时间、用户、任务类型、prompt 哈希、模型版本、温度、tokens(in/out)
  • 结果:延迟、可执行性(校验通过/失败)、错误类型
  • 工具流水:入参、出参、耗时、错误、重试次数

2) 调试回放

  • 取历史请求 → 固定环境(模型/提示/温度)→ 回放 → 对比差异
  • 支持“替换单步工具结果”,定位问题在“模型/工具/数据”哪一层

3) 指标看板

  • 模型维度:延迟、成本、拒答率、错误率
  • 任务维度:通过率、平均步数、工具调用次数、最慢 5%
  • 版本维度:回归/防回归,异常突增报警

💡 实战示例:请求日志结构

json
{
  "ts": 1739999999,
  "user": "u123",
  "task": "refund_search",
  "model": "qwen2.5-7b-instruct@2025-01-10",
  "prompt_sha": "abc123",
  "tokens": {"in": 900, "out": 200},
  "latency_ms": 1800,
  "tools": [{"name":"searchTickets","latency":300,"ok":true}],
  "error": null
}

📊 对比/取舍(速查)

  • 全量日志 vs 采样:成本与隐私;建议关键任务全量,其它采样
  • 页面对比 vs 离线报表:排障 vs 复盘各有侧重

🧪 踩坑与经验

  • 不记录 prompt/版本哈希,问题无法复现
  • 只看平均值忽略分位数(P95/P99),无法发现长尾问题
  • 无对比回放,难以定位“模型 vs 工具 vs 数据”的根因

📎 参考与延伸

  • 日志/指标/追踪三板斧(ELK/Prometheus/OpenTelemetry)
  • Prompt 版本化与评测平台

💭 总结

  • 以“数据模型 + 回放 + 指标/报警”构建可观测与可调试的 LLM 应用