如果您的计算机智能体能够学习新的命令行界面(CLI),并且在无需编写文件或自由输入 shell 命令的情况下也能安全操作,该怎么办?
在关于构建计算机使用智能体的系列文章的第 1 部分中,我们利用 NVIDIA Nemotron 在一小时内构建了一个自定义的 Bash 计算机使用智能体。在本续集中,我们将更进一步,指导同一个 推理 模型在缺乏先验知识的情况下,安全地运行 LangGraph 平台 CLI。这表明大型推理模型能够轻松适应并执行新的代理式任务。
与简单的文件操作不同,我们的新智能体将学会启动本地服务器、构建容器以及生成 Dockerfile,整个过程完全通过可验证的 人机交互 命令界面完成。
我们将结合合成数据生成(SDG)与强化学习结合可验证奖励(RLVR),并通过组相对策略优化(GRPO),以提升效率与安全性。
您将微调 AI 智能体,它可以:
以下是模型训练完成后典型的交互示例:
[🙂] Bring the LangGraph server online. [🤖] I can execute: [COMMAND] ["langgraph", "up", "--wait"] [CONFIRM] Run this command now? (yes/no) ▶️ Execute `langgraph up --wait`? [y/N]: y [🤖] Result: Server started successfully on port 8000.
此模式具备通用性:相同的工作流程可扩展以支持新的 CLI 工具和环境。
教 AI 智能体操作专用 CLI 工具带来了传统方法难以应对的独特挑战:
数据稀缺问题: 多数专用 CLI 工具缺乏常规训练所需的大量使用日志。与常见的 shell 命令不同,像 LangGraph 这类工具具有特定的语法、标志和工作流,在常规训练数据中难以充分呈现。收集真实的使用示例可能需要耗费数月甚至数年时间。
安全 – 准确性权衡:您希望代理在理解用户意图时具备创造性,但在生成命令时必须绝对精确。一个拼写错误或错误的参数标志就可能导致系统故障,甚至引发更严重的后果。传统的微调方法往往导致模型表现过于保守(拒绝合理的请求)或过于宽松(响应危险指令),难以在安全性与灵活性之间取得平衡。
SDG+ RL 如何解决这一问题:
这种方法在企业环境中尤为有效,尤其适用于需要快速调整智能体以适应专有内部工具、而无需等待自然数据收集的情况。
对于此设置,您需要:
硬件要求:
软件要求:
核心组件:
基础模型:
观看本教程的视频版本:
视频 1:利用 SDG 与 RL 生成 LangGraph CLI BASH 智能体。
在训练之前,我们需要准备数据:即与 LangGraph CLI 调用 相对应的 自然语言请求 对。
我们将使用 NVIDIA NeMo Data Designer 以编程方式生成该数据集,从少量种子示例出发,逐步扩展为数百个经过验证的命令对。
想象一下合成数据的生成过程,比如通过向某人展示一种模式来教授一门新语言,然后让他们创造出新的变体。与收集数千个真实样本(这些样本可能尚不存在)不同,我们:
| 用户请求 | CLI 命令 | 确认 |
|---|---|---|
| “在端口 8123 上启动本地开发服务器。” | langgraph dev –port 8123 –no-browser | “继续执行此命令?(是/否)” |
| “为 amd64 和 arm64 构建项目镜像。” | langgraph build -t my-graph:multi –platform linux/amd64,linux/arm64 | “立即运行 build?” |
生成的每条记录包括:
在 Data Designer 中,我们通过采样参数引导多样性,并拒绝任何无法验证的记录。例如,可采用如下正则表达式模式:
^langgraph\s+(dev|build|up|dockerfile)\b
这可确保:
最后,我们以 OpenAI 风格的消息格式导出数据集,这种格式特别适合使用开源 NVIDIA NeMo 框架进行 RLVR 微调。
此验证过程至关重要:它能够确保奖励验证器(稍后引入)与训练数据的结构和语法保持一致。
我们来了解一下 NeMo Data Designer 中的实现方式。
# Define seed distributions
command = Sampler(["new", "dev", "up", "build", "dockerfile"])
port = Sampler(range(3000, 9000))
template = Sampler(["react-agent", "memory-agent", "retrieval-agent"])
# Generate natural language input
user_request = LLM(
prompt=f"Write a request to {command} with {template} on port {port}",
model="nemotron-3-nano-30b-a3b"
)
# Generate structured output
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 智能体,验证器将执行以下规则:
奖励系统:
有效的命令 → +1 个奖励 (鼓励此行为)
无效的命令 → −1 个奖励 (不鼓励此行为)
输出 → 0 个奖励 (中立,无强化)
这种一致性至关重要:相同的输出始终会带来相同的回报,从而使训练过程稳定且可预测。由于验证器仅仅是代码,您可以随时调整约束条件,而无需重新训练独立的奖励模型。
NeMo Gym 是一个开源库,用于为大语言模型构建强化学习训练环境。它提供了定义工具、执行智能体动作以及计算可验证奖励的基础架构,恰好满足了我们训练 CLI 智能体的需求。
CLI 智能体环境被实现为 NeMo Gym 资源服务器,其封装如下:
当智能体发出命令时,资源服务器将评估其正确性,并返回基于 GRPO 训练的奖励信号。这种环境逻辑与训练框架的明确分离,使您能够在不触碰 RL 代码的前提下,独立迭代 CLI 工具和验证规则。
如需了解创建自定义环境的更多详情,请参阅 NeMo Gym 文档及资源服务器创建指南。
与 PPO 相比,GRPO 是一种更为简洁且内存效率更高的替代方案。 GRPO 无需训练独立的“评论家”模型来评估每个动作的效果,而是通过对同一提示采样多个输出,并以它们的平均奖励作为基准。这种方法将所需模型数量减半(无需评论家),并通过将输出结果相互比较(而非与已学习的估计值比较)来降低方差。
它在实践中的工作原理如下:
当大多数尝试都失败时,传统的强化学习可能会面临困难。试想一下,模型为同一个提示生成 10 个命令变体:
标准优化可能在故障噪声中消失。改为 GRPO:
这种方法可显著提高学习效率和收敛速度,帮助模型快速掌握命令中的有效要素。
我们来看看如何利用 Unsloth 和 NeMo Gym 来实现这一目标:
# The "Verifiable Reward" Function
def compute_reward(agent_output, expected):
try:
cmd = json.loads(agent_output)
# Hard Rule: Command must match expectation
if cmd.name != expected.name:
return -1.0 # Penalize hallucinations
# Soft Rule: Flags must be accurate
accuracy = calculate_flag_accuracy(cmd.flags, expected.flags)
return accuracy
except JSONDecodeError:
return -1.0 # Penalize broken syntax
# Start GRPO Training
grpo.train(
model="nemotron-nano-9B-v2",
algorithm="GRPO",
env=compute_reward,
dataset=synthetic_data
)
微调完成后,我们会将模型嵌入运行时循环中,该循环在执行前始终要求人工确认。这延续了第 1 部分提出的安全架构,确保任何命令都需获得明确批准后方可执行。
subprocess.run(argv, shell=False)
这条简单的代码体现了关键的安全原则。通过设置 shell=False,我们可以确保:
我们的分层方法可确保每个步骤的安全性:
即使模型在训练过程中偶尔生成无效指令,运行时策略也会阻止这些指令的执行。
这种组合产生了强大的协同作用:
| 组件 | 作用 | 为何重要 |
|---|---|---|
| NeMo Data Designer | 通过内置验证生成逼真且多样化的结构化 AI 训练数据 | 解决冷启动问题——无需等待实际使用数据即可开展训练 |
| NeMo Gym | 借助 CLI 工具和可验证的奖励逻辑提供训练环境 | 定义哪些动作有效以及如何衡量成功 |
| Unsloth for RLVR + GRPO | 实现高效的 GRPO 训练 | 使 RL 训练在单个 GPU 上可用,同时保持质量 |
| Human approval loop | 作为最终安全门,保持用户控制 | 维护信任——用户始终在任何操作之前拥有最终决定权 |
结果:我们能够教会 Nemotron-Nano-9B-V2 精确且安全地操作新的 CLI 工具,而无需进行完全重新训练,也不会影响其安全性。
通过将 Bash 运算符扩展为 LangGraph 感知型计算机使用代理,我们展示了合成数据生成与RLVR(基于 GRPO)如何构成高效方案,快速使大型推理模型适配新的工具链。
该工作流可清晰地泛化到任何 CLI 工具:
通过这种模式,您可以将任何具备能力的大语言模型(LLM)转化为特定领域的、可验证的安全计算智能体,从当前的 LangGraph 延伸至未来的专有内部工具。
这具有重大意义:您无需等待数月来收集训练数据,也无需承担不可控的命令生成风险,即可在几天内部署专用且安全的 CLI 智能体。无论是自动化 DevOps 工作流程、创建客户支持工具,还是构建内部生产力智能体,该方法都能提供一条从创意到生产的高效、安全路径。
通过订阅 NVIDIA 新闻,并在LinkedIn、X、Discord和YouTube上关注 NVIDIA AI,及时掌握 NVIDIA Nemotron的最新动态。
如果您的计算机智能体能够学习新的命令行界面(CLI),并且在无需编写文件或自由输入 shell 命令的情况下也能安全操作,该怎么办?
在关于构建计算机使用智能体的系列文章的第 1 部分中,我们利用 NVIDIA Nemotron 在一小时内构建了一个自定义的 Bash 计算机使用智能体。在本续集中,我们将更进一步,指导同一个 推理 模型在缺乏先验知识的情况下,安全地运行 LangGraph 平台 CLI。这表明大型推理模型能够轻松适应并执行新的代理式任务。
与简单的文件操作不同,我们的新智能体将学会启动本地服务器、构建容器以及生成 Dockerfile,整个过程完全通过可验证的 人机交互 命令界面完成。
我们将结合合成数据生成(SDG)与强化学习结合可验证奖励(RLVR),并通过组相对策略优化(GRPO),以提升效率与安全性。
您将微调 AI 智能体,它可以:
以下是模型训练完成后典型的交互示例:
[🙂] Bring the LangGraph server online. [🤖] I can execute: [COMMAND] ["langgraph", "up", "--wait"] [CONFIRM] Run this command now? (yes/no) ▶️ Execute `langgraph up --wait`? [y/N]: y [🤖] Result: Server started successfully on port 8000.
此模式具备通用性:相同的工作流程可扩展以支持新的 CLI 工具和环境。
教 AI 智能体操作专用 CLI 工具带来了传统方法难以应对的独特挑战:
数据稀缺问题: 多数专用 CLI 工具缺乏常规训练所需的大量使用日志。与常见的 shell 命令不同,像 LangGraph 这类工具具有特定的语法、标志和工作流,在常规训练数据中难以充分呈现。收集真实的使用示例可能需要耗费数月甚至数年时间。
安全 – 准确性权衡:您希望代理在理解用户意图时具备创造性,但在生成命令时必须绝对精确。一个拼写错误或错误的参数标志就可能导致系统故障,甚至引发更严重的后果。传统的微调方法往往导致模型表现过于保守(拒绝合理的请求)或过于宽松(响应危险指令),难以在安全性与灵活性之间取得平衡。
SDG+ RL 如何解决这一问题:
这种方法在企业环境中尤为有效,尤其适用于需要快速调整智能体以适应专有内部工具、而无需等待自然数据收集的情况。
对于此设置,您需要:
硬件要求:
软件要求:
核心组件:
基础模型:
观看本教程的视频版本:
视频 1:利用 SDG 与 RL 生成 LangGraph CLI BASH 智能体。
在训练之前,我们需要准备数据:即与 LangGraph CLI 调用 相对应的 自然语言请求 对。
我们将使用 NVIDIA NeMo Data Designer 以编程方式生成该数据集,从少量种子示例出发,逐步扩展为数百个经过验证的命令对。
想象一下合成数据的生成过程,比如通过向某人展示一种模式来教授一门新语言,然后让他们创造出新的变体。与收集数千个真实样本(这些样本可能尚不存在)不同,我们:
| 用户请求 | CLI 命令 | 确认 |
|---|---|---|
| “在端口 8123 上启动本地开发服务器。” | langgraph dev –port 8123 –no-browser | “继续执行此命令?(是/否)” |
| “为 amd64 和 arm64 构建项目镜像。” | langgraph build -t my-graph:multi –platform linux/amd64,linux/arm64 | “立即运行 build?” |
生成的每条记录包括:
在 Data Designer 中,我们通过采样参数引导多样性,并拒绝任何无法验证的记录。例如,可采用如下正则表达式模式:
^langgraph\s+(dev|build|up|dockerfile)\b
这可确保:
最后,我们以 OpenAI 风格的消息格式导出数据集,这种格式特别适合使用开源 NVIDIA NeMo 框架进行 RLVR 微调。
此验证过程至关重要:它能够确保奖励验证器(稍后引入)与训练数据的结构和语法保持一致。
我们来了解一下 NeMo Data Designer 中的实现方式。
# Define seed distributions
command = Sampler(["new", "dev", "up", "build", "dockerfile"])
port = Sampler(range(3000, 9000))
template = Sampler(["react-agent", "memory-agent", "retrieval-agent"])
# Generate natural language input
user_request = LLM(
prompt=f"Write a request to {command} with {template} on port {port}",
model="nemotron-3-nano-30b-a3b"
)
# Generate structured output
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 智能体,验证器将执行以下规则:
奖励系统:
有效的命令 → +1 个奖励 (鼓励此行为)
无效的命令 → −1 个奖励 (不鼓励此行为)
输出 → 0 个奖励 (中立,无强化)
这种一致性至关重要:相同的输出始终会带来相同的回报,从而使训练过程稳定且可预测。由于验证器仅仅是代码,您可以随时调整约束条件,而无需重新训练独立的奖励模型。
NeMo Gym 是一个开源库,用于为大语言模型构建强化学习训练环境。它提供了定义工具、执行智能体动作以及计算可验证奖励的基础架构,恰好满足了我们训练 CLI 智能体的需求。
CLI 智能体环境被实现为 NeMo Gym 资源服务器,其封装如下:
当智能体发出命令时,资源服务器将评估其正确性,并返回基于 GRPO 训练的奖励信号。这种环境逻辑与训练框架的明确分离,使您能够在不触碰 RL 代码的前提下,独立迭代 CLI 工具和验证规则。
如需了解创建自定义环境的更多详情,请参阅 NeMo Gym 文档及资源服务器创建指南。
与 PPO 相比,GRPO 是一种更为简洁且内存效率更高的替代方案。 GRPO 无需训练独立的“评论家”模型来评估每个动作的效果,而是通过对同一提示采样多个输出,并以它们的平均奖励作为基准。这种方法将所需模型数量减半(无需评论家),并通过将输出结果相互比较(而非与已学习的估计值比较)来降低方差。
它在实践中的工作原理如下:
当大多数尝试都失败时,传统的强化学习可能会面临困难。试想一下,模型为同一个提示生成 10 个命令变体:
标准优化可能在故障噪声中消失。改为 GRPO:
这种方法可显著提高学习效率和收敛速度,帮助模型快速掌握命令中的有效要素。
我们来看看如何利用 Unsloth 和 NeMo Gym 来实现这一目标:
# The "Verifiable Reward" Function
def compute_reward(agent_output, expected):
try:
cmd = json.loads(agent_output)
# Hard Rule: Command must match expectation
if cmd.name != expected.name:
return -1.0 # Penalize hallucinations
# Soft Rule: Flags must be accurate
accuracy = calculate_flag_accuracy(cmd.flags, expected.flags)
return accuracy
except JSONDecodeError:
return -1.0 # Penalize broken syntax
# Start GRPO Training
grpo.train(
model="nemotron-nano-9B-v2",
algorithm="GRPO",
env=compute_reward,
dataset=synthetic_data
)
微调完成后,我们会将模型嵌入运行时循环中,该循环在执行前始终要求人工确认。这延续了第 1 部分提出的安全架构,确保任何命令都需获得明确批准后方可执行。
subprocess.run(argv, shell=False)
这条简单的代码体现了关键的安全原则。通过设置 shell=False,我们可以确保:
我们的分层方法可确保每个步骤的安全性:
即使模型在训练过程中偶尔生成无效指令,运行时策略也会阻止这些指令的执行。
这种组合产生了强大的协同作用:
| 组件 | 作用 | 为何重要 |
|---|---|---|
| NeMo Data Designer | 通过内置验证生成逼真且多样化的结构化 AI 训练数据 | 解决冷启动问题——无需等待实际使用数据即可开展训练 |
| NeMo Gym | 借助 CLI 工具和可验证的奖励逻辑提供训练环境 | 定义哪些动作有效以及如何衡量成功 |
| Unsloth for RLVR + GRPO | 实现高效的 GRPO 训练 | 使 RL 训练在单个 GPU 上可用,同时保持质量 |
| Human approval loop | 作为最终安全门,保持用户控制 | 维护信任——用户始终在任何操作之前拥有最终决定权 |
结果:我们能够教会 Nemotron-Nano-9B-V2 精确且安全地操作新的 CLI 工具,而无需进行完全重新训练,也不会影响其安全性。
通过将 Bash 运算符扩展为 LangGraph 感知型计算机使用代理,我们展示了合成数据生成与RLVR(基于 GRPO)如何构成高效方案,快速使大型推理模型适配新的工具链。
该工作流可清晰地泛化到任何 CLI 工具:
通过这种模式,您可以将任何具备能力的大语言模型(LLM)转化为特定领域的、可验证的安全计算智能体,从当前的 LangGraph 延伸至未来的专有内部工具。
这具有重大意义:您无需等待数月来收集训练数据,也无需承担不可控的命令生成风险,即可在几天内部署专用且安全的 CLI 智能体。无论是自动化 DevOps 工作流程、创建客户支持工具,还是构建内部生产力智能体,该方法都能提供一条从创意到生产的高效、安全路径。
通过订阅 NVIDIA 新闻,并在LinkedIn、X、Discord和YouTube上关注 NVIDIA AI,及时掌握 NVIDIA Nemotron的最新动态。