类型预测正确才算路由成功;运行时只有类型决定进入工具系统还是直接响应。
最终 0.6B 路由 · 9,000 / 9,000 · 100.0000%100-TOOL COMMERCE AGENT · INTEGRATED SYSTEM STUDY
让复杂电商请求,
先找齐工具,再排对工具链。
面向固定 100 工具的离线系统:先完成意图分流、候选检索与有序工具链规划,再用模型外上下文编排处理自然历史回放与完整新请求切换。
- 100
- 固定工具空间
- 100.00%
- 截至意图分流 · 9,000 / 9,000
- 98.24%
- 截至候选检索 · 8,842 / 9,000
- 92.62%
- 单轮 9K 最终有序工具链 · 8,336 / 9,000
帮我看看这款台灯的包裹送到哪了。
- 01意图分流电商类 · 进入工具选择通过
- 02混合检索BM25 + 负样本训练向量模型前 40
- 03重排融合精排 20 + 二级 RRF输出 10
INTRODUCTION · 项目介绍
任务、工具与三阶段系统
面向固定 100 工具,先判断请求是否需要工具,再找齐全部必要工具,最后输出正确的有序工具链。
最终系统采用 0.6B 路由、完整负样本检索链与 8B Planner;Planner 先用 77,724 条两种写法的数据完成监督训练,再用当前模型真实错误完成 RPO 与 DPO。9K 逐阶段通过数为 9,000 → 8,842 → 8,336。结果止于工具 ID 序列,不含真实工具执行。
如何判定成功 · 同一批 9,000 条请求逐阶段计算
一条请求的全部目标工具都进入 Top-K,候选集合才算完整覆盖。
电商请求 6K · 5,842 / 6,000 · 97.3667% | 9K 累计 · 8,842 / 9,000 · 98.2444%集合全对要求工具集合完全一致;工具链全对进一步要求工具及其顺序完全一致。
最终有序工具链 · 8,336 / 9,000 · 92.6222%为什么检索有两个百分比:97.3667% 只计算 6,000 条电商请求;98.2444% 还把 3,000 条被 0.6B 正确分流、无需检索的闲聊计入 9K 系统累计值。电商请求随后还要生成完全正确的有序工具链。
多轮结果单独计算:开发集为 991 段、独立测试为 993 段 2~7 轮自然短会话,每段只统计最后一个目标轮;方案 L 的独立测试整体准确率为 94.56%,不接在这条单轮 9K 曲线上。
指标示例AllHit@K 与集合 / 工具链全对率 +
完整覆盖,才算一次命中
候选检索只负责把全部必要工具送进短名单;它不判断最终工具集合是否精确,也不评测执行顺序。
“查一下订单详情、物流状态,并帮我确认退款进度。”
get_order_detailget_order_logisticsget_refund_status
get_order_detailget_order_logisticsget_refund_status · 遗漏
命中 2/3,但必要工具集合仍不完整。
同一个请求,Top-K 覆盖全部三个必要工具。
get_order_detailget_order_logisticsget_refund_status
get_order_detailget_order_logisticsget_refund_status
目标工具 ⊆ Top-K,才记为一次成功。
工具选对,不等于顺序排对
工具链规划既要选出精确工具集合,也要按照用户要求与工具依赖生成正确顺序;因此需要同时报告集合与工具链指标。
用户要求:先查订单详情,再查物流,最后确认退款进度。
get_order_detailget_order_logisticsget_refund_status
工具及其顺序共同构成目标工具链。
工具集合没有遗漏,但后两步顺序被调换。
get_order_detailget_refund_statusget_order_logistics
集合一致;完整有序序列不一致。
100 工具能力底座
100 个工具覆盖 8 个业务域,统一供数据生成、候选检索与工具链规划使用。
完整工具目录浏览 100 个工具及容易混淆的相关工具 +
当前显示 100 个工具
选择任意工具查看能力描述与相关能力;使用上方业务域快速筛选目录。
实验 01 · 意图分流
先判断请求是否需要进入工具系统
区分电商请求与开放闲聊;只有电商请求进入候选检索。
采用说明:最终路由使用 Qwen3-0.6B LoRA checkpoint-2000。它在固定 9K 上分类全对,且比 1.7B 推理更快、显存更低;当前检索只读取原始请求,不使用预测关键词,因此 1.7B 的关键词优势不会传递到后续模块。1.7B 只保留为对照。
01 · 模型选择与主结果先比较路由准确率,再比较两个候选版本的关键词输出 +
01A · 分类路由主指标
比较规则、未微调与 LoRA 版本
七个版本使用同一固定 9K 测试集;Accuracy 与 Macro-F1 衡量路由分类。绿色行是最终采用的 0.6B checkpoint-2000,1.7B 只保留作分类、关键词与成本对照。
| 模型 | 训练状态 | 模型版本 | Accuracy | Macro-F1 | 用途 |
|---|---|---|---|---|---|
| 关键词规则 | 规则基线 | — | 50.22% | 48.84% | 规则起点 |
| Qwen3-0.6B | 未微调 | 原始模型 | 84.76% | 83.74% | 同尺寸训练前基线 |
| Qwen3-0.6B | LoRA · 同一 45.6K 样本 · 原始排列 | 训练步 2000 | 100.00% | 100.00% | 最终路由模型 |
| Qwen3-0.6B | LoRA · 同一 45.6K 样本 · 原始排列 | 训练步 2852 | 99.98% | 99.97% | 同一次训练的结束版本 |
| Qwen3-1.7B | 未微调 | 原始模型 | 90.47% | 88.38% | 更大模型对照 |
| Qwen3-1.7B | LoRA · 同一 45.6K 样本 · 类别均衡排列 | 训练步 1600 | 99.88% | 99.86% | 最低验证损失版本 |
| Qwen3-1.7B | LoRA · 同一 45.6K 样本 · 类别均衡排列 | 训练步 2852 | 99.96% | 99.95% | 关键词与成本对照 |
01B · 两个候选版本
补充比较分类判断与关键词输出
由已有预测离线复算,没有重新推理;分类指标覆盖完整 9,000 条,关键词指标只统计其中 6,000 条电商请求。
| 模型版本 | 分类 Macro-P | 分类 Macro-R | 分类 Macro-F1 | 关键词集合全对率 | 关键词 micro-P | 关键词 micro-R | 关键词 micro-F1 |
|---|---|---|---|---|---|---|---|
| 0.6B · 最终路由 | 100.00% | 100.00% | 100.00% | 56.13% | 81.01% | 83.19% | 82.08% |
| 1.7B · 关键词输出对照 | 99.97% | 99.93% | 99.95% | 57.82% | 81.15% | 87.23% | 84.08% |
关键词按 100 个工具的规范标签做字面集合匹配,不是语义等价评分;候选检索直接使用原始请求,不消费预测关键词。因此 1.7B 的关键词 micro-F1 较高只是输出侧差异,最终系统仍选择分类全对且成本更低的 0.6B。
02 · 数据、训练与推理核对每套数据的用途、训练成本与推理效率 +
02A · 每套数据的用途
区分训练、checkpoint 选择与最终路由比较
| 数据 | 规模 | 构造方法 | 用途 |
|---|---|---|---|
| 监督训练与验证电商轨迹 + 独立闲聊 | 45,606 / 2,400合计 48,006 条 | GPT-5.5 Agent 编写的离线生成逻辑依据 100 工具目录构造电商请求;程序化扩展通用与易混淆闲聊,再按固定随机种子划分 95% / 5%;构建时未调用外部 API | 训练 0.6B / 1.7B;验证集监控损失并保留检查点 |
| 意图分流与路由选择入口二分类 | 9,0006K 电商 + 3K 闲聊 | 6K 电商请求由同一离线生成逻辑使用独立表达簇构造;3K 闲聊由主题与句式组合生成,去重后固定打乱 | 比较规则、未微调模型与 LoRA 版本;选出 0.6B 后复用于 9K 系统计分 |
| 关键词评测测试集电商子集 | 6,00015,196 个目标标签 | 直接取 9K 中的电商请求,并把目标工具 ID 映射为工具目录中的规范关键词集合 | 计算字面集合全对率与 micro-P / R / F1;候选检索不使用预测关键词 |
隔离检查:训练与测试的归一化请求、轨迹 ID 和相似请求写法分组精确重合均为 0;闲聊样本独立构建。
比较 0.6B / 1.7B 的 LoRA 训练成本
| 模型与样本排列 | 最低验证损失版本 | 页面报告版本 | 完整训练 | 训练信息 |
|---|---|---|---|---|
| Qwen3-0.6B45,606 条 · 原始排列 | 训练步 2000loss 0.00038608 | 训练步 2000最终路由模型 | 19 分 39 秒2,852 步 | BF16 · 批量 32 · 2 轮 · 学习率 1e-4LoRA r16 / α32 / dropout 0.05 · 最大长度 512 |
| Qwen3-1.7B45,606 条 · 类别均衡排列 | 训练步 1600loss 0.00028329 | 训练步 2852关键词输出对照 | 29 分 05 秒2,852 步 | BF16 · 批量 32 · 2 轮 · 学习率 1e-4LoRA r16 / α32 / dropout 0.05 · 最大长度 512 |
调参范围:意图实验没有逐项控制学习率、轮数和 LoRA 参数进行网格搜索;这里只比较同一训练参数下的两种模型规模与不同训练步数,因此不能称为“完整超参数搜索”。
比较七个路由版本的离线推理成本
六个神经版本均使用 1 × RTX 3090 24GB;0.6B / 1.7B 的批量分别为 64 / 48。
| 模型版本 | 硬件 / 批量 | p50 / p95 | 样本吞吐 | 峰值显存:已分配 / 已保留 |
|---|---|---|---|---|
| 关键词规则单线程 CPU | Montage Jintide C6230R / 1 | 0.1066 / 0.1493ms | 8,727.45 条 / 秒 | — |
| 0.6B · 未微调 | RTX 3090 / 64 | 37.23 / 38.35ms | 27.08 条 / 秒 | 3.65 / 4.73 GiB |
| 0.6B · LoRA · 训练步 2000最终路由模型 | RTX 3090 / 64 | 45.47 / 49.05ms | 21.90 条 / 秒 | 4.04 / 5.10 GiB |
| 0.6B · LoRA · 训练步 2852 | RTX 3090 / 64 | 44.83 / 54.11ms | 22.06 条 / 秒 | 4.04 / 5.10 GiB |
| 1.7B · 未微调 | RTX 3090 / 48 | 54.64 / 58.57ms | 18.52 条 / 秒 | 5.43 / 5.86 GiB |
| 1.7B · LoRA · 训练步 1600最佳验证版本 | RTX 3090 / 48 | 69.58 / 75.51ms | 14.36 条 / 秒 | 6.09 / 6.85 GiB |
| 1.7B · LoRA · 训练步 2852关键词输出对照 | RTX 3090 / 48 | 69.24 / 75.82ms | 14.41 条 / 秒 | 6.09 / 6.85 GiB |
最终选择:相对 1.7B 对照,0.6B 的生成 p50 下降约 34.3%,吞吐提高约 52.0%,峰值已分配显存下降约 33.6%;同时 9K 路由由 8,996 条正确提高到 9,000 条正确。
推理环境:PyTorch 2.8.0+cu128 · Transformers 4.53.2 · PEFT 0.14.0 · 驱动 570.124.04。RTX 3090 记录只绑定推理,不代表历史训练硬件。
延迟如何计算:p50 / p95 是生成阶段在批内平均到每条请求的时间,不含 prompt 构建与分词,也不等同于线上单请求延迟。不同批量以及 CPU 规则方法不直接比较速度;显存只报告本次推理记录的 CUDA 峰值。
峰值显存:“已分配”是推理时模型实际占用的显存峰值,“已保留”是 PyTorch 为复用和缓存预留的显存峰值上限。
实验 02 · 候选检索
候选检索:从训练前基线到最终 Top-10
这一章只负责从 100 个工具中找出 10 个候选,并尽量让本轮需要的工具全部在其中;后续如何选择和排序工具,留到实验 03。
训练前筛选 → 训练与选型 → 最终测试 → 成本与复现
全章使用同一个判断:本轮需要的每个工具都进入 Top-10 才算检索成功;少一个就失败。这里不统计后续规划模型的工具链结果。
向量检索与 BM25 各取 40 个候选,第一次融合后精排 20 个,再经第二次融合输出 10 个;实验 02 到这里结束。
01 · 训练前基线与候选筛选先选向量与融合方案,再确定候选深度和重排模型 +
用训练前基线确定微调候选与搜索范围
以下结果均来自固定 6,000 条项目基准,用于建立训练前基线,并据此确定进入任务内微调的模型候选和参数搜索范围;最终模型仍按微调后的开发集结果选择。
比较未微调向量模型与融合方案
4 组单路基线与 9 组固定 N=20 融合;按 AllHit@10 选择后续公开重排的统一候选来源。
| 类别 | 模型或配置 | AllHit@6 | AllHit@10 | AllHit@30 | MRR |
|---|---|---|---|---|---|
| 词面检索 | BM25 · 备用分词器 | 49.40% | 55.75% | 75.95% | 76.84% |
| 向量检索 | 未微调 BAAI/bge-base-zh-v1.5 | 35.83% | 44.30% | 71.75% | 52.02% |
| 向量检索 | 未微调 BAAI/bge-large-zh-v1.5 | 38.23% | 47.63% | 73.47% | 56.90% |
| 向量检索 | 未微调 Qwen/Qwen3-Embedding-0.6B | 30.87% | 40.60% | 63.77% | 49.21% |
| 混合检索 | bge-base + BM25 · Union · 每路 Top-20 | 48.87% | 57.93% | 81.35% | 75.52% |
| 混合检索 | bge-base + BM25 · 分数加权 · 每路 Top-20 | 45.43% | 55.58% | 81.48% | 65.03% |
| 混合检索 | bge-base + BM25 · RRF · 每路 Top-20 | 50.57% | 60.47% | 81.37% | 74.65% |
| 混合检索 | bge-large + BM25 · Union · 每路 Top-20 | 51.73% | 62.30% | 85.67% | 73.73% |
| 混合检索 | bge-large + BM25 · 分数加权 · 每路 Top-20 | 46.95% | 59.88% | 85.75% | 67.19% |
| 混合检索 | bge-large + BM25 · RRF · 每路 Top-20(重排候选来源) | 50.83% | 63.67% | 85.73% | 71.19% |
| 混合检索 | Qwen3 向量模型 + BM25 · Union · 每路 Top-20 | 50.42% | 61.93% | 86.78% | 73.34% |
| 混合检索 | Qwen3 向量模型 + BM25 · 分数加权 · 每路 Top-20 | 42.80% | 57.40% | 86.65% | 61.77% |
| 混合检索 | Qwen3 向量模型 + BM25 · RRF · 每路 Top-20 | 48.20% | 62.52% | 86.85% | 71.65% |
选定融合方案后比较一级候选深度
固定 bge-large + BM25,比较两路各自截取的候选数量。N=20 的 RRF AllHit@10 最高;N=30/50 提高候选池覆盖,但候选更多且未改善 RRF Top-10。
| 每路候选 N | 候选池 AllHit | 平均合并候选 | Union A@10 | 加权 A@10 | RRF A@10 | RRF A@30 | 判断 |
|---|---|---|---|---|---|---|---|
| N=10 | 72.93% | 16.86 | 62.18% | 61.60% | 62.97% | 72.93% | 候选较浅 |
| N=20 | 87.88% | 32.72 | 62.30% | 59.88% | 63.67% | 85.73% | 进入公开重排比较 |
| N=30 | 93.45% | 47.14 | 62.32% | 58.20% | 59.63% | 86.50% | 覆盖更高,Top-10 回退 |
| N=50 | 97.65% | 71.17 | 62.40% | 58.68% | 62.35% | 82.22% | 覆盖最高,成本最高 |
固定候选池后筛选待微调的重排模型
5 个公开模型共享 bge-large + BM25 + RRF 候选池:两路各取 Top-20,合并后最多重排 40 个;其中 4 个进入后续任务内微调,Jina 仅作训练前对照。
| 模型 | 推理框架 | AllHit@6 | AllHit@10 | AllHit@30 | MRR |
|---|---|---|---|---|---|
| BAAI/bge-reranker-base | FlagEmbedding | 58.18% | 68.83% | 87.68% | 82.50% |
| BAAI/bge-reranker-large | FlagEmbedding | 59.85% | 69.67% | 87.25% | 82.97% |
| BAAI/bge-reranker-v2-m3 | FlagEmbedding | 56.22% | 65.88% | 87.27% | 82.35% |
| jinaai/jina-reranker-v2-base-multilingual | FlagEmbedding | 46.52% | 57.18% | 86.98% | 71.11% |
| Qwen/Qwen3-Reranker-0.6B | SentenceTransformers | 67.02% | 77.32% | 87.65% | 88.45% |
固定未微调最优重排模型,比较候选深度收益
上表五个模型都使用 N=20;这里单独增加候选数量,只观察质量与成本如何变化。
| 每路候选 N | 平均合并候选 | AllHit@6 | AllHit@10 | AllHit@30 | MRR |
|---|---|---|---|---|---|
| N=10 | 16.86 | 64.68% | 70.58% | 72.93% | 88.35% |
| N=20 | 32.72 | 67.02% | 77.32% | 87.65% | 88.45% |
| N=30 | 47.14 | 67.28% | 78.05% | 91.47% | 88.57% |
| N=50 | 71.17 | 67.48% | 78.37% | 92.83% | 88.62% |
02 · 训练与参数选择从向量训练方案到“精排 20、规划读取 10” +
先确定基础训练参数,再用独立开发集选出最终检索链
先预筛向量模型、学习率和训练轮数,再以同一训练设置比较负样本方案;随后选择一级检索路线和微调重排模型,联合确定精排深度 R、规划输入深度 P 与二级融合参数。
预筛向量模型与基础训练参数
九组 MNRL 对比训练比较模型、轮数与学习率;共同使用 24K 训练轨迹、无显式负样本和固定随机种子 20260707。6,000 条日常电商请求的结果只用于观察参数趋势,最终向量模型由下一步独立开发集决定。
| 向量模型 | 训练设置 | AllHit@6 | AllHit@10 | AllHit@30 | MRR | 训练耗时 | 实验作用 |
|---|---|---|---|---|---|---|---|
| bge-base-zh-v1.5 | 0.25 轮 · lr2e-5 · 批量 64 | 77.8833% | 90.1167% | 99.4167% | 0.944691 | 50.77 秒 | 训练轮数下界 |
| bge-base-zh-v1.5 | 0.5 轮 · lr2e-5 · 批量 64 | 79.1833% | 91.7333% | 99.4667% | 0.952655 | 1 分 45 秒 | 中间轮数 |
| bge-base-zh-v1.5 | 1 轮 · lr1e-5 · 批量 64 | 78.8500% | 92.2500% | 99.3500% | 0.948139 | 7 分 19 秒 | 低学习率 |
| bge-base-zh-v1.5 | 1 轮 · lr2e-5 · 批量 64 | 81.0167% | 93.9500% | 99.5667% | 0.957062 | 7 分 18 秒 | 标准配置 |
| bge-base-zh-v1.5 | 1 轮 · lr3e-5 · 批量 64 | 81.2167% | 94.4500% | 99.6000% | 0.956073 | 7 分 23 秒 | 高学习率 |
| bge-base-zh-v1.5 | 1.5 轮 · lr2e-5 · 批量 64 | 81.5667% | 93.5667% | 99.5333% | 0.958142 | 9 分 25 秒 | 更长训练 |
| bge-large-zh-v1.5 | 0.5 轮 · lr2e-5 · 批量 64 | 85.5167% | 95.1500% | 99.6333% | 0.966435 | 2 分 57 秒 | 半轮对照 |
| bge-large-zh-v1.5 | 1 轮 · lr2e-5 · 批量 64 | 85.8000% | 95.7500% | 99.7167% | 0.966786 | 10 分 18 秒 | 下一步负样本比较的统一起点 |
| Qwen3-Embedding-0.6B | 0.5 轮 · lr2e-5 · 批量 32 | 82.3500% | 93.5833% | 99.5333% | 0.957144 | 5 分 18 秒 | 不同架构对照 |
预筛结论:bge-large 在同类预算下优于另外两种基础模型,训练 1 轮又比 0.5 轮高 0.60pp;因此固定 bge-large、1 轮、lr2e-5 和有效批量 64,继续比较显式负样本。该无负样本版本不是最终模型。
在统一训练设置下比较负样本方案
固定 bge-large、1 轮、lr2e-5 与有效批量 64,五种方案各运行三个随机种子,以独立 1,200 条开发集的 AllHit@10 均值选择;采用方案每组包含 1 个正例和 2 个显式负例。
| 训练方案 | 显式负样本 / 正对 | 单步批量 / 有效批量 | AllHit@10 · 均值 ± 标准差 | AllHit@20 | AllHit@50 | MRR | 选择 |
|---|---|---|---|---|---|---|---|
| 无显式负样本 · 大批量 | 0 | 64 / 64 | 98.7500% ± 0.1179pp | 99.9167% | 100.0000% | 0.996782 | 对照 |
| 无显式负样本 · 小批量 | 0 | 8 / 64 | 99.0000% ± 0.1361pp | 99.9445% | 100.0000% | 0.996875 | 批量对照 |
| 跨领域与新增无关负样本 | 2 | 8 / 64 | 99.5556% ± 0.1416pp | 100.0000% | 100.0000% | 0.997292 | 采用 |
| 同领域与部分替代负样本 | 2 | 8 / 64 | 99.0556% ± 0.3425pp | 99.9722% | 100.0000% | 0.996962 | 种子波动较大 |
| 四类负样本全部加入 | 4 | 8 / 64 | 99.3611% ± 0.1039pp | 99.9722% | 100.0000% | 0.996493 | 未选择 |
筛选一级检索路线,保留联合搜索候选
固定采用向量模型,搜索候选数量、向量权重与 RRF 平滑常数;去除重复排名和被全面支配的路线后,将 24 条候选交给下一级联合评估。
| 阶段 | 搜索或筛选范围 | 路线数 | 进入下一步的依据 |
|---|---|---|---|
| 完整参数网格 | 每路候选 10 / 20 / 30 / 40 / 50 / 75 / 100 × 17 个向量权重 × 10 个 RRF 平滑常数 | 1,190 | 计算 AllHit@10 / @20 / @30 / @40 / @50 与 MRR |
| 排名去重 | 合并产生完全相同工具排名的参数配置 | 1,043 | 每种排名只保留一条代表路线 |
| 多指标前沿 | 按五档 AllHit 与 MRR 去除被全面支配的路线 | 80 | 保留不同覆盖深度上的有效权衡 |
| 联合搜索输入 | 综合前沿、各深度强候选与路线排序后截断 | 24 | 与重排架构、5 档候选深度和二级 RRF 联合评估 |
24 条一级检索候选路线
展示进入重排与规划联合比较的全部路线
每路候选数 N、向量权重与 RRF 平滑常数共同决定一级排名;24 条路线的 AllHit@20 / @30 / @40 / @50 均为 100%,因此表内只展开有区分度的 @6 / @10 与 MRR。最终路线还要与精排和规划联合评估。
| # | 每路候选 N | 向量 / BM25 权重 | RRF 平滑常数 | 平均合并候选数 | AllHit@6 | AllHit@10 | MRR | 后续用途 |
|---|---|---|---|---|---|---|---|---|
| 01 | 30 | 0.70 / 0.30 | 1 | 43.2925 | 95.9167% | 100.0000% | 0.997917 | 联合搜索候选 |
| 02 | 30 | 0.70 / 0.30 | 2 | 43.2925 | 96.2500% | 100.0000% | 0.997917 | 联合搜索候选 |
| 03 | 30 | 0.70 / 0.30 | 3 | 43.2925 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 04 | 30 | 0.70 / 0.30 | 5 | 43.2925 | 96.0000% | 100.0000% | 0.997917 | 联合搜索候选 |
| 05 | 30 | 0.75 / 0.25 | 2 | 43.2925 | 95.9167% | 100.0000% | 0.997917 | 联合搜索候选 |
| 06 | 30 | 0.75 / 0.25 | 3 | 43.2925 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 07 | 30 | 0.75 / 0.25 | 5 | 43.2925 | 96.2500% | 100.0000% | 0.997917 | 联合搜索候选 |
| 08 | 30 | 0.75 / 0.25 | 8 | 43.2925 | 96.2500% | 100.0000% | 0.997917 | 联合搜索候选 |
| 09 | 30 | 0.80 / 0.20 | 5 | 43.2925 | 96.0833% | 100.0000% | 0.997917 | 联合搜索候选 |
| 10 | 30 | 0.80 / 0.20 | 8 | 43.2925 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 11 | 30 | 0.80 / 0.20 | 10 | 43.2925 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 12 | 30 | 0.85 / 0.15 | 10 | 43.2925 | 95.8333% | 100.0000% | 0.997917 | 训练侧难例挖掘 |
| 13 | 40 | 0.70 / 0.30 | 1 | 56.3125 | 95.9167% | 100.0000% | 0.997917 | 联合搜索候选 |
| 14 | 40 | 0.70 / 0.30 | 2 | 56.3125 | 96.2500% | 100.0000% | 0.997917 | 联合搜索候选 |
| 15 | 40 | 0.70 / 0.30 | 3 | 56.3125 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 16 | 40 | 0.75 / 0.25 | 2 | 56.3125 | 95.9167% | 100.0000% | 0.997917 | 联合搜索候选 |
| 17 | 40 | 0.75 / 0.25 | 3 | 56.3125 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 18 | 40 | 0.75 / 0.25 | 5 | 56.3125 | 96.2500% | 100.0000% | 0.997917 | 联合搜索候选 |
| 19 | 40 | 0.80 / 0.20 | 5 | 56.3125 | 96.0833% | 100.0000% | 0.997917 | 联合评估后正式采用 |
| 20 | 40 | 0.80 / 0.20 | 8 | 56.3125 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 21 | 40 | 0.80 / 0.20 | 10 | 56.3125 | 96.1667% | 100.0000% | 0.997917 | 联合搜索候选 |
| 22 | 40 | 0.85 / 0.15 | 10 | 56.3125 | 95.8333% | 100.0000% | 0.997917 | 联合搜索候选 |
| 23 | 40 | 0.85 / 0.15 | 20 | 56.3125 | 95.9167% | 100.0000% | 0.997917 | 联合搜索候选 |
| 24 | 40 | 0.85 / 0.15 | 30 | 56.3125 | 95.8333% | 100.0000% | 0.997917 | 联合搜索候选 |
阅读方式:第 12 条只用于从训练划分挖掘重排难例,不进入最终系统;第 19 条与重排模型、候选数量和最终融合共同比较后被采用。一级检索同分,不代表后续工具链准确率与成本也相同。
微调四个候选重排模型,选择架构与学习率
四个模型都完成任务内微调:先为每个模型选择学习率,再比较三个随机种子的开发集均值。这里选择模型,表内延迟对应各行使用的候选数;最终精排数量在 02F 与规划输入数量一起选择。
| 未微调基线入围模型 | 选中学习率 | AllHit@6 均值 | AllHit@10 均值 | MRR 均值 | 重排候选数 | 估算 p50 | 选择 |
|---|---|---|---|---|---|---|---|
| bge-reranker-base | 2e-5 | 97.6667% | 100.0000% | 0.998056 | 10 | 7.72ms | 架构对照 |
| bge-reranker-large | 6e-5 | 98.2222% | 99.9167% | 0.998472 | 20 | 48.89ms | 未选择 |
| bge-reranker-v2-m3 | 2e-5 | 98.4722% | 100.0000% | 0.997778 | 10 | 24.34ms | 采用 |
| Qwen3-Reranker-0.6B | 5e-6 | 98.3056% | 100.0000% | 0.999306 | 10 | 76.45ms | 延迟较高 |
固定重排模型,选择负样本组合
每组固定为 1 个正例和 7 个负例;所有方案都先精排 10 个候选,并用另一种模型检查负样本结论是否一致。这里只选择训练方案,最终精排数量由下一步确定。
| 重排模型与负样本 | AllHit@6 均值 | AllHit@10 均值 | MRR 均值 | 筛选 p50 · R=10 | 选择 |
|---|---|---|---|---|---|
| bge-reranker-v2-m3 · 3 个按工具类型挑选的负例 + 4 个检索难例 | 98.8889% | 100.0000% | 0.997639 | 24.42ms | 采用 |
| bge-reranker-v2-m3 · 7 个检索难例 | 98.6667% | 100.0000% | 0.998056 | 24.38ms | 未选择 |
| bge-reranker-v2-m3 · 4 个按工具类型挑选的负例 + 3 个随机负例 | 98.4722% | 100.0000% | 0.997778 | 24.34ms | 未选择 |
| Qwen3-Reranker-0.6B · 3 个按工具类型挑选的负例 + 4 个检索难例 | 98.5278% | 100.0000% | 0.999167 | 76.97ms | 架构交互复核 |
联合比较精排数量与规划输入数量
R 是 Cross-encoder 实际评分的候选数,P 是规划模型最终看到的候选数,并始终要求 P≤R。先保留工具链全对率与最高分相差不超过 0.5pp 的组合,再选择候选更少、输入更短的方案。
| 精排 R | 规划 P | 深度阶段二级 RRF第一阶段权重 / 平滑常数 | AllHit@P | 加权工具链全对率 | 平均输入 token | 精排 p50 | 判定 |
|---|---|---|---|---|---|---|---|
| 10 | 5 | 0.1 / 1 | 93.8333% | 89.9762% | 322.54 | 23.95ms | 覆盖不足 |
| 10 | 10 | 0.2 / 8 | 99.3750% | 98.4167% | 454.95 | 23.95ms | 与最高分差距超过预设容差 |
| 20 | 5 | 0.2 / 8 | 93.7917% | 89.9643% | 322.58 | 47.09ms | 覆盖不足 |
| 20 | 10 | 0.4 / 2 | 100.0000% | 99.3571% | 455.42 | 47.09ms | 最终选择 |
| 20 | 20 | 0.1 / 1 | 100.0000% | 99.5833% | 720.11 | 47.09ms | 分数接近最高,输入更长 |
| 30 | 5 | 0.2 / 8 | 93.7917% | 89.9643% | 322.63 | 70.98ms | 覆盖不足 |
| 30 | 10 | 0.3 / 1 | 100.0000% | 99.5714% | 455.66 | 70.98ms | 分数接近最高,精排更慢 |
| 30 | 20 | 0.1 / 8 | 100.0000% | 99.6429% | 721.16 | 70.98ms | 单点最高 |
| 30 | 30 | 0.1 / 8 | 100.0000% | 99.5000% | 984.86 | 70.98ms | 分数接近最高,输入更长 |
| 50 | 5 | 0.3 / 20 | 93.8333% | 89.9762% | 322.65 | 116.96ms | 覆盖不足 |
| 50 | 10 | 0.4 / 2 | 100.0000% | 99.4881% | 455.68 | 116.96ms | 分数接近最高,精排更慢 |
| 50 | 20 | 0.2 / 1 | 100.0000% | 99.5595% | 722.09 | 116.96ms | 分数接近最高,成本更高 |
| 50 | 30 | 0.1 / 8 | 100.0000% | 99.4762% | 986.89 | 116.96ms | 分数接近最高,成本更高 |
| 50 | 50 | 0.1 / 8 | 100.0000% | 99.5833% | 1,513.03 | 116.96ms | 分数接近最高,成本最高 |
选择依据:精排 30 / 规划 20 的单点结果高 0.2857pp,但规划输入多 58.35%,精排 p50 多 50.74%。两者差距小于预先设定的 0.5pp 容差,因此最终采用成本更低的“精排 20 / 规划 10”;不声称它的准确率显著更高。
精排 20、规划读取 10 时,选择最终融合参数
在 2,400 条开发请求上搜索 11 个第一阶段权重 × 10 个 RRF 平滑常数,共 110 组。去除相同排名并检查候选覆盖后,比较 11 条有效路线;接近日常说法与明确写出工具需求的两类请求按 6:1 加权,对应最终测试的 6,000 / 1,000 比例。
| 一级排名权重 / RRF 平滑常数 | 加权工具链全对率 | 接近日常说法的请求 | 明确写出工具需求的请求 | 训练中未见的工具组合 | 平均输入 token | 判定 |
|---|---|---|---|---|---|---|
| 第一阶段权重 0.4 · 平滑常数 8 | 99.5714% | 99.6667% | 99.0000% | 99.3355% | 461.19 | 采用 |
| 第一阶段权重 0.4 · 平滑常数 10 | 99.5714% | 99.6667% | 99.0000% | 99.3355% | 461.20 | 质量同分,输入略长 |
| 第一阶段权重 0.4 · 平滑常数 2 | 99.3571% | 99.4167% | 99.0000% | 99.0033% | 461.24 | 同深度对照 |
| 选出参数后的独立检查 | 最终方案 | 对照方案 | 逐条比较 | 结论 |
|---|---|---|---|---|
| 深度确认 · 1,200 条 | 精排 20 / 规划 10 · 98.8571% | 精排 10 / 规划 10 · 97.9048% | 9 条改善 / 4 条回退 | 提升 0.9524pp;预设约束全部通过 |
| 最终融合确认 · 1,200 条 | 精排 20 / 规划 10 + 0.4 / 8 · 99.5714% | 精排 30 / 规划 20 · 99.4762% | 5 条改善 / 1 条回退McNemar p=0.2188 | 准确率接近时采用成本更低的方案 |
| 长候选压力验证 · 1,200 条 | 精排 20 / 规划 10 · 86.1667% | 精排 30 / 规划 10 · 86.3333% | 仅差 2 / 1,200p=0.8877;对照精排延迟高 50.74% | 微小波动不足以支付成本 |
| 长输入压力验证 · 1,200 条 | 精排 20 / 规划 10 · 86.1667% | 精排 50 / 规划 50 · 84.9167% | P50 低 1.25pp输入 token 为 3.29 倍 | 更长输入产生干扰 |
注意:平滑常数 8 只控制 RRF 排名随名次衰减的速度,不代表候选数量。上表四项检查均在参数确定后运行,结果不再用于改参数;后续规划模型实验直接使用“精排 20 / 规划 10”的候选输入。
汇总最终采用的检索模型与参数
表中按执行顺序列出最终方案:向量与 BM25 各取 40 个、精排 20 个,再向规划模型提供排序后的前 10 个;之后不再根据测试结果改参数。
| 阶段 | 模型或方法 | 训练 / 推理配置 | 阶段输出 |
|---|---|---|---|
| 向量检索 | 任务内微调 bge-large-zh-v1.5 | 每个查询—正例配对单独成组:1 正 + 2 负,共 3 个工具文档采用随机种子 20260731 | 全工具向量排序 |
| 第一阶段融合 | 向量排序 + BM25 加权 RRF | 各取前 40 · 向量权重 0.8 · 平滑常数 5 | 送入精排的 Top-20 |
| 候选精排 | bge-reranker-v2-m3 | 每组 1 正 + 7 负,共 8 个工具文档3 个按工具类型挑选 + 4 个检索难例 · lr2e-5 · 采用随机种子 20260731 | Top-20 交互评分与名次 |
| 最终融合 | 第一阶段名次 + 精排名次 | 第一阶段权重 0.4 · 精排权重 0.6 · 平滑常数 8 | 最终 Top-10全部规划候选均经过 Cross-encoder 评分 |
03 · 最终测试与失败分析在三套独立测试上报告覆盖率,并解释失败与推理成本 +
模型与参数确定后,再报告质量、失败来源与成本
最终方案确定后,依次评测 1,200 条独立请求、6,000 条日常电商请求和 1,000 条工具需求明确的请求。测试结果只用于报告和失败分析,不再用于修改模型或参数。
比较三套测试集的必要工具覆盖率
6,000 条日常电商请求是 9K 系统测试中的电商部分,也是本页检索主结果;1,200 条独立请求和 1,000 条工具需求明确的请求用于补充检查。三套数据均在模型与参数确定后计分。
| 评测集 | 样本数 | AllHit@6 | AllHit@7 | AllHit@8 | AllHit@9 | AllHit@10 | AllHit@20 | MRR |
|---|---|---|---|---|---|---|---|---|
| 日常电商请求9K 系统测试的电商部分 | 6,000 | 91.3500% | 94.0500% | 95.8167% | 96.6667% | 97.3667% | 99.5000% | 0.977048 |
| 独立改写请求参数确定后首次使用 | 1,200 | 98.5833% | 99.5000% | 99.7500% | 99.8333% | 99.8333% | 100.0000% | 0.997778 |
| 工具需求明确的请求 | 1,000 | 99.6000% | 99.9000% | 100.0000% | 100.0000% | 100.0000% | 100.0000% | 0.999500 |
分析 6,000 条日常电商请求中的 158 条检索失败
只要有一个必要工具没有进入最终 Top-10,就记为检索失败。该分析只解释测试结果,不用于后续训练或重新选择参数。
| 检查项 | 结果 | 解释 |
|---|---|---|
| 最终 Top-10 覆盖失败 | 158 / 6,0002.6333% | 5,842 条请求完整覆盖全部必要工具 |
| 必要工具未进入精排 Top-20 | 30 / 158 | 一级 Top-20 覆盖率为 99.5000%;这 30 条在精排前已经漏掉工具 |
| 已进入精排 Top-20,但未进入最终 Top-10 | 128 / 158 | 主要问题发生在 20 个已精排候选压缩为最终 10 个时 |
| 一级融合 Top-10 | 96.7167% | 精排前的 Top-10 完整覆盖 |
| 精排模型 Top-10 | 95.8333% | 仅使用 Cross-encoder 名次的 Top-10 |
| 二级融合 Top-10 | 97.3667% | 融合一级与精排名次后的最终结果 |
诊断结论:大多数残余失败发生在已精排的 20 个候选压缩为最终 10 个时。该结果只描述测试集,不用于构造负样本或重新调参。
候选越多,精排需要多长时间
这是同机同配置的离线批处理对照:先把每批评分总耗时平摊到每条请求,再取中位数。它只用于比较 10、20、30、50 个候选的相对成本,不代表线上单请求延迟。
| 精排候选数 R | 规划可见数 P | 离线批均摊 p50 | 相对精排 20 | 用途 |
|---|---|---|---|---|
| 10 | ≤10 | 23.95ms | −49.14% | 覆盖约束未通过 |
| 20 | 10 | 47.09ms | 基准 | 最终路线 |
| 30 | ≤30 | 70.98ms | +50.74% | 分数接近、成本更高的对照 |
| 50 | ≤50 | 116.96ms | +148.38% | 长候选压力测试 |
这张表只测什么:只测精排模块,不包含向量编码、BM25、规划生成或真实工具执行;最终方案仍是精排 20 个、输出 10 个。
04 · 数据、成本与复现检查说明每套数据的用途,并记录训练、推理与产物检查 +
04A · 每套数据的用途
训练、选参数和最终测试使用不同数据
| 数据 | 规模 | 用途 | 结果 / 注意事项 |
|---|---|---|---|
| 训练轨迹 | 24,000 组 · 70,012 个正对 | 训练向量模型与重排模型 | 向量训练将每个查询—正例配对展开为 1 正 + 2 负;重排每组为 1 正 + 7 负 |
| 检索开发集 | 1,200 条 | 向量负样本方案与微调重排模型选择 | 五种向量方案和四种重排架构按三随机种子比较 |
| 精排与规划候选数量开发集 | 2,400 条 | 联合比较精排数量、规划输入数量与最终融合 | 规划候选不能多于已精排候选;最高分 0.5pp 内优先选低成本方案 |
| 候选数量独立确认集 | 1,200 条 | 确认“精排 20 / 规划 10”和最终融合参数 | 确认完成后不再修改参数 |
| 长候选压力测试 | 1,200 条 | 检查增加精排或规划候选是否稳定改善结果 | 600 条单工具 + 600 条监督训练未见组合;不参与调参 |
| 独立改写请求测试 | 1,200 条 | 模型与参数确定后的首次检索质量测试 | AllHit@10 99.8333%;查看结果后未继续调参 |
| 日常电商请求测试 | 6,000 条 | 报告必要工具是否全部进入 Top-10 | AllHit@10 97.3667% |
| 工具需求明确的请求测试 | 1,000 条 | 补充检查需求写得更明确时的检索与规划 | AllHit@10 100.0000% |
| 9K 分流—检索—规划联合测试 | 9,000 条 | 将 0.6B 路由与检索、规划预测逐条联合计分 | 工具链成功 8,336 条;不含真实工具执行 |
比较训练前检索与公开重排的推理成本
编码与重排延迟均为批内均摊;这些早期运行没有保存 GPU 型号、卡数或峰值显存。
| 类型 | 模型 / 设置 | 加载或构建 | 离线推理计时 | 计时说明 |
|---|---|---|---|---|
| 词面检索 | BM25备用分词器 | — | p50 1.586ms · p95 4.459ms | 单条查询;CPU 型号与线程数未记录 |
| 向量检索 | BAAI/bge-base-zh-v1.5批量 64 | 索引构建 6.1610 秒 | 编码均值 0.7292ms / 条;FAISS p50 / p95 0.0150 / 0.0159ms | BF16 编码;批内均摊 |
| 向量检索 | BAAI/bge-large-zh-v1.5批量 64 | 索引构建 6.2456 秒 | 编码均值 2.0356ms / 条;FAISS p50 / p95 0.0168 / 0.0179ms | BF16 编码;批内均摊 |
| 向量检索 | Qwen/Qwen3-Embedding-0.6B批量 64 | 索引构建 7.6973 秒 | 编码均值 2.2964ms / 条;FAISS p50 / p95 0.0158 / 0.0167ms | BF16 编码;批内均摊 |
| 公开重排 | BAAI/bge-reranker-baseN=20 · 6,000 条 | 5.7550 秒 | p50 14.8817ms · p95 17.7625ms | FP16;批内均摊 |
| 公开重排 | BAAI/bge-reranker-largeN=20 · 6,000 条 | 5.7761 秒 | p50 33.8580ms · p95 37.1013ms | FP16;批内均摊 |
| 公开重排 | BAAI/bge-reranker-v2-m3N=20 · 6,000 条 | 5.3290 秒 | p50 32.4880ms · p95 36.9846ms | FP16;批内均摊 |
| 公开重排 | jinaai/jina-reranker-v2-base-multilingualN=20 · 6,000 条 | 5.8391 秒 | p50 13.8825ms · p95 16.3661ms | FP16;批内均摊 |
| 公开重排 | Qwen/Qwen3-Reranker-0.6BN=20 · 6,000 条 | 10.2432 秒 | p50 119.0920ms · p95 137.8053ms | SentenceTransformers;批内均摊 |
| 候选深度 | Qwen/Qwen3-Reranker-0.6BN=50 · 6,000 条 · 批量 64 | 10.3087 秒 | p50 119.0949ms · p95 141.9109ms | 最大长度 512;批内均摊 |
记录采用模型的训练与精排推理成本
训练均为单卡;精排延迟来自联合深度实验的同硬件离线批内均摊。
| 阶段 | 配置 | 硬件 | 训练耗时 | 推理或资源记录 |
|---|---|---|---|---|
| 向量模型 | bge-large-zh-v1.5 · 1 轮 · FP16 · 有效批量 64 | 1 × RTX 3090 24GB | 51 分 01.5 秒 | 最终采用版本:开发集编码均值 5.2469ms / 条;FAISS p50 / p95 0.0233 / 0.0259ms |
| 重排模型 | bge-reranker-v2-m3 · 1 轮 / 1,500 步 · FP16 · 有效组批量 16 | 1 × RTX 3090 24GB | 46 分 04.0 秒 | 峰值显存 10.64 / 10.98 GiB(已分配 / 已保留) |
| 最终采用的候选输入 | 各路 Top-40 → 精排 Top-20 → 二级 RRF → 规划 Top-10 | 同硬件深度对照 | — | 精排 p50 47.0914ms规划平均输入 455.42 token;未将模块延迟相加为在线端到端时延 |
04D · 最终一致性检查
确认模型、候选数与评测文件完全对应
| 检查项 | 结果 | 核验内容 |
|---|---|---|
| 模型身份 | 通过 | 向量模型 97816d9a…ec86;重排模型 d1ac0366…d6d |
| 评测行数 | 通过 | 独立改写请求 1,200 · 日常电商 6,000 · 明确工具需求 1,000 |
| 实际候选数 | 通过 | 向量与 BM25 各取 Top-40;精排 Top-20;规划读取最终 Top-10,满足 P≤R |
| 评测清单 | 通过 | 三套评测均保存 manifest、输入哈希与曝光记录 |
| 部署等价性 | 通过 | 最终 Top-10 排名与候选裁剪实现 100% 一致 |
| 脚本语法 | 通过 | 最终配置生成、检索测试、效率测试与固定规划模型测试脚本均通过语法检查 |
结果适用范围:只适用于这套固定 100 工具的合成测试;检索耗时不包含意图分流、规划生成或真实工具执行。
实验 03 · 工具链规划
工具链规划:从监督训练到偏好优化
先验证 Top-10 候选能否帮助基础模型,再固定“精排 20、规划读取 10”的接口;8B Planner 先学习两种请求写法,再从自身真实错误中构造偏好数据,通过 RPO 主训练和 DPO 短程收敛确定最终模型。
结果口径:6,000 条日常电商请求是规划主测试,1,000 条工具需求明确的请求用于补充检查;最终系统结果把 3,000 条闲聊与 6,000 条电商请求逐条合并。偏好数据和 1,200 条开发请求均来自训练侧,6K / 1K 只在模型锁定后报告。
92.62% 请求生成了完全正确的有序工具链
0.6B 路由先区分电商与闲聊,检索模块精排 20 个候选并向 Planner 提供前 10 个;8B Planner 使用 77,724 条两种写法的监督数据训练,再以 4,000 对真实错误偏好数据完成 RPO 与 DPO。最终 8,336 / 9,000 条请求通过,其中 6,000 条日常电商请求的工具链全对率为 88.9333%。
验证 Top-10 → 训练 8B Planner → 固定输入 → 挖掘真实错误 → 选择偏好训练端点
01 只改变候选范围,确认 RAG 是否帮助基础模型;02 用日常说法与工具需求明确写法训练 8B Planner;03 固定检索模块交付的 Top-10;04 从训练侧长短链请求挖出当前模型真实错误;05 比较 RPO 与 DPO,并在独立开发请求上锁定最终模型。
01 · Top-10 是否有用模型不变,只比较完整 100 工具与检索 Top-10 +
检验缩小候选范围能否帮助未微调模型
固定模型、提示模板与生成方式,只改变输入:无 RAG 展示完整 100 工具,RAG 按检索顺序提供 Top-10。该配对只量化候选检索的贡献,不参与候选深度选择。
| 评测集 | 基础模型 | 完整 100 工具集合 / 工具链 / 格式合规率 | 当前检索 Top-10集合 / 工具链 / 格式合规率 | 工具链提升 |
|---|---|---|---|---|
| 日常电商请求 6K | 未微调 4B | 26.9500% / 25.2167% / 84.6833% | 35.9667% / 33.9333% / 94.1833% | +8.7167pp |
| 未微调 8B | 30.7500% / 28.9333% / 92.5333% | 37.3333% / 35.6667% / 94.1500% | +6.7333pp | |
| 工具需求明确的请求 1K | 未微调 4B | 52.3000% / 50.4000% / 93.6000% | 54.5000% / 53.8000% / 87.0000% | +3.4000pp |
| 未微调 8B | 57.4000% / 54.6000% / 96.7000% | 62.3000% / 60.9000% / 89.2000% | +6.3000pp |
本步结论:Top-10 在 4 / 4 组配对中提高工具链全对率;候选检索能缩小判断范围,但不能替代 Planner 训练。
02 · 监督训练让 8B Planner 同时学习两种请求写法 +
02A · 监督数据同时覆盖明确需求与日常说法
所有样本都包含当前检索链生成的 Top-10 和正确有序工具链。两种写法共同训练,使模型既学会清晰接口表达,也能处理主测试中的自然请求。
| 数据来源 | 条数 | 训练作用 | 占比 |
|---|---|---|---|
| 工具需求明确的请求 | 53,725 | 学习候选选择、相似工具排除和多工具依赖顺序 | 69.12% |
| 日常说法请求 | 23,999 | 对齐 6K 主测试的表达方式与工具链长度 | 30.88% |
| 合计 | 77,724 | 固定 Top-10 输入与有序目标 | 100% |
02B · 冻结监督训练端点
Qwen3-8B 使用 LoRA 训练 1 轮,学习率 5e-5、有效批量 32、LoRA r16 / α32 / dropout 0.05;随后以一次短 DPO 得到偏好训练的固定起点。
| 模型阶段 | 日常电商请求 6K集合 / 工具链 / 格式合规率 | 明确工具需求 1K 工具链全对率 | 9K 系统工具链 | 作用 |
|---|---|---|---|---|
| 77,724 条监督训练checkpoint-2429 | 86.1333% / 85.6833% / 99.7833% | 99.5000% | 8,141 / 9,000 · 90.4556% | 监督训练端点 |
| 偏好训练起点checkpoint-29 | 86.2667% / 85.8000% / 99.7833% | 99.5000% | 8,148 / 9,000 · 90.5333% | 用于挖掘真实错误 |
进入下一步的固定模型:Qwen3-8B checkpoint-29。后续偏好数据只使用它在训练侧请求上的真实可解析错误,不使用 6K / 1K 冻结测试。
03 · 固定规划模型的候选输入检索精排 20 个候选,Planner 只读取前 10 个 +
检索模块向所有 Planner 阶段提供同一种输入
候选排序在 Planner 训练前已经锁定。监督训练、错误挖掘、开发集比较和最终测试都使用同一 Top-10 接口,不为某个 Planner checkpoint 重新调整检索参数。
| 处理环节 | 最终配置 | 作用 | 输出 |
|---|---|---|---|
| 一级检索 | BM25 / 向量各取 Top-40 · 向量权重 0.8 · 平滑常数 5 | 结合词面与语义信号 | 统一候选排名 |
| 交互精排 | bge-reranker-v2-m3 · R=20 | 对 Planner 可能看到的候选完整打分 | Top-20 精排名次 |
| 二级融合 | 一级权重 0.4 · 精排权重 0.6 · 平滑常数 8 | 融合两路互补名次 | 最终 Top-10 |
| 规划输入 | P=10 · 保持检索顺序 | 所有候选都已精排,满足 P≤R | 一次生成工具集合与顺序 |
固定边界:6K 日常电商请求的检索 AllHit@10 为 97.3667%;检索未命中的样本仍计入 Planner 端到端工具链全对率。
04 · 构造偏好数据从当前模型真实错误中均衡选择长短工具链 +
04A · 用两个训练侧请求池找到模型会犯的错误
先只保留目标工具全部进入 Top-10 的请求,再让 checkpoint-29 贪心生成。正确答案作为 chosen,模型实际生成且格式可解析、但集合或顺序错误的输出作为 rejected。
| 请求范围 | 生成请求 | Top-10 覆盖完整 | 起点工具链全对率 | 真实语义错误 |
|---|---|---|---|---|
| 偏长、多约束请求 | 24,000 | 23,068 | 70.8080% | 6,734 |
| 1–2 工具短请求 | 12,000 | 11,867 | 85.8178% | 1,683单工具 203 · 双工具 1,480 |
| 去重错误池 | 共观察 8,417 个错误;按请求与来源去重 | 8,309 | ||
04B · 选择 4,000 对,并约束工具链长度与错误类型
每个请求和来源轨迹最多保留一对,候选保持原检索顺序;数据覆盖全部 100 个工具。
| 维度 | 1 工具 | 2 工具 | 3 工具 | 4 工具 | 5 工具 | 6 工具 |
|---|---|---|---|---|---|---|
| 偏好对数 | 200 | 600 | 800 | 800 | 800 | 800 |
| 主要错误 | 相似工具替换 | 遗漏必要工具 | 多选无关工具 | 只错顺序 | 训练 / 监控 |
|---|---|---|---|---|---|
| 对数 | 2,064 | 911 | 765 | 260 | 3,600 / 400 |
04C · 独立开发请求不进入训练
1,200 条开发请求包含 600 条单工具和 600 条 2–6 工具请求,每种多工具长度各 120 条;覆盖 100 个工具。
| 开发集检查 | 结果 | 如何计分 |
|---|---|---|
| 与 SFT、偏好数据、6K / 1K 的请求、轨迹、表达簇、短语和上下文骨架重叠 | 0 | 仅用于 checkpoint 选择 |
| 当前检索 Top-10 覆盖率 | 96.6667% | 40 条检索未命中仍计为工具链失败,不做条件过滤 |
数据边界:不手工拼接错误输出,也不使用冻结测试中的失败样本。最大序列长度 672,小于训练上限 768,样本截断为 0。
05 · 偏好训练与最终测试RPO 主训练推进质量,再用 DPO 短程收敛 +
05A · 主训练:比较纯 DPO 与正确答案概率锚点
四个配方并行训练 1 轮。RPO 在 DPO 排序损失之外加入 chosen 的生成损失,使模型在远离错误工具链的同时维持正确工具链概率;四组共同使用 beta 0.1 和同一固定参考模型。
| 训练目标 | 学习率 | 正确答案损失权重 | 第 225 步开发集工具链全对率 | 判定 |
|---|---|---|---|---|
| DPO | 5e-7 | 0 | 87.3333% | 对照 |
| DPO + RPO | 5e-7 | 0.5 | 87.4167% | 对照 |
| DPO + RPO | 5e-7 | 1.0 | 87.2500% | 对照 |
| DPO + RPO | 1e-6 | 0.5 | 88.2500% | 进入短程扩展 |
为什么继续:主训练最高分出现在最后一个 checkpoint,说明曲线仍在边界上升;因此从该点继续 0.5 轮,并保持参考模型不变。
05B · 短程扩展:比较继续 RPO 与切换纯 DPO
从主训练 checkpoint-225 出发,比较四种 0.5 轮扩展。主阶段与扩展阶段合计 28 个 checkpoint,全部在同一 1,200 条开发请求上评测。
| 扩展目标 | 学习率 | 第 113 步集合全对率 | 第 113 步工具链全对率 | 格式合规率 | 判定 |
|---|---|---|---|---|---|
| DPO | 5e-7 | 88.9167% | 88.8333% | 99.8333% | 采用 |
| DPO + RPO · 权重 0.5 | 1e-6 | 88.9167% | 88.8333% | 99.8333% | 聚合指标并列 |
| DPO + RPO · 权重 0.5 | 5e-7 | 88.7500% | 88.5833% | 99.8333% | 未采用 |
| DPO + RPO · 权重 0.5 | 2e-7 | 88.5833% | 88.5000% | 99.9167% | 未采用 |
锁定规则:纯 DPO 与继续 RPO 的两个端点聚合指标完全相同,逐条改善 / 回退为 2 / 2;按预先固定的确定性排序选择纯 DPO checkpoint-113。6K / 1K 冻结测试没有参与破平。
05C · 开发集确认最终端点
该 1,200 条开发集是唯一参与模型选择的端到端请求集,检索未覆盖的 40 条仍按失败计入。
| 模型阶段 | 集合全对率 | 工具链全对率 | 格式合规率 | 检索命中条件下工具链全对率 |
|---|---|---|---|---|
| 偏好训练起点 | 85.8333% | 85.6667% | 99.7500% | 88.6207% |
| 最终 Planner | 88.9167% | 88.8333% | 99.8333% | 91.8966% |
| 提升 | +3.0834pp | +3.1666pp | +0.0833pp | +3.2759pp |
逐条证据:工具链改善 42 条、回退 4 条,净改善 38 条;exact McNemar p=5.10e-9。
05D · 模型锁定后报告 6K、1K 与 9K
三行模型使用同一个检索 Top-10 和同一批测试请求,用来展示当前训练路径的阶段增益;最终采用 checkpoint-113。
| Planner 阶段 | 日常电商请求 6K集合 / 工具链 / 格式合规率 | 明确工具需求 1K 工具链全对率 | 9K 系统工具链 |
|---|---|---|---|
| 监督训练 | 86.1333% / 85.6833% / 99.7833% | 99.5000% | 8,141 / 9,000 · 90.4556% |
| 偏好训练起点 | 86.2667% / 85.8000% / 99.7833% | 99.5000% | 8,148 / 9,000 · 90.5333% |
| 最终 Planner · checkpoint-113 | 89.2000% / 88.9333% / 99.8833% | 99.4000% | 8,336 / 9,000 · 92.6222% |
最终增益:相对监督训练,6K 工具链提高 3.2500pp,9K 增加 195 条成功请求;相对偏好训练起点,6K 改善 / 回退 222 / 34,p=5.28e-35。1K 由 99.5% 变为 99.4%,仅 1 条改善、2 条回退,不能支持稳定变化结论。
05E · 最终系统主结果
3,000 条闲聊必须被正确分流;6,000 条电商请求还需输出完全正确的工具集合与顺序。
| 系统指标 | 正确数 | 比例 | 是否包含真实工具执行 |
|---|---|---|---|
| 工具集合完全正确 | 8,352 / 9,000 | 92.8000% | 否 |
| 有序工具链完全正确 | 8,336 / 9,000 | 92.6222% | 否 |
最终端点:Qwen3-8B · 77,724 条监督训练 → 偏好训练起点 → RPO 主训练 → DPO 短程收敛 checkpoint-113。92.6222% 只表示静态分流与有序工具 ID 选择成功率。
06 · 实验数据、协议与环境核对监督数据、偏好数据、隔离规则与运行成本 +
06A · 数据职责
训练、选择和最终测试彼此分开
| 数据 | 规模 | 用途 | 参与选型 | 隔离与结果 |
|---|---|---|---|---|
| SFT 训练数据两种请求写法 | 77,724 条53,725 + 23,999 | 训练 8B Planner 的候选选择与有序输出 | 训练输入 | 固定当前 Top-10 与正确工具链 |
| 偏好错误挖掘请求训练侧新生成 | 24,000 + 12,000 条 | 分别覆盖偏长多约束与 1–2 工具请求 | 数据构造 | 只从 Top-10 覆盖完整且模型实际答错的样本取 rejected |
| 偏好数据真实错误配对 | 4,000 对3,600 训练 / 400 监控 | 比较 DPO、RPO 与短程扩展 | 训练输入 | 覆盖 1–6 工具和全部 100 工具;每个请求 / 来源最多一对 |
| Planner 开发集训练侧独立生成 | 1,200 条 | 评测 28 个 checkpoint 并锁定最终端点 | 是 | 检索 AllHit@10 96.6667%;40 条未命中仍计失败 |
| 冻结测试模型锁定后报告 | 日常电商 6K + 明确需求 1K + 系统 9K | 报告规划主结果、补充结果与系统结果 | 否 | 6K 工具链 88.9333% · 9K 工具链 92.6222% |
06B · 数据与产物检查
确认没有测试回流、截断或模型身份漂移
| 检查项 | 结果 | 核验内容 |
|---|---|---|
| 开发集与 SFT / 偏好 / 冻结测试重合 | 0 | 请求、轨迹 ID、来源、表达簇、短语和上下文骨架均隔离 |
| 偏好数据与 6K / 1K 冻结测试重合 | 0 | 请求、轨迹 ID 和来源均不重叠 |
| 偏好样本截断 | 0 | 最大长度 672,训练上限 768 |
| 候选接口 | 通过 | 所有阶段使用当前精排 Top-20 后的 Top-10,且保持检索顺序 |
| 训练与选择记录 | 通过 | 8 个训练 run、28 个 checkpoint、参考模型、步数和超参数均可追溯 |
| 最终模型身份 | 通过 | checkpoint-113 · adapter SHA256 68cd6eba…fc1d |
记录 SFT、RPO 与 DPO 的参数和成本
SFT 使用四卡数据并行;偏好训练同时启动四个单卡配方,因此表内每个配方的耗时不相加为串行总时长。
| 阶段 | 数据与配置 | 硬件 | 训练耗时 | 资源记录 |
|---|---|---|---|---|
| 监督训练checkpoint-2429 | 77,724 条 · 1 轮 · lr5e-5 · 有效批量 32 · LoRA r16 / α32 / dropout 0.05 | 4 × RTX 5090 | 57 分 41 秒2,429 步 | 日志显存 20.23 GiB / 进程 |
| 偏好训练起点checkpoint-29 | 1,800 训练 / 200 监控 · 1 轮 · lr1e-6 · beta 0.1 · 有效批量 16 | 4 × RTX 5090 | 4 分 56 秒完整运行 113 步;采用第 29 步 | 日志显存 18.55 GiB / 进程 |
| RPO / DPO 主搜索4 个并行配方 | 3,600 训练 / 400 监控 · 1 轮 · beta 0.1 · 有效批量 16 · LoRA r16 / α32 / dropout 0.05 | 4 × RTX 5090每配方 1 卡 | 33 分 40 秒–34 分 08 秒 / 配方225 步 | 日志显存 18.47 GiB / 进程 |
| DPO 短程扩展最终 checkpoint-113 | 从 RPO 主训练端点继续 0.5 轮 · lr5e-7 · beta 0.1 · 固定参考模型 | 4 × RTX 50904 个扩展配方并行 | 18 分 40 秒–18 分 55 秒 / 配方113 步 | 日志显存 18.47 GiB / 进程 |
比较完整工具目录、Top-10 与最终 Planner 的离线生成成本
均为贪心生成;行内延迟来自批内生成记录,不等同于线上单请求端到端延迟。最终模型最多生成 96 token。
| 模型阶段 | 测试协议 | 批量 | p50 / p95 | 输出吞吐 | 峰值显存 |
|---|---|---|---|---|---|
| 未微调 4B · Top-10 | 早期独立请求 1K | 16 | 110.8 / 154.1ms | 179.10 token/s | 9.54 / 14.87 GiB |
| 未微调 8B · Top-10 | 早期独立请求 1K | 8 | 187.7 / 269.0ms | 105.83 token/s | 16.38 / 20.13 GiB |
| 未微调 4B · 完整 100 工具 | 早期独立请求 1K | 8 | 528.7 / 1,334.2ms | 34.67 token/s | 12.55 / 23.81 GiB |
| 未微调 8B · 完整 100 工具 | 早期独立请求 1K | 4 | 835.5 / 1,078.8ms | 23.16 token/s | 18.07 / 22.72 GiB |
| 8B · 监督训练 · Top-10 | 日常电商请求 6K | 16 | 154.2 / 185.8ms | 126.99 token/s | 18.49 / 26.64 GiB |
| 8B · 偏好训练起点 · Top-10 | 日常电商请求 6K | 16 | 157.1 / 188.1ms | 125.30 token/s | 18.49 / 26.64 GiB |
| 8B · 最终 Planner · Top-10 | 日常电商请求 6K | 16 | 149.7 / 184.5ms | 125.64 token/s | 18.34–18.49 / 22.96–28.38 GiB |
训练软件:MS-SWIFT;监督阶段使用 swift sft,偏好阶段使用 swift rlhf。偏好输入为 messages + rejected_response,采用 Qwen3 chat template。
共同训练设置:BF16、Cosine、warmup 0.05、weight decay 0.1、最大梯度 1.0;偏好训练最大长度 768,参考适配器始终固定为 checkpoint-29。
最终系统测试:检索输入始终为“精排 20 / 规划 10”。正式 8B Planner 使用 seed 20260819 的 DPO 短程扩展 checkpoint-113。
实验 04 · 自然短会话评测
多轮工具调用 Agent 框架
每段会话有 2~7 轮,只统计最后一轮:短句引用历史时要找回被引用的完整任务,当前句已经完整时不能带入旧工具。所有方案共用同一套 100 工具检索与 Planner。
41.0% → 94.6%从只看当前句,到按需恢复被引用的完整任务
A 只看当前句;L 加入结构化记录、完整任务恢复和已验证计划复用。两者使用相同模型、Top-10、提示词与生成方式,没有修改任何模型权重。
整体分数怎样读:评测约含 60% 需要读取历史的目标和 40% 当前句已经完整的目标。这个比例用于同时看清两种能力,不代表线上请求分布;因此页面始终同时报告两项分数。
先分清会话、轮次和两类目标
前面的请求都会真实经过检索和 Planner,并写入本会话。最后一轮分为历史回放和完整新请求:前者必须找回正确任务,后者必须保持独立。
- 会话与轮次
- 同一会话中的每次用户请求叫一轮;每段包含 2~7 轮,记忆只在同一会话内读取。
- 计分目标
- 每段只统计最后一轮;工具 ID、数量和顺序全部一致才算正确。
- 历史回放
- 当前短句本身不完整,必须找到唯一被引用轮,并恢复当时的整项任务。
- 完整新请求
- 当前句已经把任务说全,即使前面有无关历史,也不能继承旧工具。
- 第 1 轮
查询洗衣机信息、预售状态和评价。
这一轮建立完整任务。 - 第 2 轮
洗衣机那边,刚才说的那些事接着看下吧。
短句没有重新列出三个目标。
get_item_info→check_presale_status→get_item_reviews找回第 1 轮的全部目标和原顺序。- 第 1 轮
查询账号画像、尺码、地址、收藏和通知偏好等资料。
与下一轮商品任务无关。 - 第 2 轮
看看这款电动牙刷的商品信息,再把材质、型号、尺寸等参数发我。
本句已经完整,不需要补历史。
get_item_info→get_item_specs只处理电动牙刷,不带入账号类工具。同时比较历史任务恢复与完整新请求保护
A 只看当前句,B 直接拼接历史,C~L 逐步加入结构化处理。三项分数都来自同一独立测试,任何明显损害完整新请求的方案都不能采用。
| 方案 | 本方案处理方式 | 测试集整体 | 历史回放 | 完整新请求 |
|---|---|---|---|---|
| A基线 | 不读取历史,只看当前句 | 41.0% | 5.2% | 98.4% |
| B拼接基线 | 把最近两轮原话直接拼给模型 | 50.5% | 59.2% | 36.5% |
| C | 把最近任务整理为结构化记录 | 62.9% | 48.0% | 86.9% |
| D | 按固定规则保存滑出窗口的任务摘要 | 74.1% | 66.2% | 86.9% |
| E | 按对象和关键词查询最多两条完整记录 | 85.5% | 84.6% | 86.9% |
| F | “刚才”等近期线索优先于宽泛历史词 | 85.5% | 84.6% | 86.9% |
| G | 分清当前业务动作和继承历史的指令 | 91.9% | 88.6% | 97.4% |
| H | 把被规则拆散的单工具请求还原为完整目标 | 92.4% | 89.4% | 97.4% |
| I | 只有按固定结构写出完整工具名称时才直达 | 92.4% | 89.4% | 97.4% |
| J | 找到被引用轮后,恢复当时的完整请求 | 94.6% | 92.8% | 97.4% |
| K | 完整的多目标新请求不读取历史 | 94.6% | 92.8% | 97.4% |
| L | 来源计划有效且运行配置一致时复用原计划 | 94.6% | 92.8% | 97.4% |
方案怎样确定查看开发集门槛、锁定顺序与统计区间 +
先守住完整新请求,再提高历史回放
方案只由开发集决定:完整新请求准确率不得比 A 低超过 1 个百分点;达标后依次比较历史回放、完整新请求和输入长度。L 在测试运行前已经锁定。
一个判断入口、三条处理路径、一个固定后端
Agent 不把整段历史全部塞给 Planner。当前句完整就保持原文;只有自然确认、近期续办和对象线索等可靠证据才触发历史读取。
只在同一会话中整理与当前句有关的状态
- 本句目标已经完整没有继承或取消历史任务的可靠证据。
- 清空无关历史证据多个明确新目标不会与旧目标合并。
- 原句进入默认后端自然语言请求执行意图、检索和 Planner;固定结构的完整工具名称可严格直达。
- 定位唯一被引用轮利用确认关系、近期线索或对象线索;找不到可靠来源就返回空工具结果。
- 读取当时的完整请求保留全部目标与顺序,不重新拼装任务碎片。
- 完整请求进入固定后端来源计划不可用或运行配置变化时,重新检索和规划。
- 只回放一个完整任务没有新增、取消、局部修改或多个来源合并。
- 来源计划与运行配置一致计划非空并通过输出检查,检索路线、版本和 Agent 配置均未改变。
- 直接使用原有序工具计划不再调用固定后端;任一条件失败就回到路径 2。
54 个错误主要来自来源定位和来源轮原有计划
方案 L 在 993 个目标中错 54 个:44 个来自历史回放,10 个来自完整新请求。下面按可以继续改进的环节拆开,而不是把所有错误归给“上下文”。
回放错误 44 个,完整新请求错误 10 个
先看系统有没有找对被引用轮,再看来源轮当时的工具规划是否已经错误。
完整新请求中,A 答对 375 / 381,L 答对 371 / 381,净回退 4 条;这 4 条差异尚不足以证明稳定下降(配对检验 p=0.125)。其中 3 条被误判为历史回放并错误命中缓存,实际部署仍需把“新请求误继承”单独监控。
评测集明细查看会话构成、自然引用、工具覆盖与数据检查 +
历史该读时找对任务,当前句完整时不带入旧任务
每段会话只统计最后一个目标轮;此前历史轮仍会按顺序执行,并写入同一会话的状态、摘要与记忆。
总体构成
开发集用于选择方案,独立测试集在方案锁定后一次性运行;两边都只统计审核通过的会话。
| 数据项 | 开发集 | 独立测试集 | 合计 |
|---|---|---|---|
| 计划会话 | 1,000 | 1,000 | 2,000 |
| 审核通过会话 | 991 | 993 | 1,984 |
| 审核排除 | 9 | 7 | 16 |
| 实际执行用户轮 | 2,793 | 2,835 | 5,628 |
| 普通历史轮 | 1,802 | 1,842 | 3,644 |
| 最终计分目标轮 | 991 | 993 | 1,984 |
| 其中:历史任务恢复 | 605 | 612 | 1,217 |
| 其中:完整新请求切换 | 386 | 381 | 767 |
历史任务恢复约占 60%,完整新请求约占 40%;这个比例用于让两类能力都有足够样本,不代表线上流量比例。
会话有多长,引用隔了几轮
主体是 2~4 轮的自然短会话,同时保留少量 5~7 轮和跨出近期窗口的压力样本。
会话长度
平均 2.818 / 2.855 轮
| 用户轮数 | 开发集 | 测试集 | 合计 |
|---|---|---|---|
| 2 轮 | 471 | 462 | 933 |
| 3 轮 | 313 | 307 | 620 |
| 4 轮 | 140 | 152 | 292 |
| 5 轮 | 52 | 52 | 104 |
| 6 轮 | 13 | 18 | 31 |
| 7 轮 | 2 | 2 | 4 |
历史任务恢复的引用距离
目标轮向前查找
| 相距轮数 | 开发集 | 测试集 | 合计 |
|---|---|---|---|
| 1 轮 | 344 | 349 | 693 |
| 2 轮 | 136 | 138 | 274 |
| 3 轮 | 80 | 75 | 155 |
| 4 轮 | 34 | 36 | 70 |
| 5 轮 | 11 | 14 | 25 |
来源与目标之间可以插入无关任务,但本次干扰任务会避开来源任务的工具和业务域,以保证自然表达仍有唯一指向;同对象、同业务域的极端歧义不在本次范围内。
引用怎样表达,目标工具链有多长
历史恢复使用三类自然说法;1~6 个工具的数量比例取自 24K 训练轨迹,并非人为平均分配。
自然引用表达
只统计历史任务恢复
| 表达类型 | 典型形式 | 开发集 | 测试集 |
|---|---|---|---|
| 自然确认 | “行,就按刚才说的办” | 209 | 204 |
| 近期续办 | “洗衣机那些事接着看下” | 212 | 216 |
| 对象线索 | “戴森吸尘器那个售后单继续处理” | 184 | 192 |
计分目标的工具数量
历史恢复 + 完整新请求
| 目标工具数 | 开发集 | 测试集 | 合计 |
|---|---|---|---|
| 1 | 399 | 389 | 788 |
| 2 | 80 | 69 | 149 |
| 3 | 157 | 172 | 329 |
| 4 | 122 | 128 | 250 |
| 5 | 121 | 111 | 232 |
| 6 | 112 | 124 | 236 |
目标句不使用“第 N 轮”“完整原样重做”“步骤和顺序都别变”等提示答案的说法;评分时,工具 ID、数量和顺序任一不一致,整条都算错误。
100 个工具覆盖八个业务域
开发集和测试集的计分目标都覆盖全部 100 个工具;下表后两列统计标准答案里实际出现的工具次数,因此多工具目标会贡献多次。
| 业务域 | 目录工具数 | 开发目标工具次数 | 测试目标工具次数 |
|---|---|---|---|
| 商品 | 18 | 560 | 600 |
| 订单 | 15 | 550 | 562 |
| 售后 | 15 | 343 | 334 |
| 营销 | 15 | 272 | 293 |
| 配送 | 12 | 287 | 269 |
| 用户 | 10 | 408 | 392 |
| 购物车 | 8 | 248 | 274 |
| 风控 | 7 | 127 | 130 |
| 合计 | 100 | 2,795 | 2,854 |
先锁定答案与隔离规则,再运行 Agent 方案
页面保留能判断数据可信度的关键步骤;完整生成日志、逐条字段和排除记录留在机器证据中。
| 检查环节 | 具体做法 | 锁定结果 |
|---|---|---|
| 先定工具答案 | 先生成来源与干扰任务的工具链,再生成自然请求文本;固定随机种子为 2026081601。 | 2,767 份先定好的工具链 |
| 自然性与语义审核 | 先用规则过滤提示答案、范围不完整等问题,再由独立模型检查自然性和唯一指向。 | 1,984 段通过,16 段保留为排除项 |
| 保护数据隔离 | 与 42,400 条训练、冻结和独立保护数据比对请求文本、来源任务、表达类型与会话结构。 | 请求、来源、表达与结构重合均为 0 |
| 开发与测试分开 | 两边的完整会话和计分目标均无重合;开发集选型和实现锁定后,才允许运行独立测试集。 | 会话 / 目标重合为 0,测试未提前打开 |
运行成本与工程检查
十二种候选共享固定 100 工具目录、Top-10 检索、Qwen3-8B Planner、提示词、候选顺序和贪心生成。
结果适用范围:数据来自模型生成并经独立审核的固定 100 工具、2~7 轮受控会话,覆盖整轮回放和完整新请求切换;不代表线上准确率,也不覆盖部分继承、参数共指、局部增删改、同业务域高度歧义干扰、真实工具执行或开放域长对话。
项目结论 · 单轮主链、多轮扩展与适用范围
工具找得齐、顺序排得对,多轮任务也接得上
单轮主线依次经过意图分流、候选检索和工具链规划,9K 结果还包含 3K 闲聊的正确分流;多轮层另行测试 993 段 2~7 轮自然短会话中的最后目标轮。两套结果使用不同评测集,都不执行真实工具。
单轮后端的十一个累计决策点
从没有 Intent 与闲聊出口的原始 8B Planner(19.29%)到最终 92.62%;同一 9K 工具链口径上依次加入路由、检索、重排、监督训练与偏好训练,横向模型选型不混入累计折线。
正在根据页面数据生成单轮 9K 进步图。
多轮 Agent 的十一个累计决策点
固定同一模型与后端,绿色主线从 A 直接进入 C~L;B 是直接拼接历史的单独对照,不属于逐步累加顺序。三条曲线分别展示整体、历史任务恢复和完整新请求。
正在根据页面数据生成多轮 Agent 进步图。
先判断当前句是否需要历史,再选择恢复、复用或完整链路
Agent 在入口判断和整理历史,在出口保存本轮结果。当前句完整就保持原文;引用历史时恢复唯一来源的完整任务;只有严格条件满足时才复用原计划或按标准工具名称直达。下方 9K 数字仍只统计原 Intent、检索和 Planner 链路。
从当前原句到工具计划,再写回下一轮可用的状态
上方是需要模型处理时的主链路;下方四张卡说明 Agent 怎样准备请求、何时可以安全直达,以及来源不足时如何停止猜测。
没有可靠历史依赖证据就不继承旧工具;电商请求继续检索和规划,闲聊在意图判断后结束。
找到唯一来源后,以完整请求进入同一后端;纯引用找不到可靠来源时返回合法空工具结果,不猜测其他历史。
来源状态正常、计划非空且通过输出检查,同时检索路线、检索版本和 Agent 配置一致时直接复用;任一条件失败,就恢复完整请求并走固定后端。
只有每个目标都按固定结构完整写出目录中的标准能力名称,并且唯一命中时才直接输出;任一目标不确定,整轮回到固定后端。
模型主链与会话收尾这张图描述组合后的运行架构。实验 04 在 993 个会话的最后目标轮评价 Agent;下方 9K 沿用单轮 Intent → 检索 → Planner 口径,不把 Agent 另算为一个得分阶段。
- 步骤 01 · Agent 入口判断并准备本轮任务原句不变 / 恢复完整请求 / 安全直达
- 步骤 02 · 后端阶段 01请求分流0.6B LoRA · checkpoint-2000
- 步骤 03 · 后端阶段 02混合检索向量模型 + BM25
- 步骤 04 · 后端阶段 02重排与融合bge-reranker-v2-m3 + RRF
- 步骤 05 · 后端阶段 03选择并排序工具8B · SFT + RPO + DPO · 一次生成
- 步骤 06 · Agent 收尾严格检查并写回状态无效计划不覆盖上次有效结果
入口意图分流
截至分流 · 9,000 / 9,000 · 100.0000%
必要工具完整覆盖
截至检索 · 8,842 / 9,000 · 98.2444%
精确工具集合与有序工具链生成
最终结果 · 集合 8,352 / 9,000 · 92.8000% | 有序工具链 8,336 / 9,000 · 92.6222%
规划模型一次生成同时完成工具选择与排序;集合全对率与工具链全对率是对同一输出的两种评分。实验只评测有序工具 ID,不包含参数生成、真实工具调用或调用失败恢复。
单轮最终结果 · 系统级工具链测试集 9,000 条
Qwen3-0.6B LoRA · checkpoint-2000
100.00%9,000 / 9,000
6,000 条电商和 3,000 条闲聊均正确分流负样本向量检索 + Top-20 交互精排
98.24%8,842 / 9,000
新增失败 158 条 · 6K 日常电商中 97.37% 找齐 Top-10 必要工具0.6B 路由 + 精排 20 / 规划 10 + 8B RPO / DPO
92.62%8,336 / 9,000
规划阶段新增失败 506 条 · 日常电商请求 6K 工具链全对率 88.93%三张卡如何计算:都使用同一 9K 测试集,并把上一阶段失败保留到下一阶段。0.6B 路由型号也依据这套 9K 比较确定,因此 100% 与 92.62% 是固定合成测试结果,不是完全未见的线上验证;Planner 只在训练侧独立开发请求上选型,6K 与 1K 在模型锁定后报告。
项目总数据表每套数据有多少条、用于训练还是测试 +
项目级汇总
按使用顺序列出全部数据
| 数据 | 来源与内容 | 规模与划分 | 用途 | 使用限制或结果 |
|---|---|---|---|---|
| 工具目录与文档三个实验共用 | 8 个电商业务域;每项工具包含名称、描述与接口信息 | 100 项工具 52 项查询类 / 48 项操作类 | 定义固定的 100 个候选工具并生成检索文档 | 工具目录本身不是评测请求,也不测试新增工具 |
| 工具调用轨迹同时用于意图与检索实验 | 单工具与多工具电商请求及目标工具链 | 30,000 条 12K 单工具 / 18K 多工具 24K 训练 / 6K 测试 | 生成意图监督数据以及检索训练、测试样本 | 请求、轨迹 ID 与相似请求写法分组按稳定规则隔离 |
| 意图监督数据实验 01 | 训练侧电商轨迹、独立闲聊样本与 6 条容易混淆的请求 | 48,006 条总计 45,606 训练 / 2,400 验证 | 固定同一组参数训练 0.6B 与 1.7B;验证集监控损失 | 同一样本全集、不同排列;未逐项搜索学习率、轮数和 LoRA 参数 |
| 意图分流与路由选择集实验 01 | 6K 电商请求 + 3K 独立闲聊 | 9,000 条 | 比较规则、未微调模型与 LoRA 版本,并选出 0.6B checkpoint-2000 | 同一 9K 后续用于系统级测试;已经用于型号选择,不是未见线上流量 |
| 向量与重排训练数据实验 02 | 24K 训练轨迹与 100 份工具文档组成请求—工具样本 | 70,012 个正对 向量:每个正对 1 正 + 2 负 重排:每组 1 正 + 7 负 | 向量负例来自跨领域与新增无关工具;重排负例包括 3 个按工具类型挑选的样本与 4 个检索难例 | 负样本只来自训练划分;两类模型分别训练 |
| 检索模型开发集实验 02 | 明确工具需求与简洁日常说法各 600 条;工具数 1–6 均衡 | 1,200 条请求 | 比较 5 种向量训练方案和 4 种微调重排架构 | 选完模型后才使用 1.2K、6K、1K 与 9K 最终测试 |
| 候选数量与融合开发集实验 02 | 日常说法与明确工具需求两类请求,包含单工具和训练未见组合 | 2,400 条开发 + 1,200 条确认 | 比较精排 10/20/30/50、规划 5/10/20/30/50 和最终融合参数 | 规划候选必须全部经过精排;最高分 0.5pp 内优先低成本方案 |
| 长候选压力测试实验 02 · 参数确定后 | 600 条单工具 + 600 条监督训练未见多工具组合 | 1,200 条请求 | 检查增加候选是否稳定改善规划准确率 | 参数确定后运行,不参与模型或参数选择 |
| 日常电商请求测试集实验 02 / 03 | 3K 单工具 + 3K 多工具;多工具含已见与未见组合 | 6,000 条请求 15,196 个目标工具 | 报告最终检索覆盖率与规划工具链全对率 | Top-10 找齐必要工具 97.3667%;最终 8B 工具链全对率 88.9333% |
| 检索独立改写请求测试实验 02 · 参数确定后 | 独立构造的两类写法,工具数 1–6 均衡 | 1,200 条请求 | 补充检查最终检索链的 AllHit@K 与 MRR | AllHit@10 99.8333%;查看结果后未继续调参 |
| Planner 监督训练数据实验 03 | 工具需求明确写法与日常说法,均配当前检索 Top-10 和正确有序工具链 | 77,724 条 53,725 + 23,999 | 训练 Qwen3-8B Planner 的工具选择与顺序规划 | 1 轮 LoRA;与开发、6K、1K 无请求或轨迹重合 |
| 偏好训练起点数据实验 03 | 正确工具链与监督模型在同一训练侧请求上的实际错误输出 | 2,000 对 1,800 训练 / 200 监控 | 得到用于真实错误挖掘的固定 checkpoint-29 | 不含冻结测试;保持当前 Top-10 顺序 |
| 偏好错误挖掘请求实验 03 · 训练侧新生成 | 24K 偏长多约束请求 + 12K 一至两工具请求 | 36,000 条 8,309 个去重语义错误 | 构造长短链均衡的 chosen / rejected | rejected 均为 checkpoint-29 的实际贪心输出,不手工伪造 |
| RPO / DPO 偏好数据实验 03 · 当前模型真实错误 | 覆盖 1–6 工具;包含替换、遗漏、多选与纯顺序错误 | 4,000 对 3,600 训练 / 400 监控 | 比较四个主训练配方与四个短程扩展配方 | 覆盖全部 100 工具;每个请求和来源最多一对;截断为 0 |
| Planner 开发集实验 03 | 600 条单工具 + 600 条 2–6 工具请求 | 1,200 条 | 评测 28 个 checkpoint,并锁定最终 checkpoint-113 | 检索 AllHit@10 96.6667%;与训练和冻结测试均隔离 |
| 工具需求明确的请求测试集实验 02 / 03 | 明确写出所需能力与顺序,并配目标工具与最终 Top-10 | 1,000 条请求 | 补充测试最终检索和 8B Planner | Top-10 找齐必要工具 100%;最终工具链全对率 99.4000% |
| 完整 100 工具 / Top-10 配对测试实验 03 · 基础模型 | 日常电商 6K + 明确工具需求 1K;未微调 4B / 8B 分别比较两种候选范围 | 7,000 条请求 × 2 种输入 4 组配对 · 8 份结果 | 验证 Top-10 候选是否帮助未微调 Planner | 4 / 4 组工具链全对率提高 |
| 系统级工具链测试集单轮最终结果 | 3K 闲聊 + 6K 电商;0.6B checkpoint-2000 路由、精排 20 / 规划 10 与最终 8B Planner | 9,000 条 | 逐样本联合计分;工具链成功 8,336 / 9,000 | 集合 / 工具链成功率 92.8000% / 92.6222%;未执行真实工具 |
| 多轮 Agent 开发集实验 04 · 方案形成 | 模型生成并经独立语义审核的 2~7 轮自然短会话;历史轮真实执行,每段只计最后目标轮 | 991 个会话 · 2,793 个执行轮 605 个回放 / 386 个完整新请求 | 固定后端,在 A~L 十二种候选中先守住新请求,再提高历史回放 | 方案 L:957 / 991 · 96.57% |
| 多轮 Agent 独立测试集实验 04 · 一次性确认 | 与开发集和 42,400 条保护数据完成请求、来源轨迹、表达簇与会话结构隔离 | 993 个会话 · 2,835 个执行轮 612 个回放 / 381 个完整新请求 | 方案锁定后统一运行十二种候选,并报告两类目标、错误来源与 Planner 调用 | L:94.56%;回放 92.81%;完整新请求 97.38% |
下一轮优化方向
- 01 · 准确性真实请求与多随机种子重复实验引入匿名真实请求和口语噪声,并量化训练随机性
- 02 · 速度统一端到端性能压测同一请求协议测 p50 / p95、吞吐、冷启动与各阶段显存
- 03 · 业务覆盖新工具与冷启动加入未参与训练的新工具,验证目录扩展、工具定义变化时的适配与维护成本
- 04 · 执行闭环真实调用与执行失败恢复加入工具参数、返回值、失败分支与执行状态依赖;多轮工具目标恢复已在模型外框架中单独评测
工程证据 · 复现工程资产与复现 +
精排 20 / 规划 10 的检索与规划输入
configs/retrieval_canonical_route.json 检索实验报告负样本训练、参数选择与最终测试
reports/03_向量训练.md 规划实验报告77,724 条 SFT、RPO / DPO 选择与冻结结果
reports/07_Planner再训练_20260808.md 路由结构化结果0.6B 路由选择与 9K 分流结果
intent_0p6b_canonical_20260803/summary.json 最终结构化结果checkpoint-113 的 6K / 1K / 9K 汇总
assignment3_planner_dpo2_20260808/final_summary.json 模型选择锁28 个 checkpoint 的开发集排序与确定性破平
selection/dpo_checkpoint_selection.json 多轮运行配置历史读取、计划复用、输入预算与版本校验
configs/agent_runtime.json 多轮评测报告自然短会话协议、十二种候选、错误与适用范围
reports/08_自然短会话记忆评测.md 多轮完整结果A~L 的开发集、独立测试、切片与逐条比较
natural_short_memory_evaluation/results_final.json 多轮数据协议991 + 993 段自然短会话、审核与隔离检查
natural_short_memory_evaluation/protocol.json项目概览
PROJECT/README.md 模型报告意图识别与关键词评测
reports/01_意图识别.md 基线报告检索增强
reports/02_检索增强.md 数据地图数据与实验总表
reports/04_数据集与训练用数说明.md 综合报告100 工具检索与规划总结果
reports/06_Assignment3_100工具实验总报告.md 实验配置向量训练预筛与负样本方案
configs/embedding_finetune_experiments.json 结构化结果精排与规划深度联合选择
planner_joint_depth.../final_report.json 实验配置真实错误偏好数据、RPO 主搜索与 DPO 扩展
configs/assignment3_current_dpo.json 多轮方案锁独立测试运行前锁定方案 L 的开发集证据
natural_short_memory_evaluation/selection.lock.json 异常场景检查8 / 8 来源、Token、非法输出、隔离与超时检查
natural_short_memory_evaluation/validation/failure_guards.jsonCPU 数据构建与校验
校验工具目录、生成轨迹并检查训练与测试是否重叠;GPU 实验入口见项目仓库。
cd "$PROJECT_ROOT"
python3 \
PROJECT/scripts/catalog/validate_tool_catalog.py
python3 \
PROJECT/scripts/dataset/generate_diverse_tool_trace.py \
--train-context-salt 0 --test-context-salt 100003
python3 \
PROJECT/scripts/dataset/audit_generation_leakage.py \
--tokenizer fallback
python3 \
PROJECT/scripts/dataset/audit_datasets.py \
--strict-min-test-per-tool 30
python3 -m unittest discover \
-s PROJECT/tests -v
python3 \
PROJECT/scripts/agent/audit_agent_static_regression.py
python3 \
PROJECT/scripts/agent/audit_agent_failure_guards.py
100-TOOL COMMERCE AGENT