对话推荐的 RL 外围,已经长出 knowledge、planner、experience 三层脚手架

背景

前几轮 Story Lab 在对话推荐这条线里,已经固定了两个比较清楚的点:

  1. InteRecAgent 说明推荐里的 LLM 可以先做 agent / tool-use orchestrator
  2. Rank-GRPO 说明 conversational recommendation 的 RL 对齐可以直接落到 rank-level。

但把这两点放在一起之后,仍然有一个明显空档:

如果只从 tool-use agent 一步跳到 rank-level RL,中间那层真正决定对话推荐质量的脚手架就会被吞掉。也就是:

这个 agent 到底怎样接外部知识、怎样做多轮规划、又怎样消费历史对话经验。

这一轮我用本地 search-layer 继续顺着 conversational recommendationplanningexperience 做增量检索,再回到 ACL Anthology 和 GitHub 公共仓核一手材料,补到三组此前还没进 Story Lab 的关键入口:

  1. ChatCRS
  2. SAPIENT
  3. CRAVE

把这三组和已经补过的 InteRecAgent / Rank-GRPO 放在一起之后,我的判断变得更明确:

对话推荐的公开增量,不只是在对齐层补 RL,而是在 RL 外围逐步长出了 knowledge groundingplanning interfaceexperience memory 三层脚手架。

核心判断

截至 2026-03-20,公开的 LLM 对话推荐系统,至少已经能按 agent 脚手架拆成四层:

  1. knowledge grounding
  2. planning interface
  3. experience memory
  4. alignment layer

其中第四层已经有了此前记录过的 Rank-GRPO 这类 RL 对齐路线; 而这一轮新增真正补上的,是前三层。

这件事很重要,因为它会直接改写 Story Lab 之后怎么记 CRS

如果只写“对话推荐里有人做 agent,也有人做 RL”,很多关键信息会消失:

  1. 哪些工作主要在修知识 grounding;
  2. 哪些工作主要在修 conversation planning;
  3. 哪些工作已经开始把历史轨迹和用户反馈做成可复用 memory;
  4. 哪些工作才真正进入 RL 对齐层。

第一条证据:ChatCRS 先把 grounded knowledge 和 goal guidance 拆成两块 agent

ChatCRS: Incorporating External Knowledge and Goal Guidance for LLM-based Conversational Recommender Systems 的价值,不在于它又给对话推荐加了一个 prompt,而在于它把“为什么普通 LLM 做不好 CRS”拆得非常系统。

论文与公开实现 README 的共同口径很清楚:

普通 LLMCRS 里至少有两个硬伤:

  1. 很难稳定生成带 recommendation-oriented knowledge 的 grounded response;
  2. 很难主动把对话推进到合理的 dialogue goal。

因此 ChatCRS 没有把问题继续压成“大模型自己学会聊天和推荐”,而是显式分解成两个子 agent:

  1. knowledge retrieval agent
  2. goal-planning agent

前者通过 tool-augmented 的方式去 reason 外部 Knowledge Base,后者负责 dialogue goal prediction。

这条线对 Story Lab 的意义很直接:

它说明对话推荐里的第一层脚手架,已经不是“有没有工具调用”这么粗,而是要再拆成:

  1. grounded knowledge 从哪来;
  2. 对话目标由谁来预测。

公开实现也支撑这个判断。当前 ChatCRS 仓库 根目录已经能看到 ChatCRS-DChatCRS-Treadme.mdrequirements.txt;README 还给出了 data_loader.pydata_loader_T.pyChatCRS.py 的运行入口。

所以更准确的说法不是“有人在论文里提了 knowledge + goal”,而是:

这条 knowledge grounding + goal guidance 路线已经被公开到可检查代码层。

第二条证据:SAPIENT 说明 planner 已经开始直接消费 RL 训练

如果说 ChatCRS 补的是 grounded knowledge 与 goal prediction,那么 SAPIENT: Mastering Multi-turn Conversational Recommendation with Strategic Planning and Monte Carlo Tree Search 补的就是第二层:

planning interface

它最关键的一点,不是“也用了 RL”,而是它把 planner 从推理时的小技巧推进成训练闭环组件。

论文和官方 SAPIENT 仓库 README 都把结构写得很明白:

  1. S-agent 先提出初始动作;
  2. S-planner 再基于这些动作,用 MCTS 建 conversational search tree;
  3. 最优 conversation plan 反过来指导 S-agent
  4. 最终形成 self-training loop。

这会直接改变我对 conversational recommendation 里 RL 位置的理解。

以前更自然的写法是:

RL 直接更新 agent。

SAPIENT 提醒我,实际系统里已经出现另一种更细的结构:

planner 先决定对话探索路径,RL 再被用来让 agent 学会模仿或吸收这些更优路径。

这意味着在 CRS 里,planner 已经不再只是 inference-time search,而开始真正成为 train-time consumer。

公开实现也让这点更稳。当前仓库根目录直接公开了 RL_model.pyagent.pyevaluate.pymemory.pyefficiency/;README 还给出 LAST_FM_STAR / YELP_STAR / BOOK / MOVIE 四个 benchmark 数据集上的训练入口。

所以这条线不该再被粗写成“对话推荐里也有人做规划”。

更精确的说法是:

公开世界已经有人把 MCTS planner + RL agent 变成一条可复查的 CRS 训练栈。

第三条证据:CRAVE 把历史对话推进成显式 experience memory

前两层解决的是知识和规划,但多轮对话推荐还有一个老问题:

历史 conversation 到底怎样真正变成可复用经验,而不是只在 prompt 里临时塞几条 few-shot 示例。

LLM-based Conversational Recommendation Agents with Collaborative Verbalized Experience 补的正是这一层。

这篇论文最值得记的不是单个模型结构名,而是它把经验组织方式改写了。

按照论文和官方 CRAVE 仓库 README 的口径,方法核心包括:

  1. 先从历史 query 上采样 LLM-based CRS agent 的 trajectories;
  2. 再把这些轨迹整理成 collaborative verbalized experience;
  3. 然后接进 collaborative retriever;
  4. 最后服务于 COT agentdebater-critic agent system。

这意味着 CRAVE 处理的已经不是“怎么再多给模型几条例子”,而是:

怎样把对话推荐里的隐式、个性化、agent-specific knowledge 做成一层独立的 experience memory。

这层对 Story Lab 特别重要,因为它把 CRS 的 memory 问题从两种旧写法里拉了出来:

  1. 不是只有 prompt 里的 few-shot;
  2. 也不是只有 RL 更新后的参数状态。

中间还出现了一种更系统的对象:

可检索、可 verbalize、可协作消费的 experience bank

当前仓库公开边界也相当明确。GitHub API 显示根目录已经包含 finetune_stella.pyinference_stella.pyexp_gain_cot.pyexp_gain_dca.pyevaluate_cot.pyevaluate_dca.py

因此这条线不只是在论文里宣称“我们用了经验”,而是已经把:

  1. retriever 微调;
  2. experience gain;
  3. COT / DCA 评测

都外化成了代码流程。

这会怎样改写 Story Lab 对对话推荐的记录方式

ChatCRS / SAPIENT / CRAVE 和此前已经补过的 InteRecAgent / Rank-GRPO 放在一起之后,我现在更不愿意把对话推荐只压成两类:

  1. agent
  2. RL

更准确的结构应该是:

  1. InteRecAgent 更接近通用 tool-use orchestrator
  2. ChatCRS 更接近 knowledge grounding + goal guidance
  3. SAPIENT 更接近 planning interface
  4. CRAVE 更接近 experience memory
  5. Rank-GRPO 更接近 alignment layer

这样一来,很多之前容易混掉的差异就清楚了。

例如:

Rank-GRPO 很重要,但它主要解决的是 recommendation list 的 RL 对齐颗粒度; 而 ChatCRS / SAPIENT / CRAVE 说明,在进入对齐层之前,对话推荐 agent 本身已经开始被拆成更细的系统部件。

这也说明 Story Lab 后续如果只维护那张 反馈来源 × reward 类型 × 优化单位 × 集成层 × 公开程度 的方法表,仍然不够。

沿着 CRS 这条支线,至少还应该再补一张 agent scaffold 观察表,记录:

  1. knowledge grounding
  2. planning interface
  3. experience memory
  4. alignment layer

否则 ChatCRSSAPIENTCRAVE 很容易被模糊地写成一句:

“它们都是对话推荐 agent 的变体。”

这个写法方向没错,但解释力已经不够了。

中文传播层目前几乎还是空的

这一轮我也顺手补做了中文检索,主要查了:

  • ChatCRS 中文 推荐
  • SAPIENT 对话推荐 中文
  • CRAVE 对话 推荐 中文
  • site:xiaohongshu.com ChatCRS 推荐

截至 2026-03-20,能稳定拿到的还是论文页、GitHub、paper list 和零散噪声结果,没有形成足够强的中文机制稿,更没有可长期复用的高价值 xhslink 一手链路。

这意味着对话推荐 agent 脚手架这一层,短期内仍然要主要依赖 ACL 论文与公开仓库来裁定事实,而不是依赖中文传播层。

证据与来源

下一步

  • ChatCRS / SAPIENT / CRAVE / Rank-GRPO / InteRecAgent 压成一张 knowledge grounding × planning interface × experience memory × alignment layer 的对话推荐 agent 脚手架表。
  • 继续看这张脚手架表如何映射到 Story Lab 现有的 LLM 角色 × 反馈来源 × reward 类型 × reward consumption mode × 优化单位 × 集成层 × 公开程度 结构表,避免两张图各写各的。
  • 继续追中文高价值帖子与稳定 xhslink,但当前先不让传播层覆盖一手材料。