如果你的计算机使用代理能够学习一个新的命令行界面(CLI)——并且在不写入文件或自由输入shell命令的情况下安全地操作它,会怎么样?
在本系列关于构建计算机使用代理的第一部分中,我们在短短一小时内使用NVIDIA Nemotron构建了一个自定义的Bash计算机使用代理。在本续篇中,我们将更进一步,教会同一个没有先验知识的推理模型安全地操作LangGraph平台CLI。这展示了一个大型推理模型可以多么容易地被专门化,以执行新的代理任务。
我们的新代理将不仅仅是简单的文件操作,而是学习启动本地服务器、构建容器以及生成Dockerfile——完全通过一个可验证的、包含人工干预的命令接口来实现。
我们将结合合成数据生成(SDG)和基于可验证奖励的强化学习(RLVR),并通过群组相对策略优化(GRPO)进行优化,使训练既高效又安全。
你将构建的内容: 一个用于运行新CLI工具的专用代理。
你将微调一个AI代理,使其能够:
langgraph dev --port 8123 --no-browser)以下是模型训练后典型交互的样子:
[🙂] 启动LangGraph服务器。 [🤖] 我可以执行:[COMMAND]["langgraph", "up", "--wait"][CONFIRM]现在运行此命令? (yes/no) ▶️ 执行 langgraph up --wait? [y/N]: y [🤖] 结果:服务器已成功在端口8000上启动。
此模式具有通用性:相同的工作流可以扩展以支持新的CLI工具和环境。
教授AI代理操作专用CLI工具面临着传统方法难以应对的独特挑战:
SDG + RL如何解决这个问题:
它们共同创造了一个良性循环:SDG提供多样的训练场景,而RLVR确保模型学会正确处理这些场景。
这种方法在需要快速使代理适应专有内部工具而无需等待自然数据收集的企业环境中尤其强大。
此设置需要:
硬件要求:
软件要求:
核心组件:
基础模型:
安装和使用说明在链接的文档中提供。
在训练之前,我们需要数据:将自然语言请求映射到LangGraph CLI调用的配对。
我们将使用NVIDIA NeMo Data Designer以编程方式生成此数据集,从少量种子示例开始,扩展到数百个已验证的命令配对。
可以把合成数据生成想象成通过展示一个模式,然后让对方创造变体来教某人一门新语言。我们没有收集成千上万个真实示例(这些示例可能还不存在),而是:
用户请求 | CLI命令 | 确认 |
|---|---|---|
“在端口8123上启动本地开发服务器。” |
| “继续执行此命令?(yes/no)” |
“为amd64和arm64构建项目镜像。” |
| “现在运行构建?” |
每条生成的记录包括:
在Data Designer中,我们使用采样参数引导多样性,并拒绝任何未通过验证的记录。例如,我们可能使用如下的正则表达式模式:
^langgraph\s+(dev|build|up|dockerfile)\b
这确保:
langgraph 开头最后,我们以OpenAI风格的消息格式导出数据集——这对于使用开源NVIDIA NeMo框架进行RLVR微调非常理想。
此验证过程至关重要:它保证了奖励验证器(稍后介绍)将与训练数据的结构和语法保持一致。
让我们看一下NeMo Data Designer中的实现:
# 定义种子分布
command = Sampler(["new", "dev", "up", "build", "dockerfile"])
port = Sampler(range(3000, 9000))
template = Sampler(["react-agent", "memory-agent", "retrieval-agent"])
# 生成自然语言输入
user_request = LLM(
prompt=f"Write a request to {command} with {template} on port {port}",
model="nemotron-3-nano-30b-a3b")
# 生成结构化输出
tool_call = LLM(
prompt=f"Convert '{user_request}' to CLI JSON.",
schema=CLIToolCall,
model="nemotron-3-nano-30b-a3b")有了干净、经过验证的数据,我们转向使用Unsloth进行微调,Unsloth是一个开源框架,用于高效的强化学习,集成了NeMo Gym训练环境。
传统的基于人类反馈的强化学习(RLHF)就像是让一个评审团给每个输出打分——主观、昂贵且不一致。RLVR用基于代码的确定性验证取代了人类评审。
与其问人类“这个命令看起来好吗?”,不如问代码“这个命令通过我们的验证规则吗?”
对于一个CLI代理,验证器强制执行如下规则:
langgraph 开头奖励系统:
这种一致性至关重要:相同的输出总是产生相同的奖励,使训练稳定且可预测。而且由于验证器只是代码,你可以随时调整约束,而无需重新训练单独的奖励模型。
NeMo Gym是一个开源库,用于构建大型语言模型的强化学习训练环境。它提供了定义工具、执行代理动作和计算可验证奖励的基础设施——这正是我们训练CLI代理所需要的。
CLI代理环境被实现为NeMo Gym资源服务器,它封装了:
当代理提出命令时,资源服务器评估正确性并返回奖励信号给GRPO训练。环境逻辑和训练框架之间的这种清晰分离意味着你可以在不接触RL代码的情况下迭代你的CLI工具和验证规则。
GRPO是一种比PPO更简单、内存效率更高的替代方案。GRPO不为估计每个动作的好坏而训练一个单独的“评论家”模型,而是为同一个提示采样多个输出,并使用它们的平均奖励作为基线。这将模型数量减半(不需要评论家),并通过将输出相互比较而不是与学习到的估计值比较来减少方差。
以下是它在实践中的工作原理:
传统的RL可能在大多数尝试失败时遇到困难。想象一下模型为同一个提示生成了10个命令变体:
标准优化可能会迷失在失败的噪音中。GRPO取而代之的是:
这种方法显著提高了学习效率和收敛速度,帮助模型快速学习命令有效的关键因素。
让我们看看如何使用Unsloth和NeMo Gym实现这一点:
# “可验证奖励”函数
def compute_reward(agent_output, expected):
try:
cmd = json.loads(agent_output)
# 硬规则:命令必须匹配预期
if cmd.name != expected.name:
return -1.0 # 惩罚幻觉
# 软规则:标志必须准确
accuracy = calculate_flag_accuracy(cmd.flags, expected.flags)
return accuracy
except JSONDecodeError:
return -1.0 # 惩罚损坏的语法
# 开始GRPO训练
grpo.train(
model="nemotron-nano-9B-v2",
algorithm="GRPO",
env=compute_reward,
dataset=synthetic_data)微调后,我们将模型嵌入到一个运行时循环中,该循环在执行前始终请求人工确认。这保持了第一部分中引入的安全架构,确保没有命令在未经明确批准的情况下运行。
subprocess.run(argv, shell=False)
这一行代码体现了一个关键的安全原则。通过设置 shell=False,我们确保:
["langgraph", "up", "--wait"])&&、; 或 | 这样的shell元字符被视为文字文本,而不是操作符我们的多层方法确保每一步的安全:
即使模型在训练后偶尔产生无效命令,运行时策略也会阻止其执行。
这种组合产生了强大的协同效应:
组件 | 作用 | 重要性 |
|---|---|---|
NeMo Data Designer | 生成逼真、多样、结构化的AI训练数据,并内置验证 | 解决冷启动问题——无需等待真实使用数据即可训练 |
NeMo Gym | 提供带有CLI工具和可验证奖励逻辑的训练环境 | 定义哪些操作有效以及如何衡量成功 |
用于RLVR + GRPO的Unsloth | 执行高效的GRPO训练,VRAM减少80% | 在保持质量的同时,使RL训练在单个GPU上可行 |
人工批准循环 | 作为最终的安全门,保持用户控制 | 维护信任——在任何操作发生前,用户始终拥有最终发言权 |
结果: 我们可以教会Nemotron-Nano-9B-V2精确且安全地操作一个新的CLI工具——所有这些都无需完全重新训练或牺牲安全性。
通过将我们的Bash操作器扩展为一个具有LangGraph感知能力的计算机使用代理,我们展示了合成数据生成和RLVR(结合GRPO)如何构成一个强大的配方,用于快速将大型推理模型专门化到新的工具链上。
该工作流可以清晰地推广到任何CLI工具:
这种模式使你能够将任何有能力的LLM转变为一个特定领域、可验证安全的计算机使用代理——今天可以是LangGraph,明天可以是你的专有内部工具。
其意义是重大的:你不再需要等待数月来收集训练数据或接受不受控制的命令生成的风险,而是可以在几天内部署专门的、安全的CLI代理。无论你是自动化DevOps工作流、创建客户支持工具,还是构建内部生产力代理,这种方法都提供了一条从构想到生产的快速、安全路径。FINISHED
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。