【LLM】GLM-5: from Vibe Coding to Agentic Engineering
note
- GLM5:海量通用语料打底 → 长上下文和 Agent 数据强化 → 用监督学习塑形 → 用多阶段 RL 提升推理和执行能力 → 最后用蒸馏把各阶段能力重新“缝合”起来,避免遗忘
- thinking模式:
- 单轮内部:是不是支持 interleaved thinking。也就是一边想、一边调工具、拿到结果再想。
- 跨轮之间:是不是支持 preserved thinking,也就是上一轮那些 thinking,到了下一轮还在不在上下文里。
- hybrid reward system,将三类奖励信号结合起来使用:
- rule-based reward functions
- outcome reward models(ORMs)
- generative reward models(GRMs)
- agentic训练数据:合成任务 + 合成环境 + 合成反馈 + 合成轨迹
- On-Policy Distillation结合了【off policy,如sft】和【on policy,如grpo】两者的优点。它让学生模型先按照自己的当前策略生成轨迹,再由教师在这些学生真实会访问到的状态上(甚至可以提供答案级别的特权信息)提供逐 token 的监督信号。这样,OPD 一方面保留了 on-policy 训练更不易遗忘的特点,另一方面又利用蒸馏提供了高密度的知识传递。
文章目录
一、三阶段训练
现代大模型不再追求“一个阶段解决所有问题”,而是采用分阶段建模、分阶段强化的策略。以 GLM-5 为例,其训练链路清晰划分为两大阶段:
1. Base Model Training(底座能力构建)
- Pre-Training:使用 28.5 万亿 Tokens 的 Web、Code、Math & Science 语料,建立通用语言与知识表征,早期即侧重代码与推理能力。
- Mid-Training(关键增量):定向强化长上下文(扩展至 200K)与软件工程理解。引入 Repo-level Code、Issue、PR、Commit Diff 等数据,让模型理解真实的开发上下文,而非孤立代码片段。

2. Post-Training(能力对齐与执行)
- SFT阶段:引入 Interleaved / Preserved Thinking 机制。模型在工具调用前会“打草稿”(Thought),并在多轮对话中保留推理过程,为 Agent 任务建立行为先验。

GLM-5 在 SFT 阶段还支持三种不同的 thinking 特性:
• Interleaved Thinking(交错式思考):模型会在每次回复和 tool call 之前进行思考,从而提升指令遵循能力和生成质量。本质就是形成一个Thought-Action-Observation的思维链循环,相当于给后续react流程打个草稿。
• Preserved Thinking(保留式思考):在 coding agent 场景下,模型会自动保留多轮对话中的 thinking blocks,复用已有推理过程,而不是每一轮都重新推导。这种方式可以减少信息丢失和前后不一致,更适合长流程、复杂任务
• Turn-level Thinking(轮次级别思考):模型支持在同一 session 中按轮次控制是否启用 reasoning。对于简单请求可以关闭 thinking,以降低延迟和成本;对于复杂任务则可以开启 thinking,以提升准确性和稳定性
-
多阶段 RL(能力分层强化):
- Reasoning RL:在数学、代码等可验证任务上,使用结果正确性(0/1 Reward)强化推理链。
- Agentic RL:在 SWE、Terminal、Search 等可验证环境中,基于任务完成度(如测试通过率)进行 Group-wise 策略优化。
- General RL:混合 Rule-based、ORM、GRM 奖励,优化通用对话的正确性与人类偏好。
-
On-Policy Cross-Stage Distillation(防遗忘机制):将 SFT、RL 等各阶段的优质模型作为 Teacher,让最终模型在自己生成的轨迹上蒸馏学习,“缝合”回因多阶段训练而可能遗忘的能力。
Teacher 是谁,数据从哪来
前面各训练阶段的最终 checkpoint 都可以当 teacher,包括:
• earlier SFT stage
• Reasoning RL stage
• General RL stage
也就是:把之前各阶段最好的模型都当老师。
训练时的prompt不是随便来的,而是:
• 从对应 teacher 的训练集里采样
• 再按合适比例混合
相关训练超参数:
遵循 GLM-4.5 的设置,包括 Muon 优化器、余弦衰减和批量大小预热。学习率从 0 到 2e-4 的预热阶段,衰减阶段到 4e-5,直到预训练阶段结束。在预训练阶段,学习率从 4e-5 线性下降到 1e-5。其他超参数与 GLM-4.5 相同。对于 DSA 预热阶段,学习率从 5e-3 下降到 2e-4。对于 DSA 稀疏适应阶段,我们使用 1e-5 的恒定学习率。
二、Agentic 数据合成:从“生成文本”到“构建环境”
Agent 能力的关键不在于模型规模,而在于数据质量。Agentic 数据合成的核心是合成任务 + 合成环境 + 合成反馈,而非单纯合成文本。
1. SWE(软件工程)数据:还原真实开发流
- 来源:利用 GitHub 真实的 Issue-PR 对作为种子。
- 关键:构建可执行的容器化环境(含测试脚本)。模型需要像真人一样:读 Issue → 定位代码 → 修改 → 运行测试 → 修复。
- 价值:训练模型掌握“定位-修改-验证”的长链条能力,而非仅生成代码片段。
SWE数据举例如下,就是多轮交互function call过程&工具执行结果更偏真实环境结果:
{
"task_id": "swe_registration_empty_username_123",
"task_type": "swe_fix",
"source": {
"issue_id": "#123",
"pr_id": "#456",
"seed_type": "issue_pr_pair"
},
"instruction": "修复注册接口问题:当 username 参数为空字符串时,应返回 HTTP 400 错误和提示信息,而不是 HTTP 500。",
"context": {
"issue_text": "Registration API returns 500 when username is empty string ... expected HTTP 400 with message 'Username cannot be empty'.",
"repo_state": "pre_pr_456_snapshot",
"environment": {
"language": "python",
"runtime": "containerized",
"tools": [
"file_viewer",
"file_editor",
"shell",
"test_runner",
"diff_viewer"
]
}
},
"validation": {
"f2p_tests": [
"tests/test_registration.py::test_register_empty_username_returns_400"
],
"p2p_tests": [
"tests/test_registration.py::test_register_success",
"tests/test_auth.py::test_login_success"
],
"success_criteria": "All F2P and P2P tests pass"
},
"trajectory": [
{
"step": 1,
"role": "assistant",
"thought": "先定位注册接口和 username 的处理位置。"
},
{
"step": 2,
"role": "assistant",
"action": {
"tool": "shell",
"input": "grep -R \"def .*register\\|register.*username\\|username\" -n app/ api/ tests/"
}
},
{
"step": 3,
"role": "environment",
"observation": "api/register.py:12:def register_user(request):\napi/register.py:16:username = request.json.get('username')\nservices/user_service.py:8:def create_user(username, password):"
},
{
"step": 4,
"role": "assistant",
"thought": "查看注册入口实现,判断是否缺少输入校验。"
},
{
"step": 5,
"role": "assistant",
"action": {
"tool": "file_viewer",
"input": "api/register.py"
}
},
{
"step": 6,
"role": "environment",
"observation": "def register_user(request):\n username = request.json.get('username')\n password = request.json.get('password')\n user = create_user(username, password)\n return JsonResponse({'id': user.id}, status=201)"
},
{
"step": 7,
"role": "assistant",
"thought": "注册入口直接把 username 传给 create_user,空字符串会进入后续流程,符合 Issue 描述。应在入口层返回标准 400。"
},
{
"step": 8,
"role": "assistant",
"action": {
"tool": "file_viewer",
"input": "services/user_service.py"
}
},
{
"step": 9,
"role": "environment",
"observation": "def create_user(username, password):\n normalized = username.strip()\n ...\n"
},
{
"step": 10,
"role": "assistant",
"thought": "如果 username 是空字符串,strip 后可能触发异常或非法状态。最佳修复点仍是 API 入口。"
},
{
"step": 11,
"role": "assistant",
"action": {
"tool": "file_editor",
"input": {
"path": "api/register.py",
"patch": "def register_user(request):\n username = request.json.get('username')\n password = request.json.get('password')\n\n if username == \"\":\n return JsonResponse({'error': 'Username cannot be empty'}, status=400)\n\n user = create_user(username, password)\n return JsonResponse({'id': user.id}, status=201)\n"
}
}
},
{
"step": 12,
"role": "assistant",
"thought": "补充专门覆盖空用户名的测试,并执行目标测试与回归测试。"
},
{
"step": 13,
"role": "assistant",
"action": {
"tool": "file_editor",
"input": {
"path": "tests/test_registration.py",
"patch": "def test_register_empty_username_returns_400(client):\n resp = client.post('/register', json={'username': '', 'password': 'pass123'})\n assert resp.status_code == 400\n assert resp.json['error'] == 'Username cannot be empty'\n"
}
}
},
{
"step": 14,
"role": "assistant",
"action": {
"tool": "test_runner",
"input": "pytest tests/test_registration.py::test_register_empty_username_returns_400 -q"
}
},
{
"step": 15,
"role": "environment",
"observation": "1 passed"
},
{
"step": 16,
"role": "assistant",
"action": {
"tool": "test_runner",
"input": "pytest tests/test_registration.py::test_register_success tests/test_auth.py::test_login_success -q"
}
},
{
"step": 17,
"role": "environment",
"observation": "2 passed"
}
],
"result": {
"status": "success",
"modified_files": [
"api/register.py",
"tests/test_registration.py"
],
"final_summary": "在注册入口增加空用户名校验,返回 HTTP 400 和明确错误信息;新增测试并确认正常注册、登录未回归。"
},
"reward": {
"strategy": "test_based",
"score": 1.0,
"details": {
"f2p_passed": true,
"p2p_passed": true,
"all_checks_passed": true
}
}
}
2. Terminal 数据:命令行交互能力
- 构造:从技术网页或种子任务出发,自动生成 Docker 环境与验证脚本。
- 难点:通过 Refine Agent 自动检查任务是否存在漏洞(如能否通过删代码绕过测试),确保任务必须通过真实操作完成。
3. Search 数据:多跳检索与推理
- 流程:从早期 Agent 访问的真实网页构建知识图谱(WKG)→ 采样多跳关系链 → 生成“表面简单、背后复杂”的问题。
- 过滤:剔除模型仅靠记忆或单次搜索就能回答的问题,强制要求跨网页证据聚合。
三、奖励函数
1、hybrid reward system
rule-based rewards 的优点是明确、可解释,适合那些可以被规则准确描述的维度;但它的覆盖范围有限,很多复杂质量维度无法完全写成规则。
ORMs 是只看答案的奖励模型,特点是信号方差低、训练效率高,但更容易被 reward hacking 利用,也就是模型学会钻评分规则的空子,而不是真正提升能力。
GRMs 则通常由语言模型生成评分或结构化评价,相对更不容易被简单 exploit,不容易被钻漏洞,但问题是方差更高、稳定性更差。
2、reward hacking
reward hacking举例,比如在html生成(ppt)任务,都想生成1280×720的html效果
ex1:模型结果将超长内容隐藏起来
ex2:通过乱加间距/拉伸布局来骗分

四、核心挑战与应对策略
文章最后剖析了 Agent 训练中的三大难题:
- 训练-推理不一致:通过 On-Policy 蒸馏和更真实的环境交互来缓解。
- 异步 Off-Policy 问题:Kimi K2.5 采用多智能体并行执行,需精细设计调度与奖励机制。
- 奖励设计:避免 Reward Hacking,需混合规则奖励与模型奖励。
Reference
[1] GLM-5: from Vibe Coding to Agentic Engineering
[2] Agentic能力从哪里来?拆解基座大模型 GLM-5 /MiniMax M2/Kimi K2.5 的训练过程
更多推荐


所有评论(0)