AI可观测性-Trace-Cost-质量三合一

AI 可观测性 · Trace / Cost / 质量三合一

🏠 返回 README | ⬅️ 07-AI-Gateway-LLM网关与多模型路由.md | ➡️ 03-Embedding与Reranker-选型与微调.md
风格说明 :本篇是 操作型(主) ------把 Langfuse / Phoenix / Helicone 与 OpenTelemetry GenAI Semantic Conventions 对齐,构建 trace + cost + quality 三合一看板与告警。与 07-Serving FinOps、06-Eval 指标闭环。

前置阅读24-Gateway(租户标签注入);07-部署(TTFT/TPOT)。

后续展开26-Embedding(embed 成本归因)。


L1 · 是什么

1.1 一句话定义

AI 可观测性 :对 LLM 应用建立 分布式追踪 + 成本账本 + 质量评分 的统一.telemetry 契约------让 on-call 能在 5 分钟内 回答「慢在哪、贵在哪、错在哪」。

1.2 三合一对照

支柱 回答的问题 核心指标
Trace 哪一步慢/失败? span 树、TTFT、tool latency
Cost 谁花了多少钱? $/task、token、GPU-hour
Quality 输出好不好? faithfulness、judge score、拒答率

#mermaid-svg-cksIpCy3CeFnz6ui{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cksIpCy3CeFnz6ui .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cksIpCy3CeFnz6ui .error-icon{fill:#552222;}#mermaid-svg-cksIpCy3CeFnz6ui .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cksIpCy3CeFnz6ui .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cksIpCy3CeFnz6ui .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cksIpCy3CeFnz6ui .marker.cross{stroke:#333333;}#mermaid-svg-cksIpCy3CeFnz6ui svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cksIpCy3CeFnz6ui p{margin:0;}#mermaid-svg-cksIpCy3CeFnz6ui .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cksIpCy3CeFnz6ui .cluster-label text{fill:#333;}#mermaid-svg-cksIpCy3CeFnz6ui .cluster-label span{color:#333;}#mermaid-svg-cksIpCy3CeFnz6ui .cluster-label span p{background-color:transparent;}#mermaid-svg-cksIpCy3CeFnz6ui .label text,#mermaid-svg-cksIpCy3CeFnz6ui span{fill:#333;color:#333;}#mermaid-svg-cksIpCy3CeFnz6ui .node rect,#mermaid-svg-cksIpCy3CeFnz6ui .node circle,#mermaid-svg-cksIpCy3CeFnz6ui .node ellipse,#mermaid-svg-cksIpCy3CeFnz6ui .node polygon,#mermaid-svg-cksIpCy3CeFnz6ui .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cksIpCy3CeFnz6ui .rough-node .label text,#mermaid-svg-cksIpCy3CeFnz6ui .node .label text,#mermaid-svg-cksIpCy3CeFnz6ui .image-shape .label,#mermaid-svg-cksIpCy3CeFnz6ui .icon-shape .label{text-anchor:middle;}#mermaid-svg-cksIpCy3CeFnz6ui .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cksIpCy3CeFnz6ui .rough-node .label,#mermaid-svg-cksIpCy3CeFnz6ui .node .label,#mermaid-svg-cksIpCy3CeFnz6ui .image-shape .label,#mermaid-svg-cksIpCy3CeFnz6ui .icon-shape .label{text-align:center;}#mermaid-svg-cksIpCy3CeFnz6ui .node.clickable{cursor:pointer;}#mermaid-svg-cksIpCy3CeFnz6ui .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cksIpCy3CeFnz6ui .arrowheadPath{fill:#333333;}#mermaid-svg-cksIpCy3CeFnz6ui .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cksIpCy3CeFnz6ui .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cksIpCy3CeFnz6ui .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cksIpCy3CeFnz6ui .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cksIpCy3CeFnz6ui .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cksIpCy3CeFnz6ui .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cksIpCy3CeFnz6ui .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cksIpCy3CeFnz6ui .cluster text{fill:#333;}#mermaid-svg-cksIpCy3CeFnz6ui .cluster span{color:#333;}#mermaid-svg-cksIpCy3CeFnz6ui div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cksIpCy3CeFnz6ui .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cksIpCy3CeFnz6ui rect.text{fill:none;stroke-width:0;}#mermaid-svg-cksIpCy3CeFnz6ui .icon-shape,#mermaid-svg-cksIpCy3CeFnz6ui .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cksIpCy3CeFnz6ui .icon-shape p,#mermaid-svg-cksIpCy3CeFnz6ui .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cksIpCy3CeFnz6ui .icon-shape .label rect,#mermaid-svg-cksIpCy3CeFnz6ui .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cksIpCy3CeFnz6ui .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cksIpCy3CeFnz6ui .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cksIpCy3CeFnz6ui :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Spring AI / Agent
OTel SDK
LiteLLM / Gateway
vLLM
Prometheus
Collector
Langfuse / Phoenix
Datadog / Grafana
Quality Scorecard
Spend Logs

1.3 与传统 APM 的差异

维度 传统 APM AI Observability
节点 HTTP/DB LLM call / embed / rerank / tool
成本 间接 直接 $/token
质量 错误码 语义分数、幻觉
标准 OpenTelemetry 通用 + GenAI semconv

L2 · 原理与实现

2.1 OpenTelemetry GenAI Semantic Conventions

关键 span 属性(2025 OTel gen-ai 草案口径,命名以实际 SDK 为准)

属性 示例 用途
gen_ai.system openai / anthropic 供应商
gen_ai.request.model gpt-4o-mini 路由对账
gen_ai.usage.input_tokens 2400 成本
gen_ai.usage.output_tokens 180 成本
gen_ai.response.finish_reasons stop 截断诊断
app.tenant_id shop_882 chargeback
app.feature checkout_assist 预算
app.trace.quality.faithfulness 0.87 质量

Async Judge LLM Retriever App User Async Judge LLM Retriever App User #mermaid-svg-LlGYTvRhw58YStZl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LlGYTvRhw58YStZl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LlGYTvRhw58YStZl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LlGYTvRhw58YStZl .error-icon{fill:#552222;}#mermaid-svg-LlGYTvRhw58YStZl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LlGYTvRhw58YStZl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LlGYTvRhw58YStZl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LlGYTvRhw58YStZl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LlGYTvRhw58YStZl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LlGYTvRhw58YStZl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LlGYTvRhw58YStZl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LlGYTvRhw58YStZl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LlGYTvRhw58YStZl .marker.cross{stroke:#333333;}#mermaid-svg-LlGYTvRhw58YStZl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LlGYTvRhw58YStZl p{margin:0;}#mermaid-svg-LlGYTvRhw58YStZl .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LlGYTvRhw58YStZl text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-LlGYTvRhw58YStZl .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-LlGYTvRhw58YStZl .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-LlGYTvRhw58YStZl .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-LlGYTvRhw58YStZl .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-LlGYTvRhw58YStZl #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-LlGYTvRhw58YStZl .sequenceNumber{fill:white;}#mermaid-svg-LlGYTvRhw58YStZl #sequencenumber{fill:#333;}#mermaid-svg-LlGYTvRhw58YStZl #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-LlGYTvRhw58YStZl .messageText{fill:#333;stroke:none;}#mermaid-svg-LlGYTvRhw58YStZl .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LlGYTvRhw58YStZl .labelText,#mermaid-svg-LlGYTvRhw58YStZl .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-LlGYTvRhw58YStZl .loopText,#mermaid-svg-LlGYTvRhw58YStZl .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-LlGYTvRhw58YStZl .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-LlGYTvRhw58YStZl .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-LlGYTvRhw58YStZl .noteText,#mermaid-svg-LlGYTvRhw58YStZl .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-LlGYTvRhw58YStZl .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LlGYTvRhw58YStZl .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LlGYTvRhw58YStZl .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LlGYTvRhw58YStZl .actorPopupMenu{position:absolute;}#mermaid-svg-LlGYTvRhw58YStZl .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-LlGYTvRhw58YStZl .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LlGYTvRhw58YStZl .actor-man circle,#mermaid-svg-LlGYTvRhw58YStZl line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-LlGYTvRhw58YStZl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} question span root span retrieve docs span chat completion stream tokens answer span evaluate async faithfulness 0.91

Spring AI 埋点(示意)

java 复制代码
@Autowired ObservationRegistry registry;

Observation.createNotStarted("chat.completion", registry)
    .lowCardinalityKeyValue("gen_ai.request.model", "smart")
    .highCardinalityKeyValue("app.tenant_id", shopId)
    .observe(() -> chatClient.prompt().user(q).call());

2.2 Langfuse · Phoenix · Helicone 选型

产品 强项 弱项 电商交易推荐
Langfuse trace + eval + prompt 管理一体 自托管运维 默认主栈(开源可私有化)
Phoenix (Arize) 向量漂移、RAG eval 商业功能分层 RAG 质量深析
Helicone 代理式成本日志极快 依赖代理链路 API 流量侧快速接入
Datadog LLM 与现有 APM 统一 单价高 已有 DD 的企业

推荐组合

  • Langfuse 做 trace + dataset + 在线 eval;
  • Prometheus 抓 vLLM TTFT/TPOT/GPU;
  • LiteLLM spend_logs 对账云账单;
  • Phoenix 周度 RAG 漂移分析。

2.3 Trace 设计:一棵会话树

text 复制代码
session_trace (root)
├── guardrail_span (12ms)
├── retrieve_span (85ms, top_k=8)
│   ├── embed_span (22ms)
│   └── vector_search_span (41ms)
├── rerank_span (120ms)
├── chat_span (TTFT 620ms, TPOT 38ms, tokens in/out)
│   ├── tool_call get_order (45ms)
│   └── tool_call get_logistics (38ms)
└── async_judge_span (faithfulness 0.89)

SLO 映射

Span SLO 告警
retrieve P99 <150ms >200ms 5min
chat TTFT P99 <800ms >1s
tool error rate <0.5% >1%
e2e P99 <12s >15s

2.4 Cost 账本与 Scorecard 合并

$/task 公式 (与 07 一致):

text 复制代码
cost_usd = in_tok/1e6 * price_in + out_tok/1e6 * price_out
         + embed_tok/1e6 * price_embed
         + gpu_sec * gpu_rate_per_sec

三合一看板行(每 feature × 天)

feature sessions $/task P50 TTFT P99 faith P50 拒答率 采纳率
cs_bot 1.2M $0.016 720ms 0.90 8% 61%
checkout_assist 80k $0.042 980ms 0.86 3% 54%

#mermaid-svg-ziXCkWjFd4vniSKO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ziXCkWjFd4vniSKO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ziXCkWjFd4vniSKO .error-icon{fill:#552222;}#mermaid-svg-ziXCkWjFd4vniSKO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ziXCkWjFd4vniSKO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ziXCkWjFd4vniSKO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ziXCkWjFd4vniSKO .marker.cross{stroke:#333333;}#mermaid-svg-ziXCkWjFd4vniSKO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ziXCkWjFd4vniSKO p{margin:0;}#mermaid-svg-ziXCkWjFd4vniSKO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ziXCkWjFd4vniSKO .cluster-label text{fill:#333;}#mermaid-svg-ziXCkWjFd4vniSKO .cluster-label span{color:#333;}#mermaid-svg-ziXCkWjFd4vniSKO .cluster-label span p{background-color:transparent;}#mermaid-svg-ziXCkWjFd4vniSKO .label text,#mermaid-svg-ziXCkWjFd4vniSKO span{fill:#333;color:#333;}#mermaid-svg-ziXCkWjFd4vniSKO .node rect,#mermaid-svg-ziXCkWjFd4vniSKO .node circle,#mermaid-svg-ziXCkWjFd4vniSKO .node ellipse,#mermaid-svg-ziXCkWjFd4vniSKO .node polygon,#mermaid-svg-ziXCkWjFd4vniSKO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ziXCkWjFd4vniSKO .rough-node .label text,#mermaid-svg-ziXCkWjFd4vniSKO .node .label text,#mermaid-svg-ziXCkWjFd4vniSKO .image-shape .label,#mermaid-svg-ziXCkWjFd4vniSKO .icon-shape .label{text-anchor:middle;}#mermaid-svg-ziXCkWjFd4vniSKO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ziXCkWjFd4vniSKO .rough-node .label,#mermaid-svg-ziXCkWjFd4vniSKO .node .label,#mermaid-svg-ziXCkWjFd4vniSKO .image-shape .label,#mermaid-svg-ziXCkWjFd4vniSKO .icon-shape .label{text-align:center;}#mermaid-svg-ziXCkWjFd4vniSKO .node.clickable{cursor:pointer;}#mermaid-svg-ziXCkWjFd4vniSKO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ziXCkWjFd4vniSKO .arrowheadPath{fill:#333333;}#mermaid-svg-ziXCkWjFd4vniSKO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ziXCkWjFd4vniSKO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ziXCkWjFd4vniSKO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ziXCkWjFd4vniSKO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ziXCkWjFd4vniSKO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ziXCkWjFd4vniSKO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ziXCkWjFd4vniSKO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ziXCkWjFd4vniSKO .cluster text{fill:#333;}#mermaid-svg-ziXCkWjFd4vniSKO .cluster span{color:#333;}#mermaid-svg-ziXCkWjFd4vniSKO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ziXCkWjFd4vniSKO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ziXCkWjFd4vniSKO rect.text{fill:none;stroke-width:0;}#mermaid-svg-ziXCkWjFd4vniSKO .icon-shape,#mermaid-svg-ziXCkWjFd4vniSKO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ziXCkWjFd4vniSKO .icon-shape p,#mermaid-svg-ziXCkWjFd4vniSKO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ziXCkWjFd4vniSKO .icon-shape .label rect,#mermaid-svg-ziXCkWjFd4vniSKO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ziXCkWjFd4vniSKO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ziXCkWjFd4vniSKO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ziXCkWjFd4vniSKO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出
Rollup
数据摄入
Traces
Spend
Quality scores
Hourly cube
Grafana
Alertmanager
FinOps CSV

2.5 质量分:在线 vs 离线

方式 延迟 成本 用途
规则 实时 价格格式、引用存在
LLM-as-judge 秒级 faithfulness
人工抽检 天级 校准 judge
用户反馈 实时 👎/转人工

在线采样5% 会话异步 judge;faithfulness <0.8 自动打标 quality_incident

2.6 与 Eval Harness 闭环

text 复制代码
线上 faithfulness P50 连续 3 天 < 0.85
  → 自动创建 Langfuse dataset 抽样 500
  → 触发 [19-Harness](./06-Harness全栈-Eval-Agent-RL-Test.md) nightly
  → 若 offline 也低 → P1 模型/索引事故
  → 若 offline 正常 → judge 漂移或流量分布变化

L3 · 边界陷阱

3.1 只采 trace 不算 token

  • span 无 usage.* → FinOps 黑洞
  • Fix :Gateway 统一注入;vLLM 用 prometheus vllm:prompt_tokens_total

3.2 PII 进 trace

  • 用户手机号、地址明文 → 合规失败;
  • Fix :hash/掩码;gen_ai.prompt 默认 不记录全文,只记 hash + 长度。

3.3 质量分与业务 KPI 脱节

  • faithfulness 高但 转化率降 → 评错维度;
  • Fix :scorecard 必含 采纳率/转人工/资损工单

3.4 多工具链 trace 断裂

  • Langfuse + 自研日志 trace_id 不一致
  • Fix :W3C traceparent 全链路透传;入口生成 trace_id 写 MDC。

3.5 告警风暴

  • 单模型抖动 → 数百告警;
  • Fix :SLO burn rate;按 tenant/feature 分组;faithfulness 用 同比 而非绝对值。

L4 · 架构师视角

4.1 可观测性成熟度

等级 能力
L1 仅日志 + 账单
L2 OTel trace + token
L3 + 在线 judge 采样 + 看板
L4 + 自动回流 Harness + 成本预算自治

4.2 Incident 响应 Runbook(5min)

  1. 三合一看板 哪一柱异常(延迟/成本/质量);
  2. 下钻 trace 样本(P99 最慢 10 条);
  3. 对照 发布/路由/索引 变更日历;
  4. 止血:降级路由、关语义缓存、缩 prompt;
  5. 事后:样本进 golden + 19

4.3 Datadog 与开源栈共存

  • OTel Collector 扇出:一路 Langfuse、一路 Datadog;
  • 单一 truth 的 $/task 以 LiteLLM spend 为准,其余校准偏差。

8. 可观测性 Checklist

  • GenAI semconv 属性覆盖 ≥95% LLM span
  • tenant_id + feature + model 三维成本
  • TTFT/TPOT/faithfulness 告警阈值文档化
  • prompt 全文默认关闭,仅 hash
  • 5% 异步 judge + 低分自动建 dataset
  • 周度 Phoenix 向量漂移报告
  • trace_id 与客服工单系统关联
  • 07 GPU 面板同屏

9. 真实面试现场题(5 道带公司风格标记)

9.1 🟦 字节 · 推荐链路 Trace 与延迟归因

(1) 标准答案 :用 span 树 拆分 retrieve / rank / chat;TTFT 归属 chat prefill;推荐 feature 级 SLO;采样率 10% 全量 attributes 仍保留聚合指标。

(2) 原理 walk

text 复制代码
问题: P99 从 1.1s → 2.4s
trace 下钻: retrieve 90ms → 380ms (Milvus efSearch 误调)
           chat TTFT 800ms → 1.6s (排队)

并行修复: efSearch 100→80; max-num-seqs 64→48

(3) 权衡与量化

  • 全量 trace 存储 $8k/月 → 头部采样 + 错误全采;
  • 归因后 P99 1.05s
  • 存储降 62%

(4) 落地清单

  • Langfuse + OTel;
  • retrieve_latency histogram;
  • 回滚:Milvus 参数 ConfigMap。

(5) 追问

  • 追问 1:采样丢问题?

    错误 100% 采集 ;高价值 tenant 100%;其余 10% 随机。聚合指标用 exemplar 链接 trace。

  • 追问 2:流式 token 怎么 trace?

    span 记录 首 token 事件complete 两事件;TPOT 由 (complete-first)/out_tokens 算出。

  • 追问 3:跨服务 trace?

    traceparent 从网关传入;Java Reactor 用 context 传播 (见 13-Playbook)。


9.2 🟧 阿里 · 三合一看板与 FinOps Chargeback

(1) 标准答案$/task × faithfulness × 采纳率 同屏;LiteLLM spend 对账云账单;租户预算穿透到 feature

(2) 原理 walk

text 复制代码
Cube: hour × tenant × feature × model
指标: cost_usd, sessions, faith_p50, adopt_rate

告警:
  cost_hour > budget * 0.9
  faith_p50 < 0.85 (3h 连续)
  adopt_rate 同比 -5%

(3) 权衡与量化

  • 对账误差 0.4%
  • 识别 3 个租户异常配置节省 $42k/月
  • 看板查询 P95 <2s(ClickHouse 物化视图)。

(4) 落地清单

  • spend_logs ETL;
  • Grafana 三合一面板;
  • 月报 CSV chargeback。

(5) 追问

  • 追问 1:GPU 成本怎么摊?

    gpu_sec × $rate 写入 chat span attribute;与 token 成本 相加 为 $/task。vLLM prometheus 导出 per-request gpu 时间(近似用 batch 份额)。

  • 追问 2:多模型比价?

    看板加 counterfactual :若全走 fast 的 $/task vs 实际。指导路由策略。

  • 追问 3:财务不信云账单?

    Gateway spend 为内部 truth;云账单作 校准 ;差异 >1% 查 重试/失败计费 span。


9.3 🟪 蚂蚁 · 金融场景 PII 与审计 Trace

(1) 标准答案默认不存 prompt 全文 ;存 hash + token 数;审计字段 audit_retention=7y;与 17-治理 一致。

(2) 原理 walk

text 复制代码
Collector processor:
  - mask phone/id_card regex
  - drop gen_ai.prompt body
  - keep policy_id, tool, outcome

审计查询: trace_id → 工具调用链 + 决策码(无正文)

(3) 权衡与量化

  • 合规抽检 100% 通过;
  • 存储 -78%
  • 排障靠 结构化字段 + 复现环境。

(4) 落地清单

  • OTel processor 链;
  • 访问 RBAC;
  • 季度渗透测试。

(5) 追问

  • 追问 1:出事如何复现?

    session_id + prompt_hash 在 staging 重放;golden 进 Harness。不全文靠生产 trace。

  • 追问 2:Helicone 代理合规?

    金融常 禁止 第三方代理存全文;用 自托管 Langfuse + 内网 Collector。

  • 追问 3:跨境数据?

    trace 存储 region pin ;模型调用 数据驻留 路由(链 24-Gateway)。


9.4 🟢 腾讯 · 微信支付 faithfulness 在线监控

(1) 标准答案5% 异步 judge + 规则断言;faithfulness 骤降 触发自动降级与 Harness 数据集;与客服 转人工率 联动。

(2) 原理 walk

text 复制代码
async judge queue (Kafka):
  consume completed sessions
  compute faithfulness (Ragas)
  if < 0.8 → tag + alert

联动:
  faith_p50 < 0.85 → 路由 +10% fast + 文案保守模板

(3) 权衡与量化

  • judge 成本 $0.0008/会话(8B judge);
  • 检测延迟 <3min
  • 资损类工单 -46%(半年)。

(4) 落地清单

  • judge worker 扩缩容;
  • quality_incident 工单;
  • 回滚:judge_enforced=false 仅紧急。

(5) 追问

  • 追问 1:judge 与线上一致?

    每月 200 条 人工校准;漂移 >5% 换 rubric 或模型。

  • 追问 2:用户👎信号?

    作为 弱标签 加权,不替代 judge;👎 且 faith 高 → 查 UX 非质量

  • 追问 3:多语言 judge?

    分语言 rubric;英文 judge 评中文 偏差大 → 禁用。


9.5 🟡 美团 · Phoenix 向量漂移与 RAG 质量

(1) 标准答案 :Phoenix 看 embedding 分布漂移 + 检索距离分布;与 faithfulness 下降 相关性 0.8+ 时优先查索引/embedding 版本。

(2) 原理 walk

text 复制代码
每周:
  sample 10k query embed
  UMAP 对比 baseline 云图
  KL 散度 > 0.12 → 告警

关联:
  2025-07 一次 KL 0.18 → embed 模型误升级 → faith -0.12

(3) 权衡与量化

  • 报告生成 15min
  • 提前 3 天 发现漂移(相对人工客诉);
  • 重建索引成本 200** vs 事故 **\>50k

(4) 落地清单

  • Phoenix 定时 job;
  • embedding_revision 标签;
  • 03-RAG CI 探针。

(5) 追问

  • 追问 1:Langfuse vs Phoenix 分工?

    Langfuse 日常 trace + eval ;Phoenix 深度 RAG 分析。不重复建两套 trace 存储,Phoenix 可 ingest OTel。

  • 追问 2:OTel semconv 变更快?

    SDK pin 版本;属性 双写 旧字段 1 个季度;文档化 mapping 表。

  • 追问 3:三合一看板谁维护?

    平台 SRE 维护数据管道;Applied AI 定义 faith/采纳阈值;财务 认 $/task 定义。


10. 真实事故复盘(电商交易场景)· Faithfulness 骤降

10.1 索引漂移未进 Trace 导致质量盲点

S(Situation)
  • 业务 :跨境 RAG 客服,faithfulness P50 0.90 ,三合一看板 绿色
  • :Langfuse + LiteLLM + Milvus + Cohere rerank;
  • 告警 :仅 TTFT$/task 阈值。
T(Trigger)
  • 2025-07-14 09:00 :转人工率 +8%(绝对值 12%→20%);
  • 11:00:客服反馈「答非所问」激增;
  • 14:00 :在线 judge 抽样 faithfulness 0.74(上周 0.89)。
A(Approach)

第 1 步:Trace 显示「正常」

text 复制代码
retrieve P99 120ms ✓
chat TTFT P99 700ms ✓
cost $0.017 ✓
→ 传统 APM 无异常

第 2 步:质量柱深挖

sql 复制代码
SELECT avg(faithfulness), avg(cosine_top1)
FROM quality_hourly WHERE day='2025-07-14';
-- faith 0.74, cosine_top1 0.61 (baseline 0.78)

第 3 步:Phoenix 漂移报告

  • KL(embed_dist) = 0.19 ;变更记录:embed 模型 静默升级 + 索引 未重建

根因 :可观测性 缺「检索质量」维度 ;仅有 latency/cost trace,无 embedding_revision / retrieval_score 面板

R(Resolution)

止血(2h)

  • 回滚 embed API 版本;
  • 临时 +20% 转人工;
  • 关闭低置信自动回答。

根治(5 天)

  1. 三合一看板加 cosine_top1 P50、KL 漂移
  2. Langfuse dataset 自动收录 faith<0.8 会话;
  3. embed 变更 CI 探针 + 索引重建 runbook;
  4. 告警:faith_p50 <0.85 持续 2h P1。
M(Metrics)
指标 事故日 恢复后
faithfulness P50 0.74 0.89
cosine_top1 P50 0.61 0.77
转人工率 20% 12%
额外 judge/索引成本 --- $1.2k(一次性)
避免资损估算 --- ~80 万元
P(Prevention)
  • Scorecard 必须三柱 同屏,禁止只看 latency
  • embedding_revision 进每个 retrieve span
  • Phoenix 周报进 on-call 手册
  • 19-Harness 联动自动建集
  • OTel semconv 扩展属性 文档化

关联文件 + 一句话速记

文件 速记
07-部署 TTFT/TPOT/GPU 与 $/task
24-Gateway 租户标签与 spend 日志
06-评估 faithfulness 定义
19-Harness 线上→离线数据集回流
17-安全治理 PII 与审计保留

🧭 章节导航

# 文件 风格
00 00-README.md 索引
07 03-部署-模型Serving-Caching与Cost.md 操作
24 07-AI-Gateway-LLM网关与多模型路由.md 设计
25 本篇 · Trace / Cost / 质量 操作
26 03-Embedding与Reranker-选型与微调.md 机制+操作
98 98-面试高频题满分答与Checklist.md 总览

官方文档与源码(一级依据)

AI Engineering · 正文机制应来自下方 官方文档(L1)官方源码仓库(L2)

禁止用教程站/博客充当机制依据。本章 QPS/延迟/STAR 为面试示意。

写作规范:docs/official-sources-registry.md §0

L1 · 官方文档

L2 · 官方源码

L3 · 论文 / 开放规范