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},視特殊情況也可以有其他類型的命名格式。
當工具執行表示將 Skill 載入到上下文中時,應設定 gen_ai.skill.* 相關欄位。常見情境包括 load_skill、read_skill 或類似含義的工具調用。
Attributes
|
AttributeKey |
Description |
類型 |
Example |
需求等級 |
|
|
操作類型 [1] |
string |
|
必須 |
|
|
操作二級類型 [2] |
string |
|
必須 |
|
|
工具 id |
string |
|
推薦 |
|
|
工具描述 |
string |
|
推薦 |
|
|
工具名稱 |
string |
推薦 |
|
|
|
工具類型 |
string |
|
推薦 |
|
|
GenAI Skill 的唯一標識 |
string |
|
載入 Skill 時有條件必須 |
|
|
GenAI Skill 名稱 |
string |
|
載入 Skill 時有條件必須 |
|
|
應用提供的 GenAI Skill 自由文本描述 |
string |
|
推薦 |
|
|
GenAI Skill 版本 |
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。