LLM Trace欄位是阿里雲參考OpenTelemetry標準以及大語言模型應用領域概念制定的,通過對Attributes、Resource、Event擴充用於描述LLM應用調用鏈資料的語義,能夠反映LLM的輸入輸出請求、令牌消耗等關鍵操作。它們為Completion、Chat、RAG、Agent、Tool等情境提供了豐富的、語境相關的語義資料,以便於資料跟蹤和上報。
此語義欄位將隨著社區的發展而不斷更新和最佳化。若應用為 Python 應用,需自行手動採集可觀測資料,您可以使用 loongsuite-util-genai 組件來協助您完成資料的採集接入。詳情參見 README。
Span一級欄位定義參考OpenTelemetry開源標準,阿里雲Managed Service for OpenTelemetry底層儲存的Trace一級欄位詳細說明,請參見調用鏈分析參數說明。
LLM相關的SpanKind是一個Attribute,不同於OpenTelemetry中Trace定義的Span kind。本語義規範在 OpenTelemetry GenAI 語義規範的基礎上進行擴充,該規範在修改和完善當中,可能會在後續的維護中發生修改。
公用部分
Attributes
AttributeKey | Description | 類型 | 樣本值 | 需求等級 |
| 會話ID | string |
| 有條件時必須 |
| 應用的C端使用者標識 | string |
| 有條件時必須 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 使用的架構類型 | string |
| 有條件時必須 |
[1]gen_ai.span.kind: 與gen_ai.operation.name的映射關係如下:
|
| Description |
RETRIEVER |
| 文檔召回 |
LLM |
| 模型調用 |
EMBEDDING |
| 嵌入 |
TOOL |
| 工具調用 |
AGENT |
| 智能體調用 |
RERANKER | - | 重排序調用 |
CHAIN | - | 鏈(調用單元) |
TASK | - | 任務調用 |
ENTRY | - | 入口調用標識 |
STEP | - | ReAct輪次標識 |
[2]gen_ai.operation.name: 操作二級類型,應當來自於以下某個枚舉,或者自訂一個其他的值:
Value | Description |
| 對話補全操作 |
| 建立 GenAI 智能體操作 |
| 詞嵌入操作 |
| 調用工具操作 |
| 多模態內容產生操作 |
| 調用 GenAI 智能體操作 |
| 文檔召回操作 |
| 文本補全操作 |
Resources
ResourceKey | Description | 類型 | 樣本值 | 需求等級 |
| 應用程式名稱 | string |
| 必須 |
| CloudMonitorWorkspace | string |
| 有條件時必須 |
| CloudMonitor服務ID | string |
| 有條件時必須 |
| 應用來源 | string |
| 有條件時必須 |
| 應用特徵 | string |
| 必須 說明
|
Chain
Chain是一種將LLM和其他多個元件連線在一起的工具,以實現複雜的任務,可能包含Retrieval、Embedding、LLM調用、還可以嵌套Chain等。
Span 命名應該為 chain {chain_name},如果無法擷取到 chain_name,則命名為 chain。
OpenTelemetry 社區尚未具備該類型 Span 的語義規範。當前 Chain Span 僅用於 LangChain 架構。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 | string |
| 有條件時必須 |
| 輸入內容 | string |
| 推薦 |
| 返回內容 | string |
| 推薦 |
| 首包延遲 [2] | integer | 1000000 | 推薦 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Chain中取值必須為 CHAIN。
[2]gen_ai.user.time_to_first_token: 代表一次提問的整體響應首包耗時,從服務端擷取的使用者請求到首包返回的時間,單位納秒。
Retriever
Retriever一般表示訪問向量儲存或者資料庫擷取資料,一般用於補充上下文內容提升LLM的響應的準確性以及效率。
gen_ai.operation.name 應該為 retrieval。當 gen_ai.operation.name 為retrieval時,可以將 gen_ai.span.kind 推斷為 RETRIEVER。
Span 命名應該為 {gen_ai.operation.name} {gen_ai.data_source.id},視特殊情況也可以有其他類型的命名格式。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 資料來源唯一標識 [3] | string |
| 有條件時必須 |
| 大模型的供應商 | string |
| 有條件時必須 |
| 請求中指定的模型名 | string |
| 有條件時必須 |
| 請求中指定的topK | float |
| 推薦 |
| 召回的文檔列表 [4] | string |
| 可選 |
| 檢索內容短句 | string |
| 可選 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Retriever中取值必須為 RETRIEVER。
[2]gen_ai.operation.name: 操作二級類型。
[3]gen_ai.data_source.id: 資料來源唯一ID,AI Agent 或 RAG 應用依賴的資料來源,可以是外部資料庫、Object Storage Service、文檔集、網站或其他儲存系統。
[4]gen_ai.retrieval.documents: 用於記錄召回的文檔列表。每個文檔對象至少應包含以下屬性:id(字串):文檔的唯一識別碼;score(雙精確度浮點數):文檔的相關性得分。
Reranker
Reranker針對輸入的多個文檔結合提問內容判斷相關性進行排序處理,可能返回TopK的文檔作為LLM。
Span 命名應該為 rerank {reranker.model_name},如果無法擷取到 reranker.model_name,則命名為 rerank。
OpenTelemetry 社區尚未具備該類型 Span 的語義規範。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| Reranker請求的入參 | string |
| 可選 |
| Reranker所用的模型名 | string |
| 可選 |
| Reranker後的排名 | integer |
| 可選 |
| 輸出文檔相關的中繼資料[2] | string |
| 必須 |
| 輸出文檔相關的中繼資料[3] | string |
| 必須 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Reranker中取值必須為 RERANKER。
[2]reranker.output_document: 重排序輸入文檔,JSON數組結構,metadata為文檔的基本資料,包含路徑,檔案名稱以及來源等。
[3]reranker.output_document: 重排序輸出文檔,JSON數組結構,metadata為文檔的基本資料,包含路徑,檔案名稱以及來源等。
LLM
LLM標識大模型的調用/推理過程,例如基於SDK或OpenAPI請求不同的大模型進行推理或者文本產生等情境。
gen_ai.operation.name 應該為 chat,generate_content,text_completion之一。當 gen_ai.operation.name 為chat,generate_content,text_completion時,可以將 gen_ai.span.kind 推斷為 LLM。
Span 命名應該為 {gen_ai.operation.name} {gen_ai.request.model},視特殊情況也可以有其他類型的命名格式。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 大模型的供應商 | string |
| 必須 |
| 對話的唯一ID [3] | string |
| 有條件時必須 |
| LLM請求中指定的輸出類型 [4] | string |
| 有條件時必須 |
| LLM請求中希望獲得的候選產生數量 | int |
| 有條件且不為1時必須 |
| LLM請求中指定的模型名 | string |
| 必須 |
| LLM請求中指定的seed | string |
| 有條件時必須 |
| LLM請求中設定的頻率懲罰 | float |
| 推薦 |
| LLM請求中指定的最大token數 | integer |
| 推薦 |
| LLM請求中設定的存在性懲罰 | float |
| 推薦 |
| LLM請求中指定的溫度 | float |
| 推薦 |
| LLM請求中指定的topP | float |
| 推薦 |
| LLM請求中指定的topK | float |
| 推薦 |
| LLM的終止序列 | string[] |
| 推薦 |
| LLM產生的唯一id | string |
| 推薦 |
| LLM產生所使用的模型名 | string |
| 推薦 |
| LLM終止產生的原因 | string[] |
| 推薦 |
| 流式響應情境下的大模型自身的首包響應耗時 [5] | integer |
| 推薦 |
| 推理模型的推理時間 [6] | integer |
| 推薦 |
| 輸入使用的token數 | integer |
| 推薦 |
| 輸出使用的token數 | integer |
| 推薦 |
| 使用的總token數 | integer |
| 推薦 |
| 寫入模型供應商緩衝中的token數 [7] | integer |
| 推薦 |
| 從模型供應商緩衝中讀取出的token數 [8] | integer |
| 推薦 |
| 模型輸入內容 [9] | string |
| 可選 |
| 模型輸出內容 [10] | string |
| 可選 |
| system提示詞的內容 [11] | string |
| 可選 |
| 工具定義列表 [12] | string |
| 可選 |
| LLM推理的Prefill時間,單位納秒 | integer |
| 推薦 |
| LLM推理的Decode時間,單位納秒 | integer |
| 推薦 |
| LLM推理的推理時間,等於Prefill和Decode時間的和,單位納秒 | integer |
| 推薦 |
| LLM輸入內容中涉及的多模態資料 [13] | string[] |
| 推薦 |
| LLM輸出內容中涉及的多模態資料 [14] | string[] |
| 推薦 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,在LLM中取值必須為 LLM。
[2]gen_ai.operation.name: 操作二級類型。
[3]gen_ai.conversation.id: 會話的唯一ID,當埋點可以比較方便地擷取會話的ID時應該採集。
[4]gen_ai.output.type: 當可以擷取並且請求指定了類型(如指定了output format)時應該採集。取值應屬於以下枚舉,或自訂一個其他的值:
Value | Description |
| 圖片 |
| 具備一定格式的 JSON 對象 |
| 語音 |
| 純文字 |
[5]gen_ai.user.time_to_first_token: 代表一次提問的整體響應首包耗時,從服務端擷取的使用者請求到首包返回的時間,單位納秒。
[6]gen_ai.response.reasoning_time: 代表響應reasoning過程的持續時間長度,單位毫秒。
[7]gen_ai.usage.cache_creation.input_tokens:該屬性的值應該已經被包含在gen_ai.usage.input_tokens中。
[8]gen_ai.usage.cache_read.input_tokens:該屬性的值應該已經被包含在gen_ai.usage.input_tokens中。
[9]gen_ai.input.messages: 用於記錄LLM調用的輸入內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.input.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[10]gen_ai.output.messages: 用於記錄模型的輸出內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.output.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[11]gen_ai.system_instructions: 用於單獨記錄system提示詞內容/system指令內容。如果system提示詞/system指令內容可以單獨擷取,則應該用該欄位記錄;如果system提示詞/system指令內容是模型調用的一部分,應該記錄在gen_ai.input.messages屬性中。需遵循gen_ai.system_instructions.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[12]gen_ai.tool.definitions: 用於記錄請求大模型時攜帶的工具定義。該屬性可能會非常大,採集時預設可以僅採集"type"和"name"兩個欄位。其餘欄位僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[13]gen_ai.input.multimodal_metadata: 用於匯總記錄模型在輸入內容中涉及的多模態資料,僅包含UriPart訊息。需遵循gen_ai.input.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[14]gen_ai.output.multimodal_metadata: 用於匯總記錄模型在輸出內容中涉及的多模態資料,僅包含UriPart訊息。需遵循gen_ai.output.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
記錄指令、輸入和輸出
使用者輸入和模型響應可以不記錄、記錄在 span 的 attributes 中或者作為 events(即 logs)記錄下來。詳情請參考控制 LLM 應用對話歷史採集行為。
Embedding
Embedding標識一次嵌入處理,例如針對文本嵌入大模型的操作,後續可以根據相似性查詢最佳化問題。
gen_ai.operation.name 應該為 embeddings。當 gen_ai.operation.name 為embeddings時,可以將 gen_ai.span.kind 推斷為 EMBEDDING。
Span 命名應該為 {gen_ai.operation.name} {gen_ai.request.model},視特殊情況也可以有其他類型的命名格式。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 大模型的供應商 | string |
| 必須 |
| 請求中指定的模型名 | string |
| 有條件時必須 |
| Embedding操作所應具備的維度數 | integer |
| 推薦 |
| 嵌入操作中請求的編碼格式 | string[] |
| 推薦 |
| 輸入文本的token消耗 | integer |
| 可選 |
| Embedding的token總消耗 | integer |
| 可選 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Embedding中取值必須為 EMBEDDING。
[2]gen_ai.operation.name: 操作二級類型。
Tool
Tool標識對外部工具的調用,例如可能調用計算機或者請求天氣API擷取最新的天氣情況。
gen_ai.operation.name 應該為 execute_tool。當 gen_ai.operation.name 為execute_tool時,可以將 gen_ai.span.kind 推斷為 TOOL。
Span 命名應該為 {gen_ai.operation.name} {gen_ai.tool.name},視特殊情況也可以有其他類型的命名格式。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 工具 id | string |
| 推薦 |
| 工具描述 | string |
| 推薦 |
| 工具名稱 | string | 推薦 | |
| 工具類型 | string |
| 推薦 |
| 工具調用入參 [2] | string |
| 可選 |
| 工具調用傳回值 [3] | string |
| 可選 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Tool中取值必須為 TOOL。
[2]gen_ai.tool.call.arguments: 工具調用入參,為一個 json 字串。 僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[3]gen_ai.tool.call.result: 工具調用傳回值,為一個 json 字串。 僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
Agent
Agent表示智能體情境,一種更複雜的CHAIN,需要基於大模型的推理結果決策執行下一步,例如可能涉及到LLM以及Tool的多次調用,一步步決策得出最終答案。
gen_ai.operation.name 應該為 invoke_agent,create_agent之一。當 gen_ai.operation.name 為invoke_agent,create_agent時,可以將 gen_ai.span.kind 推斷為 AGENT。
Span 命名應該為 {gen_ai.operation.name} {gen_ai.agent.name},視特殊情況也可以有其他類型的命名格式。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 [2] | string |
| 必須 |
| 對話的唯一ID [3] | string |
| 有條件時必須 |
| Agent描述 | string |
| 有條件時必須 |
| Agent唯一標識 | string |
| 有條件時必須 |
| Agent名稱 | string |
| 有條件時必須 |
| 資料來源唯一標識 [4] | string |
| 有條件時必須 |
| 輸入使用的token數 | integer |
| 推薦 |
| 輸出使用的token數 | integer |
| 推薦 |
| 使用的總token數 | integer |
| 推薦 |
| 寫入模型供應商緩衝中的token數 [5] | integer |
| 推薦 |
| 從模型供應商緩衝中讀取出的token數 [6] | integer |
| 推薦 |
| 模型輸入內容 [7] | string |
| 可選 |
| 模型輸出內容 [8] | string |
| 可選 |
| system提示詞的內容 [9] | string |
| 可選 |
| 工具定義列表 [10] | string |
| 可選 |
| Agent的首包響應耗時 | integer |
| 推薦 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Agent中取值必須為 AGENT。
[2]gen_ai.operation.name: 操作二級類型。
[3]gen_ai.conversation.id: 會話的唯一ID,當埋點可以比較方便地擷取會話的ID時應該採集。
[4]gen_ai.data_source.id: 資料來源唯一ID,AI Agent 或 RAG 應用依賴的資料來源,可以是外部資料庫、Object Storage Service、文檔集、網站或其他儲存系統。
[5]gen_ai.usage.cache_creation.input_tokens:該屬性的值應該已經被包含在gen_ai.usage.input_tokens中。
[6]gen_ai.usage.cache_read.input_tokens:該屬性的值應該已經被包含在gen_ai.usage.input_tokens中。
[7]gen_ai.input.messages: 用於記錄LLM調用的輸入內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.input.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[8]gen_ai.output.messages: 用於記錄模型的輸出內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.output.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[9]gen_ai.system_instructions: 用於單獨記錄system提示詞內容/system指令內容。如果system提示詞/system指令內容可以單獨擷取,則應該用該欄位記錄;如果system提示詞/system指令內容是模型調用的一部分,應該記錄在gen_ai.input.messages屬性中。需遵循gen_ai.system_instructions.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[10]gen_ai.tool.definitions: 用於記錄請求大模型時攜帶的工具定義。該屬性可能會非常大,採集時預設可以僅採集"type"和"name"兩個欄位。其餘欄位僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
Task
Task標識一次內部自訂方法,例如可能調用本地的某個function等應用自訂的邏輯。
Span 命名應該為 run_task {gen_ai.task.name},視特殊情況也可以有其他類型的命名格式。
OpenTelemetry 社區尚未具備該類型 Span 的語義規範,因此 gen_ai.operation.name 可能還會有變化。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 | string |
| 必須 |
| 輸入參數 | string |
| 可選 |
| 輸入MimeType | string |
| 可選 |
| 輸出MimeType | string |
| 可選 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Task中取值必須為 TASK。
Entry
Entry標識一次對AI應用系統的調用入口。
Span 命名應該為 enter_ai_application_system,視特殊情況也可以有其他類型的命名格式。
OpenTelemetry 社區尚未具備該類型 Span 的語義規範,因此 gen_ai.operation.name 可能還會有變化。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 | string |
| 推薦 |
| 會話ID | string |
| 有條件時必須 |
| 應用的C端使用者標識 | string |
| 有條件時必須 |
| 模型輸入內容 [2] | string |
| 可選 |
| 模型輸出內容 [3] | string |
| 可選 |
| 流式響應情境下的首包響應耗時 [4] | integer |
| 推薦 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,Entry中取值必須為 ENTRY。
[2]gen_ai.input.messages: 用於記錄LLM調用的輸入內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.input.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[3]gen_ai.output.messages: 用於記錄模型的輸出內容,訊息必須按照發送給模型或智能體的順序提供。需遵循gen_ai.output.messages.json。
僅在 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT 開關開啟的情況下採集。該開關預設開啟。
[4]gen_ai.response.time_to_first_token: 代表一次提問的整體響應首包耗時,從服務端擷取的使用者請求到首包返回的時間,單位納秒。
ReAct Step
Step調用標識Agent的一次Reasoning-Acting迭代的過程。
Span 命名應該為 react step,視特殊情況也可以有其他類型的命名格式。
OpenTelemetry 社區尚未具備該類型 Span 的語義規範,因此 gen_ai.operation.name 可能還會有變化。
Attributes
AttributeKey | Description | 類型 | Example | 需求等級 |
| 操作類型 [1] | string |
| 必須 |
| 操作二級類型 | string |
| 推薦 |
| 本輪ReAct結束的原因 | string |
| 推薦 |
| 本輪ReAct的輪次號 [2] | integer |
| 推薦 |
[1]gen_ai.span.kind: 大模型spanKind專用枚舉,ReAct Step中取值必須為 STEP。
[2]gen_ai.react.round: ReAct的輪次號建議從1開始計數,每次迭代自增1。