手动追踪
虽然 MLflow 的 自动追踪 为受支持的框架提供了即时可观测性,但手动追踪让您可以完全控制 GenAI 应用程序的插桩方式。这种灵活性对于构建需要详细监控和调试功能的生产就绪型应用程序至关重要。
当您需要以下功能时,手动追踪是正确的选择:
- 🔍 精细控制:精确定义要追踪的代码部分
- ⚙️ 自定义框架:为专有或内部框架进行插桩
- 🤖 高级场景:复杂工作流、多线程或异步操作、带自定义聚合的流式响应、自定义追踪元数据和属性
手动追踪示例
手动追踪 API 提供了一种直观的方式,以最小的代码更改添加追踪。它们自动处理追踪生命周期、异常追踪和父子关系。
- 装饰器
- 上下文管理器
最适用于:函数级追踪,代码更改最少
import mlflow
from mlflow.entities import SpanType
@mlflow.trace(span_type=SpanType.CHAIN)
def process_request(query: str) -> str:
# Your code here - automatically traced!
result = generate_response(query)
return result
@mlflow.trace(span_type=SpanType.LLM)
def generate_response(query: str) -> str:
# Nested function - parent-child relationship handled automatically
return llm.invoke(query)
主要优势:
- 任何函数的一行式插桩
- 自动异常处理
- 适用于异步/生成器函数
最适用于:追踪代码块和复杂工作流
import mlflow
with mlflow.start_span(name="data_processing") as span:
# Set inputs at the start
span.set_inputs({"query": query, "filters": filters})
# Your processing logic
data = fetch_data(query, filters)
processed = transform_data(data)
# Set outputs before exiting
span.set_outputs({"count": len(processed), "status": "success"})
主要优势:
- 灵活的 Span 边界
- 自定义输入/输出设置
- 非函数代码块的理想选择
后续步骤
准备好开始为您的代码进行插桩了吗?选择您的方法
装饰器与 Fluent API - 大多数用例请从这里开始
自动追踪 - 结合手动和自动追踪