跳到主要内容

洞察 AI 的视觉:针对图像、音频和文件的多模态追踪

·4 分钟阅读
MLflow maintainers
MLflow 维护者

你的智能体可以分析图像、转录音频并处理 PDF。但当出现问题时,追踪记录中往往只剩下晦涩难懂的 base64 字符串:JSON 中埋藏着数兆字节的 iVBORw0KGgo...。你可以看到发送了图像,但无法看到图像内容;你可以看到返回了音频,但无法播放。而且,每一条这样的超大字符串都会直接存储在你的追踪数据库中,不仅占用了大量存储空间,还拖慢了查询速度。

今天,我们宣布在 MLflow 中正式推出多模态追踪功能。二进制内容将从追踪记录中自动提取,高效地存储为工件(Artifacts),并直接在 UI 中按模型所见的形式渲染出来。

A multimodal trace showing an image rendered inline alongside the model's text response in MLflow's chat view

为什么纯文本追踪存在局限性

随着大模型应用超越文本范畴(视觉模型分析照片、音频模型转录通话、智能体生成图像),三个问题随之加剧:

  • 数据库臃肿:单次图像生成响应会将约 1.8MB 的 base64 内容直接嵌入 span JSON 中。在成千上万条追踪记录中,这意味着数 GB 的二进制数据存储在你的跟踪数据库中,而这些数据本不应存在于关系型存储中。
  • 查询与 UI 缓慢:加载追踪列表意味着要抓取所有内嵌的二进制数据。这会导致追踪搜索变慢、UI 卡顿,使得浏览生产环境的追踪记录变得异常痛苦。
  • 盲目调试:当视觉模型误分类图像时,你需要看到图像与模型响应的对比,而不是一堆编码后的字节墙。纯文本追踪让多模态调试变得不可能。

多模态追踪解决了以上三个问题。

工作原理

当 MLflow 在 span 中检测到二进制内容时,它会提取这些字节并将其存储在你现有的工件存储中(S3、Azure Blob、GCS、DBFS 或本地文件系统),这与 MLflow 存储模型工件的方式相同。span 只保留一个轻量级的引用 URI,因此追踪数据库保持精简,查询速度得以维持。当你打开追踪记录时,UI 会按需获取并渲染这些二进制内容。

Architecture diagram showing extract, store, and render flow for multimodal trace attachments

自动提取:零代码变更

如果你已经在使用 OpenAI、Anthropic、Gemini、Bedrock 或 LangChain 的 MLflow 自动记录功能,多模态追踪开箱即用。无需修改代码,无需任何配置。MLflow 会自动检测并提取二进制内容。

import mlflow
import openai

mlflow.openai.autolog()
client = openai.OpenAI()

# Image data is automatically extracted, no code changes needed
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_b64}"}},
],
}],
)

MLflow 可识别各提供商的 8 种多模态数据模式

模式提供商内容类型
数据 URI (data:image/png;base64,...)全部图像、音频
input_audioOpenAI音频输入
b64_jsonOpenAI生成图像
音频输出 (audio.data)OpenAI音频响应
Anthropic 图像块Anthropic图像
Bedrock 图像格式AWS Bedrock图像
Gemini inline_dataGoogle Gemini图像、音频
Responses API image_generation_callOpenAI生成图像

自定义内容的手动附件

对于无法通过自动记录流程的内容(PDF、自定义文件类型或你自行生成的图像),请使用 Attachment

import mlflow
from mlflow.tracing.attachments import Attachment

with mlflow.start_span(name="analyze_document") as span:
pdf = Attachment.from_file("report.pdf")
span.set_inputs({"document": pdf, "question": "Summarize the key findings"})
span.set_outputs({"summary": "Q3 revenue was $4.2M, up 18% YoY..."})

Attachment 对象会获得与自动提取内容相同的处理:二进制数据存储为工件,而 span JSON 中仅包含引用 URI。

追踪 UI 中的富渲染

多模态追踪可同时在摘要 (Summary)详情与时间轴 (Details & Timeline) 视图中渲染

  • 图像显示为紧凑的缩略图。点击可展开为全屏预览。
  • 音频可使用标准浏览器音频控件直接播放。
  • PDF 在嵌入式查看器中渲染。
  • 其他文件类型显示为下载链接。

聊天视图同样支持多模态内容内嵌渲染。视觉模型输入会显示图像与文本提示词的对比,音频响应在转录文本下方包含可播放的音频组件。

入门

多模态追踪功能现已集成于 MLflow 3.11+ 版本。开始在追踪中捕获多模态内容:

  1. 升级 MLflow: pip install --upgrade mlflow
  2. 启用自动记录: 为你的提供商启用自动记录功能(mlflow.openai.autolog(), mlflow.anthropic.autolog() 等)。多模态提取将自动完成。
  3. 查看追踪: 在 MLflow UI 中查看追踪。图像、音频和文件将直接内嵌渲染。

有关手动创建附件以及支持模式的完整列表,请参阅 多模态内容与附件文档

如果你觉得有用,请在 GitHub 上为我们点个星:github.com/mlflow/mlflow ⭐️

有疑问或反馈?提交 Issue 或加入我们的 Slack 频道讨论。