docs: add core-training.md - three approaches for training the heuristic scheduler

- RL approach: MDP formulation, PPO, curriculum learning
- LLM-driven approach: compact LLM fine-tuned as scheduler
- Neuro-symbolic approach (recommended): symbolic rules (70%) + small neural policy (30%) + arbiter
- Expression verifier training for Core's internal verification component
- Comprehensive training pipeline combining all approaches
- Evaluation metrics for Core performance
This commit is contained in:
root
2026-06-01 10:00:16 +08:00
parent 3345394bf5
commit c3faa570ca

483
docs/core-training.md Normal file
View File

@ -0,0 +1,483 @@
# 调度 Core — 训练方案
## 概述
调度 Core 是 NextAgent 的"大脑"——它不处理原始数据,也不直接参与推理,而是作为**启发式调度决策引擎**协调四个子网。这使得 Core 的训练与子网的模型训练有本质区别。
### Core 不是深度学习模型
| 子网 | 训练方式 | 预训练/微调 |
|------|---------|------------|
| 路由与压缩子网 | 对比学习 + VAE + 蒸馏 | 标准 DL 训练 |
| 记忆子网 | GNN + RL + 编解码 | 标准 DL 训练 |
| 逻辑链路追踪子网 | SFT + RLHF + MCTS | 标准 DL 训练 |
| LLM 子网 | SFT + RLHF | 标准 DL 训练 |
| **调度 Core** | **强化学习 / 行为克隆 / 神经符号** | **决策引擎学习** |
Core 的核心能力是**做决策**——在给定当前状态(各子网返回的张量、置信度、历史记录)下,决定下一步:
- 调哪个子网?
- 传什么参数?
- 是否需要重复调用?
- 结果是否可信?
### Core 的学习目标
| 能力 | 说明 |
|------|------|
| 任务解析 | 从路由标签张量中理解用户意图,拆解子任务 |
| 调度决策 | 在正确时机调正确的子网,避免无效循环 |
| 冲突仲裁 | 子网返回矛盾时做出合理判断 |
| 表达验证 | 从 LLM 的表达验证张量判断输出质量 |
| 记忆中介 | 正确打包查询和新信息给记忆子网 |
| 效率控制 | 在质量与延迟之间平衡(决定何时结束调度循环) |
---
## 训练方法一:强化学习(推荐)
### 方法论
将 Core 的调度决策建模为**马尔可夫决策过程(MDP)**:
```
状态 S = (当前任务状态, 各子网返回张量的摘要, 置信度向量, 循环次数)
动作 A = (目标子网, 调用参数, 是否结束循环)
转移 P = 执行动作后子网返回新张量
奖励 R = 任务完成质量 - 延迟惩罚 - 无效调用惩罚
```
### 状态空间设计
```
State = {
"task_type": # 任务类型(路由子网标签)
"memory_available": # 是否有相关记忆
"memory_confidence": # 记忆检索置信度
"reasoning_confidence": # 逻辑推理置信度
"reasoning_consistency": # 推理结果一致性
"expression_confidence": # LLM 表达验证置信度
"iteration": # 当前循环次数
"max_iterations": # 最大允许次数
"elapsed_time": # 已耗时
"conflict_flag": # 是否存在矛盾
}
```
### 动作空间设计
```
Action = {
"subnet": "routing | memory | logic | llm | stop",
"params": {
"query_type": "initial | deep | cross_verify",
"context_depth": "shallow | medium | deep",
"priority": "normal | urgent"
}
}
```
### 奖励函数
```
R = R_task + R_efficiency + R_penalty
R_task = 任务完成度 × w1
- 推理结果准确 +1,部分正确 +0.5,错误 -1
- LLM 表达验证通过 +0.5
R_efficiency = -延迟惩罚 × w2
- 每增加一次迭代 -0.1
- 超过最大迭代 -1
R_penalty =
- 冗余调用(调用子网但结果未使用)-0.3
- 矛盾未检测 -0.5
- 过早停止导致结果错误 -0.8
```
### 训练流程
```
阶段 1:离线数据收集
├── 手动标注专家调度轨迹
│ (路由→记忆→推理→LLM 等序列)
├── 记录每次调用的上下文状态和结果
└── 构建初始数据集 (S, A, R)
阶段 2:行为克隆(预训练)
├── 用专家轨迹训练初始策略网络
├── 监督学习:输入 S → 输出 A
├── 损失函数:交叉熵
└── 训练 100k 步
阶段 3:在线 RL 训练(PPO / DQN)
├── 在模拟环境中运行完整系统
├── 每次任务结束计算奖励
├── 收集经验回放池 (S, A, R, S')
├── PPO 算法优化策略
└── 训练 500k 步(或收敛为止)
阶段 4:课程学习
├── 简单任务 → 复杂任务逐步推进
├── Level 1: 单轮查询(路由→记忆→LLM)
├── Level 2: 多步推理(路由→记忆→推理→LLM)
├── Level 3: 需要回溯(中间需再次调路由/记忆)
└── Level 4: 矛盾检测与冲突仲裁
```
### 网络架构
推荐使用**小型 Transformer** 或 **MLP + Attention** 作为策略网络:
```
State 张量 (768维)
│
▼
┌──────────────────┐
│ 状态编码器 │
│ MLP(768→256) │
│ LayerNorm │
└──────┬───────────┘
│
▼
┌──────────────────┐
│ 历史注意力层 │
│ 之前的动作序列 │
│ Transformer × 2 │
│ num_heads=4 │
└──────┬───────────┘
│
▼
┌──────────────────┐
│ π 头 (Policy) │
│ 输出: 子网选择 │
│ 维度: 5 (4子网+停)│
└──────────────────┘
│
▼
┌──────────────────┐
│ V 头 (Value) │
│ 输出: 状态价值 │
│ 维度: 1 │
└──────────────────┘
```
### 难点与对策
| 难点 | 对策 |
|------|------|
| 奖励稀疏(只有任务结束时才有明确奖励) | 过程奖励模型(PRM)+ 中间奖励(子网调用是否产生新信息) |
| 动作空间离散导致的搜索低效 | 课程学习 + 动作屏蔽(排除明显无用的调用) |
| 状态空间高维 | 状态压缩(只保留关键张量的摘要统计量) |
| 训练不稳定 | PPO 的 KL 散度约束 + 经验回放 + 目标网络固定 |
---
## 训练方法二:LLM 驱动的 Core
### 方法论
用一个**紧凑型 LLM**(如 Qwen 2.5-1.5B / Llama 3.2-3B)作为 Core 的推理引擎,微调为调度专家。
### 输入格式
将当前状态格式化为结构化文本,输入 LLM:
```
当前任务:用户查询北京天气
子网状态:
- 路由标签:{类型: 天气查询, 实体: ["北京"], 时间: "今天"}
- 记忆检索:{命中: true, 相关实体: ["北京_天气偏好"], 置信度: 0.92}
- 推理结果:{状态: 待推理, 置信度: -}
- 当前迭代:第 1 轮 / 最多 10 轮
请决定下一步操作:
A. 调逻辑推理子网(已知信息充足)
B. 调路由子网获取更多特征(需要详细时间信息)
C. 调记忆子网深度检索(需要历史对比)
D. 直接送 LLM 表达(无需推理)
E. 终止
```
### 输出格式
LLM 输出格式化的调度决策:
```json
{
"action": "step_A",
"subnet": "logic_trace",
"params": {
"mode": "standard_reason",
"context_included": ["memory", "routing"]
},
"reasoning": "用户查询明确,路由标签已提取所有实体,记忆也有相关偏好,可以开始推理了"
}
```
### 微调方案
| 阶段 | 数据 | 方法 |
|------|------|------|
| SFT | 10万条专家调度轨迹 | LoRA 微调 |
| DPO | 调度结果偏好对(好调度 vs 差调度) | 直接偏好优化 |
| RFT | 强化反馈微调 | 基于在线反馈的迭代优化 |
### 优势 vs 劣势
| 方面 | RL 方法 | LLM 驱动 |
|------|---------|---------|
| 可解释性 | 黑箱策略 | 高(LLM 输出推理过程) |
| 泛化能力 | 需针对新任务重训 | 强(LLM 已预训练泛化能力) |
| 延迟 | 毫秒级 | 几十毫秒级 |
| 资源消耗 | 小网络 | LLM 推理成本 |
| 稳定性 | 训练不稳定 | 微调稳定 |
| 复杂度 | 需 RL 基础设施 | 只需 LLM 微调 |
---
## 训练方法三:神经符号方法(推荐混合方案)
### 方法论
结合手写规则的可解释性与神经网络的适应性:
```
┌──────────────────────────────────────────────┐
│ Core 调度引擎 (神经符号) │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 符号调度器 (70%) │ │ 神经策略 (30%) │ │
│ │ │ │ │ │
│ │ 手写规则库: │ │ 小 MLP 网络 │ │
│ │ × 路由→先查记忆 │ │ 覆盖符号规则 │ │
│ │ × 记忆→然后推理 │ │ 无法处理的 │ │
│ │ × 推理→送LLM表达 │ │ 模糊/新情况 │ │
│ │ × 低于阈值→回溯 │ │ │ │
│ │ │ │ 输入: 状态张量 │ │
│ │ 确定性,可解释 │ │ 输出: 规则例外 │ │
│ │ 覆盖常见场景 │ │ 建议 │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ 仲裁器 (Arbiter) │ │
│ │ 符号 vs 神经决策 │ │
│ │ 冲突时符号优先 │ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────┘
```
### 符号规则库示例
```python
rules = [
# 规则1: 新任务先查记忆
Rule(
condition=State.task_type == "new" and State.memory_queried == False,
action=Action(subnet="memory", params=QueryParams(mode="initial"))
),
# 规则2: 有记忆后送推理
Rule(
condition=State.memory_confidence > 0.7 and State.reasoning_done == False,
action=Action(subnet="logic_trace", params=ReasonParams(mode="standard"))
),
# 规则3: 推理置信度不足时回溯
Rule(
condition=State.reasoning_confidence < 0.5 and State.iteration < MAX_ITER,
action=Action(subnet="routing", params=ExtractParams(mode="detail"))
),
# 规则4: 结果可靠时送 LLM 表达
Rule(
condition=State.reasoning_confidence >= 0.7 or State.iteration >= MAX_ITER - 1,
action=Action(subnet="llm", params=ExpressParams())
),
# 规则5: 表达验证不通过则重新推理
Rule(
condition=State.verify_confidence < 0.6 and State.retry_count < 2,
action=Action(subnet="logic_trace", params=ReasonParams(mode="rethink"))
),
# 规则6: 本轮结束后通知路由处理残留数据
Rule(
condition=State.round_ended == True,
action=Action(subnet="routing", params=FlushParams())
),
]
```
### 神经策略训练
```python
class NeuralOverride(nn.Module):
"""覆盖符号规则无法处理的模糊情况"""
def __init__(self):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 32)
)
self.uncertainty_head = nn.Linear(32, 1) # 不确定性估计
self.override_head = nn.Linear(32, 3) # 覆盖建议
def forward(self, state):
h = self.encoder(state)
uncertainty = torch.sigmoid(self.uncertainty_head(h))
override = torch.softmax(self.override_head(h), dim=-1)
return uncertainty, override
```
### 训练策略
1. **符号规则**:手工编写,无需训练,覆盖 70% 常见场景
2. **神经策略**:仅在符号规则的"确定性边界"附近训练
- 数据来源:符号规则产生低确定性(0.4~0.7)的边界情况
- 训练目标:学习何时打破规则
- 训练数据量:仅需 1~5 万条(远少于纯 RL 方案)
3. **仲裁器**:确定性阈值法
- 符号确定性 > 0.7 → 走符号路径
- 符号确定性 < 0.4 → 走神经路径
- 0.4~0.7 → 加权融合
### 推荐理由
| 考量 | 为什么神经符号方案适合 Core |
|------|---------------------------|
| Core 的决策有大量确定性常识 | "新任务先查记忆"是明显的规则,无需学习 |
| 边界情况需要灵活性 | 模糊场景需要神经策略适应 |
| 可解释性要求 | Core 的决策应该能被人类理解 |
| 训练成本 | 符号规则零成本,神经策略训练数据少 |
| 鲁棒性 | 符号规则保证基础行为不崩溃 |
| 可迭代 | 发现问题后直接修改符号规则即可 |
---
## 表达验证器训练(Core 内部组件)
Core 的一个核心职责是**接收 LLM 的表达验证张量,判断输出质量**。这本质上是一个**二分类/回归问题**。
### 训练数据集
```json
{
"input": {
"reasoning_path": "{推理路径张量摘要}",
"expression_tensor": "{表达验证张量}",
"original_intent": "用户问北京今天天气"
},
"label": {
"correctness": 0.95,
"completeness": 1.0,
"faithfulness": 0.92,
"overall_pass": true
}
}
```
### 模型
小型分类器(MLP),输入为表达验证张量 + 推理路径张量的联合特征:
```
输入: 表达验证张量 (768维) + 推理路径张量 (768维)
│
▼
MLP(1536 → 256 → 64 → 3)
│
├── 正确性得分 (0~1, sigmoid)
├── 完整度得分 (0~1, sigmoid)
└── 通过/不通过 (binary)
```
### 训练
- 数据:人工标注 1 万条 LLM 输出-验证对
- 损失:二元交叉熵(通过/不通过)+ MSE(正确性/完整度)
- 训练 50 epochs
- 评估:验证准确率 ≥ 95%
---
## 综合训练流程
```
Core 训练总流程
│
┌───────────────────┴──────────────────────┐
│ │
符号规则编写 神经策略训练
│ │
┌────┴────┐ ┌──────┴────────┐
│ 规则1~N │ ┌────────────────┤ │
│ 手工编写 │ │ │ │
│ 单元测试 │ ▼ │ │
└─────────┘ ┌──────────────────┐ │ │
│ 阶段1: 行为克隆 │ │ │
│ 10K 专家轨迹 │ │ │
│ SFT 预训练 │ │ │
└────────┬─────────┘ │ │
▼ │ │
┌──────────────────┐ │ │
│ 阶段2: 在线 RL │ │ │
│ 模拟环境 │ │ │
│ PPO 优化 │ │ │
│ 500K 步 │ │ │
└────────┬─────────┘ │ │
▼ │ │
┌──────────────────┐ │ │
│ 阶段3: 边界训练 │ │ │
│ 符号→神经交叠区 │ │ │
│ 1~5万条边界数据 │ │ │
└────────┬─────────┘ │ │
│ │ │
└─────────────────┘ │
│ │
▼ │
┌──────────────────┐ │
│ 仲裁器整合 │ │
│ 确定性阈值调优 │ │
│ 端到端验证 │ │
└──────┬───────────┘ │
│ │
▼ │
┌──────────────────┐ │
│ 表达验证器训练 │ │
│ 1万条标注数据 │ │
└──────────────────┘ │
│ │
▼ │
┌──────────────────┐ │
│ 集成测试 && 上线 │ │
│ 与四个子网联调 │ │
└──────────────────┘ │
```
## 评估指标体系
| 指标 | 计算方式 | 目标 |
|------|----------|------|
| 调度正确率 | 调度序列与专家一致的比例 | ≥ 85% |
| 端到端任务成功率 | 完整链路最终结果正确 | ≥ 90% |
| 冗余调用率 | 无产出调用的比例 | ≤ 5% |
| 平均调度次数 | 每次任务平均调度子网次数 | ≤ 5 次 |
| 平均响应延迟 | 从输入到输出的总时间 | ≤ 2s |
| 冲突检测率 | 能识别出的子网矛盾比例 | ≥ 95% |
| 表达验证准确率 | 判断 LLM 输出正确性的准确率 | ≥ 95% |
| 记忆中介准确率 | Core 传递给记忆子网的信息完整性 | ≥ 98% |
## 建议
对于 NextAgent 的初期实现,推荐**神经符号混合方案**:
1. **第 1 阶段**:纯符号规则驱动 Core(零训练成本,1 天完成)
2. **第 2 阶段**:在边界数据上训练小神经策略(1 周)
3. **第 3 阶段**:加入表达验证器训练(3 天)
4. **第 4 阶段**:逐步替换符号规则为 RL 优化的决策(2 周)
这样能快速搭建可工作的系统,再逐步优化。