Taylent Labs
返回博客列表
LLM可观测性TraceOpenTelemetry

LLM 应用的可观测性体系搭建:从 Trace 到 Span 的完整方案

系统讲解 LLM 应用中 Trace 与 Span 的设计原则,涵盖关键指标采集、成本归因、问题定位等工程实践,帮助团队建立完整的可观测性体系。

为什么 LLM 应用需要专门的可观测性方案

传统 Web 应用的可观测性聚焦在响应时间、错误率、吞吐量这些维度。LLM 应用在此基础上引入了新的复杂性:单次请求可能包含多轮对话、RAG 检索、工具调用等嵌套操作,成本与延迟的分布极不均匀。一个典型的 Agent 应用,旗舰档模型调用可能占总成本的 80% 但只占请求数的 20%,而问题往往出在 Embedding 向量化或检索环节。没有结构化的 Trace 数据,你只能看到聚合后的平均值,无法定位具体哪个环节出了问题。

Trace 与 Span 的核心概念

一个 Trace 代表一次完整的用户请求生命周期,从接收问题到返回答案。Span 是 Trace 内部的操作单元,每个 Span 记录一个具体步骤(如向量检索、模型调用、工具执行)的开始时间、结束时间、输入输出和元数据。Span 之间通过父子关系构成调用树。

假设一个 RAG 应用处理用户提问的流程:根 Span 是整个请求,子 Span 包括「查询改写」(调用轻量档模型)、「向量检索」(查询向量数据库)、「上下文排序」(Rerank 模型)、「答案生成」(调用旗舰档模型)。每个 Span 独立计时和记录成本,最终汇总成完整的调用链路。

关键指标的采集与设计

延迟拆解

在每个 Span 中记录 start_timeend_time,计算耗时。对于模型调用类 Span,还需区分 TTFT(首字节时间)和总耗时。这能帮你识别是网络延迟、排队等待还是模型推理慢。

成本归因

每个模型调用 Span 必须记录 input_tokensoutput_tokensmodel_name。结合价格表(可以定期从 API 网关或配置文件读取)计算单次调用成本。按 Span 聚合后,你能清楚看到「检索阶段的 Embedding 调用占总成本 15%,答案生成占 70%」这样的分布。

质量追踪

在生成类 Span 中保存 promptcompletion 和用户反馈(如果有)。当用户标记某次回答为「不相关」时,你能直接回溯到对应 Trace,检查检索到的文档是否偏离主题,或者 prompt 构造是否有问题。

技术栈选择与实现路径

OpenTelemetry 是事实标准,提供了语言无关的 SDK 和数据格式。在应用代码中:

  1. 初始化 Tracer:配置 exporter 将数据发送到后端(Jaeger、Grafana Tempo 等)
  2. 手动埋点:在每个关键操作前后创建 Span,设置属性(如 llm.modelllm.tokens.input)
  3. 自动注入上下文:通过 HTTP header 或线程本地存储传递 Trace ID,确保跨服务调用时 Span 能正确关联

对于 LLM 调用,可以封装统一的 wrapper 函数,自动创建 Span 并记录 token 使用量。假设你用 Python,伪代码示例:

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

def call_llm(prompt, model):
    with tracer.start_as_current_span("llm_call") as span:
        span.set_attribute("llm.model", model)
        span.set_attribute("llm.prompt", prompt)
        
        response = client.chat(model=model, messages=[{"role": "user", "content": prompt}])
        
        span.set_attribute("llm.tokens.input", response.usage.prompt_tokens)
        span.set_attribute("llm.tokens.output", response.usage.completion_tokens)
        
        return response

从数据到行动:典型问题定位流程

当用户反馈「回答慢」,先在 Trace 视图中按耗时排序,找到 P95 的慢请求。展开 Span 树,如果发现「向量检索」Span 耗时占 60%,说明数据库索引或查询策略需要优化;如果是「答案生成」Span,检查是否因为上下文过长导致 token 数激增。

成本异常时,按 model_name 聚合 Span,计算各模型的调用次数和总 token 消耗。假设发现旗舰档模型在简单问题上也被调用,可以引入路由逻辑,让轻量档模型先处理,只在必要时升级到旗舰档。

工程化建议

  • 采样策略:生产环境不必记录所有请求。对正常请求采样 1-5%,对错误或慢请求全量记录
  • 敏感信息脱敏:在 Span 属性中记录 prompt 和 completion 前,过滤掉用户隐私数据
  • 成本预算告警:基于 Span 数据实时计算当日成本,超过阈值时触发通知

如果你的团队正在搭建 LLM 应用的可观测性体系,或需要在现有系统中集成 Trace 能力,Taylent Labs 提供 AI 应用开发与架构咨询服务,欢迎联系我们探讨具体方案。