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)
- 看 三合一看板 哪一柱异常(延迟/成本/质量);
- 下钻 trace 样本(P99 最慢 10 条);
- 对照 发布/路由/索引 变更日历;
- 止血:降级路由、关语义缓存、缩 prompt;
- 事后:样本进 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_latencyhistogram;- 回滚: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 天):
- 三合一看板加 cosine_top1 P50、KL 漂移;
- Langfuse dataset 自动收录 faith<0.8 会话;
- embed 变更 CI 探针 + 索引重建 runbook;
- 告警: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 为面试示意。
L1 · 官方文档
L2 · 官方源码
L3 · 论文 / 开放规范