你有没有在网购后疯狂刷物流信息的经历?包裹从上海发出,途经杭州、武汉、长沙,最后到达你手里——你不仅能看见“已发货”和“已签收”两个结果,还能看见它在哪个中转站多待了 12 小时,是哪一程拖慢了整体速度。可如果你面对的是一个 AI 应用呢?用户只丢来一句“为什么回答这么慢”,你打开日志,看到的却只有一行“模型回复成功”。至于这中间经历了多少次模型推理、哪次工具调用卡壳、知识库检索占了多久——全是黑洞。 大模型调用链追踪(LLM Observability)要解决的就是这件事:给每一次 AI 请求贴上一张全程运单。从提示词进入系统,到路由分发、工具调用、向量检索、模型推理,再到最终回复,每个环节都被记录下来,像快递轨迹一样可视化呈现。你可以一眼看出延迟花在哪、Token 烧在哪、哪个工具在悄悄拖后腿。本文会带你从零认识调用链追踪的核心概念、行业标准 OpenTelemetry、关键指标,以及一套可以直接落地的实战方案。
对 AI 从业者而言,掌握调用链追踪意味着你不只“会用”大模型,还能在生产环境里快速定位故障、归因成本、守住安全底线——这是从“能跑通”走向“能运维”的关键一跃。
可视化演示
展示OpenTelemetry Span拆解的8级调用链瀑布图、推理延迟三阶段拆解(排队/首Token/生成)瓶颈定位及Token消耗多维归因分析,支持三模式交互切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Span调用链瀑布图 8个Span:TRC根→PRM渲染→RET检索→RER重排→CTX拼装→INF推理→TOL工具→RSP回复 INF占比35%为延迟瓶颈,TOL子Span嵌套在INF内 Trace=ΣSpan_i(latency+attrs) 时间轴标记当前追踪位置,Span树展示父子嵌套关系。
为何需要追踪
你网购了一件怕摔的瓷器,卖家包了三层泡沫,可收到时还是碎了。你去找客服,客服只有一句话:“我们的发货记录显示已签收。”你气得不行,却拿不出任何证据说明是哪一段运输把它震碎了。现在的 AI 应用就像这个快递黑盒——用户问了句“帮我查一下明天杭州的天气并订一张高铁票”,系统内部可能先做了意图识别,又去调了天气 API,还调了购票工具,中间甚至让大模型“思考”了两轮。最后回复倒是出来了,可稍微慢一点或答错一点,你就只能对着日志干瞪眼。
调用链追踪解决的就是这个“查无实据”的问题。它把一次请求从“提示词进入”到“回复返回”的完整过程记录下来,拆成一个个可以独立观测的片段。在生产环境里,你真正关心的无非四件事:推理延迟——大模型生成太慢;Token 消耗——调用成本在悄悄烧钱;工具调用嵌套——某个 API 卡住或返回异常;检索质量——知识库搜回来的东西根本不相关。没有追踪,这四类问题只能靠猜;有了追踪,每一条都对应到具体的环节和证据。
用数学语言描述,一次请求的总延迟约等于各阶段耗时之和:
有了这张“分账表”,你就像拿到了快递的全程运单。用户再说“太慢了”,你不再是解释“网络波动”,而是可以指着链路图说:“不是模型慢,是检索这一步多花了 900 毫秒,因为向量库索引没命中缓存。”
- 总延迟$T_{\text{total}}$ 表示从用户发出提问到收到完整回复的墙钟时间,也就是体验层面最直观的“慢不慢”。
- 前置环节分账$t_{\text{router}}$ 是请求路由耗时,$t_{\text{retrieve}}$ 是知识库检索耗时。这两个环节一个决定“往哪转”,一个决定“查什么”,通常是大模型之外最先耗时的部分。
- 生成与收尾分账$t_{\text{reason}}$ 是大模型推理耗时,$t_{\text{tool}}$ 是工具调用耗时,$t_{\text{respond}}$ 是结果组装与回复耗时。哪一项最大,就是你要优先优化的瓶颈;如果预算紧张,先看最宽的那块。
核心概念
快递公司如何处理一单包裹?先给你一个运单号,然后每经过一个转运中心,工作人员就在系统里记录一条状态:“15:32 到达杭州分拨中心,15:47 发往下一站。”运单号把零散的状态串成一条完整的轨迹,每一个状态戳就是一个小节。在大模型调用链里,这两个概念有专门的名字:Trace(追踪,相当于整条运单轨迹)和 Span(跨度,相当于每一个转运记录)。
一次用户请求对应一个 Trace。而每一个“值得观测的工作单元”就是一个 Span——它可以是一次 HTTP 请求、一次向量数据库查询、一次大模型生成,或者一次工具调用。每个 Span 都有名字、开始时间和结束时间。最妙的是嵌套关系:一个 Span 内部可以再开子 Span,就像“分拣”这个大环节里还包含“扫码→称重→装车”三个子环节。这种父子嵌套结构构成了调用链的基本骨架。
Span 还会携带两类补充信息:属性(Attribute)和事件(Event)。属性是一组键值对,比如 model_name="gpt-4o"、token_count=128、retrieved_docs=3;事件则是发生在某个时间点的标记,比如“重试了一次”“触发了超时保护”。把所有 Span 按时间轴和嵌套层级铺开,就得到一张火焰图——横轴是时间,纵轴是嵌套层级,每一块的颜色深浅或宽窄直观展示耗时分布。
回到快递的比喻:运单号就是 Trace ID,每次扫码记录就是 Span,而“包裹破损”“客户改地址”这类备注,就是 Span 上的事件。你看懂一张快递轨迹,就基本看懂了调用链的数据模型——只不过把“城市”换成了“服务”,把“运输时间”换成了“处理耗时”。
统一标准
在快递行业没有统一面单的年代,你寄一台电脑,EMS 用自己的单号,顺丰用自己的单号,两家之间查件只能靠人工打电话。后来行业推行标准面单和统一条形码,任何一家快递公司扫一下码,就能识别出运单归属。可观测性领域也经历过同样的混乱:有的系统用 Zipkin 的格式,有的用 Jaeger 的格式,换一个监控后端就要重写一遍埋点代码。OpenTelemetry 就是那个“统一面单”。
OpenTelemetry 是一个开源的遥测标准,它主要解决三件事。第一,统一数据模型:定义了 Trace、Span、Metric、Log 的标准数据结构,所有语言(Python、Java、Go 等)的 SDK 都输出同一种格式。第二,自动与手动埋点:自动埋点能拦截常见的 HTTP 框架、数据库客户端,自动生成 Span;但像“调用大模型”“执行工具”这类业务动作,框架不知道它们的语义,需要你用 SDK 手动包一层 Span。第三,上下文传播:一次请求从服务 A 走到服务 B 时,SDK 会自动在 HTTP 头里写入 traceparent 字段,把 Trace ID 和父 Span ID 带给下游,这样跨服务的调用才能串成同一条链。
在架构上,OpenTelemetry 还有一个重要角色——Collector(采集器)。各服务的 SDK 把遥测数据发给 Collector,Collector 负责接收、过滤、批处理,再导出到 Jaeger、Grafana Tempo 或云端监控平台。它像快递行业的“分拨中心”:各个网点(服务)把包裹(遥测数据)交给分拨中心,分拨中心统一调度后发往最终目的地(后端存储)。
接入 OpenTelemetry 之后,你的应用就像贴上了行业标准面单。今天用 Jaeger 做可视化,明天想换 Grafana Tempo,只需改 Collector 的导出配置,一行业务代码都不用动。这就是标准的力量。
指标维度
查快递时你除了看轨迹,还会关心两件事:多久能到和运费多少。对应到大模型调用链,就是延迟和 Token 成本。而“运费”在大模型世界里是透明的——按 Token 计价。你发给模型的提示词算输入 Token,模型吐出来的答案算输出 Token,两者的单价往往不同。很多新手只看总账单,却不知道钱到底烧在哪个环节,这就是成本归因的难点。
成本归因的前提是准确的 Token 统计。一个调用链里,你要分别记录三个数:输入 Token、输出 Token、以及缓存命中的 Token。之所以单独看缓存命中,是因为命中缓存的输入通常价格更低甚至免费,它直接影响成本。有了这些数据,一次调用的成本就可以精确计算:
除了延迟和 Token,还有一类容易被忽略的质量信号:检索命中了几个文档、是否触发了重试、工具调用是否成功。这些指标虽然不直接产生费用,却决定了用户体验。就像快递员虽然按时送到了,但如果他敲错了门、多跑了两趟,运单上也会有记录——这些“隐性损耗”在调用链里同样无处遁形。
- 成本函数$C$ 表示一次调用链的总成本,单位通常是“美元”或“人民币”,是后续成本归因与预算控制的基础。
- 输入费用$N_{\text{prompt}}$ 是提示词消耗的 Token 数,$c_{\text{prompt}}$ 是每千 Token 的输入单价;两者相乘得到输入部分的开销。
- 输出费用$N_{\text{completion}}$ 是模型生成的 Token 数,$c_{\text{completion}}$ 是输出单价;两者相乘得到生成部分的开销。
- 合并求和把输入和输出两部分费用加在一起,就得到整条链路的费用。追踪系统把这两个数挂在 Span 属性上,你就知道每个环节各花了多少钱。
可视化分析
当我们把调用链的数据画出来,就得到了一张堪比快递轨迹页面的“全程地图”。其中最常用的就是火焰图:横向是时间轴,纵向是 Span 的嵌套层级。每一块矩形代表一个 Span,矩形的宽度就是它占用的时间。一张合格的火焰图会让你在三秒内找到问题——因为最宽的那块矩形,就是耗时最长的环节,通常也是优化的第一目标。
火焰图之外,服务拓扑图展示的是服务之间的调用关系:谁在调谁、调用频率如何、有没有环形依赖或单点故障。在一个复杂的 Agent 系统里,主智能体可能会调用子智能体,子智能体再去调工具,拓扑图能让你一眼看清这棵调用树的形状。再配合告警巡检,为关键指标设置阈值——例如“检索耗时超过 500 毫秒”“Token 消耗超过 5000”——一旦越界就触发告警,把问题从“用户投诉后才被动发现”变成“指标异常时主动出击”。
瓶颈定位是可视化分析的核心目的。假设一张火焰图显示:总耗时 4 秒,其中“模型推理”占了 2.8 秒,“检索”占了 0.9 秒,“路由”只占 0.3 秒。你不用猜也知道,应该去优化模型推理——比如换更小的模型、用流式输出让首字更快出现,或者把部分推理结果缓存起来。可视化把“感觉慢”变成“精确知道慢在哪”。
这就像查快递时看到的物流地图:包裹在哪一个城市滞留,一目了然。你不必打电话问客服“为什么还没到”,因为地图上那个停滞的节点已经告诉了你答案。火焰图就是 AI 世界的物流地图,每一次“卡住”都有迹可循。
实战方案
聊完了理论,现在动手给我们的“AI 快递中心”装上标准扫码设备。这里我们使用 OpenTelemetry 生态来搭建一套完整的 LLM 调用链追踪方案。整体分为四步,每一步都像部署快递系统一样清晰。
第一步,SDK 接入。在你的 Python 服务中安装 opentelemetry-api、opentelemetry-sdk 和相关 exporter 包,初始化时配置服务名(service name)与导出地址。服务名相当于快递网点编号,后端靠它区分不同来源的调用链。第二步,自动埋点。OpenTelemetry 的 instrumentation 库会自动拦截 requests、fastapi、redis 等常见库的调用,自动生成 Span。这一步几乎零成本,就像给快递单印上条形码。
第三步,手动埋点。大模型调用和工具执行是业务独有的动作,自动埋点无法理解它们的语义。你需要手动包 Span,例如在调用 llm.chat() 前开启一个名为 llm_reason 的 Span,结束时把 Token 数和模型名写入属性。第四步,选择可视化后端。开源社区最常用的两个选择是 Jaeger 和 Grafana Tempo。它们都能接收 OpenTelemetry 数据,提供火焰图和拓扑图。如果你在云上,也可以直接接 AWS X-Ray 或阿里云链路追踪服务。
接入路径非常清晰:服务 SDK → 本地 Collector → 后端存储。实际部署中,建议在 Kubernetes 里以 DaemonSet 方式部署 Collector,每个节点一个,统一接收本节点 Pod 的遥测数据,再批量导出。这样既能降低请求延迟,又能集中管理采样策略。完成这四步,你就拥有了一张实时更新的“AI 物流大屏”。
落地运维
系统搭好只是开始,真正考验功力的是日常运维。就像快递公司有了面单系统,还得有调度规则和成本控制,不然面单印得再多也是浪费纸。调用链追踪的落地同样有三件事要做:优化策略、成本控制、安全运维。
优化策略方面,调用链暴露了延迟的同时也指明了优化方向。检索结果可以做语义缓存——同样的用户问题直接命中历史结果,跳过向量查询;多个独立的工具调用可以并行发起,而不是串行等待;减少不必要的嵌套层级,让主模型少绕弯。每一条优化措施实施后,都能通过调用链的延迟数据快速验证效果,形成“观测 → 优化 → 再观测”的闭环。
成本控制的关键在于采样策略。生产环境流量巨大,如果每条请求都全量记录,存储成本会反噬应用本身。常见做法是:正常流量按 10% 采样,只保留有代表性的链路;当检测到错误率上升或某个服务延迟异常时,动态将采样率提到 100%,抓取完整现场。这就像快递公司只对贵重包裹全程录像,普通包裹抽检即可,出了事再切换为全量追踪。
安全运维是“AI 安全运维与红蓝对抗”这条主线里调用链追踪最大的价值所在。调用链记录了每一次工具调用的参数、每个用户的 Token 消耗、每段链路的访问路径——这些数据就是审计日志的富矿。攻击者用提示注入让模型调用危险工具时,追踪链上会浮现出“非预期的工具调用参数”;账号被盗后批量生成文本时,Token 消耗曲线会突然飙升。设置“单链路 Token 异常阈值”“工具调用频次告警”,就是在快递中心加装安检机——不放过任何一件可疑包裹。
AI 应用场景
客服机器人的延迟排障
阶段:推理部署与运维阶段
解决的问题:传统排障方式只能看到“客服机器人响应慢”,无法判断是网络问题、向量检索慢还是大模型生成慢。接入调用链追踪后,每次对话都生成一条 Trace,延迟被拆解到路由、检索、推理、回复四个环节,运维团队可以精准定位瓶颈——例如发现某地域用户的检索延迟偏高,原因是向量数据库节点负载不均。
具体案例:某电商平台客服机器人上线后平均响应时间 4.2 秒,用户投诉率上升。通过调用链追踪发现,其中 2.8 秒消耗在知识库检索上,而模型推理只占 0.6 秒。团队为高频问题配置了检索缓存,响应时间降到 1.5 秒,投诉率回落 60%。
多智能体 Agent 的工具调用审计
阶段:安全监控与审计阶段
解决的问题:多智能体系统中,主 Agent 会动态决定调用哪些工具、以什么顺序调用。传统日志只能记录“调用了工具 A”,看不出调用链的上下文。调用链追踪把“决策 → 工具调用 → 结果返回”串成完整链路,安全团队可以审计每一次工具调用的触发原因和参数合法性。
具体案例:某金融企业上线了智能投顾 Agent,发现某个用户会话中 Agent 连续三次调用了“转账”工具,且参数可疑。调用链追踪显示这是恶意提示注入导致的工具误用,安全团队随即为该工具增加了二次确认机制,并在追踪系统中添加了“单链路敏感工具调用次数”告警。
大模型成本归因与预算治理
阶段:成本治理与 FinOps 阶段
解决的问题:多个业务线共用同一个大模型平台,每月账单出来后各部门互相推诿,却说不出自己到底用了多少 Token。通过调用链追踪,每个业务线的调用链都带有 department 和 project 属性,成本可以精确分摊到每条链路、每个部门。
具体案例:某公司一个月大模型账单 80 万元,调用链追踪归因后发现,其中 35% 来自一个“数据清洗”批处理任务——它每天用大规模模型处理大量文本,而同样的任务用便宜的小模型就能完成。团队据此切换模型,月度成本下降 40%。
Python 演示
import time class MiniTracer: """用 OpenTelemetry 思路模拟调用链追踪(简化版)""" def __init__(self, trace_name): self.trace_name = trace_name self.trace_id = "9a3f7c21" self._spans = [] self._stack = [] def start_span(self, span_name): span = {"name": span_name, "start": time.perf_counter(), "end": None, "attrs": {}} self._spans.append(span) self._stack.append(span) return span def end_span(self, attrs=None): span = self._stack.pop() span["end"] = time.perf_counter() if attrs: span["attrs"].update(attrs) return span def report(self): lines = [] for span in self._spans: dur = (span["end"] - span["start"]) * 1000 attrs = ", ".join(f"{k}={v}" for k, v in span["attrs"].items()) lines.append(f"{span['name']:<12} {dur:8.2f} ms {attrs}") total = (self._spans[-1]["end"] - self._spans[0]["start"]) * 1000 lines.append(f"{'TOTAL':<12} {total:8.2f} ms") return "\n".join(lines) def simulate_llm_call(): tracer = MiniTracer("user-query") router = tracer.start_span("router") time.sleep(0.01) retriever = tracer.start_span("retrieve") time.sleep(0.05) tracer.end_span(attrs={"docs": 3}) reason = tracer.start_span("llm_reason") time.sleep(0.12) tool = tracer.start_span("tool_call") time.sleep(0.06) tracer.end_span(attrs={"tool": "calculator"}) tracer.end_span(attrs={"tokens": 128}) tracer.end_span(attrs={"status": "ok"}) return tracer if __name__ == "__main__": tracer = simulate_llm_call() print(tracer.report())
class MiniTracer:定义了一个微型追踪器,用列表维护 Span、用栈维护嵌套关系,对应 OpenTelemetry 的 Tracer 核心职责。self._spans = []用_spans列表保存所有 Span;下划线前缀表示内部属性,避免与公开方法混淆。self._stack = []_stack是调用栈,记录当前未结束的 Span,保证end_span能正确配对到最近开启的 Span。def start_span(self, span_name):开启一个新 Span,记录名字和开始时间,并把它压入栈顶。tracer.end_span(attrs={"docs": 3})结束“检索”Span,并把检索到的文档数作为属性挂上,供后续质量分析使用。time.sleep(0.05)模拟检索耗时 50 毫秒;实际运行中这里是对向量数据库的真实网络调用。tool = tracer.start_span("tool_call")在“大模型推理”内部再开一个子 Span,演示父子嵌套:工具调用是模型推理的子环节。tracer.end_span(attrs={"tool": "calculator"})记录工具名,便于事后审计“哪个工具被调用了、耗时多少”。tracer.report()遍历所有 Span,按开始顺序输出名称、耗时、属性,相当于一张极简版的火焰图数据表。
常见误区
误区很多人觉得,我在代码里多写几个 `print` 或者 `logger.info`,把开始时间和结束时间打出来,不就是在做调用链追踪了吗?
正解日志和追踪有本质区别。日志是分散的记录,彼此之间没有结构化的关联;而调用链的核心是 Trace ID 把散布在各个服务、各个线程的 Span 串联成一棵树。你打印一百行日志,也很难回答“这次请求的完整路径是什么”;但打开一条 Trace,所有环节的父子关系一目了然。
为何常见:因为从表面看,追踪输出的也是一行行带时间的信息,初学者容易把“记录了过程”和“追踪了链路”混为一谈。
误区“接口响应慢了,我测一下整体耗时,从调用到返回一共 3 秒,知道很慢就行了。”
正解总延迟只是一个结果数字,它无法告诉你瓶颈在哪。同样的 3 秒,可能是检索 2.5 秒加推理 0.5 秒,也可能是推理 2.5 秒加检索 0.5 秒——两种情况的优化方向完全不同(前者查向量库,后者换模型)。调用链追踪的价值恰恰在于把总延迟拆成多个 Span 的耗时,让优化有据可依。
为何常见:因为传统 API 监控通常只看整体响应时间,习惯了“看总量”的思维,没意识到大模型应用是多环节串并联的复杂系统。
误区“提示词写了一大段,费了很多 Token,成本主要来自输入。输出的答案反正没几句,应该不贵。”
正解很多大模型 API 的输出单价是输入单价的 3 到 4 倍。一次长文本生成,输出 Token 虽然数量少,但单位价格高,完全可能是成本的大头。调用链追踪要求把输入和输出 Token 分别记录,正是为了精确回答“钱到底花在哪”。
为何常见:因为平时看账单时只注意“提示词越来越长”这个直观现象,而对输出侧的定价敏感度低。
误区“OpenTelemetry 是给微服务做链路追踪的,我就是一个调用大模型 API 的 Python 脚本,用不上。”
正解OpenTelemetry 的数据模型与语言无关,只要你的代码里有“值得观测的工作单元”,就可以手动埋点。大模型调用、工具执行、向量检索这些动作都能包装成 Span。实际上,社区已经有 traceloop-sdk 等工具专门用 OpenTelemetry 来追踪 LLM 调用,还能采集 Token 用量和成本。
为何常见:因为大多数 OpenTelemetry 教程都以 HTTP 微服务为例,容易让人误以为它是微服务专属框架。
误区“每个请求都要记录这么多 Span,还要传到后端,肯定拖慢我的服务。”
正解OpenTelemetry 的 SDK 设计为异步上报,采集过程对业务线程几乎无阻塞;而且生产环境可以配置采样策略——比如正常的低价值请求按 10% 采样,异常或慢请求全量采样。性能开销通常远低于 1%,换来的是故障定位能力,这笔账非常划算。需要注意的是,真正该控制的是采样率和上报批处理大小,而不是直接放弃观测。
为何常见:因为早期一些日志方案确实因同步写盘拖慢过服务,这种“观测就是负担”的刻板印象延续了下来。
面试题
Q1. 在一次大模型应用请求中,用于标识整条调用链的唯一 ID 通常叫什么?
- A.Span ID
- B.Trace ID← 正确答案
- C.Log ID
- D.Node ID
答案:B。Trace 是整条调用链,Trace ID 是它的唯一标识;Span ID 只标识单个环节。就像快递运单号对应整单轨迹,而不是某一个转运记录。
Q2. OpenTelemetry 在可观测性领域的角色是什么?
- A.专有监控平台
- B.统一埋点标准← 正确答案
- C.大模型推理引擎
- D.向量数据库
答案:B。OpenTelemetry 是开源的遥测标准,定义了 Trace、Metric、Log 的统一数据模型和 API,而不是某个具体的监控产品。它像快递行业的统一面单规范,各家后端都能接入。
Q3. 火焰图中,横轴通常表示什么?
- A.嵌套层级
- B.服务数量
- C.时间轴← 正确答案
- D.Token 数量
答案:C。火焰图横轴是时间,纵轴是嵌套层级,块的宽度代表耗时。看火焰图就是看“哪块最宽”,对应关注延迟最大环节。
Q4. 下列哪种情况最能体现 Span 的“父子嵌套”关系?
- A.两个 Span 同时开始
- B.子 Span 在父 Span 的完整区间内运行← 正确答案
- C.两个 Span 名字相同
- D.子 Span 在父 Span 结束后才开始
答案:B。父 Span 定义了一个时间段,子 Span 必须完全发生在这个时间段之内,就像“分拣”环节包含“扫码”“装车”子环节。同时开始或结束后才开始都不构成嵌套。
Q5. 想评估一次 RAG 调用的经济成本,下列哪个数据是关键?
- A.GPU 显存占用率
- B.Prompt 与 Completion 的 Token 数← 正确答案
- C.磁盘 IOPS
- D.网络带宽占用
答案:B。大模型按 Token 计费,成本 = 输入 Token × 输入单价 + 输出 Token × 输出单价。GPU 显存和带宽影响的是运行容量,不是直接 API 成本。
Q6. 在调用链中,Span 的“属性”(Attribute)通常用来记录什么?
- A.用户密码
- B.模型名与 Token 数等键值对← 正确答案
- C.完整的请求体
- D.服务器 IP 列表
答案:B。属性是一组结构化的键值对,常记录模型名、Token 数、检索文档数、工具名等观测数据。属性应为可索引的元数据,而不是存放大体积请求体或敏感凭据。
Q7. 生产环境调用链采样率从 100% 降到 10%,最直接的代价是什么?
- A.大部分调用细节丢失← 正确答案
- B.模型精度下降
- C.Token 成本上升
- D.无法部署服务
答案:A。降采样意味着只有 10% 的请求会生成完整链路,低概率偶发故障可能落在采样之外而无法追溯。模型精度与 Token 成本不受采样影响。因此通常对错误请求采用动态全量采样。
Q8. 调用链追踪可以在 AI 安全运维中发挥哪些作用?
- A.定位异常的工具调用参数← 正确答案
- B.识别批量 Token 消耗异常← 正确答案
- C.自动修复模型幻觉
- D.审计敏感工具的访问路径← 正确答案
答案:ABD。调用链记录了工具调用的完整上下文、Token 消耗曲线和访问路径,适合做异常检测与审计;但它只是观测工具,本身并不修改模型参数,无法直接修复幻觉。
Q9. 以下哪些属于调用链中常见的 Token 统计维度?
- A.输入 Token 数← 正确答案
- B.输出 Token 数← 正确答案
- C.缓存命中 Token 数← 正确答案
- D.训练数据条数
答案:ABC。成本归因需要分别统计输入、输出和缓存命中的 Token;训练数据条数属于模型训练环节的概念,与单次推理调用链无关。
Q10. 从调用链追踪数据出发,哪些手段可以有效降低 LLM 应用延迟?
- A.对高频检索结果做缓存← 正确答案
- B.将无依赖的工具调用改为并行← 正确答案
- C.把采样率从 10% 提到 100%
- D.减少非必要的嵌套推理链路← 正确答案
答案:ABD。缓存减少重复检索,并行降低串行等待,简化链路减少模型调用次数,三者都直接优化延迟;提高采样率只增加观测数据量,不会改善性能。