# 决策流程

本文件定义 Agent 使用 `label-master`（标签大师）时的推荐判断顺序。目标是让 Agent 像人工标注同学一样，先判断结构维度，再判断业务标签，最后确定输出格式。

## 总体顺序

```text
输入理解
  -> 结构维度预判：自动任务 / 多指令 / complex
  -> 业务标签候选：候选召回、领域、标签、高频边界
  -> 输出能力判断：function program / Agent 包装 / 结构化外壳
  -> 组合最终结果
  -> 不确定则向用户确认
```

不要把所有知识一次性读入。每一步只读取当前需要的索引和候选文件。

## 1. 输入理解

先提取：

- 当前 query。
- 上下文、前轮对话、设备、端侧信息。
- 用户是否明确要求某种输出格式。
- 用户是在做标签判断、数据生成、badcase 分析，还是标签知识问答。

如果是训练/评测数据生成，额外确认：

- 是否需要 function program。
- 是否需要 `Agent(tag="xxx")` 包装。
- 是否需要 complex、多指令、自动任务字段。

## 2. 结构维度预判

结构维度不是业务标签，不要混进 `Agent(tag="xxx")`。

### 自动任务

如果 query 包含条件触发结构，例如“当/如果/时候/之后/到达/每/一...就”，或者涉及超级任务、自动化、提醒，则读取：

- `索引/维度索引.md`
- `判断维度/自动任务判断.md`

自动任务判断会给出 `condition`，并影响后续 subquery 的组织。

### 多指令

如果 query 包含多个动作、多个设备、并列连接、多个方向调整，或者可能需要拆成多个子任务，则读取：

- `索引/维度索引.md`
- `判断维度/多指令判断.md`

多指令判断会给出多个子句。后续业务标签判断应对每个子句分别进行，最终按多行 target 组合。

### complex

complex 是复杂度判断，独立于业务标签。它可以先粗判，但建议在业务标签和输出形态判断后再最终确认。

读取：

- `判断维度/复杂度/复杂度判断.md`
- 如果 query 涉及地图导航、POI 搜索、路线偏好、终点附近、沿途、顺路或多轮路线约束，继续读取 `判断维度/复杂度/地图导航.md`。这是 complex 维度下的专项条件表，不是新的结构维度；最终仍只输出 `complex=false/true`。
- 如果 query 涉及车控、IoT 设备控制、生活服务、系统控制、应用控制、图片问答、媒体资源播放，并出现感受/场景/约束/跨应用/视觉推理/模糊资源推断等复杂样式，继续读取 `判断维度/复杂度/垂域专项.md`。这是 complex 维度下的专项条件表，不是新的结构维度；最终仍只输出 `complex=false/true`。
- 如果专项条件依赖多轮上下文，必须先确认输入里是否真的提供了上一轮导航上下文；没有上下文时，不要把单轮完整 query 当作多轮次轮。
- 多轮场景里，如果当前轮判断依赖上一轮任务，需要先看上一轮任务的 complex 结果；专项规则明确要求继承时才继承，不要默认所有多轮都继承。

## 3. 业务标签候选

对原 query 或拆分后的每个 subquery，按下面路径读取知识：

1. 读取 `索引/候选召回索引.md`，根据 query 的动作、对象、资源、设备快速缩小候选范围。
2. 读取 `标签总览.md`，确认候选领域。
3. 读取 `索引/标签索引.md`，找到 2-5 个候选标签。
4. 如果候选命中高频混淆，读取 `边界/边界索引.md` 和 `边界/高频混淆/` 下对应文件。
5. 读取候选标签卡片，例如 `标签/地图导航/地图导航.md`。
6. 如果仍然不清楚，再读取 `边界/领域概览/` 下对应领域文件作为背景补充。

输出业务标签判断时必须说明：

- 推荐标签。
- 候选标签。
- 为什么推荐。
- 为什么排除其他候选。
- 哪些信息还不确定。

注意：`边界/领域概览/` 多数来自自动迁移，适合补背景，不适合作为第一判断入口。人工维护的 `边界/高频混淆/` 优先级更高。

## 4. 输出能力判断

业务标签不等于最终 target。判断最终输出格式时读取：

- `判断维度/标注输出形态.md`
- `输出能力/README.md`
- `输出能力/输出组合规范.md`

如果是 function，再读取：

- `输出能力/函数目录.md`
- 必要时读取 `输出能力/对象目录.md`

如果是 intent，再读取：

- `输出能力/意图目录.md`

判断重点：

- 这个类别是否已经 function 化。
- function 是否需要参数。
- 参数是否需要先构造 object。
- 这个类别是否只是旧 tag / intent；如果没有明确 function，当前默认输出 `Agent(tag="xxx")`。
- 当前任务是否要求 `Agent(tag="xxx")` 包装。
- Agent 字段是否只是承接知识，而不是最终 target。

## 5. 组合最终结果

### 单 query + function

```text
CalendarQA(type="DATE",target_time="今天")
```

### 单 query + object + function

```text
x0=Location(country="美国",province="华盛顿",city="西雅图")
CalendarQA(type="TIME",target_time="现在",location=x0)
```

### 单 query + 旧 tag / intent 标签

```text
Agent(tag="地图导航")
```

### 用户明确要求 intent target 时

```text
地图导航
```

### 多指令

```text
complex=true
Agent(query="退出导航",tag="地图导航")
Agent(query="打开后视镜加热",tag="车载控制")
```

### 自动任务

```json
[
  {
    "condition": "上车时",
    "querys": [
      {"subquery": "打开空调", "intent": "设备控制"}
    ]
  }
]
```

## 6. 需要用户确认的情况

以下情况不要硬猜：

- 用户明确要求 function program，但当前标签卡片没有 function 签名。
- function 和 Agent 形式都可能满足，且用户对 target 形式有特殊要求。
- 旧标签资料里只有 tag，但用户强制要求 function program。
- 多指令和单意图之间存在明显歧义。
- 自动任务和普通定时/延时控制存在冲突。
- complex 维度需要作为数据字段输出，但用户没有定义格式。

推荐提问方式：

```text
我能判断业务标签大概率是“地图导航”。当前知识库没有确认可用的地图导航 function 签名，
默认建议写成 Agent(tag="地图导航")。如果你希望走 function program，需要先补充地图导航的 function 定义。
```

## 7. 推荐输出模板

```text
结构判断：
- 自动任务：否
- 多指令：否
- complex：待确认/false/true

业务标签：
- 推荐：地图导航
- 候选：地图导航、餐饮服务、通用问答
- 排除：餐饮服务，因为 query 明确要求导航动作

输出形态：
- 推荐：Agent 包装 / function program / 待确认
- 候选：Agent(tag="地图导航")；已确认 function program
- 需要确认：当前任务是否强制要求 function program
```
