RECAST:让模型学会“算出正确的上下文”,而不只是检索上下文

  • 关联论文:2610.10507
  • 作者:flyP
  • 更新:2026-10-09

一句话结论

RECAST 把 RAG 的“找材料”升级为“主动构造证据”:轻量 RouterLM 在多轮决策中选择检索或计算操作,必要时让 CompilerLM 临时生成代码,直到它判断证据充分,再交给冻结的 AnswerLM 作答。

解决什么真问题

传统 RAG 默认“答案所需证据已经以可直接检索的形式存在于某个片段中”。但在财报表格、数据库、层级表和多跳文档任务里,真正需要回答的证据往往并不存在于单一记录中。

例如,源数据只有各月 revenue 和 operating income,问题却是“哪个三个月区间的 operating margin 增幅最大”。仅靠向量检索或 BM25,只能把相关行找出来,不能可靠完成口径统一、利润率计算和区间比较。此时真正要解决的不是“检索哪一个 chunk”,而是:

  1. 应该查原始记录、查派生结果,还是执行计算?
  2. 操作应该作用于哪些记录?
  3. 计算后的哪些中间结果需要保留?
  4. 返回结果是否足以支持最终答案?
  5. 失败或证据不足时,下一轮该换操作、补数据,还是停止?

RECAST 的关键判断是:context construction 不只是 selection,还包括 transformation。系统要学的是一条“证据构造策略”,而不只是 query rewriting。

核心方法

给定自然语言任务 q 和异构源集合 X,论文把流程写成:

[ E=G_\theta(q,X),\qquad y=F_{ans}(q,E) ]

其中,Gθ 是可学习的证据构造器,E 是最终证据,F_ans 是冻结的 AnswerLM。目标是在不把整个 corpus 塞进 prompt 的情况下,构造紧凑且足以支持答案的 E。

整个系统包含三个角色:

  • RouterLM:负责决策、参数化操作和判断何时停止,也是唯一训练的角色。
  • CompilerLM:冻结,把 RouterLM 提出的定制操作说明编译为可执行 Python。
  • AnswerLM:冻结,只在 RouterLM 接受证据后生成最终答案。

1. 统一异构 source

RECAST 用确定性的 rule-based preprocessor,把文档、dataframe、层级表、财务报告、用户记录等转换为统一记录列表,并生成紧凑的 source profile。profile 只描述数据规模、结构和字段等信息,让 RouterLM 无需一次读取完整 corpus,也能判断有哪些操作空间。

这很重要:跨 source 泛化不能只靠大模型临场理解格式,而要先建立稳定的操作接口。

2. 三类 primitive operation

RouterLM 每轮可选择三类内建操作:

  • Lexical:用 BM25 做词项匹配,适合名称、编号、精确术语;
  • Semantic:用 BGE-M3 embedding 与 cosine similarity 排序,适合同义表达和语义检索;
  • Relational:执行只读 SQL,支持 filter、join、group by、aggregation、sort 和 arithmetic,适合关系筛选与统计计算。

RouterLM 不只是选择操作名,还要填写 operation arguments。例如搜索 query、返回数量、SQL,或者把本轮范围限制到上一轮发现的 records。这里真正学习的是一个“操作格式化策略”,而非简单分类器。

3. SYNTHESIZE:按任务合成操作

当 primitive 不够用时,RouterLM 可发出 SYNTHESIZE。它必须说明:要执行什么变换、使用哪些 evidence 或 source identifiers、最终应返回什么证据,以及为什么现有 primitive 不足。

CompilerLM 接收到 operation specification、source profile、source samples 和先前 operation outcomes,一次性生成 Python 程序。程序可以扫描完整 source、使用既有 evidence,也可再次调用 primitive。执行结果无论是证据还是错误,都返回 RouterLM。

因此,系统不是依赖一个无限扩张的固定工具库,而是按需合成“一次性程序”。这扩大了计算能力,但也把正确性风险转交给了代码生成、沙箱和错误反馈。

4. 多轮反馈与停止

第 t 轮的动作可概括为:

[ a_t\sim\pi_\theta(\cdot\mid q,m,E_t,H_t) ]

执行后得到 outcome o_t,更新为:

[ E_{t+1}=E_t\cup\Delta E_t,\qquad H_{t+1}=H_t\parallel[(a_t,o_t)] ]

其中 m 是 source profile,H 是动作和执行结果历史。动作除构造证据外还有 ACCEPT_CONTEXT;只有 RouterLM 发出该动作,循环才终止。它判断的不是“代码是否成功执行”,因为成功执行也可能返回错误口径或不足结果,而是“现有证据能否支撑最终推理”。

一个概念上的伪代码是:

E, H = {}, []
while True:
    action = RouterLM(task, source_profile, E, H)
    if action == ACCEPT_CONTEXT:
        return AnswerLM(task, E)
    if action in {LEXICAL, SEMANTIC, RELATIONAL}:
        result = execute(action.arguments, prior_ids=action.scope)
    elif action == SYNTHESIZE:
        code = CompilerLM(action.spec, source_profile, prior_outcomes)
        result = sandbox_run(code)
    E.update(result.evidence)
    H.append(action, result.status, result.errors)

5. 两阶段训练

论文使用 SFT 后接 GRPO:

  • SFT 先让 RouterLM 学到合法、有效的操作序列;
  • GRPO 再根据最终任务结果优化策略,让模型学会在相同任务的多个 rollout 中选择更好的 evidence-building trajectory。

这个设计与单步 RAG 的分类训练不同。RouterLM 优化的是多步序列:早期一次错误检索或错误 SQL,可能让后续步骤在错误子集上继续推理,因此必须评价整条 trajectory,而不只是当前 action。

关键实验与数据

RECAST 覆盖六个 in-domain benchmark family:

  • DataBench:dataframe 数据分析;
  • FinQA:财务报告;
  • HiTab:层级表格;
  • HotpotQA:Wikipedia 多跳问答;
  • LaMP:用户画像相关任务;
  • MultiHiertt:多层表格推理。

核心结果是平均 success rate 75.6%;论文报告 strongest large-model baseline 为 59.7%,因此提升 15.9 个百分点。更强的对照来自未训练的 Gemini 3.5 Flash RouterLM,成绩为 70.6%;训练后的 Qwen3.5-9B RouterLM 仍高出 5.0 个百分点。

作者还在三个 held-out benchmark 上测试 zero-shot generalization:

  • 2WikiMultiHopQA;
  • TAT-QA;
  • WikiTableQuestions。

RECAST 达到 79.3%,strongest baseline 为 64.3%,平均提升 15.0 个百分点。这个结果比 in-domain 成绩还高,论文据此主张策略能跨任务、跨 source representation 迁移。不过 held-out benchmark 的完整逐项数据和各领域失败类型,原文摘要页未明确,需要结合正文表格阅读。

另一个值得关注的对照是模型尺寸效应:9B 的专用 RouterLM 经 SFT+GRPO 后超过更大的 training-free router。这说明“角色专门化与策略训练”可能比单纯放大通用模型更划算。

亮点与局限

亮点:

  1. 把 retrieval 和 computation 放进同一个 evidence operation space,而非让它们成为两套割裂系统。
  2. RouterLM 不只路由,还负责操作参数化和 sufficiency judgment,工程接口非常清楚。
  3. Primitive 加 synthesized operation,兼顾稳定复用与任务灵活性。
  4. AnswerLM 冻结,使增益更可能来自 context policy,而非整套模型联合重训。
  5. 有 held-out benchmark 结果,不只报告同分布拟合。

局限:

  1. 多轮循环会放大延迟与 token 成本;论文摘要没有明确给出相对 training-free RouterLM 的完整成本曲线。
  2. SYNTHESIZE 生成任意 Python,必须依赖安全沙箱、权限隔离、资源限制和审计。题目未明确生产环境的威胁模型与防护细节。
  3. ACCEPT_CONTEXT 的停止判断可能过早。若 LLM 把“代码成功”误当作“证据充分”,错误会直接传给 AnswerLM。
  4. primitive executor 与 CompilerLM 的错误会累积,历史越长越可能出现错误证据污染。
  5. benchmark 以可程序化验证的 success rate 为主,现实系统还需要处理不可验证任务、权限边界和长周期 corpus 更新。
  6. 论文公开版本刚发布,尚缺外部复现;15.9 和 15.0 个百分点的优势需结合评测脚本、提示词和算力配置判断。

对工程落地的启发

第一,值得把 context builder 设计成独立策略层,而不是把所有检索逻辑硬编码进 Agent prompt。推荐先实现三件事:source profile、typed operation、execution feedback。

第二,primitive 应少而稳定,synthesized tool 要有边界。初期生产系统可以限制生成语言、白名单 API、最大运行时间、内存、文件访问范围和返回规模,并要求每次输出带 source IDs 和 provenance。

第三,必须单独评测“证据质量”,不能只看最终答案。可引入 evidence recall、evidence precision、计算口径一致性、无效操作率、平均轮数和停止准确率。Agent 答对不代表证据构造正确,Agent 答错也可能只是 AnswerLM 的问题。

第四,训练数据要从真实 trajectory 出发。高价值样本包括:正确检索后 SQL 计算、第一次候选集不完整后跨 artifact 扩展、工具报错后的恢复,以及“应当停止却继续搜索”的案例。GRPO 的 reward 最好同时考虑最终正确率、轮数、成本和证据完整性。

第五,对异构数据源,先投资 deterministic normalization,通常比直接让一个大模型探索原始文件更可靠。RECAST 的 source profile 思路值得复用,但字段映射和 source IDs 必须由后端系统保证一致。

与同方向工作的关系

RECAST 不是简单替代传统 RAG。传统 RAG 解决“从哪里取文本”,agentic RAG 进一步解决“下一轮该搜什么”。RECAST 的增量在于把“如何从原始记录构造派生证据”也纳入学习目标。

它与 tool-augmented LM 的区别在于:后者常让程序直接生成答案,RECAST 则先构造 evidence,再交给 AnswerLM 回答;它与 specialized table/tool framework 的区别在于,不依赖每种 source 一套专用操作,同时保留 primitive 与 synthesized code 的组合能力。

从 Agent 系统看,RECAST 更像一层 learned policy 或 context compiler,而不是通用 Agent。它专门优化“进入 reasoning model 之前,应该准备哪些证据”。这使它与 planner、tool selector、retriever 都可组合。

适合谁读

  • 构建企业知识库、财报分析、研究助理和数据 Agent 的工程团队;
  • 正在做 multi-hop RAG、agentic search 或 heterogeneous data QA 的开发者;
  • 研究 RL for agents、tool synthesis 和 learned routing 的人;
  • 负责 Agent evaluation、context engineering 与 provenance 的技术负责人。

如果系统主要是对话偏好记忆,RECAST 关联不大;如果问题频繁涉及跨表计算、跨文档 join 和聚合,方法非常值得优先试验。