全部產品
Search
文件中心

Cloud Monitor:OT-Trace 資料治理

更新時間:May 01, 2026

OT-Trace 資料治理模板從 OT-Trace 資料中按 traceId 組裝完整對話,經三級去重、語義聚類、多樣性採樣、AI 評估和標註,實現 Trace 層級的 Agent 資料全鏈路治理。

業務情境

AI Agent 在運行過程中產生海量對話資料,直接使用存在大量重複和雜訊。本模板實現 Trace 層級的完整資料治理鏈路,覆蓋從原始 Span 資料到高品質標註資料集的全流程。

主要治理能力:

  • 資料群組裝:將離散 Span 按 traceId 彙總為完整對話寬表,每行代表一條完整 Trace。

  • 三級去重:精確去重、近似去重、語義去重逐級清洗重複資料,大幅降低資料量。

  • 多樣性採樣:語義聚類 + 分組採樣,確保樣本覆蓋多種情境。

  • AI 評估:對採樣資料進行多維度品質評分。

  • AI 標註:自動標註任務類型、複雜度、業務領域等標籤。

Pipeline 流程

本模板的 Pipeline 由 4 個階段、12 個節點群組成,完整運算元鏈為:where > extend > make-instance > extend > where > dedup-exact > dedup-fuzzy > dedup-semantic > semantic-cluster > sample > llm-call x 2。

Phase 1:資料群組裝

將 OT-Trace 中的離散 Span 組裝為完整的 Trace 級寬表。

順序

節點

說明

1

where

過濾出包含gen_ai.span.kind屬性的有效Span,排除非AI相關資料。

2

extend

按 Span Kind(ENTRY、LLM、TOOL、AGENT)預先處理欄位,提取使用者輸入、模型資訊、Token 用量、工具調用等結構化資料。

3

make-instance

traceid彙總所有Span,產出一行一條完整Trace的寬表,包含會話ID、使用者輸入、模型列表、Token匯總、工具鏈和執行過程等欄位。

4

extend

派生統計指標(總 Token 數、Span 數、LLM 調用次數、工具調用次數、耗時毫秒),並提取使用者查詢文本和完整對話全文。

5

where

過濾出包含有效使用者輸入的 Trace,排除缺少使用者查詢的空記錄。

Phase 2:三級去重

遞進式去重:精確去重、近似去重、語義去重逐級清洗,大幅降低資料量。

順序

節點

說明

6

dedup-exact

基於SimHash完全符合,去除user_query完全相同的記錄。

7

dedup-fuzzy

基於SimHash海明距離,去除user_query高度相似的記錄。預設閾值為3。

8

dedup-semantic

基於 Embedding 向量距離,去除語義含義相似的記錄。預設閾值為 0.1。

Phase 3:多樣性採樣

對去重後的資料進行語義聚類和分組採樣,確保產出資料覆蓋多種情境。

順序

節點

說明

9

semantic-cluster

複用語義去重階段產生的__dedup_emb向量,將資料聚為20個語義簇。

10

sample

__cluster_id分組,每簇採樣3條,確保樣本多樣性。

Phase 4:AI處理

對採樣後的代表性資料進行AI 品質評估和情境標註。

順序

節點

說明

11

llm-call(評估)

使用Prompt模板@eval/trace-eval-prompt.md,基於user_queryprocess_chainfull_text進行多維度品質評估,結果以JSON格式存入eval列。

12

llm-call(標註)

使用qwen-plus模型和Prompt模板@anno/trace-label-prompt.md,基於user_queryprocess_chain進行情境標註,結果以JSON格式存入anno列。

多維品質評估Prompt模板

你是一位專業的 AI Agent 對話品質評估專家,擅長從完整 Trace 視角評估 Agent 的端到端執行效果。

請根據以下評估維度,對這次 Agent 執行進行全面評估:

評估維度:

需求理解: Agent 是否準確理解了使用者的核心訴求?是否遺漏關鍵約束或越界推斷?(0-5分)
執行策略: Agent 的工具調用鏈是否合理高效?是否存在冗餘調用或遺漏關鍵步驟?(0-5分)
響應品質: 最終輸出是否準確、完整地解決了使用者問題?資訊是否有價值?(0-5分)
資源效率: Token 消耗是否合理?LLM 調用次數與任務複雜度是否匹配?(0-5分)
錯誤處理: 執行過程中是否有異常?異常處理是否得當?(0-5分)
評估參考:

單次對話 Token 消耗 > 50000 需要特別關注效率
工具調用次數 > 10 需要評估是否存在冗餘迴圈
有 error span 需重點檢查錯誤處理策略
現在請評估以下 Agent 執行 Trace:

使用者輸入:{{user_query}} 執行過程:{{process_chain}} 最終輸出摘要:{{full_text}}

請輸出JSON格式: { “需求理解”: {“score”: 分數, “reason”: “簡短理由”}, “執行策略”: {“score”: 分數, “reason”: “簡短理由”}, “響應品質”: {“score”: 分數, “reason”: “簡短理由”}, “資源效率”: {“score”: 分數, “reason”: “簡短理由”}, “錯誤處理”: {“score”: 分數, “reason”: “簡短理由”}, “overall_score”: 綜合分數, “quality_tier”: “A/B/C/D 四級評定” }

【重要】只輸出純JSON,不要添加任何markdown標記(如json或)。

情境資料標註Prompt模板

你是一位專業的 AI Agent 資料標註專家,擅長對 Agent 對話互動進行多維度情境分類和結構化標註。

請根據以下標註維度,對這次 Agent 執行進行分析標註:

標註維度:

任務類型: Agent 執行的核心任務類別。可選值:故障診斷, 資料查詢, 指標分析, 警示處理, 配置變更, 知識問答, 報告產生, 其他
任務複雜度: 請求的技術複雜度。可選值:簡單(單步操作), 中等(多步串聯), 複雜(多工具協同), 極複雜(多輪推理+異構資料)
工具使用模式: Agent 的工具調用模式。可選值:無工具, 單工具單次, 單工具多次, 多工具串列, 多工具並行, 嵌套調用
執行結果: 任務執行結果。可選值:完全成功, 部分成功, 執行失敗, 逾時中斷, 需人工介入
業務領域: 涉及的可觀測性領域。可選值:APM, 日誌分析, 指標監控, 鏈路追蹤, 基礎設施, 安全審計, 跨域綜合
補充標籤: 捕捉固定維度無法覆蓋的細粒度特徵標籤
標註樣本:

使用者問"為什麼服務響應變慢了?" → 任務類型=故障診斷, 複雜度=複雜, 領域=APM
使用者問"查看最近1小時的錯誤記錄檔" → 任務類型=資料查詢, 複雜度=簡單, 領域=日誌分析
使用者問"對比昨天和今天的延遲趨勢" → 任務類型=指標分析, 複雜度=中等, 領域=指標監控
現在請標註以下 Agent 執行資料:

使用者輸入:{{user_query}} 執行過程:{{process_chain}}

請輸出JSON格式: { “任務類型”: “從可選值中選擇”, “任務複雜度”: “從可選值中選擇”, “工具使用模式”: “從可選值中選擇”, “執行結果”: “從可選值中選擇”, “業務領域”: “從可選值中選擇”, “補充標籤”: [“標籤1”, “標籤2”] }

【重要】只輸出純JSON,不要添加任何markdown標記(如json或)。

完整配置

本模板提供 JSON 配置格式。

以下為完整的 Pipeline JSON 配置,可直接通過 API 提交建立 Pipeline。

{
  "name": "ot_trace_data_governance",
  "description": "OT-Trace Trace 粒度:Agent 對話資料治理",
  "source": {
    "type": "logstore",
    "logstore": {
      "project": "<your-project>",
      "logstore": "<your-logstore>",
      "query": "*"
    }
  },
  "pipeline": {
    "nodes": [
      {
        "id": "kind_filter",
        "type": "where",
        "parameters": {
          "filter": "\"attributes.gen_ai.span.kind\" IS NOT NULL AND \"attributes.gen_ai.span.kind\" != ''"
        }
      },
      {
        "id": "kind_preprocess",
        "type": "extend",
        "parameters": {
          "entry_input": "CASE WHEN \"attributes.gen_ai.span.kind\" = 'ENTRY' THEN \"attributes.gen_ai.input.messages\" ELSE CAST(NULL AS VARCHAR) END",
          "entry_output": "CASE WHEN \"attributes.gen_ai.span.kind\" = 'ENTRY' THEN \"attributes.gen_ai.output.messages\" ELSE CAST(NULL AS VARCHAR) END",
          "llm_model": "CASE WHEN \"attributes.gen_ai.span.kind\" = 'LLM' THEN CASE WHEN \"attributes.gen_ai.request.model\" IS NOT NULL AND ... THEN \"attributes.gen_ai.request.model\" ELSE spanname END ELSE CAST(NULL AS VARCHAR) END",
          "llm_input_messages": "...",
          "llm_output_messages": "...",
          "llm_input_tokens": "...",
          "llm_output_tokens": "...",
          "tool_name": "...",
          "agent_name": "...",
          "process_label": "..."
        }
      },
      {
        "id": "assemble",
        "type": "make-instance",
        "parameters": {
          "by": "traceid",
          "session_id": "first(\"attributes.gen_ai.session.id\")",
          "user_input": "first(entry_input)",
          "final_output": "last(entry_output)",
          "model_list": "array_distinct(llm_model)",
          "total_input_tokens": "sum(llm_input_tokens)",
          "total_output_tokens": "sum(llm_output_tokens)",
          "tool_name_list": "array_distinct(tool_name)",
          "tool_call_chain": "join(tool_name, ' → ')",
          "process_chain": "join(process_label, chr(10))",
          "span_kind_list": "array(\"attributes.gen_ai.span.kind\")",
          "start_time": "first(__time__)",
          "end_time": "last(__time__)",
          "trace_duration": "max(CAST(duration AS BIGINT))"
        }
      },
      {
        "id": "derive",
        "type": "extend",
        "parameters": {
          "total_tokens": "total_input_tokens + total_output_tokens",
          "span_count": "cardinality(span_kind_list)",
          "llm_count": "cardinality(filter(span_kind_list, x -> x = 'LLM'))",
          "tool_count": "cardinality(filter(span_kind_list, x -> x = 'TOOL'))",
          "trace_duration_ms": "CAST(trace_duration AS DOUBLE) / 1000000.0",
          "user_query": "CASE WHEN user_input IS NOT NULL ... END",
          "full_text": "concat('## 使用者輸入', chr(10), ..., '## 執行過程', ..., '## 最終輸出', ...)"
        }
      },
      {
        "id": "filter_valid",
        "type": "where",
        "parameters": {
          "filter": "(user_input IS NOT NULL AND user_input != '') OR (first_llm_input IS NOT NULL AND first_llm_input != '')"
        }
      },
      {
        "id": "exact_dedup",
        "type": "dedup-exact",
        "parameters": { "field": "user_query" }
      },
      {
        "id": "fuzzy_dedup",
        "type": "dedup-fuzzy",
        "parameters": { "field": "user_query", "threshold": "3" }
      },
      {
        "id": "semantic_dedup",
        "type": "dedup-semantic",
        "parameters": { "field": "user_query", "threshold": "0.1" }
      },
      {
        "id": "cluster",
        "type": "semantic-cluster",
        "parameters": { "field": "__dedup_emb", "n": 20 }
      },
      {
        "id": "sample_per_cluster",
        "type": "sample",
        "parameters": { "n": 3, "by": "__cluster_id" }
      },
      {
        "id": "evaluate",
        "type": "llm-call",
        "parameters": {
          "prompt": "@eval/trace-eval-prompt.md",
          "fields": "user_query,process_chain,full_text",
          "format": "json",
          "as": "eval"
        }
      },
      {
        "id": "annotate",
        "type": "llm-call",
        "parameters": {
          "prompt": "@anno/trace-label-prompt.md",
          "fields": "user_query,process_chain",
          "format": "json",
          "model": "qwen-plus",
          "as": "anno"
        }
      }
    ]
  },
  "sink": {
    "type": "dataset",
    "dataset": {
      "workspace": "<your-workspace>",
      "dataset": "<your-dataset>"
    }
  },
  "executePolicy": {
    "mode": "run_once",
    "run_once": { "fromTime": 0, "toTime": 0 }
  }
}
說明

配置中的source.logstoresink.dataset需替換為實際資源。kind_preprocess節點的完整運算式較長,此處以省略符號表示,請參見下方 SPL 格式擷取完整運算式。

預留位置說明:

  • <your-project>:SLS Project 名稱。

  • <your-logstore>:儲存 OT-Trace 資料的 Logstore 名稱。在目標 Project 中,選擇日誌儲存查看 Logstore 列表。

  • <your-workspace>:資料集所屬的工作空間名稱。在Log Service控制台左側導覽列選擇資料集,查看已有工作空間。

  • <your-dataset>:Pipeline 輸出目標資料集名稱。可使用已有資料集或在建立 Pipeline 時建立。

建立並運行 Pipeline

完成 Pipeline 配置後,通過以下方式提交並運行。

通過控制台建立

登入AgentLoop控制台,在左側導覽列資料集-資料處理中,選擇應用模板,挑選OT-AI Trace 資料治理模板,單擊建立任務。

參數說明

以下為各節點的關鍵參數,可根據實際業務需求調整,控制資料治理的力度和產出規模。

參數

預設值

調整說明

dedup-fuzzy.threshold

3

SimHash 海明距離閾值。值越小去重越嚴格,值越大保留越多近似資料。詳細說明請參見dedup-fuzzy

dedup-semantic.threshold

0.1

Embedding 向量距離閾值。值越小去重越嚴格,值越大保留越多語義相似資料。詳細說明請參見dedup-semantic

semantic-cluster.n

20

聚類數量。更多簇代表更細粒度的分類,但每簇內樣本量可能減少。詳細說明請參見semantic-cluster

sample.n

3

每簇採樣數量。影響下遊 AI 處理的資料量和成本。當前預設配置下最多產出 20 x 3 = 60 條資料。詳細說明請參見sample

llm-call.prompt

模板引用

可自訂評估和標註的Prompt模板。評估節點使用@eval/trace-eval-prompt.md,標註節點使用@anno/trace-label-prompt.md。關於LLM調用的詳細說明,請參見llm-call

llm-call.model

系統預設 / qwen-plus

評估節點使用系統預設模型,標註節點使用qwen-plus。可根據精度和成本需求選擇其他模型。

運行結果

Pipeline 運行完成後,產出的資料集中每條記錄包含以下關鍵字段:

欄位

來源

說明

traceid

組裝

Trace 唯一標識。

user_query

派生

提取的使用者查詢文本,優先取 ENTRY 輸入,回退取首條 LLM 輸入。

process_chain

組裝

完整執行鏈路,按時間順序拼接每個Span的處理標籤(如[LLM] qwen-plus (1200→800 tok))。

model_list

組裝

去重後的模型名稱列表。

total_tokens

派生

輸入和輸出 Token 總數。

tool_call_chain

組裝

工具調用鏈路。

trace_duration_ms

派生

Trace 總耗時(毫秒)。

eval

AI評估

多維度品質評估結果(JSON 格式)。

anno

AI標註

任務類型、複雜度、業務領域等標註結果(JSON 格式)。

注意事項

使用本模板前,請注意以下常見問題及處理方式。

情境

預期行為

排查與建議

源 Logstore 中無 OT-Trace 資料

Pipeline 正常運行但輸出資料集為空白,不會報錯。

確認目標應用已正確接入 OT 探針併產生 Trace 資料。在 Logstore 中執行* | where "attributes.gen_ai.span.kind" IS NOT NULL驗證是否存在有效資料。

LLM 調用失敗或逾時

evalanno列的值為錯誤資訊,Pipeline 不會中斷。

檢查 LLM 服務的連通性和配額。如果逾時頻繁,可在llm-call節點中切換為延遲更低的模型(如將qwen-max改為qwen-plus)。

三級去重後資料量極少或為零

下遊聚類和採樣階段輸入資料不足,輸出結果可能無法反映真實分布。

適當放寬去重閾值:增大dedup-fuzzythreshold(預設 3,可調至 5 或更高)或增大dedup-semanticthreshold(預設 0.1,可調至 0.2)。也可先跳過語義去重階段進行驗證。

許可權不足

Pipeline 建立或運行時報AccessDenied錯誤。

確認當前帳號或 RAM 角色具備源 Logstore 的讀取許可權和目標 Dataset 的寫入許可權。

Token 配額超限

Pipeline 運行失敗並返回配額相關錯誤資訊。

檢查當前帳號的 LLM 調用配額上限。如需處理更多資料,請提升配額上限或減少sample.n參數值以降低 LLM 調用量。

定製建議

可在本模板基礎上進行以下定製:

  • 調整去重力度:修改dedup-fuzzy.thresholddedup-semantic.threshold參數值。提高閾值保留更多資料,降低閾值去重更嚴格。詳見上方參數說明中的對應參數。

  • 調整採樣規模:修改semantic-cluster.nsample.n參數。聚類數 x 每簇採樣數 = 最終產出上限。詳見上方參數說明中的對應參數。

  • 自訂Prompt模板:替換評估和標註的Prompt模板,適配特定評估維度或標註體系。

  • 添加文本統計:在採樣後、LLM 調用前插入doc-stats節點,統計文本長度、詞頻等資訊。

  • 向外延展群組裝欄位:在kind_preprocessassemble節點中添加更多欄位提取和彙總規則,豐富Trace寬表資料。