智能体/生成式 AI

如何使用合成数据和强化学习训练 AI 智能体执行命令行任务

如果您的计算机智能体能够学习新的命令行界面(CLI),并且在无需编写文件或自由输入 shell 命令的情况下也能安全操作,该怎么办?

在关于构建计算机使用智能体的系列文章的第 1 部分中,我们利用 NVIDIA Nemotron 在一小时内构建了一个自定义的 Bash 计算机使用智能体。在本续集中,我们将更进一步,指导同一个 推理 模型在缺乏先验知识的情况下,安全地运行 LangGraph 平台 CLI。这表明大型推理模型能够轻松适应并执行新的代理式任务。
与简单的文件操作不同,我们的新智能体将学会启动本地服务器、构建容器以及生成 Dockerfile,整个过程完全通过可验证的 人机交互 命令界面完成。

我们将结合合成数据生成(SDG)与强化学习结合可验证奖励(RLVR),并通过组相对策略优化(GRPO),以提升效率与安全性。

构建内容:运行新 CLI 工具的专用智能体

您将微调 AI 智能体,它可以:

  • 提出有效的 LangGraph CLI 命令(例如,langgraph dev –port 823 –no-browser)
  • 在执行前要求明确的人工确认
  • 从合成种子数据中学习新的子命令
  • 利用 RLVR 在单个 GPU 上高效训练

以下是模型训练完成后典型的交互示例:

[🙂] 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 工具和环境。

为何通过合成数据生成与强化学习来训练新的命令行界面(CLI)?

教 AI 智能体操作专用 CLI 工具带来了传统方法难以应对的独特挑战:

数据稀缺问题: 多数专用 CLI 工具缺乏常规训练所需的大量使用日志。与常见的 shell 命令不同,像 LangGraph 这类工具具有特定的语法、标志和工作流,在常规训练数据中难以充分呈现。收集真实的使用示例可能需要耗费数月甚至数年时间。

安全 – 准确性权衡:您希望代理在理解用户意图时具备创造性,但在生成命令时必须绝对精确。一个拼写错误或错误的参数标志就可能导致系统故障,甚至引发更严重的后果。传统的微调方法往往导致模型表现过于保守(拒绝合理的请求)或过于宽松(响应危险指令),难以在安全性与灵活性之间取得平衡。

SDG+ RL 如何解决这一问题:

  • 通过合成数据生成,您只需基于少量种子命令即可构建高质量的训练示例,充分覆盖 CLI 的各项功能。
  • 结合可验证奖励的强化学习,通过奖励有效输出并惩罚错误,引导模型持续生成符合语法的正确指令。
  • 二者相辅相成:SDG 提供多样化的训练场景,而 RLVR 确保模型学会准确应对这些场景。

这种方法在企业环境中尤为有效,尤其适用于需要快速调整智能体以适应专有内部工具、而无需等待自然数据收集的情况。

预备知识

对于此设置,您需要:

硬件要求:

  • 具备至少 80 GB 显存的 NVIDIA GPU(例如 A100)
  • 不少于 32 GB 的系统内存
  • 100 GB 可用磁盘空间,用于存储模型权重和数据集

软件要求:

  • Python 3.10 及以上版本
  • CUDA 12.0 或更高版本以及相应的 NVIDIA 驱动

核心组件:

  • LangGraph – 智能体将学习操作的 CLI 工具
  • NeMo Gym – 构建支持工具调用与可验证奖励的强化学习训练环境
  • Unsloth – 基于 GRPO 实现高效强化学习,显著降低显存占用
  • NeMo Data Designer – 用于生成高质量的合成训练数据

基础模型:

  • Nemotron-Nano-9B-V2 – 可在 Hugging Face
  • 链接文档中包含安装与使用说明

观看本教程的视频版本:

视频 1:利用 SDG 与 RL 生成 LangGraph CLI BASH 智能体。

第 1 步:利用 NeMo Data Designer 设计合成数据集

在训练之前,我们需要准备数据:即与 LangGraph CLI 调用 相对应的 自然语言请求 对。

我们将使用 NVIDIA NeMo Data Designer 以编程方式生成该数据集,从少量种子示例出发,逐步扩展为数百个经过验证的命令对。

为何使用合成数据生成?

想象一下合成数据的生成过程,比如通过向某人展示一种模式来教授一门新语言,然后让他们创造出新的变体。与收集数千个真实样本(这些样本可能尚不存在)不同,我们:

  1. 提供若干高质量的“种子”示例
  2. 利用 AI 模型生成多样化的变体
  3. 依据严格规则逐一验证生成内容
  4. 在数小时内(而非数月)构建全面的数据集

数据集结构

用户请求 CLI 命令 确认
“在端口 8123 上启动本地开发服务器。” langgraph dev –port 8123 –no-browser “继续执行此命令?(是/否)”
“为 amd64 和 arm64 构建项目镜像。” langgraph build -t my-graph:multi –platform linux/amd64,linux/arm64 “立即运行 build?”

生成的每条记录包括:

  • 用户请求:人类实际可能输入的自然语言
  • CLI 命令:需执行的语法准确的命令
  • 确认提示:执行前的安全确认

验证过程

在 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"
)

第 2 步:使用 RLVR 进行微调 (使用 GRPO)

借助干净且经过验证的数据,我们开始使用 Unsloth 进行微调。Unsloth 是一种与 NeMo Gym 训练环境集成的开源框架,可用于高效强化学习。

利用可验证奖励(RLVR)进行强化学习

传统的基于人类反馈的强化学习(RLHF)如同由一组评委对每个输出进行评分,具有主观性强、成本高且结果不一致的问题。 RLVR 则采用基于代码的确定性验证,取代了人工评委。

我们不问人类“此命令是否正常?,”而是询问代码“此命令是否符合我们的验证规则?”

对于 CLI 智能体,验证器将执行以下规则:

  1. 语言图开头
  2. 仅允许批准的子命令和标志
  3. 禁止注释、标点符号或不安全 tokens

奖励系统

有效的命令 → +1 个奖励 (鼓励此行为)
无效的命令 → −1 个奖励 (不鼓励此行为)
输出 → 0 个奖励 (中立,无强化)

这种一致性至关重要:相同的输出始终会带来相同的回报,从而使训练过程稳定且可预测。由于验证器仅仅是代码,您可以随时调整约束条件,而无需重新训练独立的奖励模型。

使用 NeMo Gym 构建训练环境

NeMo Gym 是一个开源库,用于为大语言模型构建强化学习训练环境。它提供了定义工具、执行智能体动作以及计算可验证奖励的基础架构,恰好满足了我们训练 CLI 智能体的需求。

CLI 智能体环境被实现为 NeMo Gym 资源服务器,其封装如下:

  • 工具定义 – 智能体可提出的 CLI 命令
  • 验证逻辑 – 用于检查命令有效性和正确性的规则
  • 奖励计算 – 向强化学习训练循环返回的分数(0.0 到 1.0)

当智能体发出命令时,资源服务器将评估其正确性,并返回基于 GRPO 训练的奖励信号。这种环境逻辑与训练框架的明确分离,使您能够在不触碰 RL 代码的前提下,独立迭代 CLI 工具和验证规则。
如需了解创建自定义环境的更多详情,请参阅 NeMo Gym 文档资源服务器创建指南

通过组相对策略优化(GRPO)实现高效优化

与 PPO 相比,GRPO 是一种更为简洁且内存效率更高的替代方案。 GRPO 无需训练独立的“评论家”模型来评估每个动作的效果,而是通过对同一提示采样多个输出,并以它们的平均奖励作为基准。这种方法将所需模型数量减半(无需评论家),并通过将输出结果相互比较(而非与已学习的估计值比较)来降低方差。

它在实践中的工作原理如下:

当大多数尝试都失败时,传统的强化学习可能会面临困难。试想一下,模型为同一个提示生成 10 个命令变体:

  • 九项无效(奖励 = 0)
  • 一项有效(奖励 = 1)

标准优化可能在故障噪声中消失。改为 GRPO:

  1. 将对同一提示的所有响应分组在一起
  2. 计算每个组内的相对优势
  3. 显著巩固了这一成功,使其从失败中脱颖而出

这种方法可显著提高学习效率和收敛速度,帮助模型快速掌握命令中的有效要素。

我们来看看如何利用 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
)

第 3 步:人在环执行

微调完成后,我们会将模型嵌入运行时循环中,该循环在执行前始终要求人工确认。这延续了第 1 部分提出的安全架构,确保任何命令都需获得明确批准后方可执行。

安全架构

subprocess.run(argv, shell=False)

这条简单的代码体现了关键的安全原则。通过设置 shell=False,我们可以确保:

  • 命令以离散参数列表形式执行(例如[“langgraph”、“up”、“- wait”])
  • Shell 元字符,如 &、;或 |,将被视为普通文本,而非操作符
  • 因此,命令注入攻击变得不可能

完整的安全链

我们的分层方法可确保每个步骤的安全性:

  1. 训练时安全: RLVR 可确保模型学习生成有效的命令。
  2. 运行时验证: 验证器会依据允许列表逐项检查每个建议的命令。
  3. 人工确认: 用户须在执行每个命令前进行明确批准。
  4. 执行隔离: 命令执行时不依赖 shell 解释,有效防止注入攻击。

即使模型在训练过程中偶尔生成无效指令,运行时策略也会阻止这些指令的执行。

为什么 RLVR™ 合成数据适用于定制化代理式 AI

这种组合产生了强大的协同作用:

组件 作用 为何重要
NeMo Data Designer 通过内置验证生成逼真且多样化的结构化 AI 训练数据 解决冷启动问题——无需等待实际使用数据即可开展训练
NeMo Gym 借助 CLI 工具和可验证的奖励逻辑提供训练环境 定义哪些动作有效以及如何衡量成功
Unsloth for RLVR + GRPO 实现高效的 GRPO 训练 使 RL 训练在单个 GPU 上可用,同时保持质量
Human approval loop 作为最终安全门,保持用户控制 维护信任——用户始终在任何操作之前拥有最终决定权
表 1。训练流程中各个组件的作用及其对问题的重要性

结果:我们能够教会 Nemotron-Nano-9B-V2 精确且安全地操作新的 CLI 工具,而无需进行完全重新训练,也不会影响其安全性。

总结

通过将 Bash 运算符扩展为 LangGraph 感知型计算机使用代理,我们展示了合成数据生成RLVR(基于 GRPO)如何构成高效方案,快速使大型推理模型适配新的工具链。

该工作流可清晰地泛化到任何 CLI 工具:

  1. 使用 NeMo Data Designer 定义可验证的结构化示例
  2. 利用 CLI 工具结合验证逻辑构建 NeMo Gym 环境
  3. 采用 Unsloth 的 GRPO 实现高效微调
  4. 保持 人机交互 执行,确保安全性

通过这种模式,您可以将任何具备能力的大语言模型(LLM)转化为特定领域的、可验证的安全计算智能体,从当前的 LangGraph 延伸至未来的专有内部工具。

这具有重大意义:您无需等待数月来收集训练数据,也无需承担不可控的命令生成风险,即可在几天内部署专用且安全的 CLI 智能体。无论是自动化 DevOps 工作流程、创建客户支持工具,还是构建内部生产力智能体,该方法都能提供一条从创意到生产的高效、安全路径。

通过订阅 NVIDIA 新闻,并在LinkedInXDiscordYouTube上关注 NVIDIA AI,及时掌握 NVIDIA Nemotron的最新动态。

 

标签