大模型应用的可观测性——从 Token 监控到链路追踪的完整方案
大模型应用的可观测性——从 Token 监控到链路追踪的完整方案一、背景与问题大模型应用的可观测性与传统微服务有本质差异。传统微服务的可观测性关注请求延迟、错误率、资源占用——这些指标在 LLM 应用中同样重要但新增了两个维度Token 消耗直接关联成本与延迟和生成质量回答是否准确、完整、无幻觉。这两个维度没有现成的监控方案需要从零构建。我们在企业知识库助手项目中经历了上线后才发现成本超预期 3 倍、用户反馈回答错误但无法定位是检索问题还是生成问题的典型困境。根因是可观测性缺失没有 Token 粒度的成本追踪没有检索-生成的链路追踪没有答案质量的自动化评估。本文记录从 Token 监控到链路追踪的完整可观测性方案构建过程。二、方案设计大模型应用的可观测性体系分为四个层级指标层MetricsToken 消耗、调用延迟、成本、缓存命中率——量化资源使用。链路层Traces检索→增强→生成的全链路追踪——定位问题环节。日志层LogsPrompt/Response 的结构化记录——支撑质量分析与审计。质量层Quality答案准确率、相关性、完整性——自动化评估生成效果。flowchart TD A[用户请求] -- B[链路追踪起始点] B -- C[语义缓存检查 Span] C --|命中| D[缓存返回 Span] C --|未命中| E[上下文裁剪 Span] E -- F[模型路由 Span] F -- G[LLM 调用 Span] G -- H[Token 计量记录] H -- I[结果质量评估 Span] I -- J[链路追踪结束] J -- K[指标聚合写入 Prometheus] J -- L[日志写入 ElasticSearch] H -- M[Token Dashboard] K -- M L -- N[链路分析 Dashboard] I -- N三、实战演示3.1 Token 指标采集与 Prometheus 导出/** * Token 指标采集器——基于 Micrometer 的 Prometheus 指标导出 * 采集维度模型、应用、调用结果 */ Service Slf4j public class TokenMetricsCollector { private final MeterRegistry meterRegistry; private final Counter inputTokenCounter; private final Counter outputTokenCounter; private final Counter totalTokenCounter; private final Counter costCounter; private final Timer llmCallTimer; private final Counter cacheHitCounter; private final Counter cacheMissCounter; public TokenMetricsCollector(MeterRegistry meterRegistry) { this.meterRegistry meterRegistry; // Token 计数器——按模型和应用分组 this.inputTokenCounter Counter.builder(llm.tokens.input) .description(LLM 输入 Token 数) .tag(model, unknown) .register(meterRegistry); this.outputTokenCounter Counter.builder(llm.tokens.output) .description(LLM 输出 Token 数) .tag(model, unknown) .register(meterRegistry); this.totalTokenCounter Counter.builder(llm.tokens.total) .description(LLM 总 Token 数) .register(meterRegistry); // 成本计数器美元 this.costCounter Counter.builder(llm.cost.usd) .description(LLM 调用成本美元) .register(meterRegistry); // 调用延迟计时器 this.llmCallTimer Timer.builder(llm.call.duration) .description(LLM 调用延迟) .publishPercentiles(0.5, 0.9, 0.95, 0.99) .register(meterRegistry); // 缓存命中率 this.cacheHitCounter Counter.builder(llm.cache.hit) .description(语义缓存命中次数) .register(meterRegistry); this.cacheMissCounter Counter.builder(llm.cache.miss) .description(语义缓存未命中次数) .register(meterRegistry); } /** * 记录一次 LLM 调用的指标 * param model 模型名称 * param inputTokens 输入 Token 数 * param outputTokens 输出 Token 数 * param costUsd 调用成本美元 * param durationMs 调用延迟毫秒 * param cacheHit 是否命中语义缓存 */ public void record(String model, int inputTokens, int outputTokens, double costUsd, long durationMs, boolean cacheHit) { try { inputTokenCounter.increment(inputTokens); outputTokenCounter.increment(outputTokens); totalTokenCounter.increment(inputTokens outputTokens); costCounter.increment(costUsd); llmCallTimer.record(durationMs, TimeUnit.MILLISECONDS); if (cacheHit) { cacheHitCounter.increment(); } else { cacheMissCounter.increment(); } log.debug(指标记录: model{}, input{}, output{}, cost${:.4f}, latency{}ms, model, inputTokens, outputTokens, costUsd, durationMs); } catch (Exception e) { // 指标采集失败不应阻断主流程 log.warn(指标记录异常, e); } } }3.2 链路追踪——OpenTelemetry 集成/** * LLM 链路追踪服务——基于 OpenTelemetry 的全链路 Span 记录 * 将 RAG 链路中的每个环节记录为独立 Span */ Service Slf4j public class LlmTracingService { private final Tracer tracer; public LlmTracingService(Tracer tracer) { this.tracer tracer; } /** * 创建 RAG 查询链路 * param question 用户问题 * return 链路 Span 上下文 */ public SpanContext startRagTrace(String question) { Span span tracer.spanBuilder(rag.query) .setAttribute(question, question) .setAttribute(question.length, question.length()) .startSpan(); return new SpanContext(span, span.makeCurrent()); } /** * 记录检索环节 Span * param parentSpan 父 Span * param topK 检索参数 * param resultCount 检索结果数 * param durationMs 检索延迟 */ public void recordRetrievalSpan(Span parentSpan, int topK, int resultCount, long durationMs) { try { Span retrievalSpan tracer.spanBuilder(rag.retrieval) .setParent(parentSpan) .setAttribute(retrieval.topK, topK) .setAttribute(retrieval.resultCount, resultCount) .setAttribute(retrieval.durationMs, durationMs) .startSpan(); retrievalSpan.end(); } catch (Exception e) { log.warn(检索 Span 记录异常, e); } } /** * 记录 LLM 调用环节 Span * param parentSpan 父 Span * param model 调用模型 * param inputTokens 输入 Token * param outputTokens 输出 Token * param durationMs 调用延迟 */ public void recordLlmSpan(Span parentSpan, String model, int inputTokens, int outputTokens, long durationMs) { try { Span llmSpan tracer.spanBuilder(rag.llm_call) .setParent(parentSpan) .setAttribute(llm.model, model) .setAttribute(llm.inputTokens, inputTokens) .setAttribute(llm.outputTokens, outputTokens) .setAttribute(llm.durationMs, durationMs) .setAttribute(llm.costUsd, calculateCost(model, inputTokens, outputTokens)) .startSpan(); llmSpan.end(); } catch (Exception e) { log.warn(LLM Span 记录异常, e); } } /** * 结束 RAG 链路 * param spanContext 链路 Span 上下文 * param finalAnswer 最终回答 * param totalDurationMs 总延迟 */ public void endRagTrace(SpanContext spanContext, String finalAnswer, long totalDurationMs) { try { Span span spanContext.getSpan(); span.setAttribute(answer.length, finalAnswer.length()); span.setAttribute(total.durationMs, totalDurationMs); span.end(); } catch (Exception e) { log.warn(链路 Span 结束异常, e); } } }3.3 质量评估自动化/** * 答案质量评估服务——基于参考答案与 LLM 辅助的自动化评估 * 评估维度准确性、相关性、完整性、无幻觉 */ Service Slf4j public class QualityEvaluationService { private final ChatClient evalModel; public QualityEvaluationService(ChatClient evalModel) { this.evalModel evalModel; } /** * 评估回答质量 * param question 原始问题 * param answer LLM 生成的回答 * param referenceAnswer 参考答案可选 * param retrievedContext 检索到的上下文 * return 质量评估结果 */ public QualityResult evaluate(String question, String answer, String referenceAnswer, String retrievedContext) { try { String evalPrompt 你是质量评估专家。对以下 LLM 回答进行评分0-10 分评估维度 1. 准确性回答内容是否正确 2. 相关性回答是否针对问题 3. 完整性回答是否覆盖了问题的全部要点 4. 无幻觉回答是否仅基于检索上下文没有编造信息 问题%s 检索上下文%s LLM 回答%s 参考答案如有%s 输出 JSON{accuracy: N, relevance: N, completeness: N, hallucination_free: N, overall: N, issues: ...} .formatted(question, truncate(retrievedContext, 500), truncate(answer, 500), referenceAnswer ! null ? truncate(referenceAnswer, 500) : 无); String evalResult evalModel.call(evalPrompt); QualityResult result parseQualityResult(evalResult); log.info(质量评估完成: overall{}, question{}, result.getOverall(), truncate(question, 30)); return result; } catch (Exception e) { log.error(质量评估异常, e); // 降级返回默认评分 return QualityResult.builder() .accuracy(5) .relevance(5) .completeness(5) .hallucinationFree(5) .overall(5) .issues(评估异常: e.getMessage()) .build(); } } private String truncate(String text, int maxLen) { if (text null) return ; return text.length() maxLen ? text.substring(0, maxLen) … : text; } }3.4 Grafana Dashboard 配置要点# Prometheus 自定义指标示例 # llm_tokens_input_total{modelgpt-4o,appknowledge-assistant} # llm_tokens_output_total{modelgpt-4o,appknowledge-assistant} # llm_cost_usd_total{modelgpt-4o,appknowledge-assistant} # llm_call_duration_seconds{modelgpt-4o,quantile0.95} # llm_cache_hit_total / llm_cache_miss_total # Grafana Dashboard 面板设计 # 1. Token 消耗趋势图按模型分组24小时滚动窗口 # 2. 成本累计仪表盘今日/本周/本月 # 3. 延迟 P50/P95/P99 折线图 # 4. 缓存命中率饼图 # 5. 质量评分分布图按 overall 评分分桶四、深度解析4.1 可观测性四层的数据关联四层之间不是孤立存在而是通过 Trace ID 串联层级数据载体关联方式查询场景MetricsPrometheusTrace ID 作为标签哪条链路的 Token 异常高TracesOpenTelemetry自身就是关联轴检索环节是否是瓶颈LogsElasticSearchTrace ID 字段这条链路的具体 Prompt 和 Response 是什么Quality自建存储Trace ID 字段这条链路的回答质量如何关键设计每条 RAG 查询链路生成唯一的 Trace ID贯穿四个层级。在 Grafana 中从 Metrics Dashboard 的异常点点击跳转到 Jaeger Trace 页面查看链路详情再跳转到 ElasticSearch 查看完整 Prompt/Response最后查看质量评分——这是可观测性的端到端可导航体验。4.2 Token 消耗的异常检测Token 消耗异常的三个典型模式异常模式特征检测方法典型根因突增单小时 Token 消耗 3倍均值Prometheus rate 规则检索结果过多、Prompt 膨胀缓增日均消耗逐日增长 10%7 天趋势对比知识库膨胀、缓存失效周期异常特定时段消耗骤降/骤增按时段分桶对比定时任务调用、缓存 TTL 刷新4.3 质量评估的抽样策略全量评估每条回答的成本约 $0.01/条调用评估模型日均 10 万次调用则月评估成本 $3000。我们采用分层抽样全量自动评估基于简单规则回答长度异常、包含特定幻觉关键词的轻量检查。10% LLM 评估对全量自动评估标记为可疑的回答 10% 随机抽样回答调用 LLM 做深度评估。人工评估LLM 评估中 overall 6 的回答推送至人工审核队列。三层评估的总成本控制在月 $300覆盖 100% 的基础检查 10% 的深度评估 重点人工审核。五、总结与展望大模型应用的可观测性方案核心构建原则Trace ID 是四层的串联轴Metrics/Traces/Logs/Quality 通过 Trace ID 关联实现端到端可导航。Token 是大模型特有的核心指标成本、延迟、质量都受 Token 消耗影响必须以模型和应用维度细分追踪。质量评估需要分层抽样全量评估成本过高三层抽样规则检查 → LLM 评估 → 人工审核是务实的平衡。后续方向基于 OpenTelemetry 的 LLM Semantic Convention 标准化正在起草中的社区规范、质量评估的离线批量分析夜间低成本评估当日全量回答、以及成本异常的自动熔断Token 消耗超阈值时自动切换到小模型或缓存模式。大模型应用的可观测性不仅是运维工具更是成本控制与质量保障的工程基础——没有可观测性大模型应用就是黑箱。

相关新闻

从零实现轻量本地AIGC内容筛查工具:全离线无接口调用,适配高校内网论文合规场景

从零实现轻量本地AIGC内容筛查工具:全离线无接口调用,适配高校内网论文合规场景

上周接到了学院科研处的需求,要给内部论文提交系统加一层AIGC内容筛查能力。要求全流程不能连公网,所有论文数据不能出内网服务器,完全合规保保密。一开始想直接找现成的开源方案改改,结果试了好几个主流项目都踩了一堆坑。最开始…

2026/7/9 8:30:22阅读更多 →
BiliBiliCCSubtitle:高效获取B站字幕的完整解决方案

BiliBiliCCSubtitle:高效获取B站字幕的完整解决方案

BiliBiliCCSubtitle:高效获取B站字幕的完整解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾为下载B站视频字幕而烦恼?面对…

2026/7/9 8:30:22阅读更多 →
计算机毕业设计之零售管理系统

计算机毕业设计之零售管理系统

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

2026/7/9 8:30:22阅读更多 →
Skill是什么?—— 从概念到应用场景的全面解析

Skill是什么?—— 从概念到应用场景的全面解析

1. 什么是 Skill?Skill,中文常译为“技能”或“能力”,是一个广泛用于描述个人或系统所具备的、通过学习和实践获得的、能够有效完成特定任务或解决特定问题的能力集合。在技术领域,尤其是在人工智能、软件开发、产品设计和项目管…

2026/7/9 9:45:40阅读更多 →
在Cortex-M上跑一个轻量级神经网络,比想象中简单

在Cortex-M上跑一个轻量级神经网络,比想象中简单

在Cortex-M上跑一个轻量级神经网络,比想象中简单一个Cortex-M4内核的MCU,主频不到200MHz,RAM只有几百KB——这样的硬件真的能跑神经网络推理吗?几年前这个问题确实不太好回答。但TensorFlow Lite for Microcontrollers&#xff08…

2026/7/9 9:45:40阅读更多 →
CrysTBox软件安装步骤(附安装包)TEM数据分析软件 超详细下载安装教程

CrysTBox软件安装步骤(附安装包)TEM数据分析软件 超详细下载安装教程

文章目录前言CrysTBox 下载CrysTBox 安装教程CrysTBox新手必看:TEM数据分析基础操作指南前言 做TEM数据分析的朋友应该都听说过CrysTBox。这款工具在衍射斑点标定方面表现非常出色,尤其适合借助高分辨TEM图像进行自动晶轴确定。它的工作原理是自动测量衍…

2026/7/9 9:45:40阅读更多 →
TrollInstallerX完整指南:三步法快速部署TrollStore的终极解决方案

TrollInstallerX完整指南:三步法快速部署TrollStore的终极解决方案

TrollInstallerX完整指南:三步法快速部署TrollStore的终极解决方案 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是专为iOS 14.0至16.6.1设…

2026/7/9 9:45:40阅读更多 →
BGE-M3 8192长文本实战:MCLS策略免训练提升检索精度 15%

BGE-M3 8192长文本实战:MCLS策略免训练提升检索精度 15%

BGE-M3 8192长文本实战:MCLS策略免训练提升检索精度15%在信息爆炸的时代,高效处理长文本已成为AI工程师的核心挑战之一。面对动辄数千字的学术论文、技术报告或法律文书,传统文本向量化方法往往力不从心——要么因截断丢失关键信息&#xff0…

2026/7/9 9:45:40阅读更多 →
QModMaster终极指南:5分钟上手开源免费的ModBus调试神器

QModMaster终极指南:5分钟上手开源免费的ModBus调试神器

QModMaster终极指南:5分钟上手开源免费的ModBus调试神器 【免费下载链接】qModbusMaster Fork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/) 项目地址: https://gitcode.com/gh_mirrors/qm/qModbusMaster 在工业自动化领域&…

2026/7/9 9:40:39阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →