外观
动手实现
Implementation
现在我们已经理解了可观测性在 LLM 系统中的含义,接下来就该在实践中落地了。为此,我们将使用 Opik——一个为 LLM 应用提供追踪与监控工具的开源框架。
Opik 提供了一种轻量级的方式来捕获提示词、模型输出以及完整的执行追踪记录。无论是简单的函数调用、LLM 交互,还是像检索增强生成(RAG)或多步骤智能体(agent)这样更复杂的系统,它都能帮助你调试其中的处理流程。
实现
在接下来的内容中,我们会从一个最简示例开始,逐步深入。
追踪一个简单的 Python 函数
让我们从一个简单的演示开始。假设我们想追踪下面这个简单 Python 函数的所有调用:

为此,Opik 提供了一个功能强大的 @track 装饰器,让追踪一个 Python 函数变得毫不费力。

就是这么简单!
只要用这个装饰器包裹任意函数,就能自动在 Opik 仪表盘(dashboard)中追踪并记录它的执行过程。举例来说,目前我们的仪表盘还什么都没有显示。

如果我们运行上面这段用 @track 装饰器修饰过的代码,然后再打开仪表盘,就会看到这样的内容:

如上图所示,函数运行之后,Opik 会自动在其仪表盘中创建一个默认项目。在这个项目里,你可以查看传入函数的输入、函数产生的输出,以及执行过程中发生的一切细节。
举例来说,打开这个项目后,我们会看到上面这个函数的调用记录,包括输入内容、函数产生的输出,以及生成响应所花费的时间。

此外,如果你像下面这样多次调用这个函数:

仪表盘会展示这个函数的所有调用记录:

打开任意一次具体的调用记录,我们可以以清晰的 YAML 格式查看输入和输出,以及 Opik 追踪到的其他细节:

这种无缝集成让你无需添加任何复杂的样板代码,就能轻松监控和调试自己的工作流程。
用 Opik 追踪 LLM 调用
本节的目的,是展示当输入同时包含文本和图片 URL 时,Opik 是如何记录并监控这类交互的。在深入介绍 Ollama 之前,我们先用 OpenAI 做一个简单的演示。
在 .env 文件中指定好 OpenAI API key 之后,我们把它加载到运行环境中:

接下来,我们会使用 Opik 与 OpenAI 的集成,如下面代码所示,同时导入 OpenAI 库:

接下来,我们用 Opik 的 track_openai 函数包裹 OpenAI 客户端。这样一来,所有与 OpenAI API 之间的交互都会被追踪并记录在 Opik 仪表盘中。此后,通过这个客户端发出的任何 API 调用都会被自动监控,包括它们的输入、输出以及相关的元数据。

接下来,我们按如下方式定义多模态的提示词输入:

最后,我们按如下方式调用 chat completion API:

在这里,我们通过 chat.completions.create 方法发起这次 API 调用:
- model:指定要使用的 LLM(本例中是 gpt-4o-mini)。
- messages:提供我们前面定义好的多模态输入。
- max_tokens:将输出限制在 300 个 token 以内,确保响应保持简洁。同样地,如果我们打开仪表盘,就能看到这次 LLM 调用的输入和输出:

打开这次具体的运行记录,能看到关于这次 LLM 调用的大量细节,比如输入、输出、使用的 token 数量、这次运行产生的成本,等等。

这说明,只要使用 track_openai,每一次调用的输入、输出以及中间细节都会被记录在 Opik 仪表盘中,从而提升可观测性。对于本地运行的 LLM,我们用 Ollama 也能做到同样的事。我们来看看具体怎么做——整个流程和前面几乎一样。这次演示我们同样会用到 Opik 与 OpenAI 的集成,如下面代码所示,同时导入 OpenAI 库:

接下来,我们再次创建一个 OpenAI 客户端,但这次我们将 base_url 指定为 https://localhost:11434/v1:

接下来,为了记录客户端发出的所有调用,我们把这个客户端传给 track_openai 方法:

最后,我们按如下方式调用 completion API:

再次打开仪表盘,我们会看到新增了一条记录:

打开最新(最上面)的那条调用记录,我们同样能看到与 OpenAI 那次类似的细节——输入、输出、使用的 token 数量、成本,等等。

是不是很简单?