This commit is contained in:
hupenglong1
2026-05-20 15:04:19 +08:00
parent c4b935692c
commit 1a94cec822
27 changed files with 4831 additions and 1693 deletions
@@ -0,0 +1,21 @@
# 多指令 vs ComplexTask 分流规则
## 核心判定
| 场景 | 输出 | 示例 |
|------|------|------|
| 多个独立命令拼在一句话里 | 多个 `Agent(...)` | "导航到大姚县打开微信播放音乐" → 3个Agent |
| 单个任务涉及多步骤/多目的地 | `ComplexTask(tag="...")` | "先去加油站再去机场" → 1个ComplexTask |
## 判定要点
- **多指令(Multi-command)≠ ComplexTask**:用户在一句话中说了多个独立的命令(导航+播放+打电话+控制),每个命令应该独立解析为各自的 Agent,不是一个 ComplexTask
- **ComplexTask 是单任务多步**:只有当一个任务本身需要多步规划时才是 ComplexTask(如多目的地导航、带筛选条件的旅游规划)
- **"然后"不一定是 ComplexTask 信号**:如果"然后"连接的是不同领域的独立命令(导航+控制+播放),那是多指令;只有"然后"连接同一任务的多个步骤(先去A再去B)才是 ComplexTask
## 识别方法
- output 中有多个 `Agent(...)` 调用 → 多指令,保持不变
- output 中只有一个调用但 query 含多目的地 → 可能应该是 ComplexTask
- query 中"然后/再/接着"连接不同 tag 的任务 → 多指令
- query 中"然后/再/接着"连接同 tag 的多个地点 → ComplexTask
@@ -0,0 +1,57 @@
# 多轮对话连贯性 —— ComplexTask 继承规则
## 核心判定
| 场景 | 输出 | 示例 |
|------|------|------|
| 上轮是 ComplexTask + 当前 query 和上轮**相关**(延续/细化/替换/挑选/追加) | 当前仍 `ComplexTask(tag="...")` | 上轮 CT 导航多目的地,当前"第二家导航过去" → CT |
| 上轮是 Agent + 当前 query 是独立新任务 | 按当前 query 独立分类 | 上轮 Agent 导航,当前"播放周杰伦" → Agent(音乐播放) |
| 上轮是 ComplexTask + 当前 query 是**无关**新任务 | 按当前独立分类 | 上轮 CT 旅游,当前"今天天气怎么样" → QA/WeatherQA |
## 判定要点
- **"相关"的定义**:当前 query 是对上轮任务的**延续、细化、替换、挑选、追加**中的任一类:
- 延续:用户在上轮的同一任务线上继续操作("继续导航"/"换一条不堵的"
- 细化:对上轮结果加筛选条件("人少一点的"/"评分最高的"/"最近的那个"
- 替换:换掉上轮的某个要素,同领域保持("不要 A 换成 B"
- 挑选:从上轮推荐的候选中选择("第一个"/"第二家"/"刚给的那个"
- 追加:在上轮任务基础上加步骤("路上再加个加油站"/"顺便找个 ATM"
- **prev 侧"隐式 CT 信号"R17777 补充)**:prev 即使只是一轮用户独白,只要含以下任一信号也视作 CT 场景:
- **单轮内自我修正/替换**:"导航到 A 哦不对 B"、"去 X 啊不 Y"、"到 A 嗯就是 B" —— 用户在说的过程中换目的地,系统需处理替换逻辑
- **候选选择犹豫**"是 A 还是 B"、"哪个近就哪个"、"算了不去 A 了"
- **多 POI 枚举/对比**"A 和 B 哪个近"、"先说 A 再说 B"
> 注:单 POI + 多重形容词筛选("最便宜的有车位的充电站")**不算** CT 信号,按 R1 归 Agent。
- **继承的是 `complex` 维度,不是 tag 内容**:tag 仍可能是 Agent 标签,但 complex=true,因为复合任务语境未结束
## 反例(不适用继承)
- 当前 query 明显切换意图:上轮 CT 导航 → 当前"打开空调"(tag=车载控制,无关)→ 独立分类
- 当前 query 是独立的闲聊 / 时间 / 天气问答:上轮 CT → 当前"现在几点" → 独立分类
- 上轮是 CT 但失败/取消("算了不要了"):后续 query 不再继承
## 为什么需要这条规则(经验来源)
R17775 迭代中,我们修改了训练集 47 条"纯路线偏好"样本 complex=true → false,对齐 0511 专项 gold60% → 76.67%)。但这产生副作用:
- `复杂导航线上真实_rag` -3.30pp11 条 gold=true 被过度修正为 false
- 如 "我要重新选一个路线"、"嗯经过凤雏路去江北虹悦城"
- `0511 专项` 新引入 6 条错全是**多轮延续 POI/挑选**类
- 如 "评分最高的那个导航过去"、"第二家导航过去"、"人少一点的"
根因:单看 query 这些表达像"纯偏好",但在多轮上下文中是**对上轮 ComplexTask 的挑选/细化**,应继承 CT。SFT 模型在只看当前 query 时判错。
## 应用场景
- **数据增强**:生成带 prev_session 的训练样本时,如果 prev 是 `ComplexTask(...)`,当前 query 与之相关 → ground_truth 必须是 ComplexTask(不能矛盾)
- **训练集清洗**:不要把"多轮延续同任务"类样本的 complex=true 改为 falseR17774 的 47 条改动里,L10752 / L10943 / L10954 等 multi_turn_deixis 已保留未改,正确)
- **Badcase 分析**:错例 query 如果语境是对上轮 CT 的延续,SFT 模型判错不能靠修改训练集同 pattern 样本的 label 来解,需要补"带 prev_session 的延续 CT"仿写增强模型学到上下文信号
- **Reward 函数**:对违反此规则的预测(prev=CT + 相关继续 但 pred complex=false)应被惩罚
## 反模式
- ❌ 只看当前 query 文本判 complex,忽略 prev_session
- ❌ 训练集批改 complex=true→false 时未检查 prev_session,导致多轮延续样本被误改
- ❌ 生成仿写时当前 query 与 prev_session 矛盾(prev CT 但 current 标 complex=false
@@ -0,0 +1,21 @@
# 地图导航 Agent / ComplexTask 分流规则
## 核心判定逻辑
| 场景 | 输出 | 示例 |
|------|------|------|
| 单POI + 任意数量形容词 | `Agent(tag="地图导航")` | 导航去最近的加油站、去附近最便宜的停车场 |
| 多POI(多个目的地) | `ComplexTask(tag="地图导航")` | 先去加油站再去机场接人 |
| 单POI + 一句话描述当前状态 | `ComplexTask(tag="地图导航")` | 加完油再去机场("加完油"描述当前状态) |
## 判定要点
- **形容词不影响分流**:不管加多少形容词修饰(最近的、便宜的、大的),只要是单POI就是 Agent
- **多目的地 = Complex**:只要 query 中出现多个地点/动作序列,就是 ComplexTask
- **状态描述 = Complex**:单POI 但前面带了一句描述当前状态的话(如"加完油"、"吃完饭"),说明用户在做多步规划,属于 ComplexTask
## 应用场景
- 数据增强时:按此规则标注 ground_truth
- Badcase 分析时:以此为标准区分"分流错误"和"语义错误"
- Reward 函数:分流违反此规则的应被惩罚
@@ -0,0 +1,26 @@
# 旅游 Agent / ComplexTask 分流规则
## 核心判定逻辑
| 场景 | 输出 | 示例 |
|------|------|------|
| 规划路线,无筛选条件 | `Agent(tag="旅游")` | 规划一个从北京到上海的路线 |
| 规划路线,有筛选条件 | `ComplexTask(tag="旅游")` | 规划一个从北京到上海的路线,人少风景好、三天两夜、3000预算 |
## 判定要点
- **无条件纯路线规划 = Agent**:只要求从A到B的路线,没有额外约束
- **带筛选/约束条件 = Complex**:路线规划附带了时间、预算、偏好、天数等任何筛选条件,说明需要多维度规划,属于 ComplexTask
## 筛选条件举例
- 时间约束:三天两夜、五一假期、周末
- 预算约束:3000预算、经济型
- 偏好约束:人少、风景好、适合亲子、有美食
- 交通约束:自驾、高铁优先
## 应用场景
- 数据增强时:按此规则标注 ground_truth
- Badcase 分析时:以此为标准区分"分流错误"和"语义错误"
- Reward 函数:分流违反此规则的应被惩罚