多样性采样模板通过三级去重(精确、近似、语义)和语义聚类分组采样,从海量 Agent 交互日志中提取具有代表性的数据子集,用于构建评测数据集或训练样本。
业务场景
构建 AI Agent 评测数据集或训练样本时,直接随机采样容易被热门问题主导,导致样本分布偏斜。多样性采样模板通过三级去重和语义聚类采样解决这一问题:
消除冗余:三级去重(精确、近似、语义)逐级过滤重复数据,计算代价递增但前置步骤已大幅削减数据量。
保证多样性:语义聚类将数据按含义分组,每组采样确保覆盖不同语义类别。
控制规模:通过聚类簇数和每簇采样量精确控制输出规模。
适用人群:
算法工程师:构建训练数据集、选取微调样本。
评测工程师:构建评测 Benchmark、执行版本对比评测。
产品经理:了解用户问题的语义分布。
功能特性
特性 | 说明 |
三级去重 | 精确、近似、语义三级递进过滤,计算代价递增但数据量递减,整体效率最优。 |
语义聚类 | 保证输出样本的语义多样性,避免热门问题主导采样结果。 |
分层采样 | 支持按分组维度进行定量或按比例采样,确保样本覆盖各语义类别。 |
低成本语义处理 | 使用低成本向量语义生成,无需 LLM 调用,适合大规模语义计算。 |
Pipeline 流程
多样性采样 Pipeline 包含以下算子,按顺序依次执行:
顺序 | 算子 | 阶段 | 说明 |
1 | 字段选取 | 从原始日志中提取所需字段,如用户输入、模型输出、模型名称等。 | |
2 | 字段扩展 | 通过正则表达式从输入字段中提取用户提问原文。 | |
3 | 精确去重 | 移除完全重复的记录,计算成本最低。 | |
4 | 近似去重 | 移除字面相似的记录,阈值越小越严格。 | |
5 | 语义去重 | 移除语义重复的记录,同时生成 | |
6 | 语义聚类 | 复用 | |
7 | 分组采样 | 按 |
完整配置
多样性采样模板支持 API(JSON)配置方式。更多信息,请参见数据处理(Pipeline)。
API 配置(JSON)
以下为完整的 Pipeline JSON 配置示例,需要将 source 中的日志库信息替换为实际值。
{
"name": "diversity_sampling",
"description": "多样性采样:三级去重 + 语义聚类 + 分组采样,构建代表性评测数据集",
"source": {
"type": "logstore",
"logstore": {
"project": "your-project",
"logstore": "your-agent-logstore",
"query": "serviceName:your-agent-service and *"
}
},
"pipeline": {
"nodes": [
{
"id": "select_fields",
"type": "project",
"parameters": {
"input": "attributes.input.value",
"output": "attributes.output.value",
"model": "attributes.gen_ai.model_name",
"trace_id": "traceId",
"span_id": "spanId"
}
},
{
"id": "extract",
"type": "extend",
"parameters": {
"question": "regexp_extract(input, '(?s)用户提问原文:\\s*(.*?)\\s*,\\s*\"files\"', 1)"
}
},
{
"id": "exact_dedup",
"type": "dedup-exact",
"parameters": { "field": "question" }
},
{
"id": "fuzzy_dedup",
"type": "dedup-fuzzy",
"parameters": { "field": "question", "threshold": "3" }
},
{
"id": "semantic_dedup",
"type": "dedup-semantic",
"parameters": { "field": "question", "threshold": "0.1" }
},
{
"id": "cluster",
"type": "semantic-cluster",
"parameters": { "field": "__dedup_emb", "n": 100 }
},
{
"id": "sample_per_cluster",
"type": "sample",
"parameters": { "n": 1, "by": "__cluster_id" }
}
]
},
"sink": {
"type": "dataset",
"dataset": {
"workspace": "your-workspace",
"dataset": "agent_diverse_sample"
}
},
"executePolicy": {
"mode": "run_once",
"run_once": {
"fromTime": 1735689600,
"toTime": 1735776000
}
}
}参数说明
需要替换的参数:
参数 | 说明 |
| 日志服务 Project 名称。 |
| 存储 Agent 交互日志的 Logstore 名称。 |
| 数据过滤查询条件,用于筛选目标 Agent 服务的日志。 |
| 输出数据集所在的工作空间名称。 |
| 输出数据集名称,采样结果将写入该数据集。 |
| 数据处理的起始时间戳(Unix 秒)。 |
| 数据处理的结束时间戳(Unix 秒)。 |
以下为各算子的关键参数。完整参数列表请参见对应算子文档。
算子 | 参数 | 说明 | 本模板取值 |
dedup-exact |
| 去重依据字段。 |
|
dedup-fuzzy |
| 去重依据字段。 |
|
| 编辑距离阈值,值越小越严格。 |
| |
dedup-semantic |
| 去重依据字段。 |
|
| 语义相似度阈值。0.05 极严格(仅移除几乎相同的内容),0.3 较宽松(移除相关但不同的内容)。 |
| |
semantic-cluster |
| 向量列名。复用 |
|
| 聚类簇数,决定最终输出的最大数据量上限。 |
| |
sample |
| 每组采样数量。 |
|
| 分组字段。按 |
|
运行结果
以 1000 条原始 Agent 交互日志为例,经过多样性采样 Pipeline 处理后的数据量变化如下:
处理前(1000 条原始日志):
语义类别 | 原始数量 | 典型问题 |
错误日志查询 | 350 | 帮我查错误日志、查一下报错、看看有没有error… |
性能分析 | 280 | 统计延迟、分析慢查询、看下RT分布… |
流量统计 | 200 | 统计PV、看下访问量、统计UV… |
配置查询 | 100 | 查看配置、看下参数、获取设置… |
安全审计 | 70 | 谁在访问、查看登录记录、异常IP… |
处理后(100 条多样性采样):
步骤 | 数据量 | 说明 |
原始数据 | 1000 条 | |
精确去重后 | 650 条 | 移除完全重复 |
近似去重后 | 400 条 | 移除字面相似 |
语义去重后 | 250 条 | 移除语义重复 |
聚类 100 簇 | 250 条 | 每条标注 |
每簇采样 1 条 | 100 条 | 各语义类别均匀覆盖 |
1000 条原始数据经处理后输出 100 条,保留率 10%,但语义覆盖率接近 100%。最终输出量由 semantic-cluster 的簇数 n 和 sample 的每簇采样量 n 共同决定。
定制建议
可根据实际业务场景调整以下参数:
定制点 | 说明 |
语义去重阈值 |
|
聚类簇数 |
|
每簇采样量 |
|
按比例采样 | 将 |
跨批次全局去重 | 给 |
追加 AI 处理 | 在 |
注意事项
使用多样性采样模板时,注意以下事项:
如果数据量小于聚类簇数
n,部分簇可能为空,实际输出量将小于n。dedup-semantic的threshold值过大可能将相关但不同的问题误判为重复,建议从较小值开始逐步调整。semantic-cluster必须在dedup-semantic之后执行,否则__dedup_emb向量列不存在。如果需要独立聚类(不依赖去重),在dedup-fuzzy后添加 embedding 算子生成向量列,再使用semantic-cluster。