全部产品
Search
文档中心

云监控:OT-Trace 数据治理

更新时间:Apr 30, 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>:数据集所属的工作空间名称。在日志服务控制台左侧导航栏选择数据集,查看已有工作空间。

  • <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宽表数据。