追踪跨度规范#
实验性功能
这是一个实验性功能,可能会随时更改。了解更多更多。
本文档概述了Prompt flow spans的设计,详细说明了跟踪的信息及其结构。
介绍#
你可能知道,span是跟踪系统的基本单位,代表在Prompt flow系统中捕获执行信息的单元。Span以父子关系嵌套在一起,并通过链接关系配对,为开发者和用户提供应用程序执行过程的全面视图。
通过遵守这些规范,我们确保跟踪系统的透明度和一致性。
用户界面解释捕获的跨度并以用户友好的方式呈现它们。理解跨度中定义的字段和合同对于有效利用Prompt flow或集成其组件至关重要。
OpenTelemetry Span 基础#
一个典型的 span 对象包含以下信息:
字段 |
描述 |
|---|---|
name |
跨度的名称 |
parent_id |
父级跨度ID(根跨度为空) |
上下文 |
|
start_time |
时间段的开始时间 |
end_time |
时间段的结束时间 |
状态 |
|
属性 |
|
事件 |
|
链接 |
提示流中的Span#
在Prompt flow中,我们定义了几种跨度类型,系统会自动在指定的属性和事件中创建包含执行信息的跨度。
这些span类型共享共同的属性和事件,我们称之为标准属性和事件。在深入探讨每种span类型的具体细节之前,让我们先探索这些共同的元素。
常见属性和事件#
属性#
Prompt flow 中的每个 span 都附带了一组标准属性,这些属性提供了关于 span 上下文和目的的基本信息。下表概述了这些属性:
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
框架 |
字符串 |
此属性指定记录跟踪的框架。对于我们的项目,此值始终设置为promptflow。 |
promptflow |
|
node_name |
string |
表示流程节点的名称。 |
chat |
|
span_type |
string |
指定span的类型,例如LLM或Flow。详情请参见this。 |
LLM |
|
line_run_id |
string |
在Prompt flow中执行运行的唯一标识符。 |
d23159d5-cae0-4de6-a175-295c715ce251 |
|
function |
string |
与跨度关联的函数。 |
search |
|
session_id |
string |
聊天会话的唯一标识符。 |
4ea1a462-7617-439f-a40c-12a8b93f51fb |
|
referenced.line_run_id |
string |
表示作为评估运行来源的线路运行ID。 |
f747f7b8-983c-4bf2-95db-0ec3e33d4fd1 |
|
batch_run_id |
string |
批处理模式下的批处理运行ID。 |
61daff70-80d5-4e79-a50b-11b38bb3d344 |
|
referenced.batch_run_id |
string |
记录评估流程运行的批次运行ID。 |
851b32cb-545c-421d-8e51-0a3ea66f0075 |
|
line_number |
int |
批处理运行中的行号,从0开始。 |
|
|
__computed__.cumulative_token_count.prompt |
int |
提示的子节点的累计令牌计数。[1] |
|
|
__computed__.cumulative_token_count.completion |
int |
完成响应的子节点的累计令牌计数。[1] |
|
|
__computed__.cumulative_token_count.total |
int |
提示和完成的总累积令牌计数。[1] |
|
|
[1]: 累计令牌计数会沿着跨度层次结构向上传播,确保每个跨度反映其范围内所有LLM执行的总令牌计数。
事件#
在Prompt flow中,由Prompt flow框架发出的事件遵循以下格式
事件必须具有属性
事件属性必须包含一个名为
payload的键,它指的是事件中携带的数据。事件属性 payload 必须是一个表示对象的 JSON 字符串。
事件 |
负载描述 |
负载示例 |
|
|---|---|---|---|
promptflow.function.inputs |
函数调用的输入 |
|
|
promptflow.function.output |
函数调用的输出 |
|
|
跨度类型规范#
在Prompt flow系统中,我们定义了几种不同的span类型,以适应各种执行单元。每种span类型都旨在捕获特定的执行信息,补充标准属性和事件。目前,我们的系统包括以下span类型:LLM、Function、LangChain、Flow、Embedding和Retrieval。
除了标准属性和事件外,每种跨度类型都拥有指定的字段,用于存储与其在系统中的角色相关的独特信息。这些专门的属性和事件确保所有相关数据都被细致地追踪并可用于分析。
大型语言模型#
LLM(大型语言模型)跨度捕获了从调用大型语言模型中获取的详细执行信息。
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
span_type |
string |
标识该span为LLM类型。 |
LLM |
|
llm.usage.total_tokens |
int |
使用的总令牌数,包括提示和响应。 |
|
|
llm.usage.prompt_tokens |
int |
LLM提示中使用的令牌数量。 |
|
|
llm.usage.completion_tokens |
int |
LLM响应中使用的令牌数量(完成)。 |
|
|
llm.response.model |
string |
指定生成响应的LLM。 |
gpt-4 |
|
事件 |
负载描述 |
负载示例 |
需求级别 |
|---|---|---|---|
promptflow.llm.generated_message |
捕获来自LLM调用的输出消息。 |
|
|
注意:OpenTelemetry 目前定义了几个与LLM相关的跨度属性和事件作为语义约定。我们计划在未来与这些约定保持一致。更多信息,请访问 Semantic Conventions for GenAI operations。
函数#
函数 span 是 Prompt flow 中的一个多功能默认 span,旨在捕获广泛的通用函数执行信息。
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
span_type |
string |
标识该span为函数类型。 |
Function |
|
事件 |
负载描述 |
负载示例 |
|
|---|---|---|---|
promptflow.prompt.template |
详细说明提示模板和变量信息。 |
|
|
[1]: 模板格式化是一个通过解析提示模板生成提示信息的过程,这个过程可能发生在调用LLM的函数内部。
流程#
Flow span 封装了 Prompt flow 中流程的执行细节。
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
span_type |
string |
将span指定为Flow类型。 |
Flow |
|
嵌入#
嵌入跨度专门用于记录Prompt flow中嵌入调用的详细信息。
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
span_type |
string |
表示该span为Embedding类型。 |
Embedding |
|
llm.usage.total_tokens |
int |
使用的总令牌数,提示和响应令牌的总和。 |
|
|
llm.usage.prompt_tokens |
int |
用于嵌入调用的提示中的令牌数量。 |
|
|
llm.usage.completion_tokens |
int |
嵌入调用响应中使用的令牌数量。 |
|
|
llm.response.model |
string |
标识用于生成嵌入的LLM模型。 |
text-embedding-ada-002 |
|
事件 |
负载描述 |
负载示例 |
|
|---|---|---|---|
promptflow.embedding.embeddings |
详细说明由调用生成的嵌入。 |
|
|
检索#
检索跨度类型专门设计用于封装Prompt flow中检索任务的执行细节。
属性 |
类型 |
描述 |
示例 |
|
|---|---|---|---|---|
span_type |
string |
将跨度标记为检索类型。 |
Retrieval |
|
事件 |
负载描述 |
负载示例 |
|
|---|---|---|---|
promptflow.retrieval.query |
捕获检索查询的文本。 |
|
|
promptflow.retrieval.documents |
详细列出与查询相关的检索文档列表。 |
|
|