编程 Agent Lightning 深度实战:微软开源的零代码 AI 代理训练框架——Triplet 与 VERL 算法详解

2026-05-21 21:51:08 +0800 CST views 6

Microsoft Agent Lightning 深度实战:零代码变更优化 AI 代理的强化学习框架——从 Triplet 机制到 VERL 算法的完整指南

本文深度解析微软开源的 Agent Lightning (AGL) 框架,这是一款革命性的 AI 代理训练框架,通过"零代码变更"理念,让开发者可以在不修改现有代理逻辑的情况下,使用强化学习、自动提示优化和监督微调等技术优化 AI 代理。本文将深入讲解其核心架构、Triplet 三元组机制、VERL 算法、信用分配策略,并通过完整的代码实战演示如何从零开始训练一个生产级 AI 代理系统。


目录

  1. 背景介绍:AI 代理优化的困境与突破
  2. 核心概念:Agent Lightning 架构解析
  3. 深度实战:从零开始训练 AI 代理
  4. Triplet 机制:强化学习的数据引擎
  5. VERL 算法:分层强化学习的实现
  6. 信用分配:解决稀疏奖励的关键
  7. 自动提示优化:让 Prompt 自主进化
  8. 监督微调:将经验转化为模型能力
  9. 生产级部署:从训练到上线
  10. 性能优化:让训练更快、效果更好
  11. 总结与展望:AI 代理训练的未来

1. 背景介绍:AI 代理优化的困境与突破

1.1 AI 代理的现状与痛点

2026 年,AI 代理(Agent)已经成为大语言模型(LLM)应用的主流范式。从 LangChain、AutoGen 到 CrewAI,各种代理框架如雨后春笋般涌现。然而,在实际生产环境中部署 AI 代理时,开发者面临着一个核心难题:

如何让 AI 代理从"能用"进化到"好用"?

传统做法通常依赖三种方式:

  1. 手工调 Prompt:这是最原始的方法。开发者根据经验反复修改提示词,期望模型能给出更好的回答。但这种方式高度依赖个人经验,难以系统化,且无法保证稳定性。

  2. 监督微调(SFT):收集高质量的输入-输出对,对模型进行微调。这种方法需要大量标注数据,且一旦训练完成,模型的行为就固定了,难以适应新场景。

  3. 人类反馈强化学习(RLHF):通过人类反馈来训练奖励模型,再用强化学习优化代理。这是 ChatGPT 等模型的核心技术,但实现成本高昂,需要大量人类标注。

这三种方式都有一个共同问题:需要修改代理的核心逻辑。这意味着你要么重写代理代码,要么重新训练模型,要么依赖外部的人类反馈——这些都让迭代周期变得漫长而昂贵。

1.2 Agent Lightning 的破局之道

微软的 Agent Lightning (AGL) 框架提出了一个颠覆性的解决方案:零代码变更优化

其核心思想是:

将 AI 代理的训练过程与代理逻辑完全解耦。

Agent Lightning 通过以下方式实现这一目标:

  • 数据收集与代理逻辑分离:代理在运行时产生的所有交互数据(用户输入、代理响应、环境反馈)都会被自动收集,但代理本身的代码不需要做任何修改。

  • 服务器端优化:收集到的数据流向 Lightning 服务器,服务器应用强化学习、自动提示优化、监督微调等技术,然后将改进的参数(可能是新的提示模板,也可能是微调后的模型权重)推送回代理。

  • 框架无关性:无论你用的是 LangChain、AutoGen、CrewAI 还是微软自家的 Agent Framework,Agent Lightning 都能与其配合使用。团队将其描述为"点亮 AI 代理的绝对训练器"(The Absolute Trainer for Lighting Up AI Agents),其通用性确实令人印象深刻。

1.3 为什么 Agent Lightning 是革命性的?

在 Agent Lightning 之前,优化 AI 代理意味着:

  • 如果你想改进提示词,你需要手动修改代码中的 prompt 模板。
  • 如果你想用强化学习训练代理,你需要重写代理的训练循环,接入 RL 库(如 RLlib、Tianshou)。
  • 如果你想微调模型,你需要准备数据集,运行微调脚本,然后重新部署模型。

这些工作不仅技术门槛高,而且每次改进都需要修改代理的核心代码,风险极高。

Agent Lightning 通过改变优化范式,让这些工作变得:

  • 自动化:不再需要手工调 prompt,系统会自动搜索最优的提示词配置。
  • 解耦:代理逻辑与优化算法分离,你可以随时切换优化策略,而不影响代理的正常运行。
  • 通用:一套框架支持所有主流代理框架,你不需要为每个框架单独开发优化方案。

2. 核心概念:Agent Lightning 架构解析

2.1 整体架构

Agent Lightning 的架构可以分为三个核心组件:

┌─────────────────────────────────────────────────────────────┐
│                      AI Agent (代理)                        │
│  (LangChain / AutoGen / CrewAI / Microsoft Agent Framework)│
│                                                             │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐             │
│  │ 用户输入 │───▶│ 代理逻辑 │───▶│ 代理响应 │             │
│  └──────────┘    └──────────┘    └──────────┘             │
│        │              │              │                       │
│        └──────────────┴──────────────┘                       │
│                       │                                     │
│                       ▼                                     │
│            ┌──────────────────┐                             │
│            │  数据收集器       │                             │
│            │  (Data Collector)│                             │
│            └──────────────────┘                             │
└─────────────────────────────────────────────────────────────┘
                       │
                       │ 发送交互数据 (提示、响应、奖励)
                       ▼
┌─────────────────────────────────────────────────────────────┐
│                  Lightning 服务器                            │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │            Triplet 生成器 (Triplet Generator)        │   │
│  │  将交互数据转换为 (prompt, response, reward) 三元组 │   │
│  └─────────────────────────────────────────────────────┘   │
│                       │                                     │
│                       ▼                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │         VERL 算法引擎 (VERL Algorithm Engine)        │   │
│  │  分层强化学习 + 信用分配                              │   │
│  └─────────────────────────────────────────────────────┘   │
│                       │                                     │
│                       ▼                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │     优化器 (Optimizer)                               │   │
│  │   • 自动提示优化 (Auto Prompt Optimization)          │   │
│  │   • 监督微调 (Supervised Fine-Tuning)               │   │
│  │   • 强化学习策略梯度 (RL Policy Gradient)            │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                       │
                       │ 推送改进的参数 (新 prompt / 模型权重)
                       ▼
┌─────────────────────────────────────────────────────────────┐
│                      AI Agent (代理)                        │
│            ┌─────────────────────────────────┐               │
│            │  更新后的提示模板 / 模型权重    │               │
│            └─────────────────────────────────┘               │
└─────────────────────────────────────────────────────────────┘

2.2 核心组件详解

2.2.1 数据收集器(Data Collector)

数据收集器是 Agent Lightning 的"眼睛",它负责:

  1. 拦截代理交互:在不修改代理代码的情况下,通过钩子(hook)或中间件(middleware)机制,捕获代理的完整运行轨迹。

  2. 结构化存储:将交互数据存储为结构化格式,包括:

    • prompt:用户输入或系统提示
    • response:代理的响应(可能是最终答案,也可能是中间推理步骤)
    • reward:环境反馈或人类反馈(可能是延迟的、稀疏的)
    • metadata:时间戳、会话 ID、代理状态等
  3. 批量发送:为了效率,数据收集器通常会批量发送数据到 Lightning 服务器,而不是每条交互都发送。

2.2.2 Triplet 生成器(Triplet Generator)

Triplet 生成器是 Agent Lightning 的"数据引擎",它负责将原始的交互数据转换为强化学习所需的三元组(Triplet)

Triplet = (prompt, response, reward)

为什么需要 Triplet?

在传统的监督学习中,我们只需要输入-输出对 (x, y)。但在强化学习中,我们需要的是"在某个状态下采取行动,获得多少奖励"的数据,即 (state, action, reward)

在 AI 代理的场景中:

  • prompt 对应 state(当前状态:用户输入 + 代理的上下文)
  • response 对应 action(代理采取的行动:生成的回答或执行的工具调用)
  • reward 对应 reward(环境反馈:用户是否满意、任务是否成功)

Triplet 生成器的工作流程:

  1. 解析代理轨迹:将代理的一次完整运行(可能包含多轮对话、多次工具调用)解析为一系列的 (prompt, response) 对。

  2. 分配奖励:这是最关键也最困难的一步。代理可能在多轮交互后才收到最终反馈(比如用户说"谢谢"表示满意),而中间的步骤并没有直接奖励。Triplet 生成器需要根据最终反馈,通过**信用分配(Credit Assignment)**算法,为中间的每一步分配合理的奖励。

  3. 过滤与增强:不是所有的 (prompt, response) 对都有价值。Triplet 生成器会过滤掉低质量的样本(比如响应长度过短、包含错误格式等),并可能通过数据增强(如改写 prompt)来扩充训练数据。

2.2.3 VERL 算法引擎(VERL Algorithm Engine)

VERL(Value-Guided Expectation-Refinement Learning)是 Agent Lightning 的核心强化学习算法,它是一种**分层强化学习(Hierarchical RL)**算法,专门设计用于处理 AI 代理的复杂、多步决策过程。

为什么需要分层强化学习?

传统的强化学习算法(如 DQN、PPO)假设代理在每一步都接收一个奖励信号,并且代理的目标是最大化累积奖励。但在 AI 代理的场景中:

  • 稀疏奖励:代理可能只在完成任务后才收到奖励(比如用户确认问题已解决),中间步骤没有直接反馈。
  • 长时序依赖:代理的当前决策可能影响很远未来的结果(比如提前调用了错误的工具,导致后续所有步骤都失败)。
  • 层次化行为:代理的行为是层次化的。高层决策("我应该先搜索还是先计算?")和底层决策("我应该调用 search_web 还是 search_database?")需要不同时间尺度的优化。

VERL 通过将代理的决策过程分解为多个层次来解决这些问题:

高层次策略 (High-Level Policy)
  ├── 目标分解:"解决这个问题需要哪些步骤?"
  └── 步骤规划:"第一步应该做什么?"
  
低层次策略 (Low-Level Policy)
  ├── 工具选择:"我应该调用哪个工具?"
  └── 参数生成:"工具的参数是什么?"

VERL 的核心思想是:

  1. 价值引导(Value-Guided):为每个层次学习一个价值函数 V(s),表示在状态 s 下期望的累积奖励。高层策略使用这个价值函数来评估不同步骤规划的优劣。

  2. 期望精炼(Expectation-Refinement):通过迭代优化,不断精炼每个层次的策略。具体来说,低层次策略会"向上"传递反馈("这个工具调用是否有效?"),高层次策略会"向下"传递指导("这个目标是否达成?")。

  3. 分层信用分配:不是将所有奖励平均分配给所有步骤,而是根据每个步骤对最终结果的贡献程度,有选择性地分配奖励。这通过计算每个步骤的"贡献度"(用 Shapley 值或类似方法)来实现。

2.2.4 优化器(Optimizer)

优化器是 Agent Lightning 的"大脑",它负责根据 Triplet 数据,实际执行优化算法。Agent Lightning 支持三种优化方式:

  1. 自动提示优化(Auto Prompt Optimization)

    这种方法不改变模型的权重,而是优化提供给模型的提示词。其核心思想是:

    将提示词视为"可学习的参数",通过梯度下降或进化算法来搜索最优的提示词配置。

    具体来说,系统会:

    • 维护一个"提示词种群"(多个候选提示词)
    • 用每个候选提示词运行代理,收集性能数据
    • 根据性能数据,保留好的提示词,淘汰差的提示词,并生成新的候选提示词(通过改写、组合等操作)
    • 重复上述过程,直到找到最优提示词

    优势:不需要 GPU,不需要修改模型,即插即用。
    劣势:优化空间有限(提示词的长度和复杂度受模型上下文窗口限制)。

  2. 监督微调(Supervised Fine-Tuning, SFT)

    这种方法使用 Triplet 数据中的 (prompt, response) 对,对模型进行微调。其核心思想是:

    让模型"记住"好的响应模式。

    具体来说,系统会:

    • 从 Triplet 中筛选出高奖励的样本(表示"好的响应")
    • 用这些样本构建监督学习数据集
    • 运行微调脚本(可能是全参数微调,也可能是 LoRA 等参数高效微调方法)
    • 将微调后的模型权重推送回代理

    优势:可以深度定制模型行为,适应特定领域。
    劣势:需要 GPU,需要小心过拟合,可能需要定期重新微调以适应新数据。

  3. 强化学习策略梯度(RL Policy Gradient)

    这种方法直接使用强化学习算法(如 PPO、TRPO)来优化模型的策略。其核心思想是:

    让模型通过"试错"来学习,最大化期望奖励。

    具体来说,系统会:

    • 用当前策略运行代理,收集交互数据
    • 计算每个动作的"优势"(advantage,即实际奖励与期望奖励的差值)
    • 通过策略梯度更新模型参数,增加高优势动作的概率
    • 重复上述过程

    优势:理论上可以找到全局最优策略,适应动态环境。
    劣势:训练不稳定,对超参数敏感,可能需要大量交互数据。

Agent Lightning 的创新之处在于,它可以同时运行这三种优化方式,并根据代理的运行效果,自动选择最合适的优化策略,或者将多种策略组合使用(比如先用提示优化快速改进,再用微调深度定制)。


3. 深度实战:从零开始训练 AI 代理

3.1 环境准备

首先,我们需要准备开发环境。

步骤 1:安装 Agent Lightning

# 克隆仓库
git clone https://github.com/microsoft/agent-lightning.git
cd agent-lightning

# 创建虚拟环境(推荐使用 conda)
conda create -n agent-lightning python=3.10
conda activate agent-lightning

# 安装依赖
pip install -e ".[dev]"

步骤 2:启动 Lightning 服务器

# 启动服务器(默认端口 8080)
python -m agent_lightning.server --port 8080

# 如果需要使用 GPU 进行微调,指定设备
python -m agent_lightning.server --port 8080 --device cuda:0

服务器启动后,会提供一个 REST API,代理可以通过这个 API 发送数据和接收更新。

步骤 3:集成到现有代理

Agent Lightning 提供了多种集成方式。这里我们以 LangChain 为例。

# langchain_integration.py
from langchain.agents import initialize_agent, AgentType
from langchain.llms import OpenAI
from agent_lightning.integrations.langchain import AgentLightningCallback

# 1. 初始化 LangChain 代理
llm = OpenAI(temperature=0, model="gpt-4")
agent = initialize_agent(
    tools=[...],  # 你的工具列表
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)

# 2. 添加 Agent Lightning 回调
lightning_callback = AgentLightningCallback(
    server_url="http://localhost:8080",
    agent_id="my-langchain-agent",
    collect_data=True,  # 是否收集数据
    auto_update=True    # 是否自动应用更新
)

agent.callbacks = [lightning_callback]

# 3. 运行代理(数据会被自动收集)
response = agent.run("如何优化 Python 代码的性能?")
print(response)

就这么简单!你的 LangChain 代理现在已经开始向 Lightning 服务器发送数据了。

3.2 配置优化策略

在代理运行一段时间后(比如收集了 100 条交互数据),你可以配置优化策略。

创建配置文件 config.yaml

agent_id: "my-langchain-agent"

# 数据收集配置
data_collection:
  batch_size: 10          # 每收集 10 条数据发送一次
  collect_metadata: true  # 是否收集元数据(时间戳、会话 ID 等)

# Triplet 生成配置
triplet_generation:
  reward_model: "implicit"  # 使用隐式反馈(如响应长度、用户后续行为)作为奖励
  # reward_model: "explicit"  # 使用显式反馈(如用户点赞/点踩)
  credit_assignment: "shapley"  # 使用 Shapley 值进行信用分配

# 优化策略配置
optimization:
  strategy: "auto"  # 自动选择优化策略
  # strategy: "prompt"  # 只使用提示优化
  # strategy: "sft"     # 只使用监督微调
  # strategy: "rl"      # 只使用强化学习

  # 提示优化配置
  prompt_optimization:
    population_size: 50     # 提示词种群大小
    num_generations: 10     # 进化代数
    mutation_rate: 0.3      # 变异率

  # 监督微调配置
  sft:
    learning_rate: 1e-5
    num_epochs: 3
    lora_rank: 8           # 如果使用 LoRA

  # 强化学习配置
  rl:
    algorithm: "ppo"        # 使用 PPO 算法
    learning_rate: 1e-6
    clip_range: 0.2

# 更新策略配置
update:
  strategy: "best"         # 只应用效果最好的更新
  # strategy: "ensemble"   # 集成多个更新
  update_frequency: 100    # 每 100 条数据更新一次

应用配置

# apply_config.py
from agent_lightning.config import load_config

config = load_config("config.yaml")

3.3 监控训练过程

Agent Lightning 提供了一个 Web UI 用于监控训练过程。

# 启动 Web UI(默认端口 8090)
python -m agent_lightning.ui --port 8090

打开浏览器,访问 http://localhost:8090,你可以看到:

  • 训练曲线:奖励、损失、策略熵等指标的变化趋势。
  • Triplet 可视化:每个 Triplet 的 prompt、response、reward 值。
  • 优化进度:当前正在运行哪种优化策略,进展如何。
  • 代理性能:代理在测试集上的成功率、平均响应长度等。

4. Triplet 机制:强化学习的数据引擎

4.1 为什么 Triplet 如此重要?

在强化学习中,数据质量决定了上限,算法只是逼近这个上限的手段

Agent Lightning 的 Triplet 机制是其最核心的创新之一。它通过系统化的方式,解决了 AI 代理训练中的三个关键问题:

  1. 数据稀疏性:AI 代理的交互数据通常非常稀疏(用户不会每次都给出反馈)。Triplet 机制通过隐式反馈(如响应长度、完成时间、后续对话是否继续)来推断奖励。

  2. 数据偏差:代理在训练初期可能只会探索到有限的几种行为模式,导致收集到的数据存在偏差。Triplet 机制通过主动探索(encouraging exploration)来缓解这个问题。

  3. 数据效率:收集数据(尤其是与真实用户交互)的成本很高。Triplet 机制通过数据增强和重用,提高数据利用效率。

4.2 Triplet 的数据结构

一个完整的 Triplet 包含以下字段:

triplet = {
    "prompt": "如何优化 Python 代码的性能?",  # 输入提示
    "response": "有多种方法可以优化 Python 代码的性能...",  # 代理响应
    "reward": 0.85,  # 奖励值(0 到 1 之间)
    
    # 元数据
    "metadata": {
        "timestamp": "2026-05-21T13:45:00Z",
        "session_id": "sess_12345",
        "agent_id": "my-langchain-agent",
        "tool_calls": [  # 代理调用的工具
            {"tool": "search_web", "args": {...}},
            {"tool": "run_code", "args": {...}}
        ],
        "response_length": 256,
        "latency_ms": 1234,
        "user_feedback": null  # 可能是 null(隐式反馈)或 like/dislike(显式反馈)
    }
}

4.3 奖励设计:隐式反馈 vs 显式反馈

显式反馈是用户直接给出的反馈,比如:

  • 点赞/点踩
  • 评分(1-5 星)
  • 文本评论("这个回答很有用!")

显式反馈的优点是准确,缺点是稀疏(用户不会每次都给出反馈)。

隐式反馈是从用户行为中推断出来的反馈,比如:

  • 响应长度:如果代理的响应很长,用户没有中断,可能表示用户感兴趣。
  • 完成时间:如果用户快速完成了任务,可能表示代理的回答很有用。
  • 后续对话:如果用户继续追问,可能表示代理的回答没有彻底解决问题。
  • 工具调用成功率:如果代理调用的工具都成功执行,可能表示代理的决策是正确的。

隐式反馈的优点是密集(每次交互都有),缺点是噪声大(推断可能不准确)。

Agent Lightning 支持两种反馈模式,并可以通过**反馈融合(Feedback Fusion)**将两者结合:

# feedback_fusion.py
from agent_lightning.reward import FeedbackFusion

fusion = FeedbackFusion(
    explicit_weight=0.7,  # 显式反馈权重
    implicit_weight=0.3,   # 隐式反馈权重
    
    # 隐式反馈信号
    implicit_signals=[
        "response_length",
        "completion_time",
        "follow_up_questions",
        "tool_success_rate"
    ]
)

# 计算融合奖励
reward = fusion.compute_reward(triplet)

4.4 信用分配:解决稀疏奖励的关键

假设你有一个多步骤的 AI 代理,它解决问题的流程是:

  1. 用户问:"如何优化 Python 代码的性能?"
  2. 代理调用 search_web("Python 性能优化"),获得一些文章链接。
  3. 代理调用 read_article("https://..."),提取关键信息。
  4. 代理生成回答:"有多种方法可以优化 Python 代码的性能..."

最终,用户给出了点赞(奖励 = 1)。但问题是:这 1 的奖励应该分配给哪一步?

  • 如果只分配给第 4 步,那么代理可能不会学会如何有效地搜索(因为搜索步骤没有奖励)。
  • 如果平均分配给所有步骤,那么无效的步骤(比如搜索到了不相关的文章)也会获得奖励,导致代理学不到正确的行为。

**信用分配(Credit Assignment)**就是解决这个问题的:根据每个步骤对最终结果的贡献程度,分配不同的奖励。

Agent Lightning 支持多种信用分配算法:

  1. 均匀分配(Uniform):所有步骤平均分配奖励。简单但效果差。
  2. 时间衰减(Temporal Decay):越接近最终结果的步骤获得越高的奖励。适用于奖励主要由最后几步决定的场景。
  3. Shapley 值(Shapley Value):基于博弈论的方法,计算每个步骤的"边际贡献"。准确但计算成本高。
  4. 注意力权重(Attention Weight):用 Transformer 的注意力权重来分配奖励。适用于语言模型,因为注意力权重本身就反映了 token 之间的重要性。
# credit_assignment.py
from agent_lightning.reward import CreditAssignment

# 使用 Shapley 值进行信用分配
assigner = CreditAssignment(method="shapley")

# 为 Triplet 中的每个步骤分配奖励
triplet_with_credit = assigner.assign(triplet)

5. VERL 算法:分层强化学习的实现

5.1 VERL 的核心思想

VERL(Value-Guided Expectation-Refinement Learning)是 Agent Lightning 的核心强化学习算法。它的设计灵感来自于人类的问题解决方式:

人类在解决复杂问题时,会先在脑中规划出大致的步骤(高层次策略),然后再逐步细化每个步骤的具体执行(低层次策略)。

VERL 将这个过程形式化为一个分层马尔可夫决策过程(Hierarchical MDP)

Hierarchical MDP = (S, A_high, A_low, P, R, γ)

其中:
- S: 状态空间(用户的输入、代理的上下文)
- A_high: 高层次动作空间(步骤规划:"第一步应该做什么?")
- A_low: 低层次动作空间(工具调用:"调用 search_web")
- P: 状态转移概率
- R: 奖励函数
- γ: 折扣因子

5.2 VERL 的算法流程

VERL 的每一次更新包含以下步骤:

步骤 1:高层次策略评估

用当前的高层次策略 π_high,生成多个候选的"步骤规划"(比如"先搜索,再写代码,最后测试")。

对每个候选规划,用低层次策略 π_low 执行,并估算其价值 V(plan)(即按照这个规划执行,期望能获得多少奖励)。

保留价值最高的 K 个规划(比如 K=5)。

步骤 2:低层次策略改进

对这 K 个规划,分别用强化学习算法(如 PPO)优化低层次策略 π_low

具体来说,对于每个规划,用 π_low 执行多次,收集交互数据,计算策略梯度,更新 π_low 的参数。

步骤 3:高层次策略改进

根据 K 个规划的实际执行结果(而不是估算的价值),更新高层次策略 π_high

具体来说,如果某个规划的实际奖励很高,就增加它在 π_high 中的采样概率;如果实际奖励很低,就降低它的采样概率。

步骤 4:迭代

重复上述步骤,直到策略收敛。

5.3 VERL 的数学推导

让我们将 VERL 的形式化。

高层次策略 π_high(z|s),其中 z 是一个"步骤规划"(比如一个由 3 个步骤组成的序列)。

低层次策略 π_low(a|s, z),其中 a 是一个具体的动作(比如调用某个工具),z 是当前的步骤规划。

价值函数 V(s, z),表示在状态 s 下,按照规划 z 执行,期望的累积奖励。

VERL 的目标是最大化期望累积奖励:

J(θ_high, θ_low) = E[∑_t γ^t r_t]

其中:
- θ_high 是高层次策略的参数
- θ_low 是低层次策略的参数
- r_t 是时间 t 的奖励

通过对 J 求梯度,我们可以得到策略梯度:

∇J(θ_high) = E[∇ log π_high(z|s) * Q(s, z)]
∇J(θ_low) = E[∇ log π_low(a|s, z) * A(s, a)]

其中:

  • Q(s, z) 是状态-规划价值函数(表示规划 z 的好坏)
  • A(s, a) 是优势函数(表示动作 a 相对平均水平的好坏)

VERL 使用价值引导来估计 Q(s, z)A(s, a)

Q(s, z) ≈ V(s, z) + A(s, z)
A(s, a) = r + γ V(s', z) - V(s, z)

其中 V(s, z) 通过神经网络来近似。

5.4 VERL 的代码实现

以下是 VERL 算法的简化实现:

# verl.py
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical

class VERL:
    def __init__(self, state_dim, high_action_dim, low_action_dim, hidden_dim=128):
        # 高层次策略网络
        self.high_policy = nn.Sequential(
            nn.Linear(state_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, high_action_dim),
            nn.Softmax(dim=-1)
        )
        
        # 低层次策略网络
        self.low_policy = nn.Sequential(
            nn.Linear(state_dim + high_action_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, low_action_dim),
            nn.Softmax(dim=-1)
        )
        
        # 价值网络
        self.value_net = nn.Sequential(
            nn.Linear(state_dim + high_action_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, 1)
        )
        
        # 优化器
        self.optimizer = optim.Adam(
            list(self.high_policy.parameters()) +
            list(self.low_policy.parameters()) +
            list(self.value_net.parameters()),
            lr=1e-4
        )
    
    def select_high_action(self, state):
        """选择高层次动作(步骤规划)"""
        state_tensor = torch.FloatTensor(state)
        probs = self.high_policy(state_tensor)
        dist = Categorical(probs)
        action = dist.sample()
        return action.item(), dist.log_prob(action)
    
    def select_low_action(self, state, high_action):
        """选择低层次动作(具体工具调用)"""
        state_tensor = torch.FloatTensor(state)
        high_action_one_hot = torch.zeros(self.high_policy[-2].out_features)
        high_action_one_hot[high_action] = 1
        input_tensor = torch.cat([state_tensor, high_action_one_hot])
        probs = self.low_policy(input_tensor)
        dist = Categorical(probs)
        action = dist.sample()
        return action.item(), dist.log_prob(action)
    
    def update(self, states, high_actions, low_actions, rewards, log_probs):
        """更新策略"""
        # 计算回报
        returns = []
        G = 0
        for r in reversed(rewards):
            G = r + 0.99 * G
            returns.insert(0, G)
        returns = torch.FloatTensor(returns)
        
        # 计算优势
        states_tensor = torch.FloatTensor(states)
        high_actions_one_hot = torch.zeros(len(high_actions), self.high_policy[-2].out_features)
        for i, a in enumerate(high_actions):
            high_actions_one_hot[i, a] = 1
        values = self.value_net(torch.cat([states_tensor, high_actions_one_hot], dim=1)).squeeze()
        advantages = returns - values.detach()
        
        # 计算损失
        policy_loss = -(torch.stack(log_probs) * advantages).mean()
        value_loss = ((values - returns) ** 2).mean()
        loss = policy_loss + value_loss
        
        # 反向传播
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

6. 信用分配:解决稀疏奖励的关键

6.1 为什么信用分配如此困难?

在 AI 代理的训练中,**稀疏奖励(Sparse Reward)**是一个普遍存在的问题。

举个例子,假设你正在训练一个"代码生成代理",它的任务是根据用户需求生成正确的代码。代理的工作流程可能是:

  1. 解析用户需求
  2. 搜索相关代码示例
  3. 编写代码
  4. 运行测试
  5. 修复错误(如果有)

在这个过程中,代理可能只有在第 4 步(运行测试)才知道自己是否成功。如果测试通过,奖励 = 1;否则,奖励 = 0。

问题是:如果测试失败了,代理不知道是哪一步出了问题

  • 是需求解析错误?(第 1 步)
  • 是搜索到的代码示例不相关?(第 2 步)
  • 是代码逻辑错误?(第 3 步)
  • 是测试脚本本身有 bug?(第 4 步)

这就是信用分配问题:如何将最终的奖励(或惩罚)合理地分配给中间的每个决策步骤。

6.2 传统方法的局限性

方法 1:均匀分配

将最终奖励平均分配给所有步骤。

奖励 = +1(测试通过)
每个步骤的奖励 = +1 / 5 = +0.2

局限性:这种方法假设所有步骤对最终结果的贡献相同,显然不符合实际。

方法 2:时间衰减

越接近最终结果的步骤获得越高的奖励。

奖励 = +1(测试通过)
步骤 5 的奖励 = +1 * 0.5^0 = +1
步骤 4 的奖励 = +1 * 0.5^1 = +0.5
步骤 3 的奖励 = +1 * 0.5^2 = +0.25
...

局限性:这种方法假设"最后一步最重要",但实际情况可能并非如此。比如,如果第 1 步(需求解析)就错了,后面所有步骤都是徒劳。

方法 3:蒙特卡洛采样

对每个步骤,通过多次采样来估计其贡献。

具体来说,对于每个步骤 i,固定其他步骤不变,只改变步骤 i 的决策,然后观察最终结果的变化。如果这个变化很大,说明步骤 i 很重要;否则,说明步骤 i 不重要。

局限性:这种方法计算成本很高,因为需要对每个步骤进行多次采样。

6.3 Shapley 值:博弈论的启示

Shapley 值是从博弈论中借鉴过来的方法,用于计算每个"玩家"(在这里是每个步骤)对"游戏结果"(最终奖励)的贡献。

Shapley 值的核心思想是:

一个玩家的贡献,应该等于它在所有可能的玩家组合中的"边际贡献"的平均值。

用数学语言表达:

Shapley(i) = ∑_{S ⊆ N \ {i}} (|S|! * (|N| - |S| - 1)! / |N|!) * (v(S ∪ {i}) - v(S))

其中:
- N 是所有玩家的集合(在这里是所有步骤)
- S 是不包含玩家 i 的玩家子集
- v(S) 是玩家子集 S 的"价值"(在这里是如果只执行 S 中的步骤,能获得多少奖励)

举个例子

假设你有 3 个步骤:A(需求解析)、B(搜索代码)、C(编写代码)。

Shapley(A) 的计算过程:

  1. 当只有 A 时:v({A}) = ?(如果只做需求解析,能获得多少奖励?可能是 0,因为还没写代码)
  2. 当 A 和 B 一起时:v({A, B}) = ?(如果做需求解析和搜索代码,能获得多少奖励?可能还是 0)
  3. 当 A、B、C 一起时:v({A, B, C}) = 1(测试通过)

然后,Shapley(A) = 平均边际贡献 = (v({A}) - v({})) + (v({A, B}) - v({B})) + (v({A, C}) - v({C})) + (v({A, B, C}) - v({B, C})) / 4

6.4 Agent Lightning 中的信用分配实现

Agent Lightning 提供了多种信用分配算法,你可以根据需要选择。

使用 Shapley 值

# shapley_credit_assignment.py
from agent_lightning.reward import ShapleyCreditAssignment

assigner = ShapleyCreditAssignment(
    num_samples=100,  # 采样次数(越多越准确,但计算成本越高)
    method="monte_carlo"  # 使用蒙特卡洛采样估计 Shapley 值
)

# 为代理的执行轨迹分配信用
trajectory = [
    {"step": "parse_requirement", "contribution": None},
    {"step": "search_code", "contribution": None},
    {"step": "write_code", "contribution": None},
    {"step": "run_test", "contribution": None}
]
final_reward = 1  # 测试通过

assigned_trajectory = assigner.assign(trajectory, final_reward)

使用注意力权重

如果你的代理是基于 Transformer 的(比如使用 GPT-4 作为 LLM),你可以使用注意力权重来进行信用分配。

核心思想是:Transformer 的注意力权重反映了不同 token 之间的"相关性"。如果某个步骤(比如"搜索代码")的注意力权重很高,说明这个步骤对生成最终回答很重要,应该获得更高的奖励。

# attention_credit_assignment.py
from agent_lightning.reward import AttentionCreditAssignment

assigner = AttentionCreditAssignment(
    attention_layer=-1,  # 使用最后一层的注意力权重
    aggregation="mean"   # 对多个注意力头取平均
)

# 需要访问 LLM 的注意力权重(这可能需要修改 LLM 的推理代码)
attention_weights = ...  # 形状:(num_heads, seq_len, seq_len)

assigned_trajectory = assigner.assign(trajectory, attention_weights)

7. 自动提示优化:让 Prompt 自主进化

7.1 提示工程的艺术与科学

**提示工程(Prompt Engineering)**是 AI 代理开发中最核心的技能之一。一个好的提示词可以:

  • 让模型更准确地理解用户意图
  • 让模型生成更符合要求的回答
  • 让模型避免常见的错误(如幻觉、重复、偏离主题)

但提示工程也是一门高度依赖经验的艺术。同一个任务,不同的提示词可能带来天壤之别的性能。

Agent Lightning 的**自动提示优化(Auto Prompt Optimization)**功能,旨在将这门艺术转化为一门科学:通过系统化的搜索和优化,找到最优的提示词配置。

7.2 提示优化的搜索空间

提示词可以看作是一个"可学习的参数"。提示优化的目标就是在这个"参数空间"中搜索,找到能让代理性能最优的提示词。

但提示优化的搜索空间非常庞大。假设你的提示词有 N 个 token,每个 token 可以从词汇表(大小 V,通常是 50000 左右)中选择,那么搜索空间的大小是 V^N——这是一个天文数字。

为了降低搜索成本,Agent Lightning 采用了以下几种策略:

策略 1:提示词模板化

不是直接优化原始的提示词,而是将提示词分解为多个"可学习的片段"(learnable segments)。

比如,一个典型的代理提示词可能包含以下部分:

你是一个有用的 AI 助手。

【角色定义】
你是一个 {role},擅长 {skills}。

【任务描述】
用户会向你提问,你需要 {task}。

【输出格式】
请以 {format} 的格式输出你的回答。

其中 {role}{skills}{task}{format} 就是可学习的片段。优化算法只需要搜索这些片段的取值,而不需要重新生成整个提示词。

策略 2:进化算法

Agent Lightning 使用**进化算法(Evolutionary Algorithm)**来搜索最优的提示词配置。

进化算法的核心思想是模拟生物进化过程:

  1. 初始化种群:随机生成 P 个候选提示词(种群大小为 P)。
  2. 评估适应度:用每个候选提示词运行代理,收集性能数据(如成功率、平均奖励),作为"适应度"。
  3. 选择:选择适应度最高的 K 个候选提示词("优胜劣汰")。
  4. 交叉:将选出的 K 个候选提示词两两组合,生成新的候选提示词("繁殖")。
  5. 变异:对新生成的候选提示词进行随机修改("突变"),比如替换某个片段、删除某个片段、插入新片段。
  6. 迭代:重复步骤 2-5,直到达到最大迭代次数或性能不再提升。
# evolutionary_prompt_optimization.py
from agent_lightning.optimization import EvolutionaryPromptOptimizer

optimizer = EvolutionaryPromptOptimizer(
    population_size=50,      # 种群大小
    num_generations=20,      # 进化代数
    mutation_rate=0.3,       # 变异率
    crossover_rate=0.7,      # 交叉率
    evaluation_samples=100   # 每个候选提示词评估的样本数
)

# 开始优化
best_prompt = optimizer.optimize(
    initial_prompt=my_initial_prompt,
    agent=my_agent,
    eval_metric="success_rate"  # 优化目标:成功率
)

print(f"最优提示词:{best_prompt}")

策略 3:梯度引导搜索

如果你使用的 LLM 支持提示词微调(Prompt Tuning)前缀微调(Prefix Tuning),那么你可以将提示词视为"连续的可学习参数",通过梯度下降来优化。

具体来说,提示词不再是离散的 token 序列,而是连续的向量序列(通常是 LLM 的 embedding 空间中的向量)。你可以通过反向传播,计算损失函数对这些向量的梯度,然后更新向量。

优化完成后,你可以将这些连续向量"解码"为最接近的离散 token,或者直接使用这些连续向量作为提示词(这通常需要 LLM 支持"软提示词")。

# gradient_guided_prompt_optimization.py
from agent_lightning.optimization import GradientGuidedPromptOptimizer

optimizer = GradientGuidedPromptOptimizer(
    embedding_dim=768,      # embedding 维度(取决于 LLM)
    prompt_length=20,        # 提示词长度(连续向量的个数)
    learning_rate=1e-3,
    num_epochs=100
)

# 开始优化
best_prompt_embeddings = optimizer.optimize(
    agent=my_agent,
    train_data=my_training_data,
    loss_function="cross_entropy"
)

# 将连续向量解码为离散 token
best_prompt_tokens = decode_embeddings(best_prompt_embeddings)

7.3 提示优化的评估指标

如何评估一个提示词的好坏?Agent Lightning 支持多种评估指标:

指标 1:成功率(Success Rate)

代理成功完成任务的次数 / 总任务数。

适用于有明确"成功/失败"标准的任务(如代码生成、数学推理)。

指标 2:平均奖励(Average Reward)

代理获得的平均奖励。

适用于有连续奖励值的任务(如对话系统,可以根据用户反馈给出 0-1 之间的奖励)。

指标 3:响应质量(Response Quality)

用另一个 LLM(如 GPT-4)作为"评判者",对代理的响应进行打分。

这种方法适用于没有客观评估标准的任务(如开放式对话、创意写作)。

# eval_metrics.py
from agent_lightning.evaluation import SuccessRate, AverageReward, LLMJudge

# 使用成功率作为评估指标
eval_metric = SuccessRate(threshold=0.8)  # 奖励 >= 0.8 视为成功

# 使用 LLM 作为评判者
eval_metric = LLMJudge(
    judge_model="gpt-4",
    criteria=["有用性", "相关性", "准确性", "完整性"]
)

# 评估代理
score = eval_metric.evaluate(agent=my_agent, test_data=my_test_data)

8. 监督微调:将经验转化为模型能力

8.1 为什么需要监督微调?

自动提示优化可以改变提示词,但它不能改变模型的内部参数。这意味着:

  • 如果模型本身缺乏某些知识或能力(比如不知道最新的 Python 库),提示优化无法解决这个问题。
  • 提示词的长度是有限的(受 LLM 的上下文窗口限制),无法包含太多信息。

**监督微调(Supervised Fine-Tuning, SFT)**通过更新模型的权重,将代理的"经验"(高质量的交互数据)固化为模型的能力。

8.2 数据准备

监督微调的第一步是准备训练数据。Agent Lightning 会自动从 Triplet 数据中筛选出高质量的样本。

筛选标准

  1. 高奖励:只保留奖励值 >= 某个阈值(如 0.8)的 Triplet。
  2. 多样性:确保训练数据覆盖不同的任务类型和场景,避免过拟合到某一种模式。
  3. 格式正确:确保 prompt 和 response 的格式符合预期(比如 response 不包含乱码、不包含敏感信息)。
# prepare_sft_data.py
from agent_lightning.data import SFTDataPreparer

preparer = SFTDataPreparer(
    reward_threshold=0.8,
    max_samples=1000,
    diversity_sampling=True  # 使用多样性采样
)

# 准备训练数据
train_data = preparer.prepare(triplets=my_triplets)

8.3 微调方法选择

Agent Lightning 支持多种微调方法:

方法 1:全参数微调(Full Fine-Tuning)

更新模型的所有参数。

优势:可以最大化模型性能。
劣势:计算成本高(需要存储所有参数的梯度),可能导致灾难性遗忘(模型忘记了之前学到的知识)。

方法 2:LoRA(Low-Rank Adaptation)

只更新模型参数的一小部分(低秩矩阵)。

优势:计算成本低(只需要存储和更新少量参数),可以快速切换不同的"适配器"(adapter)。
劣势:表达能力受限(低秩矩阵的秩通常远小于原始参数矩阵的维度)。

方法 3:QLoRA(Quantized LoRA)

在 LoRA 的基础上,将模型量化为 4-bit 或 8-bit。

优势:进一步降低计算成本,可以在消费级 GPU 上微调大型模型(如 Llama 3 70B)。
劣势:量化可能导致精度损失。

# sft.py
from agent_lightning.fine_tuning import LoRAFineTuner

fine_tuner = LoRAFineTuner(
    model_name="meta-llama/Llama-3-8B",
    lora_rank=8,          # LoRA 的秩
    lora_alpha=32,        # LoRA 的缩放因子
    learning_rate=1e-4,
    num_epochs=3,
    batch_size=4
)

# 开始微调
fine_tuned_model = fine_tuner.fine_tune(train_data=train_data)

8.4 防止过拟合与灾难性遗忘

**过拟合(Overfitting)**是指模型在训练数据上表现很好,但在新数据上表现很差。

**灾难性遗忘(Catastrophic Forgetting)**是指模型在微调后,丢失了之前学到的知识(比如在微调一个对话模型后,模型失去了代码生成能力)。

Agent Lightning 提供了多种策略来缓解这个问题:

策略 1:混合训练数据

在微调数据中混入一部分原始预训练数据(或通用指令遵循数据),以防止模型忘记通用能力。

# mixed_data.py
from agent_lightning.data import MixedDataPreparer

preparer = MixedDataPreparer(
    sft_data=my_sft_data,              # 代理的专属数据
    general_data=my_general_data,      # 通用数据(如 Alpaca、ShareGPT)
    sft_ratio=0.7,                    # 专属数据的比例
    general_ratio=0.3                  # 通用数据的比例
)

mixed_data = preparer.prepare()

策略 2:弹性权重巩固(Elastic Weight Consolidation, EWC)

EWC 是一种正则化方法,它惩罚那些对旧任务重要的参数的变化。

核心思想是:对每个参数,计算它对于旧任务的重要性(用 Fisher 信息矩阵近似)。在微调时,对于重要的参数,如果它发生了变化,就施加一个很大的惩罚。

# ewc.py
from agent_lightning.fine_tuning import EWCRegularizer

ewc = EWCRegularizer(
    model=my_model,
    importance=1e3  # 重要性权重(越大,越防止遗忘)
)

# 在微调时加入 EWC 损失
loss = task_loss + ewc.penalty()

9. 生产级部署:从训练到上线

9.1 模型版本管理

在生产环境中部署 AI 代理时,模型版本管理是至关重要的。

你可能同时有多个版本的模型:

  • v1.0:初始版本(未优化)
  • v1.1:提示优化后的版本
  • v1.2:微调后的版本
  • v2.0:使用新的训练数据重新训练的版本

Agent Lightning 提供了内置的模型版本管理功能。

# model_versioning.py
from agent_lightning.deployment import ModelRegistry

registry = ModelRegistry(storage_dir="./model_registry")

# 注册模型
registry.register(
    model=fine_tuned_model,
    version="v1.2",
    metadata={
        "train_data_size": 1000,
        "eval_metric": "success_rate",
        "eval_score": 0.85,
        "training_time": "2026-05-21 13:45:00"
    }
)

# 列出所有版本
versions = registry.list_versions()
print(versions)

# 加载指定版本
model = registry.load(version="v1.2")

9.2 A/B 测试

在将新模型全面上线之前,你应该先进行 A/B 测试:将用户随机分为两组,一组使用旧模型(对照组),一组使用新模型(实验组),然后比较两组的性能指标。

# ab_testing.py
from agent_lightning.deployment import ABTestManager

ab_manager = ABTestManager(
    control_model="v1.1",   # 对照组模型
    treatment_model="v1.2", # 实验组模型
    traffic_split=0.5        # 50% 流量到对照组,50% 到实验组
)

# 运行 A/B 测试
results = ab_manager.run(test_data=my_test_data, num_users=1000)

print(f"对照组性能:{results['control_score']}")
print(f"实验组性能:{results['treatment_score']}")
print(f"提升:{results['lift']}%")

9.3 在线学习

在生产环境中,代理会继续收集新的交互数据。你可以使用这些新数据,持续更新模型

这称为在线学习(Online Learning)持续学习(Continual Learning)

# online_learning.py
from agent_lightning.learning import OnlineLearner

learner = OnlineLearner(
    model=my_model,
    update_frequency=100,  # 每收集 100 条新数据更新一次
    max_buffer_size=1000  # 最多存储 1000 条数据
)

# 启动在线学习
learner.start()

# 在代理运行时,新数据会自动添加到缓冲区
# 当缓冲区满了,或达到更新频率,模型会自动更新

10. 性能优化:让训练更快、效果更好

10.1 分布式训练

如果你有大量的训练数据,或者单卡训练太慢,你可以使用分布式训练

Agent Lightning 支持多种分布式训练策略:

策略 1:数据并行(Data Parallelism)

将训练数据分成多个子集,每个 GPU 处理一个子集,计算梯度,然后汇总梯度,更新模型。

# distributed_training.py
from agent_lightning.distributed import DataParallelTrainer

trainer = DataParallelTrainer(
    model=my_model,
    num_gpus=4,              # 使用 4 个 GPU
    batch_size_per_gpu=8,
    learning_rate=1e-4
)

# 开始分布式训练
trainer.train(train_data=my_train_data)

策略 2:模型并行(Model Parallelism)

如果模型太大,无法放入单个 GPU 的内存,你可以将模型的不同层分配到不同的 GPU 上。

# model_parallelism.py
from agent_lightning.distributed import ModelParallelTrainer

trainer = ModelParallelTrainer(
    model=my_large_model,  # 比如 Llama 3 70B
    device_map="auto"      # 自动分配层到不同 GPU
)

trainer.train(train_data=my_train_data)

10.2 混合精度训练

**混合精度训练(Mixed Precision Training)**使用半精度(FP16)或低精度(BF16)来进行计算,同时使用全精度(FP32)来存储模型参数和梯度。

优势

  • 减少显存占用(FP16 的显存占用是 FP32 的一半)
  • 加速计算(在支持 Tensor Core 的 GPU 上,FP16 的计算速度是 FP32 的 2-4 倍)
# mixed_precision.py
from agent_lightning.training import MixedPrecisionTrainer

trainer = MixedPrecisionTrainer(
    model=my_model,
    precision="fp16",  # 使用 FP16
    optimizer="adamw"
)

trainer.train(train_data=my_train_data)

10.3 梯度累积

如果你受限于 GPU 显存,无法使用大的 batch size,你可以使用梯度累积(Gradient Accumulation)

核心思想是:将大的 batch 分成多个小的 micro-batch,每个 micro-batch 分别计算梯度,但不更新模型参数,而是将梯度累积起来。当累积到一定数量的 micro-batch 后,再一次性更新模型参数。

# gradient_accumulation.py
from agent_lightning.training import GradientAccumulationTrainer

trainer = GradientAccumulationTrainer(
    model=my_model,
    batch_size=4,             # 每个 micro-batch 的大小
    gradient_accumulation_steps=8  # 累积 8 个 micro-batch,等效 batch size = 32
)

trainer.train(train_data=my_train_data)

11. 总结与展望:AI 代理训练的未来

11.1 Agent Lightning 的核心价值

Microsoft Agent Lightning 的核心价值在于:

  1. 零代码变更:不需要修改代理的核心逻辑,就可以进行优化。
  2. 框架无关性:支持所有主流代理框架。
  3. 算法多样性:同时支持提示优化、监督微调、强化学习。
  4. 生产级可靠性:提供版本管理、A/B 测试、在线学习等功能。

11.2 AI 代理训练的未来方向

方向 1:多模态代理训练

目前的 Agent Lightning 主要专注于文本代理。未来,它可能会支持多模态代理(可以处理图像、音频、视频)。

方向 2:联邦学习

在保护用户隐私的前提下,从多个用户的代理中收集数据,进行联合训练。

方向 3:自我进化

代理可以自主设计训练任务、自主评估性能、自主选择优化策略,真正实现"自我进化"。


参考资料

  1. Microsoft Agent Lightning GitHub: https://github.com/microsoft/agent-lightning
  2. LangChain 官方文档: https://python.langchain.com/
  3. AutoGen 官方文档: https://microsoft.github.io/autogen/
  4. 强化学习经典教材: Sutton & Barto, "Reinforcement Learning: An Introduction"
  5. Shapley 值原论文: Shapley, L. S. (1953). "A Value for N-Person Games"

文章作者:程序员茄子
发布时间:2026-05-21
标签:AI Agent, 强化学习, Microsoft, Agent Lightning, 提示工程, 监督微调, 信用分配
关键词:Agent Lightning, AI代理训练, 强化学习, 提示优化, 微软开源


版权声明:本文为程序员茄子原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

推荐文章

Nginx 状态监控与日志分析
2024-11-19 09:36:18 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
Vue3中如何处理状态管理?
2024-11-17 07:13:45 +0800 CST
Rust 并发执行异步操作
2024-11-19 08:16:42 +0800 CST
windows安装sphinx3.0.3(中文检索)
2024-11-17 05:23:31 +0800 CST
Vue3中如何处理SEO优化?
2024-11-17 08:01:47 +0800 CST
程序员茄子在线接单