一、开场:一句话需求,68 分钟交付
我在提出需求的那一刻,不知道 LoRA 是什么,不知道 MiniCPM-o 4.5 有几个模态,不知道 ms-swift 存在。
我说的原话是:
我手头有一台 spark,现在想微调一个 https://huggingface.co/openbmb/MiniCPM-o-4_5 让它成为 Alice,让我们可以和她视频电话,我们来讨论一下这个微调的技术方案。
68 分钟后,我拿到了:一份收敛过范围的技术方案、1000 条经过质检的训练数据、一份可直接执行的训练脚本、一份源码级的格式验证报告。全程我只回答了 6 轮问题,没有读过一行 MiniCPM 的文档。
这件事之所以成立,不是因为模型多聪明,而是因为 OpenBMB 把关键事实放在了 Agent 够得着的地方。这篇文章记录的是完整过程——Agent 走了哪些检索路径、做了哪些关键决策、踩了哪些坑、以及最终如何从一句话需求走到一通真正的视频电话。
flowchart LR
A["一句话需求 / 零知识起步"] --> B["检索四跳 / 30次搜索 + 源码核验"]
B --> C["方案锁定 / 68分钟交付"]
C --> D["数据生成 / 1000条 + 质检"]
D --> E["Smoke测试 / 2次失败 + 1次成功"]
E --> F["正式训练 / V1到V5迭代"]
F --> G["行为回归 / 指标与行为分开验收"]
G --> H["视频电话 / 端到端交付"]
图:Agent 驱动微调的全流程链路 — 从一句话需求到端到端交付,中间没有某个单独的「神奇提示词」,而是一个有门槛的证据循环。
二、检索链路:Agent 实际走了哪几跳
这是全文最有信息量的部分。以下是从会话日志里还原的真实动作序列:
02:48:36 我提出需求
02:48:49 第一次检索发出(13 秒后)
02:56:52 给出第一版经检索的结论 + 第二轮提问
03:15:31 方案锁定,进入执行
03:18:02 git clone ms-swift 源码做事实核验
03:23:04 开始批量生成 1000 条训练数据
03:56:43 交付
整个过程发出 30 次面向公开资料的检索动作,加 1 次源码 clone 和约 10 次定向源码读取。分成四跳:
第一跳:HuggingFace 模型卡
Agent 做的第一件事,是打开模型卡,搜索 "Training" 和 "Voice Cloning" 关键词。
模型卡直接回答了三个决定性问题:
- 模型原生支持全双工语音交互、打断、参考音频声音克隆——意味着「声音像 Alice」可能根本不需要训练。
- 模型不生成视频形象——意味着「视频电话」里的画面得另外解决,不在微调范围。
- 模型卡声明支持 LLaMA-Factory 和 SWIFT——给出了下一跳的方向。
第 1 条直接把我原本以为的「训练目标」砍掉了一半。这是模型卡里那段 Voice Cloning 示例的功劳:它不是一句「支持声音克隆」的形容词,而是一段能被 Agent 解析出「输入=参考音频,输出=克隆音色」这个事实结构的具体说明。
第二跳:官方仓库与技术报告
Agent 接着搜索了 OpenBMB 的 GitHub 仓库,找到了 MiniCPM-o-Demo,并打开了 arXiv 上的技术报告 HTML 版。
三个产出:
- MiniCPM-o-Demo 直接成了产品架构。 它已经具备移动端前端、HTTPS/WSS、全双工、主动观察、自定义 system prompt 和参考音频接口。Agent 的判断是「不另造实时通信协议」——这一条省掉的工作量,比整个微调还大。
- 技术报告给出了训练范式的先验。 报告里「大规模指令数据适配 + 小规模高质量数据精修」的两阶段结构,被直接映射成了我们的「合成数据建覆盖面 + 少量人工抽检收紧人格」。
- 报告也给出了一条否决性的事实:语音解码器和视觉系统与 LLM 隐状态紧密耦合。这直接决定了后面 LoRA 必须保守,且必须做回归测试。
这一跳也暴露了第一个缺口:截至 2026-07-24,OpenBMB 官方的 finetune 教程尚未完整覆盖 4.5。Agent 检索到的官方微调入口是围绕更早版本组织的,无法从中取到 4.5 的训练参数。于是它做了正确的事——不猜,转向第三跳。
第三跳:生态框架的公开文档
Agent 去 ms-swift、LLaMA-Factory、align-anything 等多个框架的文档和仓库里搜索 MiniCPM-o-4_5 的支持情况。
关键发现:模型卡说「支持 SWIFT」,但没有说是哪个版本、哪个 commit 之后。Agent 是靠翻到 PR #9147 才确认「4.5 的支持刚进主分支,且该 PR 明确关闭了 TTS template」。
这一条信息直接改写了方案:两段配音不进 LoRA。因为公开证据只支持「音频输入」,不支持「训练全双工语音输出」。同一次检索里,LLaMA-Factory 侧当时没有检到 4.5 的支持条目。
如果模型卡上写的是「SWIFT >= x.y.z 或 commit abc 之后支持,TTS 头暂不支持训练」,这一跳可以省掉,而且不会有误判风险。
第四跳:clone 源码,把文档当线索、把代码当事实
这是最关键的一跳。Agent 没有停在「readthedocs 说支持」,而是直接 clone 了 ms-swift 源码,定向读取了模型注册、模板定义、参数解析等核心文件。
一次 clone 取到的最有价值的一段:
ModelGroup(
[ Model('OpenBMB/MiniCPM-o-4_5', 'openbmb/MiniCPM-o-4_5') ],
template=TemplateType.minicpmo4_5,
requires=['timm', 'transformers==4.51.3', 'decord', 'soundfile', 'minicpmo-utils==1.0.6'],
),
注册项本身就是依赖清单。 版本锁、模板名、模态标签全在一处,且是机器可读的结构化字面量,不是散在 README 段落里的自然语言。Agent 拿到这一段就完成了环境规划——这是「文档可被调用」最教科书的例子,而它甚至不在 docs 目录里。
三、四个关键瞬间:检索如何直接改写方案
这一节回答「读文档到底有什么用」。以下每一条,都是某次具体检索之后方案发生的实际变化。
