---
name: online-mining-v2
description: 使用 ELK 作为默认线上数据源挖掘线上 case，并复用 product-data 的 canonical record 与导出流程。
when_to_use: 当用户希望从线上日志中按 query/domain/model prompt/model output/候选 domain 等条件挖掘样本、review 命中质量、形成专项评测集或训练数据时使用。
aliases: online-mining-elk, elk-mining, 线上挖掘v2
allowed_tools: read_file, write_file, grep_search, glob_search, ask_user_question, python_exec, python_package
---

# Online Mining v2

使用这个 skill 处理“线上日志需求 -> ELK 挖掘策略 -> 候选样本 review -> product-data 标准数据”的工作流。

本 skill 不新增平台注册工具。能力都在 `skills/online-mining-v2/scripts/` 下，通过 `python_exec` 的 `script_path` 模式执行；如果迁移到其他 Agent，也可以直接运行这些脚本。

## 能力组织

```text
skills/online-mining-v2/
  SKILL.md
  README.md
  knowledge/
    数据源字段说明.md
    工作流.md
  scripts/
    online_mining_common.py
    elk_profile_index.py
    elk_search_cases.py
    elk_fetch_by_request_ids.py
    elk_join_request_logs.py
    build_dataset_draft.py
    build_online_records.py
```

默认数据源：

- `pre-processing*`：前处理日志，适合拿模型 prompt、模型输出、候选 domain、`excellent_domains_result`。
- `arch-flat-nlp-log-f-*`：主 NLP 日志，适合拿最终 `query`、`domain`、`func`、`request_id`、`device_id`、`device`、`tts/text/to_speak`。

后处理全部复用 `product-data`：

- `skills/product-data/scripts/normalize_dataset_draft.py`
- `skills/product-data/scripts/validate_dataset_records.py`
- `skills/product-data/scripts/export_dataset_records.py`
- `skills/product-data/scripts/export_training_jsonl.py`
- `skills/product-data/scripts/export_planning_eval_csv.py`

## 依赖

如果 `python_exec` 返回缺少 `elasticsearch` 或 `urllib3`，先安装：

```json
{
  "action": "install",
  "packages": ["elasticsearch<8", "urllib3"],
  "timeout_seconds": 120
}
```

不要用 `bash` 手写临时脚本查询 ELK；优先使用本 skill 的 portable scripts。

## 关键工作流

### 1. 先理解需求，不直接挖

从用户输入整理挖掘目标：

- 目标问题：要评估准确率、构建评测集，还是补充训练数据。
- 目标标签：如 `Agent(tag="地图导航")`、`Summarize()`。
- 复杂度：`complex=true/false` 是否明确。
- 线上筛选特征：query 关键词/正则、domain、func、候选 domain、模型输出、prompt 特征、设备、日期。
- review 策略：先抽多少条给用户看，通常先 20 到 100 条。

缺少目标标签或关键筛选字段时，先问用户，不要直接导出数据。

### 2. 探索表和字段

需要确认表字段时，执行：

```json
{
  "script_path": "skills/online-mining-v2/scripts/elk_profile_index.py",
  "stdin": {
    "sources": ["main", "pre_processing"],
    "date": "20260512",
    "sample_size": 20
  },
  "timeout_seconds": 120,
  "max_output_chars": 20000
}
```

时间筛选支持三种写法：

- 单日：`"date": "20260512"`
- 日期范围：`"date_from": "20260508", "date_to": "20260514"`
- 最近 N 天：`"lookback_days": 7`

用户说“一周内”“最近 7 天”时，优先传 `lookback_days: 7`；用户给明确起止日期时，传 `date_from/date_to`。

### 3. 搜索候选

按策略搜索：

```json
{
  "script_path": "skills/online-mining-v2/scripts/elk_search_cases.py",
  "stdin": {
    "source": "pre_processing",
    "date": "20260512",
    "size": 50,
    "scan_size": 500,
    "filters": {
      "query_contains": ["总结一下"],
      "planning_result_contains": ["Summarize"]
    }
  },
  "timeout_seconds": 180,
  "max_output_chars": 30000
}
```

`source=main` 适合按最终 `domain` / `func` / `query` 搜索。`source=pre_processing` 适合按 `planningOriginalResult`、`promptModel`、`excellent_domains_result`、候选 domain 搜索。

### 4. 补全双表信息

候选里只有一张表信息时，用 request id 补全：

```json
{
  "script_path": "skills/online-mining-v2/scripts/elk_join_request_logs.py",
  "stdin": {
    "request_ids": ["xxx", "yyy"],
    "date": "20260512"
  },
  "timeout_seconds": 180,
  "max_output_chars": 30000
}
```

### 5. 单条 rid 或已确认候选直接转元数据

如果用户给了明确 rid，或已经确认一批线上候选要直接作为样本，优先使用
`build_online_records.py`。这个脚本会完成：

- 主表 `arch-flat-nlp-log-f-*` 和前处理表 `pre-processing*` 双表拉取。
- 从前处理 `promptModel` 的 `[对话历史]` 抽取模型真实输入 session，作为 `prev_session`。
- 优先使用用户指定 `target`；没有指定时，按 `pre_processing.code` -> `planningOriginalResult` -> 主表 `llm_agent_info.agentType` -> 主表 `domain` 推断标签。
- 生成 product-data canonical records。
- 默认导出 `output/records.jsonl` 和 `output/records.csv`，可选导出 `training.jsonl` 和 `eval_planning.csv`。

示例：

```json
{
  "script_path": "skills/online-mining-v2/scripts/build_online_records.py",
  "stdin": {
    "request_ids": ["6656271eedfe4b478ac716448a3ad310"],
    "lookback_days": 7,
    "dataset_label": "线上挖掘样本",
    "target": "Agent(tag=\"地图导航\")",
    "complex": false,
    "output_dir": "output",
    "export_records": true,
    "export_training": false,
    "export_eval": false
  },
  "timeout_seconds": 300,
  "max_output_chars": 30000
}
```

注意：

- 老 rid 超出近 48 小时时必须让用户补日期，传 `date=YYYYMMDD`。
- 如果用户说“一周内/最近 7 天”，可以直接传 `lookback_days: 7`，不必逐日循环。
- 如果用户没有指定 `target`，脚本可以从线上模型输出推断，但最终仍建议展示 `target_source` 给用户确认。
- 如果脚本返回 `case has no query`，说明该 rid 在当前日期窗口没有命中主表/前处理表，不要继续伪造元数据。
- 不要用主表 `session_id` 去拼训练/评测 session；它不是 planning 模型输入 session 的同义概念。

### 6. 给用户 review

展示候选样本时只展示必要字段：

- request_id
- query
- target / target_source（如果已经转换）
- main.domain / main.func
- pre.planning_result
- pre.hit_rules
- pre.candidate_domains
- session_id / device_id
- tts/text

不要一次贴大量 prompt。需要看 prompt 时只展示截断摘要，或保存到会话 output 目录。

### 7. 用户确认后转成 product-data draft

一般情况下不要再手动接 normalize/export。只有当用户明确要看 draft text，
或需要和 `product-data` 的人工生成流程混合时，才先生成 dataset draft text：

```json
{
  "script_path": "skills/online-mining-v2/scripts/build_dataset_draft.py",
  "stdin": {
    "dataset_label": "总结类线上专项",
    "target": "Summarize()",
    "complex": false,
    "cases": [/* elk_search_cases 或 join 输出里的 cases */],
    "output_path": "scratchpad/mined_dataset_draft.txt"
  },
  "timeout_seconds": 120,
  "max_output_chars": 20000
}
```

然后再调用 product-data：

```json
{
  "script_path": "skills/product-data/scripts/normalize_dataset_draft.py",
  "stdin": {
    "draft_path": "scratchpad/mined_dataset_draft.txt",
    "source_type": "online",
    "records_output_path": "scratchpad/normalized_records.jsonl",
    "append": false,
    "return_records": false
  },
  "timeout_seconds": 120,
  "max_output_chars": 20000
}
```

更推荐直接使用第 5 步的 `build_online_records.py`，减少模型手动接线出错。

如果使用 draft 分支，再执行校验和导出：

- `validate_dataset_records.py`
- `export_dataset_records.py`，输出固定 `output/records.jsonl`
- 用户需要训练或评测时，再导出 `training.jsonl` 或 `eval_planning.csv`

## 分支约束

- 用户要“线上数据直接做样本/评测集”：只做挖掘、review、转换，不生成新 query。
- 用户明确要“基于线上问题补数据/扩写/构造”：先完成线上问题 review，再切到 `product-data` 的 generation plan 流程。
- 不要把挖掘策略第一次命中的样本直接当最终数据；至少展示一小批给用户 review。

## 输出目录约束

所有产物写当前会话目录：

- 中间候选：`scratchpad/mined_candidates.jsonl`
- joined 详情：`scratchpad/joined_cases.jsonl`
- draft：`scratchpad/mined_dataset_draft.txt`
- canonical records：通过 product-data 导出到 `output/records.jsonl`

不要写项目根目录、`tasks/`、`src/` 或 `skills/`。
