从经验中学习:RL 与 LLM 上下文学习的对比


文档摘要

源文件:chapter1/learning-from-experience/README.md 从经验中学习:RL 与 LLM 上下文学习的对比 本实验对比传统强化学习(Q-learning)与基于 LLM 的上下文学习(in-context learning),复现 Shunyu Yao 博文 "The Second Half" 中的核心洞见。 🎯 实验概览 实验展示了 LLM 如何通过推理进行泛化,而传统 RL 方法需要大量训练才能学会游戏机制。我们使用一个带有隐藏机制的文字寻宝游戏,让 Agent 通过经验来发现这些机制。

源文件:chapter1/learning-from-experience/README.md

从经验中学习:RL 与 LLM 上下文学习的对比

本实验对比传统强化学习(Q-learning)与基于 LLM 的上下文学习(in-context learning),复现 Shunyu Yao 博文 "The Second Half" 中的核心洞见。

🎯 实验概览

实验展示了 LLM 如何通过推理进行泛化,而传统 RL 方法需要大量训练才能学会游戏机制。我们使用一个带有隐藏机制的文字寻宝游戏,让 Agent 通过经验来发现这些机制。

待验证的关键洞见

  1. 样本效率:LLM 能从比传统 RL 少得多的样本中学习
  2. 泛化能力:LLM 通过推理理解模式,而 RL 只能记住“状态-动作”映射
  3. 先验知识:语言预训练为推理新任务提供了强大的先验
  4. 隐藏机制的发现:LLM 能提出假设并加以验证,而 RL 需要穷举式探索

你将看到什么

运行 LLM 实验时,你会看到完整的决策过程

============================================================ LLM DECISION PROCESS ============================================================ 📊 Experiences in memory: 15 🎮 Current room: hallway 🎯 Available actions: 8 💡 Recent successful patterns learned: • take red key → +5.0 reward • try crafting → +10.0 reward 🤔 LLM is thinking... 📝 LLM Reasoning: ---------------------------------------- Based on my past experiences, I've learned that: 1. The red key opens the locked door to the guard room 2. Crafting rusty sword + magic crystal creates a silver sword 3. The silver sword can defeat the strong guard Since I have the silver sword and I'm in the hallway... ---------------------------------------- ✅ Chosen action: go north

这种透明度精确展示了 LLM 如何学习与推理,而 Q-learning 则是典型的黑盒!

🎮 游戏

一个文字版寻宝游戏,Agent 必须:

  • 在多个房间之间穿行
  • 收集物品与钥匙
  • 用合适的武器击败守卫
  • 通过经验发现隐藏机制

隐藏机制(不对 Agent 透露)

  1. 颜色对应锁:特定颜色的钥匙开对应的门
  2. 武器有效性:不同武器对付不同敌人
  3. 合成系统:某些物品可组合成更好的物品
  4. 药水效果:喝下药水后获得临时能力

🚀 快速开始

安装

# Navigate to the project directory cd chapter1/learning-from-experience # Install dependencies pip install -r requirements.txt

对应书中实验 7-1(Q-learning 在寻宝游戏中的表现)实验 7-2(传统 RL 与 LLM Agent 的对比研究)
Q-learning 部分完全离线运行、无需任何 API Key;LLM 部分需要 Moonshot/Kimi API Key。

配置 Kimi K3 API

要运行 LLM 实验,你需要一个 Kimi(Moonshot)API Key:

  1. Moonshot AI 获取 API Key
  2. 设置环境变量:
export MOONSHOT_API_KEY="your-api-key-here"

或创建 .env 文件:

echo "MOONSHOT_API_KEY=your-api-key-here" > .env

通用兜底(OpenRouter):若未设置 MOONSHOT_API_KEY 但设置了 OPENROUTER_API_KEY
LLM 部分会自动改走 OpenRouter。由于 Kimi 模型在 OpenRouter 上不稳定可用,兜底时会使用
OPENROUTER_MODEL(默认 openai/gpt-5.6-luna):

export OPENROUTER_API_KEY=sk-or-v1-your-key-here python quick_demo.py # MOONSHOT_API_KEY 缺失时自动经 OpenRouter 运行

运行实验

快速 Demo(直观感受 LLM 的学习过程)

python quick_demo.py

这会详细展示 LLM 如何通过推理学习,包括:

  • 每次决策的完整思考过程
  • 经验如何累积并影响后续决策
  • 与传统 RL 在学习速度上的巨大差异

命令行界面(experiment.py

experiment.py 现在提供带中文帮助的完整 CLI。查看所有参数:

python experiment.py --help

主要参数:

参数 说明 默认值
--mode {both,qlearning,rl,llm} 运行哪种智能体:qlearning/rl 只跑 Q-learning(离线)、llm 只跑 LLM Agent、both 两者对比 both
--rl-episodes Q-learning 训练局数(实验 7-1 用 10000) 10000
--llm-episodes LLM Agent 训练局数 20
--eval-episodes Q-learning 训练后贪婪评估局数 100
--checkpoint-interval 学习曲线采样间隔(每 N 局记录一次胜率/Q 表规模) 1000
--model LLM 模型名(也可用 MOONSHOT_MODEL 环境变量) kimi-k3
--output 结果输出目录 results
--seed 随机种子,用于复现 Q-learning 学习曲线 不固定
--learning-rate / --discount / --epsilon-decay / --epsilon-min Q-learning 超参数 0.2 / 0.99 / 0.9995 / 0.1
--stochastic 使用随机环境 确定性
--skip-llm 兼容旧用法,等价于 --mode qlearning

仅 Q-Learning(实验 7-1,离线,无需 API)

python experiment.py --mode qlearning --rl-episodes 10000 --seed 42

训练不到 3 秒即可完成,并打印学习曲线表格,直观展现智能体如何在近万局试错中从
0% 胜率逐步学会通关(见下方"Experiment Results")。

完整对比(RL vs LLM,实验 7-2)

python experiment.py --mode both --model kimi-k3

该命令会:

  1. 训练一个 Q-learning Agent 共 10000 局(约 3 秒)并打印学习曲线
  2. 训练一个 LLM Agent 共 20 局,并详细展示推理过程
  3. 评估两个 Agent
  4. 生成对比图
  5. 把结果保存到 results/ 目录

注意:LLM 训练会完整展示前 3 局和最后 1 局的推理过程,让你看清它到底是怎么学的!每局 LLM 推理约需 1–2 分钟(真实 API 调用),与实验 7-2 中讨论的成本权衡一致。

仅 LLM

python experiment.py --mode llm --llm-episodes 20

交互式游玩

手动测试游戏:

from game_environment import TreasureHuntGame game = TreasureHuntGame() print(game.get_state_description()) print("Available actions:", game.get_available_actions()) # Try an action feedback, reward, done = game.execute_action("take rusty sword") print(f"Feedback: {feedback}") print(f"Reward: {reward}")

📊 实验结果

实验会生成多份产出:

对比指标

  1. 样本效率

    • 达到良好表现所需的局数
    • 学习速度对比
  2. 表现

    • 评估时的胜率
    • 平均奖励与局长度
  3. 计算成本

    • 训练时间
    • 内存占用(Q 表大小 vs. 经验存储)
    • LLM 的 API 调用次数

可视化

实验会生成对比图,展示:

  • 随时间推移的学习曲线
  • 胜率的提升过程
  • 样本效率对比
  • 关键洞见小结

预期结果

Q-Learning 学习曲线(本机实测,--mode qlearning --rl-episodes 10000 --seed 42

实测学习曲线(确定性环境,胜率按最近 1000 局滑动窗口统计,整段训练约 3 秒):

Episodes Victory rate Q-table states epsilon
1000 0.1% 124 0.606
2000 0.0% 129 0.368
3000 0.0% 130 0.223
5000 0.0% 132 0.100
7000 0.0% 138 0.100
8000 0.0% 140 0.100
9000 9.3% 143 0.100
10000 99.8% 143 0.100

训练后贪婪评估(--eval-episodes 100)胜率为 100%,平均 15 步通关。这正是实验 7-1
的核心现象:前 8000 局几乎 0% 胜率、只在盲目探索,价值信号需要近万局试错才传播到位。
(因随机探索有方差,未固定 --seed 时各次运行的拐点会略有不同,但整体形态一致。)

RL vs LLM(实验 7-2 的对比结论)

  • Q-Learning:需要近 10000 局才达到稳定通关;把"门/钥匙/剑"当作无意义符号,只能靠统计式暴力探索。
  • LLM In-Context:携带预训练先验,往往第一局就能在十几步内通关;靠推理理解游戏概念结构。
  • Sample Efficiency:LLM 的样本效率高出 2-3 个数量级;但单局推理慢(API 调用 ~1-2 分钟),
    Q-learning 跑 10000 局只需约 3 秒——权衡取决于交互成本,详见书中实验 7-2。

🏗️ 项目结构

learning-from-experience/ ├── game_environment.py # Text-based game with hidden mechanics ├── rl_agent.py # Q-learning implementation ├── llm_agent.py # LLM with in-context learning ├── experiment.py # Main experiment runner ├── requirements.txt # Python dependencies ├── README.md # This file └── results/ # Experiment outputs (created on run) └── [timestamp]/ ├── rl_agent.pkl # Trained Q-learning agent ├── llm_experiences.json # LLM's collected experiences ├── experiment_results.json # Numerical results └── comparison_plots.png # Visualization

🔬 技术细节

Q-Learning Agent

  • 算法:表格型 Q-learning,ε-贪婪探索
  • 状态表示:房间、背包与游戏状态的组合哈希
  • 学习率:0.2(可通过 --learning-rate 配置)
  • 折扣因子:0.99(可通过 --discount 配置)
  • 探索:ε 起始为 1.0,按 --epsilon-decay(0.9995)衰减到 --epsilon-min(0.1)

LLM Agent(Kimi K3)

  • 模型kimi-k3(Kimi K3;可用 --modelMOONSHOT_MODEL 覆盖)
  • 推理模型:Kimi K3 会在最终回答(message.content)之前先输出一段思维链
    message.reasoning_content),因此代码使用较大的 max_tokens=2048,确保
    ACTION: 行不会被推理预算截断。
  • 学习方法:带经验记忆的上下文学习(最多保留 50 条经验)
  • 上下文管理:存储成功与失败的经验
  • 推理:在行动前提示 LLM 先就过往经验进行推理
  • temperature:请求值 0.7,但推理模型(Kimi K3、GPT-5)只接受
    temperature=1,因此代码会对这类模型自动强制为 1(见 _reasoning_safe_temperature

📈 扩展实验

进一步研究的方向

  1. 换游戏:尝试其他带隐藏机制的游戏
  2. 混合方法:将 RL 与 LLM 引导相结合
  3. 迁移学习:测试 Agent 迁移到相似游戏的能力
  4. 消融研究:移除推理提示以隔离其影响
  5. 其他 LLM:对比不同的语言模型

修改游戏

编辑 game_environment.py 来:

  • 增加新房间和物品
  • 设计更复杂的隐藏机制
  • 调整难度与奖励
  • 加入新型谜题

🎓 教学价值

本实验展示了:

  1. 先验的力量:语言预训练如何提供有用知识
  2. 推理 vs. 记忆:两种不同的学习路径
  3. 样本效率:为什么它在真实应用中如此重要
  4. "下半场"论题:从"我们能不能解决它?"转向"我们解决得多高效?"

📚 参考文献

🤝 参与贡献

欢迎:

  • 为游戏加入新的隐藏机制
  • 实现其他 RL 算法(DQN、PPO 等)
  • 尝试不同的 LLM 提供方
  • 设计更精细的评估指标

📝 许可证

本项目用于教学目的,灵感来自 AI 与强化学习领域的学术研究。


作者与出处
原作者: bojieli
来源:bojieli
许可证:Apache-2.0
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: bojieli 转发
评论区 (0)
U