首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用合成数据与强化学习训练命令行AI代理

用合成数据与强化学习训练命令行AI代理

原创
作者头像
用户11764306
发布2026-05-10 19:23:04
发布2026-05-10 19:23:04
1450
举报

如果你的计算机使用代理能够学习一个新的命令行界面(CLI)——并且在不写入文件或自由输入shell命令的情况下安全地操作它,会怎么样?

在本系列关于构建计算机使用代理的第一部分中,我们在短短一小时内使用NVIDIA Nemotron构建了一个自定义的Bash计算机使用代理。在本续篇中,我们将更进一步,教会同一个没有先验知识的推理模型安全地操作LangGraph平台CLI。这展示了一个大型推理模型可以多么容易地被专门化,以执行新的代理任务。

我们的新代理将不仅仅是简单的文件操作,而是学习启动本地服务器、构建容器以及生成Dockerfile——完全通过一个可验证的、包含人工干预的命令接口来实现。

我们将结合合成数据生成(SDG)和基于可验证奖励的强化学习(RLVR),并通过群组相对策略优化(GRPO)进行优化,使训练既高效又安全。

你将构建的内容: 一个用于运行新CLI工具的专用代理。

你将微调一个AI代理,使其能够:

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

以下是模型训练后典型交互的样子:

[🙂] 启动LangGraph服务器。 [🤖] 我可以执行:[COMMAND]["langgraph", "up", "--wait"][CONFIRM]现在运行此命令? (yes/no) ▶️ 执行 langgraph up --wait? [y/N]: y [🤖] 结果:服务器已成功在端口8000上启动。

此模式具有通用性:相同的工作流可以扩展以支持新的CLI工具和环境。

为什么使用合成数据生成和强化学习来教授新的CLI?

教授AI代理操作专用CLI工具面临着传统方法难以应对的独特挑战:

  • 数据稀缺问题: 大多数专用CLI工具缺乏传统训练所需的大规模使用日志。与常见的shell命令不同,像LangGraph这样的工具具有特定的语法、标志和工作流,这些在通用训练数据中没有得到很好的体现。等待收集真实世界的使用示例可能需要数月或数年。
  • 安全性与准确性的权衡: 希望代理在理解用户意图时具有创造性,但在生成命令时必须绝对精确。一个拼写错误或错误的标志都可能导致系统错误,甚至更糟。传统的微调往往会产生过于保守(拒绝有效请求)或过于宽松(幻想出危险命令)的模型。

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

  • 合成数据生成 使你可以仅仅从少量种子命令中引导出高质量的训练示例,确保完全覆盖CLI的功能。
  • 基于可验证奖励的强化学习 通过奖励有效输出和惩罚错误,教会模型持续生成语法正确的命令。

它们共同创造了一个良性循环:SDG提供多样的训练场景,而RLVR确保模型学会正确处理这些场景。

这种方法在需要快速使代理适应专有内部工具而无需等待自然数据收集的企业环境中尤其强大。

先决条件

此设置需要:

硬件要求:

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

软件要求:

  • Python 3.10或更新版本
  • CUDA 12.0+及相应的NVIDIA驱动程序

核心组件:

  • LangGraph – 代理将学习操作的目标CLI工具
  • NeMo Gym – 用于构建包含工具和可验证奖励的RL训练环境
  • Unsloth – 用于基于GRPO的高效强化学习,降低VRAM需求
  • NeMo Data Designer – 用于生成合成训练数据

基础模型:

  • Nemotron-Nano-9B-V2 – 可在Hugging Face上获取

安装和使用说明在链接的文档中提供。

步骤1:使用NeMo Data Designer设计合成数据集

在训练之前,我们需要数据:将自然语言请求映射到LangGraph CLI调用的配对。

我们将使用NVIDIA NeMo Data Designer以编程方式生成此数据集,从少量种子示例开始,扩展到数百个已验证的命令配对。

为什么使用合成数据生成?

可以把合成数据生成想象成通过展示一个模式,然后让对方创造变体来教某人一门新语言。我们没有收集成千上万个真实示例(这些示例可能还不存在),而是:

  • 提供几个高质量的“种子”示例
  • 使用AI模型生成多样的变体
  • 根据严格规则验证每个生成的示例
  • 在几小时内而不是几个月内构建一个全面的数据集
数据集结构

用户请求

CLI命令

确认

“在端口8123上启动本地开发服务器。”

langgraph dev --port 8123 --no-browser

“继续执行此命令?(yes/no)”

“为amd64和arm64构建项目镜像。”

langgraph build -t my-graph:multi --platform linux/amd64,linux/arm64

“现在运行构建?”

每条生成的记录包括:

  • 用户请求: 人类可能实际输入的自然语言
  • CLI命令: 要执行的确切、语法正确的命令
  • 确认提示: 执行前的安全检查
验证过程

在Data Designer中,我们使用采样参数引导多样性,并拒绝任何未通过验证的记录。例如,我们可能使用如下的正则表达式模式:

^langgraph\s+(dev|build|up|dockerfile)\b

这确保:

  • 每个命令都以 langgraph 开头
  • 仅使用批准的子命令
  • 语法始终有效

最后,我们以OpenAI风格的消息格式导出数据集——这对于使用开源NVIDIA NeMo框架进行RLVR微调非常理想。

此验证过程至关重要:它保证了奖励验证器(稍后介绍)将与训练数据的结构和语法保持一致。

让我们看一下NeMo Data Designer中的实现:

代码语言:python
复制
# 定义种子分布
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")

步骤2:使用RLVR进行微调(通过GRPO)

有了干净、经过验证的数据,我们转向使用Unsloth进行微调,Unsloth是一个开源框架,用于高效的强化学习,集成了NeMo Gym训练环境。

基于可验证奖励的强化学习(RLVR)

传统的基于人类反馈的强化学习(RLHF)就像是让一个评审团给每个输出打分——主观、昂贵且不一致。RLVR用基于代码的确定性验证取代了人类评审。

与其问人类“这个命令看起来好吗?”,不如问代码“这个命令通过我们的验证规则吗?”

对于一个CLI代理,验证器强制执行如下规则:

  • 输出必须以 langgraph 开头
  • 只允许经过批准的子命令和标志
  • 不允许注释、标点符号或不安全的令牌

奖励系统:

  • ✅ 有效命令 → +1 奖励(鼓励此行为)
  • ❌ 无效命令 → −1 奖励(不鼓励此行为)
  • ⚪ 模糊输出 → 0 奖励(中性,无强化)

这种一致性至关重要:相同的输出总是产生相同的奖励,使训练稳定且可预测。而且由于验证器只是代码,你可以随时调整约束,而无需重新训练单独的奖励模型。

使用NeMo Gym构建训练环境

NeMo Gym是一个开源库,用于构建大型语言模型的强化学习训练环境。它提供了定义工具、执行代理动作和计算可验证奖励的基础设施——这正是我们训练CLI代理所需要的。

CLI代理环境被实现为NeMo Gym资源服务器,它封装了:

  • 工具定义 – 代理可以提出的CLI命令
  • 验证逻辑 – 检查命令有效性和正确性的规则
  • 奖励计算 – 返回到RL训练循环的分数(0.0到1.0)

当代理提出命令时,资源服务器评估正确性并返回奖励信号给GRPO训练。环境逻辑和训练框架之间的这种清晰分离意味着你可以在不接触RL代码的情况下迭代你的CLI工具和验证规则。

通过群组相对策略优化(GRPO)进行优化

GRPO是一种比PPO更简单、内存效率更高的替代方案。GRPO不为估计每个动作的好坏而训练一个单独的“评论家”模型,而是为同一个提示采样多个输出,并使用它们的平均奖励作为基线。这将模型数量减半(不需要评论家),并通过将输出相互比较而不是与学习到的估计值比较来减少方差。

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

传统的RL可能在大多数尝试失败时遇到困难。想象一下模型为同一个提示生成了10个命令变体:

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

标准优化可能会迷失在失败的噪音中。GRPO取而代之的是:

  • 将同一提示的所有响应分组
  • 计算每个组内的相对优势
  • 强烈强化那一次成功,使其从失败中脱颖而出

这种方法显著提高了学习效率和收敛速度,帮助模型快速学习命令有效的关键因素。

让我们看看如何使用Unsloth和NeMo Gym实现这一点:

代码语言:python
复制
# “可验证奖励”函数
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)

步骤3:人工干预执行

微调后,我们将模型嵌入到一个运行时循环中,该循环在执行前始终请求人工确认。这保持了第一部分中引入的安全架构,确保没有命令在未经明确批准的情况下运行。

安全架构

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工具和可验证奖励逻辑的训练环境

定义哪些操作有效以及如何衡量成功

用于RLVR + GRPO的Unsloth

执行高效的GRPO训练,VRAM减少80%

在保持质量的同时,使RL训练在单个GPU上可行

人工批准循环

作为最终的安全门,保持用户控制

维护信任——在任何操作发生前,用户始终拥有最终发言权

结果: 我们可以教会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工作流、创建客户支持工具,还是构建内部生产力代理,这种方法都提供了一条从构想到生产的快速、安全路径。FINISHED

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么使用合成数据生成和强化学习来教授新的CLI?
  • 先决条件
  • 步骤1:使用NeMo Data Designer设计合成数据集
    • 为什么使用合成数据生成?
    • 数据集结构
    • 验证过程
  • 步骤2:使用RLVR进行微调(通过GRPO)
    • 基于可验证奖励的强化学习(RLVR)
    • 使用NeMo Gym构建训练环境
    • 通过群组相对策略优化(GRPO)进行优化
  • 步骤3:人工干预执行
    • 安全架构
    • 完整的安全链
  • 为什么RLVR + 合成数据适用于定制代理AI
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档