# 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](https://huggingface.co/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 调用：

```text
<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 出发的候选方向，不是简单连续的一条训练链。

```text
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](https://gorilla.cs.berkeley.edu/leaderboard.html)。

## 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 | 早期自定义子集诊断 | 历史局限，不作为官方结果 |

原始合成执行器的调用示意（仅说明代码，不代表本次重新运行）：

```python
from protocol import execute
result = execute("multiply", {"a": 3, "b": 4}, {})
# expected: {"result": 12}
```

训练掩码逻辑示意：

```python
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 原模型](https://huggingface.co/DALabCommunity/Haidass1.5-143M)
- [BFCL 官方榜单](https://gorilla.cs.berkeley.edu/leaderboard.html)
- [BFCL 固定代码版本](https://github.com/ShishirPatil/gorilla/tree/f7cf7359b7ac615a0b294831c5ba2bc95ee4a000/berkeley-function-call-leaderboard)
- [Hermes Function Calling v1](https://huggingface.co/datasets/NousResearch/hermes-function-calling-v1)
- [Belle 中文指令](https://huggingface.co/datasets/BelleGroup/train_0.5M_CN)
- [ToolACE](https://huggingface.co/datasets/Team-ACE/ToolACE)
- [Glaive Function Calling v2](https://huggingface.co/datasets/glaiveai/glaive-function-calling-v2)
- [APIGen / xLAM60K 候选来源](https://huggingface.co/datasets/Salesforce/xlam-function-calling-60k)：本研究未获取或训练
- 本归档 `evidence/`、`data/`、`code/`；读取证据时以文件自身 stage、split、scorer_revision 和 protocol 为准。
