跟踪是一种可观测性技术,它通过应用程序捕获请求的完整执行流。 与传统记录隔离事件的日志不同,跟踪会创建一个详细的映射,展示数据如何流经系统,并记录沿途的每个操作。
GenAI 应用程序运行复杂的多步骤工作流,这些工作流结合了多个组件,例如 LLM、检索器、工具和代理。 通过捕获完整执行流程,追踪让这些工作流便于调试。
跟踪结构
MLflow Trace 包括两个主要对象:
Trace.info类型TraceInfo:描述跟踪的源、状态和执行时间的元数据。TraceInfo还包含 标签。 标记是用户、会话和开发人员提供的键值对,可用于搜索或筛选跟踪。Trace.data类型TraceData:包含仪器化的 Span 对象的实际载荷,这些对象捕获应用程序从输入到输出的每一步执行。
MLflow 跟踪与 OpenTelemetry 规范兼容,这是一种广泛使用的可观测性行业标准。 跟踪与其他与 OpenTelemetry 兼容的可观测性工具保持互操作,而 MLflow 使用特定于 GenAI 的结构和属性扩展 OpenTelemetry 模型。
TraceInfo
TraceInfo 提供有关总体跟踪的轻量级元数据。 关键字段包括:
| 领域 | Description |
|---|---|
trace_id |
跟踪的唯一标识符 |
trace_location |
存储追踪的位置(MLflow 试验或 Databricks 推理表) |
request_time |
跟踪的开始时间(以毫秒为单位) |
state |
跟踪状态:OK、、ERRORIN_PROGRESS或STATE_UNSPECIFIED |
execution_duration |
跟踪持续时间(以毫秒为单位) |
request_preview |
输入的 JSON 编码预览(根跨度输入) |
response_preview |
输出的 JSON 编码预览(根范围输出) |
tags |
用于筛选和搜索追踪的键值对 |
TraceData
该 TraceData 对象是 Span 对象的容器,其中存储执行详细信息。 每个跨度捕获与特定操作有关的信息,包括:
- 请求和响应
- 延迟测量
- LLM 消息和工具参数
- 检索的文档和上下文
- 元数据和属性
跨度通过父-子连接形成分层结构,创建一个表示应用程序执行流程的树。
标记
标记是附加到跟踪上的可变键值对,用于组织和筛选。 MLflow 为常见用例定义标准标记:
-
mlflow.trace.session:用于对相关跟踪进行分组的会话标识符 -
mlflow.trace.user:用于跟踪每个用户交互的用户标识符 -
mlflow.source.name:生成跟踪的入口点或脚本 -
mlflow.source.git.commit:源代码的 Git 提交哈希(如果适用) -
mlflow.source.type:源类型(PROJECT等NOTEBOOK)
还可以为特定需求添加自定义标记。 在 添加上下文以跟踪 和 附加自定义标记/元数据中了解详细信息。
存储布局
MLflow 针对性能和成本优化跟踪存储。 若要自定义存储位置,在 创建试验时附加 Unity 目录卷。 然后,访问受 Unity Catalog 卷权限控制。
TraceInfo 以建立索引的行形式直接存储在关系型数据库中,从而能够对追踪数据进行快速搜索和筛选。
TraceData (范围)存储在项目存储中,而不是关系数据库,因为范围更大。 即使追踪数据量增加,查询仍能保持快速响应。
活动跟踪与已完成跟踪
活跃跟踪是指 MLflow 当前正在写入的跟踪,例如,当使用@mlflow.trace修饰的函数正在运行时。 修饰函数退出后,跟踪已完成,但仍可以使用新数据对其进行批注。
若要处理当前或最近的跟踪,请使用以下方法:
-
mlflow.get_active_trace_id():返回当前活动跟踪的 ID。 -
mlflow.get_last_active_trace_id():返回最近完成的跟踪的 ID。
后续步骤
- 跨度概念 - 了解跨度及其捕获各个操作的方式。
- 入门:GenAI 的 MLflow 跟踪 (Databricks Notebook) - 在笔记本中获取跟踪的实践体验。