Microsoft Agent Lightning是一种基于强化学习的开源AI Agent训练框架,其核心设计理念在于将运行逻辑与学习逻辑解耦,从而能够灵活且高效地集成至现有的智能体中。本文介绍了其工作原理、使用步骤,包括架构、连接、调试、训练等内容,并进一步分析了其典型应用场景。

 

AI Agent正在改变人们使用人工智能的方式。依托大型语言模型(LLM),它们能够回答问题、执行指令,并与各类数据源或API进行交互。然而,它们在处理复杂的多步骤任务时仍会出错,而人工修复这些问题通常既耗时又费力。

微软公司最近推出的Agent Lightning框架使这一过程变得更加简单。该框架将智能体(Agent)的运行机制与学习过程分离开来,使得智能体能够在实际交互中持续自我优化。用户可基于现有的聊天工具或自动化系统进行部署,并借助强化学习技术,让智能体在执行任务过程中逐步提升智能化水平。

什么是Microsoft Agent Lightning?

Agent Lightning是微软公司推出的一种开源框架,旨在通过强化学习(RL)来训练和改进AI Agent。其优势在于,它可以无缝封装任何使用现有框架(如LangChain、OpenAI Agents SDK、AutoGen、CrewAI、LangGraph或自定义Python)开发的智能体,并且几乎无需更改代码。

从技术角度来看,该框架支持对智能体中嵌入的LLM进行强化学习训练,而无需改变智能体的核心逻辑。其基本思想是将智能体的执行过程视为一个马尔可夫决策过程——“在每一步,智能体都处于特定状态,执行某个行动(LLM输出),并在这些行动在成功完成任务时获得相应的奖励。”

Agent Lightning框架由Python SDK与训练服务器两部分组成。用户只需将智能体逻辑封装进LitAgent类或兼容接口,并定义输出结果(奖励)评估机制,即可启动训练。该框架负责采集交互经验,将其输入至分层强化学习算法(LightningRL)中以完成信用分配,进而更新智能体模型或提示模板。在训练结束后,用户即可获得一个经过强化、性能显著提升的智能体。

为什么Agent Lightning很重要?

传统的智能体框架(如LangChain、LangGraph、CrewAI或AutoGen)能够创建可以逐步推理或使用工具的AI Agent,但它们没有训练模块。这些智能体只是基于静态的模型参数或提示词来运行模型,这意味着它们无法从所经历的情况中学习。现实世界中的挑战具有一定程度的复杂性,需要一定程度的适应性。Agent Lightning解决了这一问题,将学习引入了智能体流程中。

Agent Lightning通过实现一个自动优化管道来解决这一预期差距,它利用强化学习的能力,根据反馈信号更新智能体的策略。简而言之,智能体可以从自己的成功和失败中学习,从而可能产生更可靠、更值得信赖的结果。

Agent Lightning的工作原理

在服务器-客户端架构中,Agent Lightning利用强化学习算法来生成任务并优化建议,例如调整提示或更新模型权重。任务由Runner执行,它收集智能体的每个行动和最终奖励,并将这些数据返回给算法。这种反馈机制使得智能体能够随着时间的推移,利用“自动中间奖励”功能来进一步微调其提示或权重,该功能可为成功的中间行动提供即时的小幅奖励以加速学习过程。

Agent Lightning本质上将Agent操作视为一个循环:状态是其当前上下文;行动是它的下一步,奖励是任务成功的指标。通过设计“状态-行动-奖励”的转换,Agent Lightning最终可以为任何类型的智能体提供训练支持。

Agent Lightning采用了解耦化设计,将智能体的学习与执行相分离。在这一架构中,服务器负责模型更新与优化,客户端则负责执行实际任务并报告结果。这种任务分工使智能体在高效完成具体任务的同时,能持续通过强化学习优化其性能。

注:Agent Lightning使用分层强化学习系统LightningRL,能够分解复杂的多步骤智能体行为进行训练。LightningRL还支持多智能体、复杂工具使用和延迟反馈。

使用微软Agent Lightning训练智能体的分步指南

本节将介绍如何使用Agent Lightning训练一个SQL智能体,并展示如何集成其核心组件:基于LangGraph构建的SQL智能体、VERL强化学习框架,以及用于控制训练与调试流程的Trainer。

本文提供了一个可直接运行的命令行示例(examples/spider/train_sql_agent.py),但重点在于帮助开发者深入理解系统架构与工作流程,从而能够自信地将Agent Lightning应用于实际业务场景。

智能体架构

Agent-Lightning可以与AutoGen、CrewAI、LangGraph、OpenAI Agents SDK以及其他自定义Python逻辑等框架无缝协作。在这个例子中,使用LangGraph构建了一个循环工作流,模拟数据分析师迭代编写和修复SQL查询的过程:

这个工作流包含四个功能阶段:

  • write_query:获取用户的问题,根据文本问题生成初始SQL查询。
  • execute_query:在目标数据库中执行生成的查询。
  • check_query:使用验证提示(CHECK_QUERY_PROMPT)验证结果。
  • rewrite_query:如果有问题,则重写查询。

循环继续,直到查询验证或达到最大迭代计数(max_turns)。强化学习优化了write_query和rewrite_query阶段。

构建LangGraph智能体

为保证代码的模块化与可维护性,建议使用独立的构建器函数来定义 LangGraph 工作流,具体实现如下所示:

python

复制

from langgraph import StateGraph def build_langgraph_sql_agent( database_path: str, openai_base_url: str, model: str, sampling_parameters: dict, max_turns: int, truncate_length: int ): # Step 1: Define the LangGraph workflow builder = StateGraph() # Step 2: Add agent nodes for each step builder.add_node(“write_query”) builder.add_node(“execute_query”) builder.add_node(“check_query”) builder.add_node(“rewrite_query”) # Step 3: Connect the workflow edges builder.add_edge(“__start__”, “write_query”) builder.add_edge(“write_query”, “execute_query”) builder.add_edge(“execute_query”, “check_query”) builder.add_edge(“check_query”, “rewrite_query”) builder.add_edge(“rewrite_query”, “__end__”) # Step 4: Compile the graph return builder.compile().graph()

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

这样做可以将LangGraph逻辑与Agent Lightning的未来更新相分离,从而提高代码的可读性和可维护性。

连接LangGraph与Agent Lightning

LitSQLAgent类作为LangGraph与Agent Lightning之间的桥梁。它继承自agl.LitAgent,因此Runner可以为每次迭代管理共享资源(如LLM)。

python

复制

import agentlightning as agl class LitSQLAgent(agl.LitAgent[dict]): def __init__(self, max_turns: int, truncate_length: int): super().__init__() self.max_turns = max_turns self.truncate_length = truncate_length def rollout(self, task: dict, resources: agl.NamedResources, rollout: agl.Rollout) -> float: # Step 1: Load shared LLM resource llm: agl.LLM = resources[“main_llm”] # Step 2: Build LangGraph agent dynamically agent = build_langgraph_sql_agent( database_path=”sqlite:///” + task[“db_id”], openai_base_url=llm.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id), model=llm.model, sampling_parameters=llm.sampling_parameters, max_turns=self.max_turns, truncate_length=self.truncate_length, ) # Step 3: Invoke agent result = agent.invoke({“question”: task[“question”]}, { “callbacks”: [self.tracer.get_langchain_handler()], “recursion_limit”: 100, }) # Step 4: Evaluate query to generate reward reward = evaluate_query( result[“query”], task[“ground_truth”], task[“db_path”], raise_on_error=False ) return reward

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

注:“main_llm”资源键是智能体与VERL之间的一种协作约定,用于在服务上下文中为每次任务提供正确的端点访问。

奖励信号和评估机制

evaluate_query函数定义了用于强化训练的奖励机制。Spider数据集上的每个任务都包含一个自然语言问题、一个数据库模式和一个基准SQL查询。奖励机制将模型生成的SQL查询与参考SQL查询进行比较:

python

复制

def evaluate_query(predicted_query, ground_truth_query, db_path, raise_on_error=False): result_pred = run_sql(predicted_query, db_path) result_true = run_sql(ground_truth_query, db_path) return 1.0 if result_pred == result_true else 0.0

  • 1.
  • 2.
  • 3.
  • 4.

注:在训练过程中,智能体绝不能看到真实查询,否则会导致信息泄露。

配置VERL以进行强化学习

VERL是智能体的强化学习后端。其配置如同定义Python字典一样简单,用户需要输入算法、模型、rollout参数和训练选项。以下是一个基础配置示例:

python

复制

verl_config = { “algorithm”: {“adv_estimator”: “grpo”, “use_kl_in_reward”: False}, “data”: { “train_batch_size”: 32, “max_prompt_length”: 4096, “max_response_length”: 2048, }, “actor_rollout_ref”: { “rollout”: {“name”: “vllm”, “n”: 4, “multi_turn”: {“format”: “hermes”}}, “actor”: {“ppo_mini_batch_size”: 32, “optim”: {“lr”: 1e-6}}, “model”: {“path”: “Qwen/Qwen2.5-Coder-1.5B-Instruct”}, }, “trainer”: { “n_gpus_per_node”: 1, “val_before_train”: True, “test_freq”: 32, “save_freq”: 64, “total_epochs”: 2, }, }

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

这类似于可以在CLI中运行的命令:

python

复制

python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ data.train_batch_size=32 \ actor_rollout_ref.model.path=Qwen/Qwen2.5-Coder-1.5B-Instruct

  • 1.
  • 2.
  • 3.
  • 4.

使用Trainer编排训练过程

Trainer是连接智能体、强化学习算法、数据集和分布式Runner的高级协调模块。

python

复制

import pandas as pd import agentlightning as agl # Step 1: Initialize agent and algorithm agent = LitSQLAgent(max_turns=3, truncate_length=1024) algorithm = agl.VERL(verl_config) # Step 2: Initialize Trainer trainer = agl.Trainer( n_runners=10, algorithm=algorithm, adapter={“agent_match”: “write|rewrite”} # Optimize both query stages ) # Step 3: Load dataset train_data = pd.read_parquet(“data/train_spider.parquet”).to_dict(“records”) val_data = pd.read_parquet(“data/test_dev_500.parquet”).to_dict(“records”) # Step 4: Train trainer.fit(agent, train_dataset=train_data, val_dataset=val_data)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

幕后发生的过程如下:

  • VERL启动一个OpenAI兼容的代理,以便无需实现OpenAI请求即可分发工作。
  • Trainer创建10个Runner以并发执行。
  • 每个Runner调用rollout方法,收集轨迹信息并将奖励发送回以更新策略。

使用trainer.dev()调试智能体

在开始完整的强化学习(RL)训练之前,建议对整个流程进行试运行,以检查连接情况和轨迹信息。

python

复制

trainer = agl.Trainer( n_workers=1, initial_resources={ “main_llm”: agl.LLM( endpoint=os.environ[“OPENAI_API_BASE”], model=”gpt-4.1-nano”, sampling_parameters={“temperature”: 0.7}, ) }, ) # Load a small subset for dry-run import pandas as pd dev_data = pd.read_parquet(“data/test_dev_500.parquet”).to_dict(“records”)[:10] # Run dry-run mode trainer.dev(agent, dev_dataset=dev_data) 该步骤确保在投入大量GPU资源进行长时间训练之前,整个LangGraph控制流、数据库连接及奖励逻辑均已正确配置并验证通过。

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

运行完整示例

要设置环境,需安装依赖项(即使用pip install -r requirements.txt命令),然后运行完整的训练脚本:

python

复制

# Step 1: Install dependencies pip install “agentlightning[verl]” langchain pandas gdown # Step 2: Download Spider dataset cd examples/spider gdown –fuzzy https://drive.google.com/file/d/1oi9J1jZP9TyM35L85CL3qeGWl2jqlnL6/view unzip -q spider-data.zip -d data && rm spider-data.zip # Step 3: Launch training python train_sql_agent.py qwen # Qwen-2.5-Coder-1.5B # or python train_sql_agent.py llama # LLaMA 3.2 1B

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

如果使用的是托管在Hugging Face平台上的模型,那么务必按照以下步骤导访问令牌:

python

复制

export HF_TOKEN=”your_huggingface_token”

  • 1.

在没有VERL情况下的调试

如果希望在没有强化学习的情况下验证代理逻辑,可以使用内置的调试助手:

python

复制

export OPENAI_API_BASE=”https://api.openai.com/v1″ export OPENAI_API_KEY=”your_api_key_here” cd examples/spider python sql_agent.py

  • 1.
  • 2.
  • 3.
  • 4.

这将允许用户使用当前LLM端点运行SQL Agent,以确认查询已执行且控制流按预期工作。

评估结果

注:在单个80GB GPU上运行python train_sql_agent.py qwen通常会在大约12小时后完成。你将看到训练获得的奖励持续增加,这表明智能体的SQL生成过程随着时间的推移而不断改进。因此,由于资源限制,在这里使用了官方文档中展示的结果。

Agent Lightning的适用场景

在实际应用中,假设用户有一个基于LLM的智能体,它在某个应用程序(如客户支持聊天机器人、自动化编码助手等)中扮演着重要角色,并且希望对其进行优化,那么Agent Lightning是一个理想的候选方案。该框架已在SQL查询生成等任务中得到验证。经过引入强化学习或提示优化机制,Agent Lightning能够持续迭代并优化已有智能体,从而生成更准确、更可靠的输出结果。

  • 如果希望AI Agent通过试错进行学习,那么应该使用Agent Lightning。它专为具有明确成功或失败信号的多步骤逻辑场景而设计。
  • 例如,Agent Lightning可以通过观察执行反馈来学习,从而改进生成数据库查询的机器人。该模型也适用于聊天机器人、虚拟助手、游戏智能体以及使用工具或API的通用智能体。
  • Agent Lightning框架与智能体无关,并支持灵活部署。它可以在标准个人电脑(PC0或服务器上按需训练,因此可以在必要时在笔记本电脑或云平台上进行模型训练。

结论

Microsoft Agent Lightning是一种用于提升AI Agent智能水平的新机制。其核心理念在于,智能体不应是固定的代码对象,而应该能够通过持续的训练循环从经验中学习。通过将训练过程与执行过程解耦,它可以在无需更改任何代码的情况下优化任何智能体工作流。

这意味着,可以通过使用Agent Lightning的强化学习机制轻松增强智能体工作流程,无论它是定制智能体、LangChain机器人、CrewAI、LangGraph、AutoGen还是更具体的OpenAI SDK agent,。实际上,智能体正从其自身的数据中变得更加智能。

常见问题解答

Q1.什么是Microsoft Agent Lightning?

A:它是微软的一个开源框架,通过强化学习来训练AI Agent,而无需改变其核心逻辑或工作流。

Q2. Agent Lightning如何改进AI Agent?

A:它允许智能体通过强化学习从实际任务反馈中学习,从而不断优化提示或模型权重以提高性能。

Q3. Agent Lightning能否与现有的智能体的框架协同工作?

A:是的,它可以与LangChain、AutoGen、CrewAI、LangGraph以及自定义Python智能体轻松集成,并且几乎无需修改代码。

原文标题:Train Your AI Agents Like a Pro with Microsoft Agent Lightning (Full Setup & Workflow) ,作者:Vipin Vashisth

文章来自:51CTO

Loading

作者 yinhua

发表回复