前几天有个朋友来找我,说他的客服机器人又“发疯”了。用户问“你们家退货政策是什么”,机器人一本正经地回答了一个完全不相关的运费问题。他翻遍日志,只看到最后那句错误答案,前面发生了什么——检索了哪些文档、调用了哪些工具、模型收到什么 prompt——一概不知。

这其实不是他一个人的问题。只要你在做 LLM 应用,尤其是 Agent、RAG、多轮对话这类东西,迟早都会遇到这种“黑盒时刻”。你看到输入,看到输出,但中间那团东西像雾一样。你想修,却不知道从哪下手。

Opik 就是来治这个病的。它是一套面向 LLM 应用的可观测性平台,核心目标很朴素:把你 Agent 处理的每一个请求、每一次 LLM 调用、每一次工具调用、每一次检索,都变成一条可以点开、可以搜索、可以分析的 trace。说白了,就是把黑盒拆成透明的流水线。

如果你还没听过 Opik,可以先把它理解成“LLM 应用的可观测性层”。它不负责替你写 prompt,也不负责替你换模型,它负责让你看清楚:到底发生了什么。

为什么 LLM 应用比传统 API 难调得多

传统后端接口出问题,你打个日志、断个点,基本能定位。因为逻辑是确定的,输入 A 经过几步计算得到输出 B。但 LLM 应用完全不是这个路数。

一个典型的 Agent 请求,可能长这样:用户输入 → 意图识别 → 检索知识库 → 重排文档 → 组装 prompt → 第一次 LLM 调用 → 解析工具调用 → 执行工具 → 把工具结果塞回 prompt → 第二次 LLM 调用 → 后处理 → 返回。中间还可能穿插多轮对话、记忆读取、成本控制、敏感词过滤。

这些步骤在运行时几乎是隐形的。你只看到最后那句话,但不知道模型为什么 hallucinate,不知道哪个检索步骤返回了无关上下文,不知道延迟是在 embedding 还是 LLM 调用上飙起来的,也不知道这次请求烧了多少 token、花了多少钱。

没有可观测性,调试 LLM 应用就是一场猜谜。你改 prompt、换模型、调温度,本质上是在盲试。试对了是运气,试错了连原因都说不清。

Opik 把这些步骤全部记录下来。每一次 LLM 调用、每一次工具调用、每一次检索,都会变成 trace 里的一段。你可以像看火焰图一样看整个执行路径,也可以按状态、延迟、成本、标签去过滤和搜索。问题出在哪,点开就知道。

Opik 能帮你做的五件事

我把 Opik 的价值总结成五句话,基本覆盖了日常开发中最痛的点。

第一,看到完整执行路径。从用户输入,到工具调用,到 LLM completion,再到最终响应,每一步都有输入、输出、耗时和元数据。你不再只看首尾。

第二,快速根因定位生产问题。线上请求那么多,不可能一条条看。Opik 支持按状态、延迟、成本、自定义标签过滤和搜索。比如你想找“所有耗时超过 3 秒且状态为错误的 trace”,几秒钟就能筛出来。

第三,跟踪成本和延迟趋势。Token 用量和花费可以按模型、提供商、trace 拆开看。这个月为什么账单涨了?是哪个模型、哪类请求在烧钱?一目了然。

第四,捕获多轮对话。单次 trace 只能看一轮,但真实场景往往是多轮。Opik 可以把相关 trace 分组到 thread 里,让你看到对话是怎么一步步演变的。用户在哪一轮开始跑偏,模型在哪一轮忘了上下文,都能查。

第五,闭环反馈。你可以给 trace 附加人工评分或自动评分,然后拿这些分数去驱动评估。哪些回答好、哪些不好,不再靠感觉,而是有数据。

这五件事听起来简单,但真做起来,很多团队连第一件都没做好。Opik 的好处是,它把这些能力都做成了开箱即用,不需要你从零搭一套。

核心概念:Trace、Span、Thread、Feedback

在深入之前,先把几个概念理清楚。Opik 的文档里叫 traces、spans、conversations、feedback scores,我用快递来打个比方。

Trace 是一次完整请求的旅程。比如用户问“帮我查一下订单”,从进入系统到返回答案,这整条链路就是一个 trace。它包含了这次请求的所有信息:输入、输出、耗时、状态、标签、元数据。

Span 是 trace 里的一个步骤。就像快递从仓库到分拣中心、到转运站、到配送点,每一站都是一个 span。在 LLM 应用里,一次检索是一个 span,一次工具调用是一个 span,一次 LLM 调用也是一个 span。Span 可以嵌套,形成一棵执行树。Opik 会把整棵树可视化出来,你点开任何一个节点,都能看到它的输入、输出、耗时和元数据。

Thread 是多轮对话的容器。用户和机器人聊了十轮,这十轮可能产生十条 trace。Thread 把它们串起来,让你看到上下文是怎么传递的。比如用户第三轮说“那换成红色的呢”,模型需要知道“那”指的是什么。Thread 就是用来回答这个问题的。

Feedback score 是附加在 trace 上的评分。可以是人工打的“好/差”,也可以是自动评估的“相关性 0.8”“准确性 0.6”。这些分数可以汇总、对比、导出,用来做质量监控和模型迭代。

理解了这四个概念,后面的东西就顺了。

你能捕获哪些东西

Opik 能捕获的东西比很多人想象的要多。我按官方文档里的分类,结合实际使用场景展开说。

Traces & Spans:完整执行树

这是最核心的能力。每个请求都会生成一条 trace,里面包含完整的执行树。每个 span 都有输入、输出、时间、元数据。你可以看到检索返回了哪些文档,工具调用的参数是什么,LLM 收到的 prompt 长什么样,模型返回了什么,耗时多少。

比如你的 RAG 应用回答错了,点开 trace 一看:检索阶段返回了三篇文档,其中两篇是两年前的旧政策。模型基于旧政策回答,自然就错了。问题不在模型,在检索。如果没有 trace,你可能会一直以为是模型不行。

Conversations:多轮会话线程

单轮 trace 看的是“这一句怎么答的”,thread 看的是“整个对话怎么走的”。Opik 可以把相关 trace 分组到 thread 里,帮你理解交互是怎么跨轮次演变的。

这个功能在客服、教育、陪伴类应用里特别有用。用户可能前几轮很正常,第五轮开始情绪激动,第七轮完全跑题。你单独看第七轮,觉得模型答得莫名其妙;但放到 thread 里一看,原来是第四轮的一个误解没被纠正,后面越滚越大。

Cost Tracking:成本跟踪

Token 用量和花费可以按模型、提供商、trace 拆开。你可以看到每个请求花了多少钱,哪个模型最烧钱,哪类请求成本最高。

我见过一个团队,一直以为成本大头在 GPT-4 调用上,结果 Opik 一接,发现 embedding 和重排模型的开销加起来比 LLM 还高。不是模型贵,是检索阶段太贪心,每次拉几百篇文档。这种问题,不看数据根本发现不了。

Media & Attachments:多模态附件

图像、音频、视频、文件都可以和 trace 一起记录。你做多模态应用时,模型看到了哪张图、听了哪段音频,都能在 trace 里看到。调试多模态问题,没有这个基本没法玩。

User Feedback:用户反馈

定性评分和定量评分都可以附加到单条 trace 上。用户点了个“踩”,或者人工审核打了“不符合事实”,这些反馈会留在 trace 上。时间一长,你就有一批带标签的数据,可以用来做评估、微调、回归测试。

Agent Graphs:Agent 执行图

Opik 可以可视化 Agent 的执行图,展示各个步骤是怎么连接的。对于复杂的 Agent 工作流,这张图能帮你快速理解结构,也能在出问题时一眼看出是哪条分支走错了。

这六项能力加起来,基本覆盖了 LLM 应用从调试到监控到优化的全流程。

四步上手 Opik

Opik 的上手路径设计得很顺。官方说如果你只想赶紧写代码,可以直接去 Getting started 指南,五分钟就能加上 tracing。我把完整流程拆成四步。

第一步:连接你的项目

在你的 Agent 目录下运行:

opik connect --project <YOUR_PROJECT_NAME>

这会把你的项目跟 Opik 配对。项目名可以自己取,比如 customer-service-botrag-demo。连接之后,后续的 trace 就会归到这个项目下。

第二步:插桩你的代码

这是最关键的一步。Opik 提供了两种方式:用 opik-skills 让编码助手帮你插桩,或者手动用 SDK 插桩。

官方推荐最快的方式是 opik-skills。先安装:

npx skills add comet-ml/opik-skills

然后对你的编码助手说:

Instrument my agent with Opik using the /opik-instrument command.

它支持 Claude Code、Cursor、Codex、OpenCode 等主流编码助手。助手会帮你把 Opik 的 tracing 加到代码里,省去手动改代码的麻烦。

如果你想手动插桩,也不复杂。Python 版本:

import opik

@opik.track
def my_agent(user_message):
    context = retrieve_context(user_message)
    response = call_llm(user_message, context)
    return response

TypeScript 版本:

import { Opik } from "opik";
const client = new Opik();

const myAgent = client.track({
  name: "my-agent",
  fn: async (userMessage: string) => {
    const context = await retrieveContext(userMessage);
    return await callLlm(userMessage, context);
  },
});

加一个装饰器或者包一层 track,就能自动捕获输入、输出、耗时和嵌套调用。如果你的代码里已经有 LangChain、LlamaIndex 这些框架,Opik 也有现成的集成,基本不用改业务逻辑。

第三步:在 Dashboard 查看 Traces

插桩之后,每个请求都会生成 trace。打开 Opik Dashboard,你能看到完整的执行树,点开每个 span 看输入输出,按耗时、成本、状态、标签过滤。

官方给了一张 traces 页面的截图,信息密度很高。左边是 trace 列表,右边是执行树和详情。你可以快速扫一眼哪些请求慢、哪些请求贵、哪些请求报错,然后点进去深挖。

第四步:分析和改进

有了 trace 之后,真正的优化才开始。你可以用 trace 调试失败案例,找出慢步骤,跟踪质量随时间的变化。给 trace 附加反馈分数,对数据集跑评估,还可以用 Ollie——Opik 的 AI 助手——帮你自动做根因分析。

Ollie 这个功能挺有意思。它不只是让你手动翻 trace,而是用 AI 去分析 trace,给出可能的原因和建议。比如它可能会告诉你:“这次失败是因为检索阶段返回的文档与问题相关性低,建议检查 embedding 模型或调整检索 top-k。” 对于复杂 Agent,这种自动根因很有价值。

集成生态:不用重写应用

Opik 对 30 多个框架提供了一等支持,覆盖 Python、TypeScript 和 OpenTelemetry。这意味着你不需要为了可观测性重写应用。

常见的集成包括:

  • LangChain
  • LlamaIndex
  • Anthropic
  • AWS Bedrock
  • Google Gemini
  • CrewAI

还有一些其他框架和提供商,官方有一个完整的集成列表。你可以去 /integrations/overview 看。核心思路是:你继续用你熟悉的框架,Opik 在底下帮你捕获 trace。

OpenTelemetry 的支持也很关键。如果你的团队已经有 OTel 基础设施,Opik 可以融入现有链路,不用另起炉灶。

一些实战建议

工具再好,用不对也白搭。我结合自己踩过的坑,给几条建议。

从关键路径开始。 不要一上来就给所有函数加 tracing,那样噪音太大。先把最核心的请求链路插桩,比如“用户输入 → 检索 → LLM → 输出”这条主路。等主路清晰了,再逐步加细节。

给 trace 打标签。 标签是过滤和搜索的基础。你可以给 trace 打上 env:prodversion:v2user_tier:premium 这类标签。出问题时,按标签筛选,能快速缩小范围。

关注成本,但不只是 LLM 成本。 检索、重排、embedding、工具调用,这些都可能烧钱。Opik 的成本跟踪可以按模型和提供商拆开,帮你找到真正的成本大头。

把反馈变成数据。 用户点踩、人工审核、自动评估,这些反馈都附加到 trace 上。积累一段时间后,你就有了一个带标签的数据集。用它做回归测试、做评估、做微调,比凭感觉改 prompt 靠谱得多。

用 MCP server 在编辑器里读 trace。 Opik 提供了 MCP server,你可以直接从 AI 编码助手里读取 trace,不用离开编辑器。调试的时候特别方便:看到错误 trace,直接在编辑器里问助手“这条 trace 为什么失败”,助手可以读取 trace 详情并给出分析。

最后

LLM 应用的可观测性不是锦上添花,而是工程化的基础设施。你不可能靠猜来维护一个生产级 Agent。每一次幻觉、每一次延迟飙升、每一次成本失控,背后都有具体原因。Opik 的作用,就是把这些原因从黑盒里挖出来,摆在你面前。

如果你还在用 print 调试 LLM 应用,真的可以试试 Opik。从 opik connect 开始,加上 @opik.track,跑一次请求,打开 Dashboard。你会第一次清楚地看到:原来我的 Agent 是这么工作的。

下一步可以看这几个地方:

  • Getting started:几分钟内给 Agent 加上可观测性。
  • Concepts:深入理解 traces、spans、threads 和 feedback scores。
  • Debugging agents with Ollie:用 AI 辅助做根因分析。
  • Cost tracking:监控 token 用量和花费。
  • MCP server:在 AI 编码助手里直接读 trace,不离开编辑器。

别让 LLM 应用继续当黑盒了。把它拆开,看清楚,然后你会发现问题其实没那么难修。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐