阶段成果与边界
完整 BFCL Overall 和完整 Agentic 均不报告:Web Search 未执行。所有表格是本地固定官方版本结果,未作为正式榜单提交。内部高分不代表通用工具智能体能力。
BFCL:官方版本本地结果
commit f7cf735 · Prompt · greedy · 原生 4096。选择模型与指标查看;超限、缺项和实际答案失败需结合覆盖报告解释。
| 指标 | C | E | F |
|---|---|---|---|
| Non-Live AST Acc | 0.02% | 0.02% | 0.94% |
| Non-Live Simple AST | 0.08% | 0.08% | 2.25% |
| Non-Live Multiple AST | 0.00% | 0.00% | 1.50% |
| Non-Live Parallel AST | 0.00% | 0.00% | 0.00% |
| Non-Live Parallel Multiple AST | 0.00% | 0.00% | 0.00% |
| Live Acc | 0.00% | 0.00% | 0.52% |
| Live Simple AST | 0.00% | 0.00% | 1.94% |
| Live Multiple AST | 0.00% | 0.00% | 0.19% |
| Live Parallel AST | 0.00% | 0.00% | 0.00% |
| Live Parallel Multiple AST | 0.00% | 0.00% | 0.00% |
| Multi Turn Acc | 0.00% | 0.00% | 0.00% |
| Multi Turn Base | 0.00% | 0.00% | 0.00% |
| Multi Turn Miss Func | 0.00% | 0.00% | 0.00% |
| Multi Turn Miss Param | 0.00% | 0.00% | 0.00% |
| Multi Turn Long Context | 0.00% | 0.00% | 0.00% |
| Web Search Acc | N/A | N/A | N/A |
| Web Search Base | N/A | N/A | N/A |
| Web Search No Snippet | N/A | N/A | N/A |
| Memory Acc | 1.08% | 0.65% | 0.86% |
| Memory KV | 0.00% | 0.00% | 0.00% |
| Memory Vector | 0.00% | 0.00% | 0.00% |
| Memory Recursive Summarization | 3.23% | 1.94% | 2.58% |
| Relevance Detection | 0.00% | 0.00% | 12.50% |
| Irrelevance Detection | 99.94% | 99.94% | 73.81% |
| Format Sensitivity Max Delta | 0.5 | 0.5 | 1.0 |
| Format Sensitivity Standard Deviation | 0.2 | 0.2 | 0.31 |
原始 CSV 中包含缺项条件下生成的聚合分数和 rank,保留用于审计,不作为完整榜单成绩。Format Sensitivity 单位为百分点;接近零的差值并不证明稳健。
数据分布与质量审计
124,260 原始行 → 74,841 结构/schema 通过 → 16,730 保留候选。候选 15,266 条含调用、1,464 条零调用;10,609 条含工具结果,但结果未经逐条执行。
training_ready=false。随机 10K/1K 切分仍是草案;语义抽审、任务族隔离、模型 token 长度和结果重算未完成。保留率低不能等同源数据错误率。
Haidass 143M 工具调用后训练研究复盘
归档日期:2026-10-08。研究状态:阶段结束,仅整理既有记录,不再启动训练、推理或评测实验。
摘要与可支持的结论
本研究在八张 Ascend NPU、隔离 Docker 环境中,对 Haidass1.5-143M 原始预训练模型进行了 A、A_repair、B、C、D、E、F 多阶段全参数监督微调。我们完成了工具协议、单步选择、少量多步依赖任务的训练,建立了本地可执行评测、官方 BFCL 接入、数据规模审计和新增公共数据候选池。
研究证明了:143M 基座能学习有限工具集合与固定协议,在内部合成任务上完成多步执行。但这套训练没有获得可用的通用工具调用能力,也没有获得可与 BFCL 完整榜单比较的总分。C 是此前内部能力保留门槛下的保留版本,并不意味着它是 BFCL 上最强或可部署版本。F 在公开单步类别有小幅改善,却伴随原协议能力回退。G 仅准备数据,未发现训练产物,不能报告 G 的模型性能。
最重要的经验是同时管理四件事:语义任务覆盖、协议一致性、有效监督量、评测可执行覆盖。内部高分、loss 下降、更多函数名、更多输入 token,都不能单独替代公开任务上的真实执行成功。
本报告基于已保存的 JSON、CSV、训练代码和数据审计文件。明确区分“记录直接支持的事实”“根据代码和结果的解释”“尚未验证的建议”。新整理不重新运行模型实验,不追补缺失结果。
1. 研究目标、边界和环境
目标是在 BFCL 所覆盖的工具调用任务上改善函数选择、参数生成、多函数调用、跨轮状态使用、不相关请求识别及格式适应性。对话中偶有 BCFL 拼写,本文统一为 BFCL(Berkeley Function Calling Leaderboard)。
基座为 DALabCommunity/Haidass1.5-143M,下载 revision 为 d8a00d4943971088e6f0f4e08fb317dd5ba33ed1。本地检查记录为 143,071,296 参数,Qwen3 架构,30 层,hidden size 576,9 个 attention heads、3 个 KV heads,约 64K 词表,原生上下文 4096。它是预训练模型,不能默认已具备通用指令遵循能力。模型卡记录预训练约 400B token,与对话中的 40B 不同;本研究没有重新审计其预训练语料。
运行环境为 Ubuntu 22.04 / aarch64、八张 Ascend 910B3 64GB。训练容器为 haidass-posttrain,基础镜像 swr.cn-south-1.myhuaweicloud.com/ascendhub/verl_pt27_25rc3:a2-arm。torch 2.7.1 + torch_npu 2.7.1,transformers 4.56.0.dev0。BFCL 的依赖在独立评测 venv 中安装,避免升级训练环境。向量记忆使用 CPU MiniLM 编码器,固定 revision 1110a243fdf4706b3f48f1d95db1a4f5529b4d41。
这是硬件相关的研究快照。原始代码包含 /workspace 路径、torch_npu 和 HCCL 假设,并非已整理成可在任意 CPU/GPU 上直接安装运行的软件包。本归档不包含登录凭据、远程访问脚本、模型权重、优化器状态或完整公共评测题目。
2. 训练数据与协议
早期公共工具数据来自 NousResearch/hermes-function-calling-v1,包括 singleturn 和 Glaive 5K 文件;固定 revision dae3e1d28cfbcf4b915c04ea1e072030529b4bda。记录中 3,379 条工具轨迹被接收,1,752 条被拒绝。BelleGroup/train_0.5M_CN 的固定 revision 为 29c35e9b56c7fc91f04a613ed33896f7a19bad54,读取前 20K 行,用于补充中文指令。公共工具结果多数未经独立执行重算,数据来源可信不等于每个标签正确。
自建可执行任务主要围绕约 20 个工具:四则运算、列表统计、大小写与字符串处理、日期偏移、单位换算、商品与库存查询、联系人查询。多步模板集中于“商品查询→数量乘法→运费”“商品 ID→库存”“超时重试→后续计算”等少数模式。reverse_text、km_to_miles 被用于部分工具泛化检查,但两个留出工具不能代表开放世界 OOD。
原始协议使用 ChatML 风格边界,以及 XML 包裹的 JSON 调用:
<tool_call>{"name":"multiply","arguments":{"a":3,"b":4}}</tool_call>
tool 消息包含 JSON 返回,assistant 可以继续调用或生成最终回答。监督标签仅覆盖 assistant 目标,其余上下文 labels 设为 -100。没有把工具响应当成模型需要臆造的目标,没有开展 RL、DPO 或 GRPO。
一条多步轨迹可能被拆成多个响应样本,每个样本重复工具说明和历史。因此“轨迹数”“响应数”“总输入 token”“监督 token”“实际训练处理 token”是五种不同计量,必须分别记录。改名、换格式、回放同一轨迹不增加独立语义任务数量。
3. 阶段经过与实际训练结果
训练采用八卡 HCCL DDP、全参数 AdamW,FP32 参数配合 BF16 autocast,micro batch 2、accumulation 4,标称全局 batch 64;梯度裁剪 1.0、4% warmup、cosine 调度、序列按 128 对齐。loss 按有效目标 token 归一化;每 100 步及最后一步验证并保存 checkpoint。超长样本计数后排除,没有静默截断。
| 阶段 | 步数 | 峰值学习率 | 初始 dev loss | 最佳 dev loss | 实际输入 token |
|---|---|---|---|---|---|
| A | 306 | 5e-5 | 2.138567 | 1.029488 | 6,275,843 |
| A_repair | 160 | 3e-5 | 1.029489 | 1.013236 | 4,253,228 |
| B | 663 | 3e-5 | 0.985083 | 0.776857 | 18,113,190 |
| C | 438 | 2e-5 | 0.782565 | 0.629671 | 15,177,428 |
| D | 300 | 1e-5 | 0.629671 | 0.618056 | 10,214,957 |
| E | 400 | 5e-6 | 0.629671 | 0.619172 | 13,790,817 |
| F | 400 | 5e-6 | 0.747862 | 0.527767 | 28,946,298 |
来源:evidence/{stage}/result.json;学习率见历史 continuation/pipeline 代码。dev 集和协议发生过变化,表中的 loss 不应跨阶段直接排序。
A / A_repair:建立基础协议
A 将公共工具轨迹、一般指令、合成单步和负例混合训练。loss 大幅下降,但模型存在提前 EOS、不会实际产生调用的问题。A_repair 进行协议和调用目标强化,说明初期对小基座的首要挑战包含输出协议和指令对齐,单看教师强制 loss 会漏掉生成时的停止行为。
B:单步调用能力强化
B 增加单工具选择、参数生成、负例和公共轨迹,显著降低 dev loss。这建立了有限工具集合上的可执行基础,但大量函数名并没有自动带来更广的任务推理覆盖。
C:多步执行与能力保留
C 增加多步轨迹并保留单步、负例、公共轨迹、通用指令回放。内部多步表现成为这一阶段的主要成果。之后的 D/E/F 均作为从 C 出发的候选方向,不是简单连续的一条训练链。
Base → A → A_repair → B → C
├→ D
├→ E
└→ F
D / E:偏重单步修复的代价
D 的 loss 改善及单步提升伴随多步回退,没有通过晋级门槛。E 在内部 dev_v2 单步和 OOD 上明显改善,多步降至 87.50%,因此也未替换 C。可观察到保留任务之间的权衡;仅凭这些分支不能建立某个超参数的因果结论。
F:面向官方格式的适配
F 从 C 开始,将既有 B/C 轨迹转成官方 Python/JSON 提示与调用格式,并回放 XML 多步轨迹。转换标签经过官方解析器检查;记录中排除 43 条过长样本和 13 条解析转换失败。F 没有引入大量新语义任务。
F 降低新协议 dev loss,并使官方 Python Simple 从 1/400 改善到 15/400,Multiple 从 0/200 改善到 3/200。但内部原协议单步和 OOD 退化,因此研究没有把 F 晋级为通用推荐模型。此结果支持“格式适配有作用但远远不足”;没有格式/数据/初始化的完整对照,不能声称只由格式变化导致。
4. 内部评测:有效成果与外推限制
内部 dev_v2 有 224 条:单步 96、负例 32、多步 64、OOD 32。评测采用 greedy unconstrained 生成、最多 6 次工具调用、真实合成工具执行,使用修正版 scorer_revision=2。早期 revision=1 的不调用判分曾有局限,归档中保留原记录以便审计,主表统一采用 revision=2。
| 内部 dev_v2 执行成功率 | C | E | F |
|---|---|---|---|
| 单步,n=96 | 84.38%(81) | 96.88%(93) | 76.04%(73) |
| 多步,n=64 | 98.44%(63) | 87.50%(56) | 95.31%(61) |
| 负例,n=32 | 100%(32) | 100%(32) | 100%(32) |
| OOD,n=32 | 56.25%(18) | 81.25%(26) | 43.75%(14) |
括号中为成功数;来源为 C_v2_eval.json、E_eval.json、F_eval.json。负例成功是该内部协议下正确处理请求,不等价于所有 BFCL 不相关检测标签。
C 的历史冻结 test_v2 为 800 条:单步 300、多步 250、负例 150、OOD 100;成功率分别 81.33%、96.40%、100%、67.00%。该结果支持有限合成分布的能力保留。工具族和模板较窄、验证样本量小、部分开发集被多次用于选择版本,不能由此声称通用智能体成功率超过 90%。研究未开展多随机种子实验,也不报告统计显著性胜出。
5. 两种 BFCL 结果必须分开
5.1 早期 500 题自定义局部测试:历史诊断
| 模型 | 本地自定义 500 题历史 accuracy |
|---|---|
| Haidass-C | 18.6% |
| Haidass-E | 20.0% |
| SmolLM2-135M-Instruct | 19.2% |
| SmolLM2-360M-Instruct | 12.2% |
| Qwen2.5-0.5B-Instruct | 15.4% |
| Qwen3-0.6B | 30.2% |
这些均是历史本地测试,不是外部公布的 BFCL 成绩。当时采用自定义 XML 受控协议和局部样本,部分解码/解析存在局限。Simple、Multiple、Parallel、Parallel Multiple 几乎没有成功时,仍可能因不相关类别正确“不调用”而出现正的整体 accuracy。
一般局部 micro accuracy 为 通过的样本数 / 已测试样本总数。若通过主要来自负例,整体分数反映样本构成,不证明正例调用能力。官方榜单的类别聚合及权重应以固定版本评分代码为准,不能把上述局部 accuracy 当作官方 Overall,也不能把历史 SmolLM/Qwen 表当作严谨的性能排名。
5.2 官方 BFCL 固定版本的本地评测
采用榜单关联版本 f7cf7359b7ac615a0b294831c5ba2bc95ee4a000,接入官方 loader、Prompt、AST 解码、交互工具环境和 scorer。自定义部分为 Haidass 本地 NPU 推理和模型注册;报告的是 Prompt 设置下的本地复现成绩,未作为正式提交榜单的公开成绩。
| 类别 / 指标 | C | E | F |
|---|---|---|---|
| Non-Live AST 汇总 | 0.02% | 0.02% | 0.94% |
| Non-Live Simple 汇总 | 0.08% | 0.08% | 2.25% |
| Python Simple | 0.25% | 0.25% | 3.75% |
| Java Simple | 0% | 0% | 1.00% |
| JavaScript Simple | 0% | 0% | 2.00% |
| Multiple | 0% | 0% | 1.50% |
| Parallel | 0% | 0% | 0% |
| Parallel Multiple | 0% | 0% | 0% |
| Live AST 汇总 | 0% | 0% | 0.52% |
| Live Simple | 0% | 0% | 1.94% |
| Live Multiple | 0% | 0% | 0.19% |
| Live Parallel / Parallel Multiple | 0% / 0% | 0% / 0% | 0% / 0% |
| Multi-Turn Base | 0%† | 0%† | 0%† |
| Multi-Turn Miss Func | 0%† | 0%† | 0%† |
| Multi-Turn Miss Param | 0%† | 0%† | 0%† |
| Multi-Turn Long Context | 0%† | 0%† | 0%† |
| Relevance Detection | 0% | 0% | 12.50% |
| Combined Irrelevance Detection | 99.94% | 99.94% | 73.81% |
| Non-Live Irrelevance | 100% | 100% | 67.08% |
| Live Irrelevance | 99.89% | 99.89% | 80.54% |
| Memory 汇总 | 1.08% | 0.65% | 0.86% |
| Memory KV | 0%† | 0%† | 0%† |
| Memory Vector | 0% | 0% | 0% |
| Memory Recursive Summarization | 3.23% | 1.94% | 2.58% |
| Format Sensitivity 最大差(百分点) | 0.50 | 0.50 | 1.00 |
| Format Sensitivity 标准差(百分点) | 0.20 | 0.20 | 0.31 |
| Web Search Base / No Snippet | 未完成 | 未完成 | 未完成 |
| 完整官方 Overall | 不报告 | 不报告 | 不报告 |
† 为官方记分结果,但有严重上下文覆盖限制,见下一节。CSV 中的小数已按官方显示精度报告,不能用四舍五入后的表格逆推出所有准确的计数。
官方输出的 data_overall.csv 还包含 10.21%、10.13%、7.70% 的聚合值,以及 Agentic 的不完整聚合值。这些文件作为原始证据保留,但 Web Search 为 N/A,本报告不将它们包装为完整 BFCL Overall 或完整 Agentic 成绩,也不使用其中局部 rank 宣称胜出。费用逻辑的默认硬件假设与 Ascend 不符,没有实际成本结论。
来源为 evidence/bfcl_official_f7cf735/score/*.csv,主页面提供交互查看。格式敏感性包含 26 种配置,准确率多数接近零;最大差小不等于格式稳健。
5.3 上下文覆盖失败与模型答案失败
C/E/F 各 800 个 Multi-Turn 样本全部触发原生 4096 上下文限制。模型没有完整阅读这些输入,因此不能把这些零分解释为“看完题目后多轮推理全部失败”。
| 初始失败提示长度(token) | 最小 | 中位 | 最大 |
|---|---|---|---|
| Base | 10,276 | 19,383 | 28,233 |
| Long Context | 10,276 | 19,383 | 28,233 |
| Miss Func | 8,970 | 18,314.5 | 27,518 |
| Miss Param | 10,274 | 19,380 | 28,120 |
Memory KV 与 Memory Vector 各 192 条含前置记录全部超限;Recursive Summarization 的 192 条记录有 19 条超限。含前置记录的条数不能直接作为官方最终评分分母。Live 类别也有超限:C 的 Live Multiple 为 381/1053、Live Irrelevance 为 114/884、Live Relevance 为 3/16;格式敏感性为 435/5200。不能将这些类别的全部差距归因于答案质量。Web Search 因缺少 SerpAPI 配置未执行,属于基础设施缺项,不能补零。完整覆盖审计见 coverage_audit.json。
4096→8192 仍不足覆盖上述多轮输入。32K 只是初始提示覆盖的候选长度,后续对话可能更长。没有长上下文训练和验证时,修改配置不能证明具备长上下文能力。本研究没有开展上下文扩展实验。
5.4 如何读 Hallucination 和格式指标
不相关检测高而相关检测接近零,与偏向不调用的行为相容;它不是已经解决幻觉问题的证据。官方 irrelevance 主要识别没有有效函数调用输出,解析失败也可能表现为不调用,故必须结合生成轨迹与 relevance。F 相关检测从 0 提升到 12.50% 的同时,不相关检测降到 73.81%,显示调用积极性与误调用之间存在权衡。
AST 成功要求函数与参数符合题目允许的答案;格式正确仅是必要条件。Parallel 还涉及调用集合正确性。Multi-Turn 更依赖工具返回和状态演进,不能用第一步调用准确率替代全轨迹执行成功率。
5.5 外部公布结果的比较边界
后续对外部模型的比较遵循用户要求:引用公开模型卡、论文、固定榜单快照;不新增本地复测。归档中没有可核实、同一 BFCL 版本与设置下的 SmolLM/Qwen 外部结果快照,因此不填入来源不明的数值,也不将早期本地结果冒充公开成绩。
若今后只做文献整理,外部比较表须保存模型确切版本、参数量、BFCL 版本、Prompt/FC 设置、类别覆盖、公开日期和链接。论文中不同版本的 Overall 与本研究不完整聚合值没有直接排序意义。官方入口:BFCL leaderboard。
6. 数据规模审计:为什么“输入很多”仍监督有限
| F 数据计量 | 数值 | 解释 |
|---|---|---|
| 轨迹池 | 16,487 | 既有任务转换及回放 |
| 响应样本 | 45,531 | 多步拆响应,重复历史输入 |
| 准备池输入 token | 51,487,862 | 不是实际训练处理量 |
| 准备池监督 token | 976,587 | labels 非 -100,约输入的 1.90% |
| 平均监督 token / 响应 | 21.45 | 调用目标短 |
| F 实际处理输入 token | 28,946,298 | 400 步处理量 |
| C 分支累计输入 token | 43,819,689 | A→A_repair→B→C |
| F 分支累计输入 token | 72,765,987 | C 分支→F,不含 D/E |
各阶段原始文件合并精确去重后有 56,837 条轨迹、47,807 个用户文本、2,706 个工具名、5,553 个 schema 文档。它们仍包含模板、格式和名称变体,不能等同于独立任务数量。审计没有完整的 A_repair 原始轨迹文件,统计范围需保留这一限制。
扩量理由来自任务覆盖有限和公开泛化不足,而不是预训练与 SFT token 的固定比例。更长工具说明只增加输入成本,重复回放只增加更新次数,不能替代新的任务族。短调用目标本来就合理,不应为了提高监督 token 占比而制造无意义长回答。
7. 最后一轮公共数据准备:成果及质量门槛
新增来源固定为 ToolACE 6bda777c88d21e5a204703c1ee45597a8fa4f734 和 Glaive-v2 e7f4b6456019f5d8bcb991ef0dd67d8ff23221ac。原文件 SHA-256 与源 manifest 一致。原始 124,260 条经过保守解析、schema/参数检查、来源重合检查、精确去重和近重复筛选,保留 16,730 条候选。
| 分布 | ToolACE | Glaive-v2 | 合计 |
|---|---|---|---|
| 原始行数 | 11,300 | 112,960 | 124,260 |
| 结构/schema 校验通过 | 6,375 | 68,466 | 74,841 |
| 最终保留候选 | 6,363 | 10,367 | 16,730 |
| 零调用候选 | 1,286 | 178 | 1,464 |
| 含调用候选 | 5,077 | 10,189 | 15,266 |
| 一个 assistant 回合含多调用 | 1,888 | 0 | 1,888 |
| 含工具返回的候选 | 420 | 10,189 | 10,609 |
| 用户文本含 CJK | 15 | 0 | 15 |
| 用户文本字符 p50 / p95 | 148 / 741 | 150 / 240 | — |
| 可用工具数 | 1–9 | 1–2 | — |
保留率约 13.46%。低保留率同时受到数据重合和解析器保守规则影响,不能解读为“86.54% 源数据低质量”。例如无 schema 的一般问答不适用工具数据筛选,但不一定是错误问答;ToolACE 的 SchemaError 有 3,974 条,可能是类型别名和 schema 方言与 Draft7 不兼容,而非所有标签错误。没有额外重跑修复验证,本报告不推断可挽回数量。
Glaive 的拒绝记录包含 19,413 条既有来源用户文本精确重合、8,621 条冻结评测池文本重合、17,168 条用户序列重复、11,671 条轨迹重复、632 条参数 schema 不合格。这些原因按流水线先命中的规则计数,不能把它们理解为各类错误独立同时存在。冻结池结合 BFCL 和内部开发/测试文件,因此 8,621 不能全部归因于 BFCL 污染。
近重复流程使用 64 permutations 的 MinHash 查候选、词三元组 Jaccard≥0.85 精确复核,排除 1,208 条用户序列近重复和 18 条冻结池近重合。它是词法近似筛选,无法保证没有语义重复、改写题或基座预训练污染。扫描中 Format Sensitivity 文件未提取到用户文本;对应基础题覆盖与变化需另行映射,不能宣称每个格式题已完整匹配。
候选均标为 schema_validated_results_not_executed。多调用回合未验证调用之间独立性,不能全部称为并行;零调用候选未逐条判定为不相关、澄清或一般回答;含工具返回不代表结果真实可执行。仅 15 条含 CJK 的候选说明语言分布明显偏英文,不代表做完了语言识别或中文能力评测。
准备脚本随机选出 10,000 条 train 和 1,000 条 dev,其中 train 的 863 条为零调用、12,900 次为调用总数。此前把 863 当成全池零调用数、把 15,867 当成全池含调用数的表述需要纠正,主表以 1,464 和 15,266 为准。
该 train/dev 是准备草案:随机切行,没有完成任务族/schema 分组隔离;未完成语义抽审、模型 token 长度检查、既有来源近重复筛查和真实结果重算。归档报告原字段 training_ready=false 保持不变。数据曾上传服务器,但未发现 G tokenized 数据、模型 checkpoint 或训练结果,本研究结束时不声称已在此扩量训练。
8. 失败模式与研究经验
8.1 协议是可执行接口,应作为独立验收层
工具调用目标需要明确函数名、参数类型、边界 token 和停止条件。XML 协议熟练不等于官方 Python/JSON Prompt 熟练。解码时 skip_special_tokens=True 可能去除结构,保存原始 token 并只去除末端 EOS/pad 更适合诊断;依然须根据真实 tokenizer 检查结构是否为 special token,不能泛化为所有模型的统一问题。
实用验收应逐层记录:非空生成→调用解析→函数存在→参数 schema→参数语义→执行成功→用户目标完成。一个总分无法定位在哪一层失败。本次 F 的官方单步小幅改善说明协议适配有收益,但模板语义覆盖与容量因素仍需独立证据。
8.2 内部合成评测用于回归,不足证明开放泛化
约 20 个工具和少数生成模板容易使模型学习词面映射。内部 multi 98.44% 与公开单步 0.25% 并不矛盾:两者在工具说明、题型、协议、参数结构、任务开放度和上下文长度上不同。未来研究需要留出工具族、任务族、schema 结构和参数组合,报告 IID 与 OOD,避免只靠随机 query 划分。
8.3 负例指标必须结合正例
总不调用可以在不相关集获得高分。负例训练要区分无法完成、缺参需澄清、无需工具可答、可调用但用户没有请求调用等行为。reward 或晋级门槛如果只奖励“不调用”或格式有效,可能优化出捷径。本次未进行 RL,此处是后续方法上的风险分析。
8.4 Loss 衡量拟合,不直接衡量工具执行
D/E/F 均降低各自 dev loss,但对保留能力和 BFCL 的影响不同。监督目标中可能混有短调用、长回答、一般问答,其权重不同。应同时保留教师强制 loss 与生成执行指标,版本晋级以正例、负例、多轮和 OOD 的组合门槛决定。跨协议 dev loss 不直接可比。
8.5 先核实评测长度再决定架构路线
Multi-Turn 全部超限意味着本次没有真正测得该类别的模型推理能力。实验计划应先无推理地统计完整提示长度、后续对话增长和可用生成预算。之后若考虑扩展上下文,需要长序列 attention、显存、吞吐、RoPE/位置适配、远距离引用和短能力保留验证;单纯继续短 SFT 无法解决此瓶颈。
8.6 数据规模要由独立性和学习曲线定义
预训练约 400B 不推出 SFT 必须某个固定规模。应该同时报告去重轨迹、任务族、schema 结构、有效监督 token、真实执行验证比例。比较一次遍历与固定监督预算能够区分“新样本收益”和“更多更新收益”。本次没有实际开展 10K→50K→150K 学习曲线,不能声称扩量已证实有效。
8.7 基础设施和科学结论需分账
NPU DDP、独立 venv、离线下载传输、按卡分片、断点恢复和进度仪表盘是可复用工程成果。它们证明管线可运转,不证明模型有效。网络服务缺失、长输入拒绝、原始评分失败、模型答案错误应分别计数;只有覆盖完整时才可讨论完整榜单总体表现。
9. 可复用代码与复现说明
归档 code/ 保留历史 Python 文件,并提供下载 ZIP。重点阅读顺序为 protocol.py → prepare.py → tokenize_data.py → train.py → evaluate.py → official_adapter.py → run_official.py → 两个审计脚本。文件有硬编码路径与阶段副作用,导入某些文件也会执行数据准备或注册操作;先读代码,勿将归档页面当成自动训练入口。
| 文件 | 作用 | 重要限制 |
|---|---|---|
| protocol.py | schema、XML 调用、合成真实执行器 | 工具集合窄 |
| prepare.py / prepare_d/e/f.py | 阶段采样、轨迹、协议变换 | 回放与转换不增加独立语义 |
| tokenize_data.py | 逐 assistant 目标掩码与序列校验 | 重复上下文成本;需匹配模板 |
| train.py | 八卡 DDP、token 归一 loss、checkpoint | torch_npu / HCCL / 固定数据路径 |
| evaluate.py | 内部生成和执行成功检查 | 特定 XML 协议和模板分布 |
| official_adapter.py | Haidass→官方 OSSHandler | 4096 上限、贪心生成、Prompt |
| run_official.py | 原官方题目与 scorer,分片恢复 | 要安装固定 BFCL,运行会启动评测 |
| audit_sft_scale.py | 输入、目标、分支和去重计量 | 部分原文件缺失,非语义去重 |
| audit_bfcl_coverage.py | 失败与长度覆盖统计 | 需要已保存原始输出 |
| quality_expansion.py | 公共候选审计 | 保守规则;未满足全部质量门槛 |
| prepare_bfcl_expansion.py | 10K/1K 数据草案 | 随机切行,不能直接视为独立验证 |
| public_eval.py | 早期自定义子集诊断 | 历史局限,不作为官方结果 |
原始合成执行器的调用示意(仅说明代码,不代表本次重新运行):
from protocol import execute
result = execute("multiply", {"a": 3, "b": 4}, {})
# expected: {"result": 12}
训练掩码逻辑示意:
prefix = tokenizer.apply_chat_template(history, tools=tools,
tokenize=False, add_generation_prompt=True)
full = tokenizer.apply_chat_template(history + [assistant_target], tools=tools,
tokenize=False, add_generation_prompt=False)
# 必须验证 prefix 真的是 full 的 token 前缀;仅目标区段参与 loss。
labels = [-100] * prompt_len + full_ids[prompt_len:]
正式评分复现依赖 pinned BFCL 仓库及其许可证。归档链接到上游而非重新发布全部题目和答案。实验环境快照见 docs/CODE_GUIDE.zh.md,代码文件 SHA-256 见 MANIFEST.json。代码快照不等价于完整可移植复现实验包:原权重、完整数据、历史环境和种子一致性仍需要用户保留的原服务器记录。
10. 阶段结束的成果清单
已完成:A–F SFT 记录;内部执行评测与保留门槛;C/E/F 官方版本本地可运行类别;三种记忆后端;格式配置评测;上下文覆盖审计;输入与监督规模审计;两源原始下载、checksum 验证、16,730 候选池和 10K/1K 草案;研究文档、源代码及证据归档。
未完成且本次不再执行:G 训练、50K 扩量、语义数据质量抽审、任务族隔离切分、32K 长上下文适配、Web Search、完整官方 Overall、RL、多种子与严格容量对照。未完成项目是研究边界,不能从现有结果外推其成功。
阶段结论:该研究获得了有限分布工具学习的可行性证据、可复用的训练评测工程,以及清晰的泛化和上下文瓶颈证据。它没有完成在 BFCL 上表现良好的整体目标。最有价值的经验是及时识别“内部高分≠公开泛化”“不调用高分≠会选择调用”“loss下降≠版本晋级”“格式转换≠新任务”“样本池≠独立高质量数据”“记分零≠推理失败”。
来源与证据
- Haidass 原模型
- BFCL 官方榜单
- BFCL 固定代码版本
- Hermes Function Calling v1
- Belle 中文指令
- ToolACE
- Glaive Function Calling v2
- APIGen / xLAM60K 候选来源:本研究未获取或训练
- 本归档
evidence/、data/、code/;读取证据时以文件自身 stage、split、scorer_revision 和 protocol 为准。
代码、证据与下载
展开代码阅读与复现指南
代码和证据归档说明
本包归档既有研究,不会自动启动训练或推理。所有模型、数据和平台的权利仍以各自来源条款为准。本归档不附加统一开源许可证来覆盖未知来源的内容。
目录
docs/RESEARCH_REPORT.zh.md:完整复盘,包含结果、限制、数据质量和经验。code/:历史训练、数据、内部评测、官方接入和审计脚本。evidence/:服务器已有 stage result、开发/测试指标、gate、BFCL CSV 和覆盖诊断。data/:已有数据源 manifest、质量报告、SFT 规模统计;不重新发布原始语料或 BFCL 题目。downloads/:可下载的代码包和完整归档 ZIP。MANIFEST.json:每个归档文件大小和 SHA-256,生成 manifest 和 ZIP 之前的文件清单。
阅读路径
protocol.py定义早期工具、执行器及 XML 约定。prepare.py和prepare_d/e/f.py对应数据混合与阶段适配。tokenize_data.py检查模板前缀一致性,为 assistant 目标创建 labels。train.py对目标 token 做跨卡归一化,保存 best/checkpoint/final。evaluate.py使用合成执行器检查实际目标是否完成。official_adapter.py只提供本地模型接入;run_official.py对接上游 BFCL。audit_sft_scale.py和audit_bfcl_coverage.py检查有效监督和评测覆盖。quality_expansion.py为新增数据构建候选审计,不代表完整高质量数据认证。
环境快照与依赖
训练:Linux aarch64、Ascend 910B3 ×8、torch 2.7.1、torch_npu 2.7.1、transformers 4.56.0.dev0、Python conda 环境 verl_pt27_25rc3。原训练环境没有锁成完整跨平台依赖清单;不能仅 pip 安装 torch 就运行。
BFCL:仓库 commit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000。隔离 venv 继承训练环境 site-packages,补充 sentence-transformers 3.4.1、faiss-cpu 1.11.0、tree-sitter-java 0.21.0、tree-sitter-javascript 0.21.4、overrides 7.7、tenacity 9.1.2、rank-bm25 0.2.2。向量编码器需按官方构造器的路径约定准备。
新增数据审计环境:Windows Python 3.12;jsonschema 4.26.0、datasketch 2.0.0。只用于历史 CPU 清洗,不参与旧 A–F 的训练环境。
原运行通过 /workspace/scripts/env.sh 加载 conda/CANN 和库路径。服务器数据在 /srv/haidass,容器映射到 /workspace。公开包不包含 SSH 登录脚本、密码、API token 或宿主地址。
重要的历史代码限制
- 路径和阶段参数多为硬编码,文件不是可随意导入的公共库。
quality_expansion.py在模块顶层运行,导入会触发数据扫描和输出。prepare_bfcl_expansion.py使用随机行切分,属于未通过任务族独立性门槛的草案。analyze_expansion.py的早期启发式统计被质量报告替代;其 checksum 布尔字段是硬编码,实际校验来自后来的quality_expansion.py。原文件保留以展示修正链,不能用该布尔字段证明完整性。public_eval.py与run_public.py为早期局部诊断,不提供可与完整 BFCL 榜单比较的成绩。official_adapter.py保留结构 token,但固定上下文 4096;长输入会主动报错。train.py使用固定 processed/tokenizer;更换协议却忘记同步 tokenizer 会导致训练/推理不一致。optimizer.pt使用 torch 序列化,未随公共包分发;这里只保留相关代码供审阅。- loss 改善与 checkpoints 是完整阶段记录;best 的祖先不一定正好经历阶段全部 steps。分支累计 token 不是 best checkpoint 的精确 token 账本。
证据优先级
最新服务器导出的 stage/result 与官方 score CSV → 同一 split 和 scorer_revision 的 JSON → 质量与覆盖报告 → 历史状态文档 → 对话描述。旧 gate 中 official_evaluation_pending=true 是保存时状态,不能覆盖之后已完成的类别 CSV。旧计划中 50K、150K、32K 是未执行建议,不能写成成果。
data_overall.csv 有不完整聚合值,data_agentic.csv 缺 Web Search。保留原表用于审计,主文档明确拒绝作为完整 Overall/Agentic 排名。format 指标单位是百分点,其 26 配置表可以单独下载。
本次归档仅做文件解析、编译检查、站点与发布验证,没有启动新的模型训练、模型推理、基准评测或数据实验。