跳到主要内容

跨度

什么是跨度?

Span 对象是 Trace 数据模型中的基本构建块。它是关于跟踪各个步骤信息的容器,例如 LLM 调用、工具执行、检索等。Span 在单个跟踪中形成一个分层的树状结构,表示跟踪的执行流。

Example of a Span for a Tool Calling Agent

工具调用代理的 Span 示例

例如,上图展示了一组以树状结构组织在跟踪中的跨度。每行代表一个跨度,树状结构由行之间的卷曲边缘形成。

Span 对象模式

MLflow 的 Span 对象设计为与 OpenTelemetry Span 规范兼容。它是一个数据类对象,与 OpenTelemetry Span 对象基本相同,但增加了一些便利的访问器和方法以支持 GenAI 用例。当导出到 OpenTelemetry 兼容的后端时,Span 对象会被序列化为严格的 OpenTelemetry 导出格式 (OTLP)。

字段类型描述
span_idstr在跟踪中为每个跨度生成的唯一标识符。
trace_idstr将此跨度与其父跟踪链接的唯一标识符。
parent_idOptional[str]建立给定跨度与其父跨度层次关联的标识符。如果该跨度是根跨度,则此字段为 None
namestr跨度的名称,可以是用户定义的,也可以根据正在检测的函数或方法自动生成。
start_time_nsint跨度开始时的 Unix 时间戳(纳秒)。
end_time_nsint跨度结束时的 Unix 时间戳(纳秒)。
statusSpanStatus跨度的状态,值为 OK、UNSET 或 ERROR。如果 status_code 反映了发生的错误,则跨度状态对象包含一个可选的描述。
inputsOptional[Any]传入应用程序特定阶段的输入数据。
输出Optional[Any]传出应用程序特定阶段的输出数据。
attributesDict[str, Any]属性是与应用程序中给定步骤关联的元数据。这些是键值对,提供对函数和方法调用行为修改的见解。
eventsList[SpanEvent]事件是一种系统级属性,仅在跨度执行期间出现问题时才可选择性地应用于跨度。这些事件包含有关在被检测调用中抛出的异常以及堆栈跟踪的信息。

Span 属性

Span 属性是键值对,提供对函数和方法调用行为修改的见解。

span.set_attributes(
{
"ai.model.name": "o3-mini",
"ai.model.version": "2024-01-01",
"ai.model.provider": "openai",
"ai.model.temperature": 0.7,
"ai.model.max_tokens": 1000,
"infrastructure.gpu.type": "A100",
"infrastructure.memory.used_mb": 2048,
}
)

Span 类型

Span 类型是分类跟踪中跨度的一种方式。MLflow 提供了一组预定义的常用 Span 类型,同时还允许您设置自定义 Span 类型。

Span 类型描述
"CHAT_MODEL"表示对聊天模型的查询。这是 LLM 交互的特殊情况。
"CHAIN"表示一系列操作。
"AGENT"表示自主代理操作。
"TOOL"表示工具执行(通常由代理执行),例如查询搜索引擎。
"EMBEDDING"表示文本嵌入操作。
"RETRIEVER"表示上下文检索操作,例如查询向量数据库。
"PARSER"表示解析操作,将文本转换为结构化格式。
"RERANKER"表示重排序操作,根据相关性对检索到的上下文进行排序。
"UNKNOWN"当未指定其他 Span 类型时使用的默认 Span 类型。

专用 Span 模式

MLflow 具有预定义的 Span 类型,某些 Span 类型具有启用 UI 中附加功能和下游任务(如评估)所需的属性。

检索器 Span

RETRIEVER span 类型用于从数据存储中检索数据的操作(例如,从向量存储中查询文档)。RETRIEVER span 的输出预计为文档列表。

列表中的每个文档都应该是一个具有以下结构的字典

page_content (str):检索到的文档块的文本内容。

metadata (Optional[Dict[str, Any]]):与文档关联的附加元数据的字典。MLflow UI 和评估指标可能会特别查找

  • doc_uri (str):文档源的字符串 URI
  • chunk_id (str):如果文档是较大分块文档的一部分,则为字符串标识符

id (Optional[str]):文档块本身的可选唯一标识符。

示例用法

import mlflow
from mlflow.entities import SpanType, Document


def search_store(query: str) -> list[tuple[str, str]]:
# Simulate retrieving documents (e.g., from a vector database)
return [
(
"MLflow Tracing helps debug GenAI applications...",
"docs/mlflow/tracing_intro.md",
),
(
"Key components of a trace include spans...",
"docs/mlflow/tracing_datamodel.md",
),
("MLflow provides automatic instrumentation...", "docs/mlflow/auto_trace.md"),
]


@mlflow.trace(span_type=SpanType.RETRIEVER)
def retrieve_relevant_documents(query: str):
# Get documents from the search store
docs = search_store(query)

# Get the current active span (created by @mlflow.trace)
span = mlflow.get_current_active_span()

# Set the outputs of the span in accordance with the tracing schema
outputs = [
Document(page_content=doc, metadata={"doc_uri": uri}) for doc, uri in docs
]
span.set_outputs(outputs)

# Return the original format for downstream usage
return docs


# Example usage
user_query = "MLflow Tracing benefits"
retrieved_docs = retrieve_relevant_documents(user_query)