1. 项目概述当大语言模型学会“多轮对话”与“自我反思”最近在折腾LLM智能体Agent时我遇到了一个典型瓶颈单次对话Single-turn的Agent表现尚可但一旦任务需要多轮交互Multi-turn比如让Agent去分析一份复杂报告、调试一段代码或者规划一个多步骤项目它的表现就开始“掉链子”。问题往往不是模型能力不足而是Agent在连续决策中缺乏有效的“记忆”和“反思”机制容易在后续轮次中偏离目标、重复错误或陷入逻辑死循环。这让我把目光投向了强化学习Reinforcement Learning, RL领域一个经典且强大的范式Actor-Critic。但传统的Actor-Critic是为解决马尔可夫决策过程MDP设计的其“对称”的更新方式直接套用在LLM Agent上会水土不服。于是“非对称的Actor-Critic”Asymmetric Actor-Critic思路应运而生。这个项目的核心就是探讨如何将这一思想改造并应用于构建更强大、更稳定的多轮对话LLM Agent。简单来说我们想打造一个Agent它不仅能根据当前对话历史状态做出行动生成回复或调用工具还能在每一轮结束后像一个经验丰富的教练一样对自己刚才的行动进行“复盘”和“评分”从而指导下一轮做出更优决策。这个“教练”就是Critic而执行行动的“运动员”就是Actor。所谓“非对称”关键在于我们为Actor和Critic设计了不同的“信息视野”和更新策略让它们各司其职协同进化。2. 核心思路拆解为什么需要“非对称”在深入技术细节前我们必须先理解传统对称Actor-Critic在多轮LLM Agent场景下的局限性以及“非对称”设计如何破局。2.1 传统对称Actor-Critic的困境在标准RL中Actor策略网络和Critic价值网络通常共享底层特征提取器例如同一个Transformer的编码器并基于相同的状态表示State Representation进行学习和更新。这种对称设计在游戏、机器人控制等状态空间定义清晰、维度固定的环境中非常高效。然而对于多轮LLM Agent状态是不断增长的对话历史其本质是一个变长的、高维的、富含语义的文本序列。直接套用对称架构会面临几个尖锐问题价值估计的滞后与模糊Critic的任务是评估当前状态或状态-动作对的长期价值。在多轮对话中一个行动如一句回复的最终价值往往要等到好几轮之后甚至任务结束时才能完全显现。对称Critic基于当前不完整的历史去做估计就像在迷宫只走了一半就去猜出口位置非常不准确。这种不准确的信号反过来会误导Actor的学习。策略更新的短视Actor基于当前Critic提供的可能不准确的价值信号进行优化容易陷入追求即时奖励比如让当前回复看起来合理而忽视长期任务目标的陷阱。例如在代码调试任务中Agent可能倾向于给出一个能暂时通过编译但埋下隐患的修改而不是一个更彻底但步骤稍多的解决方案。训练的不稳定性LLM本身的参数空间极其庞大策略文本生成的微小变化可能导致输出分布的剧烈波动。Actor和Critic共享特征或紧密耦合会导致一个模块的更新剧烈影响另一个整个训练过程容易振荡甚至发散。2.2 “非对称”设计的核心思想Asymmetric Actor-Critic for Multi-turn LLM Agents 的核心思想就是解耦Actor和Critic让它们以不同的“节奏”和“视角”工作从而克服上述困境。具体体现在三个维度信息非对称Information AsymmetryActor行动者专注于“当下”。它接收当前轮次的对话历史可能经过压缩或摘要以及任务指令其目标是生成一个在当前语境下最合理、最有助于推进任务的行动文本或工具调用。它不需要也不应该被过于遥远的未来价值所困扰。Critic评论家专注于“复盘”。它在每一轮对话结束后被激活。它的输入不仅仅是当前轮的状态更重要的是包含了任务最终目标、截至目前的所有历史、以及刚执行完的行动及其结果。Critic像一个事后诸葛亮基于更全面的信息对刚结束的这一轮交互给出一个更准确的评分价值估计。这个评分用于调整Actor的策略。更新频率非对称Update Frequency AsymmetryActor需要在每一轮都快速响应因此它的策略更新可以是频繁的、基于单步或近期经验的。Critic的价值评估需要更稳定、更长期的视角。它的更新可以基于一个更大的经验回放缓冲区Replay Buffer里面存储了多个完整或部分的任务轨迹。Critic的训练目标是最小化其对整个轨迹回报的预测误差从而学习到一个更稳健的价值函数。架构非对称Architectural AsymmetryActor和Critic可以使用不同的模型架构甚至不同大小的模型。一种常见实践Actor使用一个功能完整的、参数较多的LLM如7B或13B模型以确保生成质量。而Critic可以使用一个更轻量级的模型如一个小型Transformer或甚至一个基于BERT的判别模型专门用于价值回归或优劣判断。这大大降低了训练成本并避免了两个重型模型互相干扰。注意这里的“非对称”不是指地位不平等而是职能分工不同。Actor是冲锋陷阵的士兵Critic是运筹帷幄的参谋部。士兵根据实时战况做出战术动作参谋部则根据更全面的战场情报评估每一次战术行动的得失并据此调整未来的战术手册。3. 系统架构与工作流程设计基于以上思路我们可以设计一个具体的多轮LLM Agent系统架构。下图勾勒了其核心组件和数据流注此处用文字描述架构图实际部署时可使用绘图工具整个系统围绕一个中央经验池Experience Pool和两个核心模块运行核心模块Actor策略模型一个经过指令微调Instruction-Tuned的LLM。它接收当前状态S_t处理后的对话历史输出动作A_t下一句回复或工具调用指令。Critic价值模型一个价值评估模型。它接收增强状态S_t包含任务目标、完整历史上下文、以及动作A_t的结果输出一个标量价值分数V_t或一个优势函数A(s, a)。工作流程单轮迭代状态感知与压缩系统维护一个完整的对话历史H [U_1, A_1, U_2, A_2, ..., U_t]其中U是用户输入A是Agent动作。在每一轮tActor 并不直接处理冗长的原始历史H。而是由一个状态处理器可以是另一个小模型或启发式规则对H进行压缩或摘要生成一个精简的、聚焦于最近关键信息的当前状态表示S_t。这避免了上下文长度限制并帮助Actor聚焦。行动生成Actor 模型以S_t和任务指令为输入通过其策略π(a|s)采样生成一个动作A_t例如“调用搜索引擎API查询‘Asymmetric Actor-Critic的最新论文’。”。环境执行与观察动作A_t被发送到环境Environment执行。环境可能是真实用户等待用户下一轮回复U_{t1}。工具集如代码执行器、数据库、搜索引擎返回工具执行结果R_t。模拟器在训练时可能是一个任务模拟器根据既定规则给出反馈。系统接收到新的观察O_{t1}用户回复或工具结果。经验存储将本轮经验元组(S_t, A_t, R_t, S_{t1})存入经验回放池。这里的R_t是环境给出的即时奖励如果有的话比如工具调用成功返回了有效信息可得0.1分S_{t1}是下一轮的状态。Critic 复盘与评估在训练阶段定期从经验池中采样一批经验轨迹。Critic 模型被调用它的输入是“增强状态”S_t。S_t包含了任务初始目标、到t轮为止的完整历史摘要、动作A_t以及其带来的结果O_{t1}。Critic 输出对(S_t, A_t)的价值评估V_t。这个V_t的目标是预测从该状态-动作对出发到任务结束所能获得的累计回报。策略优化Actor更新使用Critic提供的价值信号V_t来计算优势函数Advantage_t例如通过GAE广义优势估计。优势函数Adv_t衡量了动作A_t相对于平均水平的优劣。Adv_t 0说明这是个好动作应该被鼓励Adv_t 0则说明是坏动作应该被抑制。基于Adv_t通过策略梯度算法如PPO来更新Actor模型的参数最大化期望回报。更新公式的核心思想是增加高优势动作的概率降低低优势动作的概率。价值函数优化Critic更新同时Critic自身也需要更新。它的学习目标是让它的预测值V_t尽可能接近真实的累计回报G_t可以通过蒙特卡洛方法或TD(λ)计算得到。通过最小化价值损失如均方误差损失MSE(V_t, G_t)来更新Critic模型的参数。这个流程循环往复Agent就在与环境的交互中通过Actor不断试错并通过Critic的“复盘指导”不断进化其策略。4. 关键技术实现细节与实操要点理解了架构我们来看看实现中的几个关键技术和容易踩坑的地方。4.1 状态表示与压缩这是影响Actor性能的第一道关卡。直接把几十轮的对话原文扔给LLM会迅速耗尽上下文窗口且包含大量无关信息。实操方案滑动窗口摘要维护一个固定长度的最近对话摘要。每轮新增对话后用一个小型摘要模型或直接让LLM自身将最新一轮内容和旧摘要融合生成新的摘要。例如“用户询问AAC原理Agent解释了核心思想。用户追问与对称架构区别Agent正在准备回答...”关键信息提取使用一个轻量级模型如基于BERT的QA模型或NER模型从历史中提取与当前任务强相关的实体、意图、已完成步骤、待解决问题等结构化后作为状态。向量记忆库将每一轮对话的核心内容编码成向量存入向量数据库如FAISS。在每一轮根据当前查询从记忆中检索最相关的若干片段作为状态的补充。这实现了类似“长期记忆”的功能。避坑指南状态压缩必然伴随信息损失。关键在于保留任务进度和未决问题。一个技巧是在状态中显式维护一个“任务清单”和“已解决清单”让Agent始终清楚目标和自己走到哪一步了。4.2 奖励函数设计在RL中奖励函数Reward Function是指引Agent学习的“指挥棒”。对于LLM Agent设计一个好的奖励函数极具挑战性。多维度奖励信号任务完成奖励在任务成功结束时给予一个大额正向奖励如10。这是最核心但最稀疏的信号。子目标达成奖励为任务分解出的关键步骤设置奖励。例如在数据分析任务中“成功连接到数据库”奖励1“正确执行查询”奖励2。工具使用奖励鼓励正确、高效地使用工具。如“调用了正确的API”奖励0.5“调用参数合理”奖励0.5。人类偏好奖励使用一个经过人类反馈训练的奖励模型Reward Model对Agent的每一轮输出进行评分。这个分数可以作为密集奖励信号。这是从InstructGPT/RLHF借鉴的关键思想。惩罚信号无效动作生成无意义内容、重复之前的话、调用不存在的工具-0.5。偏离主题根据一个主题相关性分类器打分过低则惩罚-0.3。格式错误工具调用格式不符合规范-0.2。实操心得不要指望一个完美的奖励函数。初期应采用“稀疏主奖励密集辅助奖励”的组合。辅助奖励如工具使用、格式正确帮助Agent快速学会基本操作主奖励任务完成确保大方向正确。同时所有奖励值需要经过归一化防止某一项奖励主导训练。4.3 Critic模型的具体实现Critic可以有不同的实现形式各有优劣1. 价值函数Critic (V-Critic)输入增强状态S_t。输出一个标量V(s)表示处于状态s时的期望累计回报。优点结构简单训练稳定。缺点评估的是状态价值对具体动作的优劣指导不够直接。需要结合优势函数计算。2. 动作-价值函数Critic (Q-Critic)输入增强状态S_t和动作A_t通常需要将动作文本编码成向量。输出一个标量Q(s, a)表示在状态s下执行动作a的期望累计回报。优点直接评估动作优势函数计算更简单Advantage Q(s,a) - V(s)或直接用Q值。缺点动作空间是文本高维且离散使得Q(s,a)函数难以准确学习。通常需要将动作编码与状态编码进行复杂的交互计算。3. 判别式Critic (Discriminative Critic)思路将价值评估视为一个二分类或回归问题。输入是(S_t, A_t)输出是该动作“好”或“坏”的概率或一个0-1的得分。实现可以用一个对比学习框架。收集一些“好”的(s, a)对和“坏”的对训练一个判别模型区分它们。在训练中用这个模型的输出作为奖励信号的补充。优点更符合人类的评判直觉易于从人类反馈中学习。缺点依赖于高质量的正负样本对。我的选择与实操对于初期实验我推荐从V-Critic开始。它更容易实现和稳定训练。我们可以用一个轻量级的Transformer编码器比如6层接一个回归头来实现Critic。它的训练目标就是最小化预测价值V与实际回报G之间的均方误差。虽然它不直接评价动作但通过GAE等技巧可以很好地推导出优势函数用于Actor更新。4.4 策略优化算法选择PPOProximal Policy Optimization是目前将RL应用于LLM的事实标准。原因如下信任域约束PPO通过剪切Clipping或KL散度惩罚限制新策略与旧策略的差异不要太大。这对于LLM至关重要因为一次激进的更新可能导致模型“遗忘”已有的语言能力输出乱码。样本效率相对较高相比传统的策略梯度PPO能更有效地利用采样到的经验。实现成熟有众多开源库如TRL, DeepSpeed-Chat提供了PPO与Transformer集成的稳定实现。PPO核心步骤在LLM Agent中的对应收集轨迹用当前的Actor策略模型与环境进行多轮对话收集一批(状态动作奖励)序列。优势估计用Critic模型或一个单独的价值网络估计每个状态的价值然后用GAE方法计算每个动作的优势值A_t。计算PPO损失核心是策略损失L^{CLIP}它比较新旧策略在相同状态下生成相同动作的概率比并用A_t加权同时进行剪切以防止更新过大。同时包含价值函数损失L^{VF}训练Critic和熵奖励L^{S}鼓励探索。反向传播与更新计算总损失L L^{CLIP} c1 * L^{VF} - c2 * L^{S}进行反向传播更新Actor和Critic的参数。关键参数经验值剪切系数 epsilon通常设得很小如0.1或0.2确保策略更新非常平缓。GAE参数 lambda0.95是一个常用起点平衡偏差和方差。价值损失系数 c10.5 ~ 1.0。熵系数 c20.01左右初期可稍大鼓励探索后期减小。5. 训练流程、数据与工程实践构建一个可工作的Asymmetric Actor-Critic Agent训练流程和工程细节决定成败。5.1 训练阶段划分一个稳健的训练流程通常分为三个阶段阶段一监督式微调目标获得一个基础的行为良好的Actor模型。方法收集高质量的多轮对话数据可以是人工编写的也可以从现有对话数据集中筛选。数据格式为(任务指令 对话历史 期望的Agent回复)。操作用标准的因果语言建模损失Cross-Entropy Loss在这个数据上微调一个预训练LLM。这一步不涉及RL只是让模型学会在给定上下文中如何做出合理的回应。阶段二奖励模型训练目标获得一个能评判Agent回复好坏的Critic或一个独立的奖励模型。方法需要人工标注的偏好数据。对于同一个问题上下文给出两个不同的Agent回复(y_w, y_l)标注哪个更好。操作训练一个奖励模型R_φ。通常使用对比损失如Bradley-Terry模型loss -log(σ(R_φ(x, y_w) - R_φ(x, y_l)))其中σ是sigmoid函数。训练好的奖励模型将在RL阶段为每一步提供密集奖励信号。阶段三强化学习微调目标使用PPO算法结合奖励模型和环境反馈优化Actor的策略。方法初始化Actor使用阶段一得到的SFT模型Critic可以使用阶段二奖励模型的最后一层之前的部分作为特征提取器接一个新的回归头或者单独初始化一个价值网络。交互与收集Actor与模拟环境或预留的测试集交互生成对话轨迹。评分对于轨迹中的每一步使用奖励模型R_φ给出即时奖励r_t。在轨迹结束时根据任务是否完成给予稀疏奖励R_T。优化使用PPO算法基于累计奖励G_t和Critic的预测更新Actor和Critic的参数。工程技巧混合训练在PPO损失中加入一个小的SFT损失项如β * L_{SFT}防止模型过度优化奖励而丧失语言通顺性和基础能力即“奖励黑客”现象。梯度裁剪与累积LLM训练显存消耗大需要使用梯度累积来模拟更大的批量大小。分布式训练使用ZeRO-3等策略进行多卡或多机分布式训练以容纳更大的模型和批次。5.2 模拟环境构建在真实用户反馈循环成本高的情况下构建一个模拟环境至关重要。基于规则的模拟器对于定义清晰的任务如SQL生成、API调用可以构建一个规则引擎。给定用户查询模拟器可以检查Agent生成的SQL语法、语义是否正确并返回一个模拟的数据库查询结果或错误信息。奖励可以根据规则自动计算。基于模型的模拟器使用另一个LLM来扮演“用户”或“环境”。例如给定任务描述让一个LLM模拟用户提出多轮问题再用另一个LLM或一套规则来评判Agent的回答是否合理并生成下一轮用户输入。这种方法更灵活但需要精心设计提示词和评判标准以防止模拟器失控。5.3 关键超参数与调试训练这样的系统如同驾驶一艘大船调参是精细活。超参数作用典型范围/值调试建议学习率控制参数更新步长1e-6 ~ 5e-6RL阶段的学习率应远小于SFT阶段如SFT用2e-5RL用1e-6。从低开始观察奖励曲线。PPO Clip Epsilon限制策略更新幅度0.1 ~ 0.2越小更新越保守。如果奖励曲线剧烈震荡调小epsilon如果学习停滞可稍调大。GAE Lambda平衡优势估计的偏差与方差0.9 ~ 0.99接近1时方差小但偏差大。通常0.95是安全选择。批大小 (Batch Size)每次参数更新使用的经验数据量取决于显存在显存允许下尽可能大。可以使用梯度累积来等效增大批大小。熵系数鼓励探索的程度0.01 ~ 0.05训练初期可设高一些如0.05鼓励多样性后期逐渐衰减如0.01以稳定策略。价值损失系数Critic损失在总损失中的权重0.5 ~ 1.0确保Critic训练充分但不过度影响策略。如果价值预测误差一直很大可以尝试调大。KL散度系数防止策略偏离SFT模型太远0.01 ~ 0.1重要的正则项。如果模型输出开始胡言乱语增大此系数。调试心法首要监控奖励曲线和KL散度曲线。奖励应稳步上升并最终趋于平稳。如果奖励突然飙升后崩溃可能是“奖励黑客”需检查奖励函数或调整KL系数。KL散度应缓慢增长并稳定在一个较低水平。如果KL散度急剧上升说明策略正在快速偏离初始SFT模型风险很高需立即降低学习率或增大KL系数。6. 常见问题、挑战与应对策略在实际操作中你会遇到一系列典型问题。以下是我踩过坑后总结的排查清单。6.1 训练不稳定与模式崩溃现象奖励曲线像过山车时而极高时而极低Agent输出开始重复无意义的短语或陷入循环。根本原因奖励函数有漏洞Agent发现了某个能骗取高奖励但无实际意义的行为模式。例如在对话中不断说“我会帮你解决”但无实际行动。探索与利用失衡熵系数太小导致策略过早收敛到一个局部最优的“愚蠢”策略。Critic预测不准Critic模型未能学好价值函数给出了错误的价值信号误导了Actor。解决策略审计奖励函数人工检查高奖励轨迹看Agent是否在“作弊”。为这种作弊行为增加惩罚项。动态调整熵系数实现一个衰减 scheduler训练初期熵系数高后期逐渐降低。稳定Critic训练使用一个比Actor更小的Critic网络降低其容量和波动性。对Critic使用更小的学习率。采用目标价值网络Target Value Network技术即用一个更新较慢的“目标网络”来估计价值定期与主网络同步减少价值目标的波动。使用PPO-Clip确保启用剪切机制这是防止单步更新过大的关键。6.2 遗忘与退化现象经过RL训练后Agent在某些基础能力上如语法、常识、指令遵循反而退步了甚至不如SFT模型。根本原因RL优化目标奖励最大化与语言模型预训练目标文本概率最大化存在冲突。过度追求奖励可能导致模型“遗忘”其原有的语言分布。解决策略KL惩罚/混合训练这是最有效的手段。在PPO损失中强制加入一个KL散度项惩罚当前策略与原始SFT策略之间的差异。或者在总损失中混合一个小的SFT损失即用原始数据同时做一点监督学习。保守的学习率RL阶段的学习率必须是SFT阶段的十分之一甚至更小。定期回滚与评估保存训练过程中的多个检查点并在一个干净的验证集上评估其指令遵循和语言质量。一旦发现退化回滚到上一个好的检查点。6.3 稀疏奖励与信用分配问题现象任务只在最后成功时有一个大奖励中间步骤没有信号。Agent很难学会导致成功的那一系列正确动作。根本原因这是多步决策任务的经典难题。Agent不知道是哪个中间动作最终导致了成功。解决策略设计中间奖励人工拆解任务为关键子目标设计奖励。这是最直接有效的方法。使用优势函数GAE等优势估计方法本质上就是在进行信用分配将最终的成功/失败 credit 合理地分配到轨迹中的每一步。** hindsight 经验回放**一种高级技巧。即使一条轨迹失败了我们可以“事后诸葛亮”地假设其中某些动作是朝着另一个可行目标努力的并据此重新计算奖励让Agent从失败中也学到东西。6.4 计算资源与效率现象训练速度极慢显存占用爆炸。根本原因同时加载多个大模型Actor, Critic, 奖励模型并进行在线交互采样计算和存储开销巨大。解决策略模型共享让Actor和Critic共享底层的Transformer编码器仅在最上层使用不同的输出头。这能大幅减少参数量。离线RL先使用旧的策略或人类数据收集大量(s, a, r, s)经验对存入一个大容量的经验回放池。然后从这个静态数据集中采样进行训练而不是实时交互。这解耦了数据收集和训练提高了数据利用率。分布式采样使用多个环境实例并行地与Agent交互快速收集大量经验数据。量化与低精度训练在推理采样时使用模型量化如FP16甚至INT8在训练时使用混合精度训练AMP。构建一个高效、稳定的Asymmetric Actor-Critic多轮LLM Agent系统是一场在算法设计、工程实现和资源调度之间的精细舞蹈。它没有银弹需要根据具体任务反复迭代和调试。但从我的实践经验来看一旦这套系统跑通其带来的Agent在复杂任务中表现出的连贯性、策略性和可靠性提升是传统单轮或简单提示链方法难以比拟的。这或许正是智能体走向真正“智能”的必经之路。