这几年做Agent相关项目时经常被问到同一个问题:为什么同一个基础模型,有人拿去做Agent效果很好,有人做出来却像“随机鹦鹉”?我自己的答案是——多数时候问题不在模型,而在你让Agent优化目标的方式。而谈及优化目标,就绕不开一个在经典强化学习里极其核心的数学框架:马尔可夫决策过程(MDP)与贝尔曼方程。这套数学语言不只是学术黑话,它几乎是理解“Agent如何通过试错学会决策”的唯一严谨路径。
这篇文章想做的事很简单:把MDP和贝尔曼方程掰开揉碎,讲清楚它们到底是什么、为什么Agentic RL绕不开它们、以及在实际做Agent时,这些数学概念如何真正帮到你。适合正准备深入强化学习、或已经在做Agent训练但总感觉“哪里差点意思”的开发者。内容不追求教科书式的面面俱到,而是尽量贴近实操视角。
1. 为什么Agentic RL绕不开MDP这个数学骨架
Agentic RL这个概念最近经常出现,大意是让智能体(Agent)在复杂的多步任务里,通过强化学习自主学会使用工具、规划步骤、修正错误。听起来很酷,但你一旦真的去实现,就会碰到一个根本性问题:到底用什么形式来描述“Agent与环境的交互过程”?
你当然可以用普通的监督学习来做,比如把“状态到动作”当作一个简单的分类问题,给每一步打标签训练。但现实中的Agent任务往往没有标准答案,同一个状态,下一步做A还是做B,取决于它对长远结果的影响。只靠静态标签根本学不出这种“长远眼光”。于是你需要一个框架,让Agent能自己探索、自己感受后果、自己学到规律——这就是MDP派上用场的起点。
MDP提供了一套形式化接口,严格定义了五个要素:状态集、动作集、状态转移概率、奖励函数、折扣因子。你可以把它理解为一种“世界如何响应Agent”的契约。在这个契约下,Agent每个时刻观察当前状态,选择一个动作,然后环境给它一个新状态和奖励。整个过程循环往复,直到任务结束——或者干脆无限延续。
举一个很常见的Agent场景:智能客服机器人需要决定是先追问用户、还是直接检索资料、还是调用另一个后端工具。每个决定都改变“对话状态”,也会影响最终满意度。听着好像不需要什么数学,但当你试图训练它“在某个对话状态下,选哪个动作最有利”时——这个“最有利”意味着长期累积回报最大化——就不可避免地走到MDP的语言体系里来。
再往深一层说,MDP不只是“描述交互流程”的流程图。它最关键的贡献,是让“策略学习”(即Agent的行为规则学习)变成了一个可优化的数学对象。你可以定义一个策略函数,告诉Agent每个状态下选每个动作的概率;也可以定义一个价值函数,告诉Agent某个状态(或某个状态-动作组合)到底有多“好”。这两个函数都是可以求导、可以迭代、可以收敛的。没有这套数学化,所谓“Agent学会决策”只能停留在口头层面,你甚至说不清楚“学会了”到底是什么意思。
所以,我的观点很直接:如果你打算认真搞Agentic RL,MDP就是必须翻过的第一座山。它未必给你直接可调的代码,但它是所有后续算法的地基——无论你之后去看策略梯度、PPO还是Q-Learning,每个算法的每一步推导,本质上都在和MDP打交道。地基没打牢,后面学到的东西都是悬浮的。
2. 马尔可夫性:为什么“记忆”可以只保存在状态里
MDP里的“M”就是“马尔可夫”——这是整套框架最重要的假设,也是很多人初学时最容易忽略的地方。马尔可夫性的严格表述是:给定当前状态和当前动作,未来的状态只依赖于当前“这一刻”,与更早的历史无关。写成公式就是:
P(S_{t+1} | S_t, A_t) = P(S_{t+1} | S_t, A_t, S_{t-1}, A_{t-1}, ..., S_0, A_0)
翻译成人话就是:只要我知道了“你现在在哪、你选了做什么”,我不需要知道你是怎么来到这里的,就能预测你下一步会到哪。这像极了打扑克时的局面判断——高手只需要看当前桌面上的牌和手里的牌,不太需要回忆上上轮谁出了什么牌,因为那些信息已经反映在当前局面里了。
但这个假设放在Agent任务里,其实有点微妙。你的Agent在每一步看到的“状态”如果是“当前对话文本”,那它注定不满足马尔可夫性——因为对话是累积的,只看最后一条消息,根本不知道问题背景是什么。所以这就是一个工程上的惯用解法:把历史的关键信息压缩进状态表示里。你可以把最近几轮对话拼起来作为一个“状态”,也可以用一个记忆模块对历史做编码。换句话说,MDP不要求“世界本身是马尔可夫的”,只要求你构造的状态表示包含了足够信息,让“当前状态”在实用意义上能够代表全部历史。
在场的人可能会问:万一状态表示不够怎么办?遗留信息就成了“隐状态”,MDP建模就会出现偏差。这也是为什么我在实际做Agent时,经常花大量精力在状态设计上,而不是急着调RL算法。状态怎么构建、上下文怎么窗口化、工具返回的结果怎么融合,这些看起来“偏工程”的细节,本质都是在努力让问题更接近马尔可夫性。如果你发现某个Agent训练效果一直不稳定,第一步不要怀疑算法,先去怀疑状态表示有没有把关键信息兜住。
顺带说一句,马尔可夫性给强化学习带来的一个巨大计算优势是:它让“多步决策”可以用递归来解决。如果一个状态不依赖历史,那么你就可以从当前状态“向后看”一步来推导未来价值,不需要模拟整条轨迹的所有可能性。这正是贝尔曼方程能够成立的基石。没有马尔可夫假设,贝尔曼递归就等于空中楼阁。
3. MDP的五个零件:状态、动作、转移、奖励、折扣因子
MDP的形式化定义通常写成一个五元组:
(S, A, P, R, γ)
每个字母都不是抽象摆设,对应实际建模时你必须回答的问题。我结合Agent场景逐个拆一下。
状态空间 S:Agent可观测到的所有情况。在Agentic RL里,状态往往不只是“用户说了什么”,还包括工具返回结果、任务进度、剩余步数等。好的状态表示应该做到两点:信息充分(该知道的都在里面)和维度可控(不然学习复杂度爆炸)。
动作空间 A:Agent所有可选行为的集合。在LLM Agent场景里,动作可以是“调用检索工具”“执行某段代码”“直接生成最终回答”“请求用户补充信息”等。这些动作有的离散有的连续,有的还会携带参数,实践中经常要额外设计动作编码层,把“动作”映射成模型能输出的结构化内容。
状态转移概率 P:P(S_{t+1} | S_t, A_t)表示执行动作后,环境进入下一个状态的概率分布。这个转移可以是确定性的,也可以是随机的。在很多Agent任务里,环境不是一个可以严格建模的物理系统,而是由外部工具和用户反馈组成的“不可预测世界”,所以转移概率很难精确给出。这时候可以走“无模型”路线——不显式建模P,直接从与环境的交互数据中学习价值函数。后面说到的很多方法都假设P未知。
奖励函数 R:R(s, a, s')表示在状态下执行动作并转移到下一个状态后,Agent能获得的即时反馈。奖励是整套信号里最需要设计感的部分。给得稀疏,Agent学得慢;给得错误,Agent学会钻空子。做Agent时,奖励经常要拆成两部分:任务成功/失败的大奖,和中间步骤的小奖(比如工具调用是否合法、回答是否简洁)。这里要非常小心奖励与真实任务目标的一致性。
折扣因子 γ:一个0到1之间的数,决定未来奖励在当下决策中的权重。γ越接近1,Agent越有远见,愿意为长期回报牺牲一点眼前利益;γ越接近0,Agent越短视,只看重近在眼前的奖励。读者可以把γ理解成“耐心系数”。
用一个简单例子把五个要素串起来。假设你要开发一个“多步骤问答Agent”:状态是当前用户问题+已检索到的若干文档摘要,动作是“继续检索”或“直接回答”,转移概率就是你执行动作后,系统返回新文档或结束任务的可能性,奖励是最后答案被用户点“满意”(+1)或“不满意”(-1),中间每次检索动作给一个很小的负奖励用来惩罚冗余步骤。这样一来,Agent要学的就不是“这一步怎么回应”,而是“做几步检索、什么时候收手,才能最大化长期满意度”。
下面这张表格可以直观对照每个符号在Agent场景里的落点:
| 符号 | 数学含义 | Agent场景举例 |
|---|---|---|
| S | 状态集合 | 用户问题 + 检索结果摘要 + 历史对话窗口 |
| A | 动作集合 | 调用搜索、查询数据库、直接作答、请求澄清 |
| P | 状态转移概率 | 执行某个动作后,新文档/新反馈出现的分布 |
| R | 奖励函数 | 最终答案获得好评 +1,调用无效工具 -0.1 |
| γ | 折扣因子 | 贴近0.95,鼓励Agent考虑后续步骤的长期效果 |
4. 回报与价值函数:先搞清学习目标是什么
有了MDP五件套,下一步就是定义Agent的“学习目标”。这里有个很容易被绕进去的点:到底应该最大化每一步的即时奖励,还是最大化整段轨迹的累积奖励?
答案是后者——Agent要优化的不是某一步的爽快感,而是从当前时刻开始,未来所有奖励的打折总和。这个累计量就是回报(Return),记作G_t:
G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ... = Σ_{k=0}∞ γ^k R_{t+k+1}
为什么需要折扣因子?直觉上有两个理由:第一,现实中的不确定性让远期奖励变得不可靠,今早拿到的一块钱比明年承诺的一块钱更值钱;第二,数学上有了γ<1,无限时间跨度下的回报也不会发散,可以保证收敛。而在Agent训练里,γ还承担着“控制远见”的作用:一个做复杂项目规划的Agent,你希望它为了最终交付愿意多折腾几步,那就得把γ设得高一些;如果你只关心它“这一轮回答是否正确”,那γ设低一点也没问题。
但直接拿回报当学习目标还有个麻烦:回报是随机变量,因为环境转移有随机性,策略也有随机性。你没法直接优化一个随机数。于是我们需要一个“稳定”的指标:价值函数。
价值函数有两种常见形态。一种是状态价值函数:
V^π(s) = E_π[G_t | S_t = s]
它表示在策略π控制下,从状态s出发,Agent能得到的期望回报。另一种是动作价值函数:
Q^π(s, a) = E_π[G_t | S_t = s, A_t = a]
它表示在状态s下先采取动作a、之后再遵循策略π,能得到的期望回报。Q函数在很多现代RL算法里几乎“C位出道”,因为它能直接回答一个问题:“当前状态下,哪个动作预期收益最高?”而V函数更像是“对所处状态本身好坏”的评分。
这里有一个新手经常混淆的点:V函数和Q函数看起来只差一个“是否指定动作”,但实际上它们回答的问题完全不同。V(s)是“我现在身处这个状态,平均而言混得怎么样”;Q(s, a)是“我在此状态,如果让我选某个具体动作,结果如何”。两者之间存在自然的关系:
V^π(s) = Σ_a π(a|s) Q^π(s, a)
也就是说,状态价值是当前策略下所有动作价值的概率加权平均。如果你找到了一个策略,它总是选择Q值最大的动作,那么这个加权平均就会大于等于之前的策略——这就是策略改进思想最朴素的内核。
在Agentic RL实践里,价值函数还有一个额外的工程意义:它常常被用来当“奖励信号”的替代品或降方差工具。因为单条轨迹的累计回报噪声很大,而价值函数是一个期望值,方差更小。很多训练管线虽然最终优化的是策略,但内部一定会隐式地估计一个价值函数,用来告诉模型“你现在卡在哪个状态的预期回报道了哪一步”。理解了这一点,你看那些RL框架代码时就不会觉得“为什么要训练一个Critic”是玄学了。
5. 贝尔曼方程推导:从递归到闭式解
价值函数定义看起来很舒服,但你不会真的把无穷项奖励加出来算期望。这里就轮到贝尔曼方程登场——它把“从某状态开始的期望回报”改写成了“当前即时奖励 + 下一状态的期望回报”,从而形成一个递归式。
推导过程不复杂。先从回报定义出发:
G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ...
你可以把从第二项开始的所有项提一个γ出来:
G_t = R_{t+1} + γ( R_{t+2} + γR_{t+3} + ... ) = R_{t+1} + γG_{t+1}
这个递推极其优美:整体回报等于当前奖励加上打折扣后的未来回报。把这个关系代进状态价值函数的定义:
V^π(s) = E_π[G_t | S_t = s] = E_π[R_{t+1} + γV^π(S_{t+1}) | S_t = s]
更完整地展开,如果策略π、转移概率P、奖励函数R都已知:
V^π(s) = Σ_a π(a|s) Σ_{s'} P(s'|s,a) [ R(s,a,s') + γ V^π(s') ]
这就是贝尔曼方程。它告诉我们:当前状态的价值,可以由“所有可能动作带来的即时奖励”加上“可能转移到的下一个状态的价值期望”来推算。这个递归表达式把原来“无穷轨迹的期望”压缩为“一步期望 + 递归调用”,计算结构大大简化。
动作价值函数的贝尔曼方程同理:
Q^π(s, a) = Σ_{s'} P(s'|s,a) [ R(s,a,s') + γ Σ_{a'} π(a'|s') Q^π(s', a') ]
区别只是多了一个对外层动作a的显式依赖:进入s'之后,模型还要按策略π挑选下一个动作a',再对应到Q值。
随便翻一本RL教科书,很大篇幅都在讨论怎么求解这个方程。为什么?因为方程里V^π的未知量在当前方程两边同时出现——右端的期望依赖于V^π(s'),而V^π(s')本身又是另一个未知状态的价值。把N个状态的价值写成一个N元线性方程组,理论上可以解出精确值。但状态量一大,直接求解根本不现实,于是就有了动态规划、时序差分、函数近似等一系列方法。这时候再回头看贝尔曼方程,你就会明白:它不是一条“一步到位的结论”,而是一个帮你把问题拆成可迭代结构的脚手架。
下面用一个极简手工例子验证一下直觉。假设Agent只有两个状态:s1表示“已经收集到关键信息”,s2表示“信息缺失”。在s2选择动作a1(先检索)以概率0.8进入s1并获得即时奖励0,以概率0.2原地不动;在s1选择动作a2(直接作答)必然结束并获得奖励+10。设定γ=0.9,那么V(s1) = 10(结束,没有未来)。再看V(s2),如果策略总是选a1:
V(s2) = 0.8 × [0 + 0.9 × V(s1)] + 0.2 × [0 + 0.9 × V(s2)]
代入V(s1)=10,得V(s2) = 7.2 + 0.18 × V(s2),于是V(s2) = 8.78。这个例子说明:即便现在还没拿到奖励,Agent也能通过“未来的V(s1)”感知到s2的价值——这就是贝尔曼方程把“远见”数学化了。实际调模型时,这种手算练习特别能帮助建立直觉,强烈建议初学者自己在纸上推几个类似的小环境。
6. 贝尔曼最优方程:让价值函数指向最佳策略
上一节的价值函数都依赖一个给定的策略π——策略一旦换,价值也会变。但Agentic RL真正想要的,是找出一个让回报最大化(或者说让V和Q尽可能高)的策略。这个“最优策略”对应的价值函数被称为最优价值函数,满足的是贝尔曼最优方程。
先看状态价值版本。既然我们可以在每个状态下自由选择动作,自然应该选那个能让后续价值最大的动作。因此:
V*(s) = max_a Σ_{s'} P(s'|s,a) [ R(s,a,s') + γ V*(s') ]
关键在于:这个max取代了之前对所有动作按策略π取期望的做法。也就是说,最优策略会把所有概率集中在最好的动作上(如果有多个好动作,可以任意分配它们之间的概率)。V*是所有策略下可以达到的最高价值上限。
动作价值的最优贝尔曼方程也顺理成章:
Q*(s, a) = Σ_{s'} P(s'|s,a) [ R(s,a,s') + γ max_{a'} Q*(s', a') ]
为什么这里用max_{a'}而不是对a'求期望?因为你从状态s'出发,接下来应该选对Q来说最大的动作。这个方程看起来更复杂,但它有个巨大优势:只要知道Q,最优策略可以直接“读取”出来——
π*(s) = argmax_a Q*(s, a)
这意味着策略提取不再需要额外计算。这也是为什么很多RL算法宁可估计Q函数而不直接估计V函数的原因。Deep Q-Network及其变体,本质上就是用一个深度网络去逼近Q*,然后用argmax来决定动作。
在实际Agent训练中,贝尔曼最优方程还承担了“自举”的职责。你可以用当前Q网络的预测值更新标签,让Q值一点点逼近Q*。这里有个常见陷阱:max操作天然偏好乐观估计,容易导致Q值被高估,偏离真实情况。所以后来才有各种“减小过估计”的改进技巧,比如用两个Q网络互相约束。这些细节的源头,归根结底都藏在贝尔曼最优方程的“max”里——理解了max带来的偏置,你就理解了为什么那些工程技巧存在。
再回到Agent场景举个例子。一个Agent面对用户提问,可以选择快速回答(动作a1)或先检索两个来源再回答(动作a2)。如果只优化即时奖励,快速回答可能因为“快”而拿到即时好评;但最优贝尔曼方程会考量:快速回答之后,如果答案不准确,用户在后续追问中会不满,一连串的负面反馈会拉低总回报;而先检索虽然慢了一点,但最终答案更可靠,顾客满意概率更高。V和Q就是这样一个把所有后续后果都“折叠”回当前动作选择的价值体系。不做这种“长远预期”的话,Agent永远只能做短期应激。
7. Agentic RL建模实战:那些书上不会写的取舍细节
理论部分告一段落,接下来聊聊我在真实Agent项目里应用MDP和贝尔曼方程时踩过的坑和琢磨出来的经验。这些细节教科书不太会写,但对实操的成败影响很大。
坑一:一步的粒度怎么定?
MDP本身对“一步”没有规定,但实际建模时,一步是“调用一次工具”还是“完整处理一个子任务”,会极大影响训练难度。如果步子太细,转移次数多、方差大、奖励累积路径长;如果步子太粗,价值函数很难对过程做细粒度指导。个人的经验是:开始尽量用中等粒度,比如把“一次工具调用+一次结果吸收”定为一个步。等基础策略稳定了,再尝试拆细或者合并,让Agent自己学会流程控制。
坑二:奖励信号要“即时但诚实”。
Agent任务天然存在奖励稀疏的问题——最终成功或失败往往只在最后一刻发生,前面的很长一段都没有明确反馈。贝尔曼方程虽然理论上可以把终极奖励往回传播,但需要大量交互和更新次数。实操里我习惯在中途加入一些轻量信号:比如“是否做出了合理检索”(二分类微弱奖励)、“是否有重复动作”(小惩罚)等。注意这类信号要对齐最终目标,否则Agent会“刷中间信号”而不解决真实任务——这种钻空子行为在Agent里比在游戏环境更常见,因为动作空间和状态语义更复杂,漏洞也更多。
坑三:γ的调整不能拍脑袋。
γ越高,Agent越愿意为远期回报付出努力,但价值函数估计方差也会随之变大,训练收敛变慢。我见过一些项目为了“让Agent有远见”,直接把γ调到0.999,结果价值网络怎么训都很难收敛。一个实用策略是:先用一个中等偏高的γ(比如0.95)跑通整个训练流程,再根据需求微调;如果你想鼓励Agent“快速解决问题”,甚至可以把γ降到0.9以下,让它更重视近期反馈。
坑四:真实环境往往不是“单智能体MDP”。
多Agent协同、部分可观测、动态环境变化等,都会突破标准MDP的边界。但即便这些场景,你在训练单个Agent时仍然可以先把它单独建模成一个MDP试试——把其他Agent的行为当作环境的一部分,隐式并入转移概率。这个近似可能不精确,但常常能跑出意想不到的可用效果。先跑通简化版本,再逐步放开复杂度,是我的习惯路径。
另外,还有一个常常被低估的点:状态的特征表示。贝尔曼方程虽然优美,但要真正发挥作用,你的价值函数得能从“状态表示”里学到东西。如果状态是原始文本或高维工具输出,即便有完备的贝尔曼方程,也几乎没有价值网络能直接拟合。实践中我会做一层状态压缩:把用户意图、检索结果摘要、任务进度等离散成结构化特征,再喂给价值网络。这个预处理的好坏,往往比算法选择更决定训练效果。用一句话概括就是:先让状态“可学习”,再让价值“可递归”。
如果你真的想提高Agentic RL的实际效果,个人建议不要急着上大规模分布式训练,而是先用一个小型环境完整跑通“收集轨迹 → 估计价值 → 改进策略”的闭环,把手推贝尔曼方程得到的直觉和实际训练曲线对照起来。这个习惯让我在后来处理复杂Agent任务时,能够快速定位问题到底出在奖励设置、状态表示,还是γ选择上。数学模型的用处,正在于它给了你一张“故障排查地图”。