GenAI 代理和框架跨度语义约定
状态: 开发中
当前正在使用 此文档 v1.36.0(或之前版本)的 GenAI 应用程序正在使用此文档。
- 默认情况下,不应更改他们发出的 GenAI约定的版本。约定包括但不限于属性、指标、跨度和事件名称、跨度种类和度量单位。
- 应引入一个名为
OTEL_SEMCONV_STABILITY_OPT_IN的环境变量,该变量包含一个逗号分隔的类别特定值列表。该列表包括:gen_ai_latest_experimental- 发出最新的实验性 GenAI 约定版本(由仪器支持)并停止发出旧版本(v1.36.0 或更早版本)。- 默认行为是继续发出仪器之前发出的 GenAI 约定版本(1.34.0 或更早版本)。
此过渡计划将在 GenAI 约定被标记为稳定版本之前进行更新,以包含稳定版本。
生成式 AI 模型可以通过使用工具来访问实时信息或建议现实世界的操作来训练。例如,模型可以利用数据库检索工具来访问特定信息,例如客户的购买历史记录,以便生成量身定制的购物推荐。或者,根据用户的查询,模型可以进行各种 API 调用,以代表您将电子邮件响应发送给同事或完成财务交易。为此,模型不仅必须能够访问一组外部工具,还需要能够以自主的方式进行规划和执行任何任务。这种推理、逻辑和访问外部信息的组合都连接到生成式 AI 模型,从而引发了代理的概念。
本文档定义了此 白皮书定义的 GenAI 代理调用的语义约定。
它可能适用于 GenAI 框架在本地执行的代理操作。
GenAI 代理的语义约定扩展并覆盖了 Gen AI Spans 的语义约定。
Span
创建代理跨度
状态:
描述 GenAI 代理的创建,通常在处理远程代理服务时适用。
gen_ai.operation.name 应为 create_agent。
跨度名称应为 create_agent {gen_ai.agent.name}。特定 GenAI 系统和框架的语义约定可能指定不同的跨度名称格式。
**Span 类型**应为 CLIENT。
**Span 状态**应遵循 记录错误文档。
Attributes
| 键 | Stability | 需求级别 | Value Type | 描述 | Example Values |
|---|---|---|---|---|---|
gen_ai.operation.name | 必需 | 字符串 | 正在执行的操作的名称。[1] | chat;generate_content;text_completion | |
gen_ai.provider.name | 必需 | 字符串 | 由客户端或服务器仪器识别的生成式 AI 提供商。[2] | openai;gcp.gen_ai;gcp.vertex_ai | |
error.type | 如果操作以错误结束,则条件必需 | 字符串 | 描述操作结束的错误类别。[3] | timeout;java.net.UnknownHostException;server_certificate_invalid;500 | |
gen_ai.agent.description | 如果由应用程序提供,则条件必需。 | 字符串 | 由应用程序提供的 GenAI 代理的自由格式描述。 | 帮助解决数学问题;生成小说故事 | |
gen_ai.agent.id | 如果适用,则条件必需。 | 字符串 | GenAI 代理的唯一标识符。 | asst_5j66UpCpwteGg4YSxUnt7lPY | |
gen_ai.agent.name | 如果由应用程序提供,则条件必需。 | 字符串 | 由应用程序提供的 GenAI 代理的人类可读名称。 | 数学导师;小说作家 | |
gen_ai.request.model | 有条件必需 如果可用。 | 字符串 | 正在请求的 GenAI 模型的名称。[4] | gpt-4 | |
server.port | 如果设置了 server.address,则条件必需。 | int | GenAI 服务器端口。[5] | 80; 8080; 443 | |
server.address | 推荐 | 字符串 | GenAI 服务器地址。[6] | example.com;10.1.2.80;/tmp/my.sock | |
gen_ai.system_instructions | 选择加入 | any | 单独提供给 GenAI 模型的系统消息或指令,与聊天记录分开。 | [ { “type”: “text”, “content”: “You are an Agent that greet users, always use greetings tool to respond” } ]; [ { “type”: “text”, “content”: “You are a language translator." }, { “type”: “text”, “content”: “Your mission is to translate text in English to French." } ] |
[1] gen_ai.operation.name: 如果预定义值之一适用,但特定系统使用不同名称,则建议在特定 GenAI 系统的语义约定中记录它,并在仪器中使用系统特定的名称。如果未记录不同名称,仪器库应使用适用的预定义值。
[2] gen_ai.provider.name: 属性应根据仪器尽可能多的了解来设置,并且可能与实际的模型提供商不同。
通过 OpenAI REST API 和相应的客户端库可以访问包括 Azure OpenAI、Gemini 和 AI 托管平台在内的多个提供商,但它们可能会代理或托管来自不同提供商的模型。
gen_ai.request.model、gen_ai.response.model 和 server.address 属性可能有助于识别实际使用的系统。
gen_ai.provider.name 属性充当一个区分器,用于在 GenAI 语义约定中识别该提供商特定的 GenAI 遥测格式。它应与特定于提供商的属性和信号一致。例如,与 AWS Bedrock 相关的 GenAI 跨度、指标和事件应将 gen_ai.provider.name 设置为 aws.bedrock,并包含适用的 aws.bedrock.* 属性,并且不应包含 openai.* 属性。
[3] error.type: error.type 应匹配生成式 AI 提供商或客户端库返回的错误代码、发生的异常的规范名称或另一个低基数错误标识符。仪器应记录它们报告的错误列表。
[4] gen_ai.request.model: 正在请求的 GenAI 模型的名称。如果模型由供应商提供,则该值必须是所请求模型的确切名称。如果模型是经过微调的自定义模型,则该值应比已微调的基础模型具有更具体的名称。
[5] server.port: 从客户端观察并与中介通信时,server.port 应表示任何中介(例如代理)之后的服务器端口,如果可用。
[6] server.address: 从客户端观察并与中介通信时,server.address 应表示任何中介(例如代理)之后的服务器地址,如果可用。
error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
_OTHER | 当检测不到自定义值时使用的回退错误值。 |
gen_ai.operation.name 具有以下知名值列表。如果其中之一适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
chat | 聊天完成操作,例如 OpenAI Chat API | |
create_agent | 创建 GenAI 代理 | |
embeddings | 嵌入操作,例如 OpenAI 创建嵌入 API | |
execute_tool | 执行工具 | |
generate_content | 多模态内容生成操作,例如 Gemini 生成内容 | |
invoke_agent | 调用 GenAI 代理 | |
text_completion | 文本补全操作,例如 OpenAI Completions API (Legacy) |
gen_ai.provider.name 具有以下知名值列表。如果其中之一适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
anthropic | Anthropic | |
aws.bedrock | AWS Bedrock | |
azure.ai.inference | Azure AI Inference | |
azure.ai.openai | Azure OpenAI | |
cohere | Cohere | |
deepseek | DeepSeek | |
gcp.gemini | Gemini [7] | |
gcp.gen_ai | 任何 Google 生成式 AI 端点 [8] | |
gcp.vertex_ai | Vertex AI [9] | |
groq | Groq | |
ibm.watsonx.ai | IBM Watsonx AI | |
mistral_ai | Mistral AI | |
openai | OpenAI | |
perplexity | Perplexity | |
x_ai | xAI |
[7]: 访问 ‘generativelanguage.googleapis.com’ 端点时使用。也称为 AI Studio API。
[8]: 当无法确定特定后端时可能使用。
[9]: 访问 ‘aiplatform.googleapis.com’ 端点时使用。
调用代理跨度
状态:
描述 GenAI 代理调用。
gen_ai.operation.name 应为 invoke_agent。
跨度名称如果 gen_ai.agent.name 可用,则应为 invoke_agent {gen_ai.agent.name}。当 gen_ai.agent.name 不可用时,应为 invoke_agent。特定 GenAI 系统和框架的语义约定可能指定不同的跨度名称格式。
跨度种类应为 CLIENT,并且对于表示同一进程中代理调用的跨度,可以设置为 INTERNAL。当所仪器化的代理通常在与调用者不同的进程中运行,或者当代理调用通过仪器化的协议(如 HTTP)发生时,建议使用 CLIENT 种类。
不同代理场景的跨度种类示例
CLIENT:远程代理服务(例如,OpenAI Assistants API,AWS Bedrock Agents)INTERNAL:进程内代理(例如,LangChain 代理,CrewAI 代理)
**Span 状态**应遵循 记录错误文档。
Attributes
| 键 | Stability | 需求级别 | Value Type | 描述 | Example Values |
|---|---|---|---|---|---|
gen_ai.operation.name | 必需 | 字符串 | 正在执行的操作的名称。[1] | chat;generate_content;text_completion | |
gen_ai.provider.name | 必需 | 字符串 | 由客户端或服务器仪器识别的生成式 AI 提供商。[2] | openai;gcp.gen_ai;gcp.vertex_ai | |
error.type | 如果操作以错误结束,则条件必需 | 字符串 | 描述操作结束的错误类别。[3] | timeout;java.net.UnknownHostException;server_certificate_invalid;500 | |
gen_ai.agent.description | 如果可用,则条件必需 | 字符串 | 由应用程序提供的 GenAI 代理的自由格式描述。 | 帮助解决数学问题;生成小说故事 | |
gen_ai.agent.id | 如果适用,则条件必需。 | 字符串 | GenAI 代理的唯一标识符。 | asst_5j66UpCpwteGg4YSxUnt7lPY | |
gen_ai.agent.name | 如果可用,则条件必需 | 字符串 | 由应用程序提供的 GenAI 代理的人类可读名称。 | 数学导师;小说作家 | |
gen_ai.conversation.id | 如果可用,则条件必需 | 字符串 | 对话(会话、线程)的唯一标识符,用于在此对话中存储和关联消息。[4] | conv_5j66UpCpwteGg4YSxUnt7lPY | |
gen_ai.data_source.id | 如果适用,则条件必需。 | 字符串 | 数据源标识符。[5] | H7STPQYOND | |
gen_ai.output.type | 有条件地必需 [6] | 字符串 | 表示客户端请求的内容类型。[7] | text;json;image | |
gen_ai.request.choice.count | 如果在请求中可用且不等于 1,则条件必需 | int | 目标候选补全数量。 | 3 | |
gen_ai.request.model | 有条件必需 如果可用。 | 字符串 | 正在请求的 GenAI 模型的名称。[8] | gpt-4 | |
gen_ai.request.seed | 如果适用且请求包含种子,则条件必需 | int | 具有相同种子值的请求更有可能返回相同的结果。 | 100 | |
server.port | 如果设置了 server.address,则条件必需。 | int | GenAI 服务器端口。[9] | 80; 8080; 443 | |
gen_ai.request.frequency_penalty | 推荐 | double | GenAI 请求的频率惩罚设置。 | 0.1 | |
gen_ai.request.max_tokens | 推荐 | int | 模型为请求生成的最大令牌数。 | 100 | |
gen_ai.request.presence_penalty | 推荐 | double | GenAI 请求的存在惩罚设置。 | 0.1 | |
gen_ai.request.stop_sequences | 推荐 | string[] | 模型将用于停止生成更多令牌的序列列表。 | ["forest", "lived"] | |
gen_ai.request.temperature | 推荐 | double | GenAI 请求的温度设置。 | 0.0 | |
gen_ai.request.top_p | 推荐 | double | GenAI 请求的 top_p 采样设置。 | 1.0 | |
gen_ai.response.finish_reasons | 推荐 | string[] | 模型停止生成令牌的原因数组,对应于收到的每个生成。 | ["stop"];["stop", "length"] | |
gen_ai.response.id | 推荐 | 字符串 | 补全的唯一标识符。 | chatcmpl-123 | |
gen_ai.response.model | 推荐 | 字符串 | 生成响应的模型名称。[10] | gpt-4-0613 | |
gen_ai.usage.input_tokens | 推荐 | int | GenAI 输入(提示)使用的令牌数。 | 100 | |
gen_ai.usage.output_tokens | 推荐 | int | GenAI 响应(补全)使用的令牌数。 | 180 | |
server.address | 当跨度种类为 CLIENT 时,推荐。 | 字符串 | GenAI 服务器地址。[11] | example.com;10.1.2.80;/tmp/my.sock | |
gen_ai.input.messages | 选择加入 | any | 作为输入提供给模型的聊天记录。[12] | [ { “role”: “user”, “parts”: [ { “type”: “text”, “content”: “Weather in Paris?" } ] }, { “role”: “assistant”, “parts”: [ { “type”: “tool_call”, “id”: “call_VSPygqKTWdrhaFErNvMV18Yl”, “name”: “get_weather”, “arguments”: { “location”: “Paris” } } ] }, { “role”: “tool”, “parts”: [ { “type”: “tool_call_response”, “id”: " call_VSPygqKTWdrhaFErNvMV18Yl”, “result”: “rainy, 57°F” } ] } ] | |
gen_ai.output.messages | 选择加入 | any | 模型返回的消息,每条消息代表一个特定的模型响应(选择、候选)。[13] | [ { “role”: “assistant”, “parts”: [ { “type”: “text”, “content”: “The weather in Paris is currently rainy with a temperature of 57°F." } ], “finish_reason”: “stop” } ] | |
gen_ai.system_instructions | 选择加入 | any | 单独提供给 GenAI 模型的系统消息或指令,与聊天记录分开。[14] | [ { “type”: “text”, “content”: “You are an Agent that greet users, always use greetings tool to respond” } ]; [ { “type”: “text”, “content”: “You are a language translator." }, { “type”: “text”, “content”: “Your mission is to translate text in English to French." } ] | |
gen_ai.tool.definitions | 选择加入 | any | 可供 GenAI 代理或模型使用的源系统工具定义列表。[15] | [ { “type”: “function”, “name”: “get_current_weather”, “description”: “Get the current weather in a given location”, “parameters”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “The city and state, e.g. San Francisco, CA” }, “unit”: { “type”: “string”, “enum”: [ “celsius”, “fahrenheit” ] } }, “required”: [ “location”, “unit” ] } } ] |
[1] gen_ai.operation.name: 如果预定义值之一适用,但特定系统使用不同名称,则建议在特定 GenAI 系统的语义约定中记录它,并在仪器中使用系统特定的名称。如果未记录不同名称,仪器库应使用适用的预定义值。
[2] gen_ai.provider.name: 属性应根据仪器尽可能多的了解来设置,并且可能与实际的模型提供商不同。
通过 OpenAI REST API 和相应的客户端库可以访问包括 Azure OpenAI、Gemini 和 AI 托管平台在内的多个提供商,但它们可能会代理或托管来自不同提供商的模型。
gen_ai.request.model、gen_ai.response.model 和 server.address 属性可能有助于识别实际使用的系统。
gen_ai.provider.name 属性充当一个区分器,用于在 GenAI 语义约定中识别该提供商特定的 GenAI 遥测格式。它应与特定于提供商的属性和信号一致。例如,与 AWS Bedrock 相关的 GenAI 跨度、指标和事件应将 gen_ai.provider.name 设置为 aws.bedrock,并包含适用的 aws.bedrock.* 属性,并且不应包含 openai.* 属性。
[3] error.type: error.type 应匹配生成式 AI 提供商或客户端库返回的错误代码、发生的异常的规范名称或另一个低基数错误标识符。仪器应记录它们报告的错误列表。
[4] gen_ai.conversation.id: 仪器应在可轻松获得给定操作的对话 ID 时填充它,例如
当被仪器化的客户端框架管理对话历史时(请参阅 LlamaIndex chat store)
当仪器化维护后端会话的 GenAI 客户端库时(请参阅 AWS Bedrock agent sessions,OpenAI Assistant threads)
管理对话历史的应用程序开发人员可以添加对话 ID 到 GenAI 和其他跨度或日志,使用仪器库提供的自定义跨度或日志记录处理器或钩子。
[5] gen_ai.data_source.id: 数据源由 AI 代理和 RAG 应用程序用于存储基础数据。数据源可以是外部数据库、对象存储、文档集合、网站或 GenAI 代理或应用程序使用的任何其他存储系统。gen_ai.data_source.id 应匹配 GenAI 系统使用的标识符,而不是外部存储(如数据库或对象存储)的特定名称。引用 gen_ai.data_source.id 的语义约定也可能利用其他属性,例如 db.*,以进一步识别和描述数据源。
[6] gen_ai.output.type: 适用时,如果请求包含输出格式。
[7] gen_ai.output.type: 当客户端请求特定类型输出时,应使用此属性。模型可能返回零个或多个此类型的输出。此属性指定输出模态,而不是实际输出格式。例如,如果请求了一个图像,实际输出可能是指向图像文件的 URL。未来可以在 gen_ai.output.{type}.* 属性中记录其他输出格式详细信息。
[8] gen_ai.request.model: 正在请求的 GenAI 模型的名称。如果模型由供应商提供,则该值必须是所请求模型的确切名称。如果模型是经过微调的自定义模型,则该值应比已微调的基础模型具有更具体的名称。
[9] server.port: 从客户端观察并与中介通信时,server.port 应表示任何中介(例如代理)之后的服务器端口,如果可用。
[10] gen_ai.response.model: 如果可用。提供响应的模型名称。如果模型由供应商提供,则该值必须是实际使用的模型的确切名称。如果模型是经过微调的自定义模型,则该值应比已微调的基础模型具有更具体的名称。
[11] server.address: 从客户端观察并与中介通信时,server.address 应表示任何中介(例如代理)之后的服务器地址,如果可用。
[12] gen_ai.input.messages: 仪器必须遵循 Input messages JSON schema。当属性记录在事件上时,它必须以结构化形式记录。当记录在跨度上时,如果不支持结构化格式,它可以被记录为 JSON 字符串,否则应以结构化形式记录。
消息必须按发送给模型的顺序提供。仪器可以提供一种方法供用户过滤或截断输入消息。
此属性很可能包含敏感信息,包括用户/PII 数据。
有关更多详细信息,请参阅 在属性上记录内容 部分。
[13] gen_ai.output.messages: 仪器必须遵循 Output messages JSON schema
每条消息代表模型生成的单个输出选择/候选。每条消息恰好对应一个生成(选择/候选),反之亦然 - 一个选择不能跨越多条消息,或者一条消息不能包含来自多个选择的部分。
当属性记录在事件上时,它必须以结构化形式记录。当记录在跨度上时,如果不支持结构化格式,它可以被记录为 JSON 字符串,否则应以结构化形式记录。
仪器可以提供一种方法供用户过滤或截断输出消息。
此属性很可能包含敏感信息,包括用户/PII 数据。
有关更多详细信息,请参阅 在属性上记录内容 部分。
[14] gen_ai.system_instructions: 当相应的提供商或 API 允许将系统指令或消息与聊天记录分开提供时,应使用此属性。
作为聊天记录一部分的指令应记录在 gen_ai.input.messages 属性中,而不是此处。
仪器必须遵循 System instructions JSON schema。
当记录在跨度上时,如果不支持结构化格式,它可以被记录为 JSON 字符串,否则应以结构化形式记录。
仪器可以提供一种方法供用户过滤或截断系统指令。
此属性可能包含敏感信息。
有关更多详细信息,请参阅 在属性上记录内容 部分。
[15] gen_ai.tool.definitions: 此属性的值与源系统工具定义格式匹配。
预计它是一个对象数组,其中每个对象代表一个工具定义。如果仪器可用序列化字符串,仪器应尽最大努力将其反序列化为数组。当记录在跨度上时,如果不支持结构化格式,它可以被记录为 JSON 字符串,否则应以结构化形式记录。
由于此属性可能很大,因此不建议默认填充它。仪器可以提供一种启用填充此属性的方法。
error.type 具有以下已知值列表。如果其中一个适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
_OTHER | 当检测不到自定义值时使用的回退错误值。 |
gen_ai.operation.name 具有以下知名值列表。如果其中之一适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
chat | 聊天完成操作,例如 OpenAI Chat API | |
create_agent | 创建 GenAI 代理 | |
embeddings | 嵌入操作,例如 OpenAI 创建嵌入 API | |
execute_tool | 执行工具 | |
generate_content | 多模态内容生成操作,例如 Gemini 生成内容 | |
invoke_agent | 调用 GenAI 代理 | |
text_completion | 文本补全操作,例如 OpenAI Completions API (Legacy) |
gen_ai.output.type 具有以下知名值列表。如果其中之一适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
image | Image | |
json | 具有已知或未知架构的 JSON 对象 | |
speech | Speech | |
text | 纯文本 |
gen_ai.provider.name 具有以下知名值列表。如果其中之一适用,则必须使用相应的值;否则,可以使用自定义值。
| 值 | 描述 | Stability |
|---|---|---|
anthropic | Anthropic | |
aws.bedrock | AWS Bedrock | |
azure.ai.inference | Azure AI Inference | |
azure.ai.openai | Azure OpenAI | |
cohere | Cohere | |
deepseek | DeepSeek | |
gcp.gemini | Gemini [16] | |
gcp.gen_ai | 任何 Google 生成式 AI 端点 [17] | |
gcp.vertex_ai | Vertex AI [18] | |
groq | Groq | |
ibm.watsonx.ai | IBM Watsonx AI | |
mistral_ai | Mistral AI | |
openai | OpenAI | |
perplexity | Perplexity | |
x_ai | xAI |
[16]: 访问 ‘generativelanguage.googleapis.com’ 端点时使用。也称为 AI Studio API。
[17]: 当无法确定特定后端时可能使用。
[18]: 访问 ‘aiplatform.googleapis.com’ 端点时使用。
执行工具跨度
如果您在代理中使用了一些工具,请参阅 Execute Tool Span。