端到端研究 demo 本节摘要:demo 是你早先写的每个契约都必须组合的地方。任一漏,demo 就是抓住它的那节。把自动研究循环端到端接起来:假设种子、实验运行器、调度器、批判循环、论文写作器。通过纯 Python import 把前四课的原语组合,不用框架。跑循环到自终止终,发单一 demo 报告列每阶段输出。保 demo 确定性使测试套件可断言终形状。当任一阶段契约破时露清晰失败模式,使下一阶段不以破输入跑。五阶段:种子是三假设列表,调度器跨它们跑六实验用三并行槽,总线报一个或多个论文触发,选择器选单一最佳结果,批判循环在从该结果建的草稿上迭代,论文写作器发终 LaTeX、BibTeX 与清单。五课,四 import,一报告——加阶段时接线恰长一行。
本节摘要:demo 是你早先写的每个契约都必须组合的地方。任一漏,demo 就是抓住它的那节。把自动研究循环端到端接起来:假设种子、实验运行器、调度器、批判循环、论文写作器。通过纯 Python import 把前四课的原语组合,不用框架。跑循环到自终止终,发单一 demo 报告列每阶段输出。保 demo 确定性使测试套件可断言终形状。当任一阶段契约破时露清晰失败模式,使下一阶段不以破输入跑。五阶段:种子是三假设列表,调度器跨它们跑六实验用三并行槽,总线报一个或多个论文触发,选择器选单一最佳结果,批判循环在从该结果建的草稿上迭代,论文写作器发终 LaTeX、BibTeX 与清单。五课,四 import,一报告——加阶段时接线恰长一行。
对应原课程:Phase 19 · Lesson 57 ·
end-to-end-research-demo(原英文phases/19-capstone-projects/57-end-to-end-research-demo/docs/en.md)。本节属「AI Scientist」赛道第八节。
阅读完本节,你应当能够:
五阶段。种子是三假设列表,调度器跨它们跑六实验用三并行槽,总线报一个或多个论文触发,选择器选单一最佳结果,批判循环在从该结果建的草稿上迭代,论文写作器发终 LaTeX、BibTeX、清单。
每早先课发 main.py 带公开 dataclass 与函数。demo 通过调每课父目录的 sys.path import 它们。这不是框架接线,是早先课测试文件已用的同一 import。
内联桩替第 48~51 课:小种子假设生成器与同步奖励函数。用户可调两 import 把内联桩换成那些课的真原语。
demo 构造上确定。实验运行器是种子 numpy,批判循环的修订器按固定序走固定维,论文写作器的散文生成器是第 52 节的 mock,调度器的 UCB 选择器按迭代序(非随机选择)破平。给同种子,demo 发同报告,测试跑两次比 manifest 断言此性质。
每字段逐字来自上游阶段。demo 不转任何输出,只组合它们——那就是 demo 测的东西。
每阶段要么成功要么抛类型化错误:
Scheduler ........ 返 SchedulerReport 带 stop_reason in {queue_empty, max_experiments, deadline} Best-result pick . 无论文触发时抛 NoTriggerError Critic loop ...... 返 LoopResult 带 status converged 或 stopped Paper writer ..... 契约破时抛 PaperValidationError
任一阶段失败用类型化异常短路 demo。测试钉此契约:test_no_triggers_raises_typed_error 与 test_best_picker_raises_when_no_triggers 断言选择器在无分支触发时抛 NoTriggerError/BestResultError,写作器永不调。
调度器按分支发论文触发。选择器选跨所有触发均奖励最高的分支,按分支 id 字母序破平使 demo 确定。选择器是小纯函数,测试在固定调度器报告上钉它。
第 53 节批判循环操作 MiniPaper。demo 从选中分支建 MiniPaper:用分支 id 填摘要、种两节(Introduction 与 Results)、从分支均奖励设 originality_tag(>=0.8 高、>=0.6 中、否则低)。修订器迭代草稿到收敛,输出进论文写作器。
第 52 节论文写作器操作带图与参考文献的全 Paper 形状。demo 经 mini_to_full_paper 升级收敛后 MiniPaper,附选中分支一张图与批判建议的引用键并集建的小合成参考文献。demo 加的每引也加到参考文献列,使校验过。
code/main.py 定义 BestResultError、NoTriggerError、DemoReport、pick_best_branch、build_mini_paper、mini_to_full_paper、run_demo。顶部 import 调一次 sys.path 拉 PaperWriter、CriticLoop、IterationScheduler。
def run_demo(seed=0): scheduler_report = IterationScheduler(seed_hypotheses(), mock_runner(seed) ).run(max_experiments=6) triggers = [t for t in scheduler_report.paper_triggers] if not triggers: raise NoTriggerError("无分支跨论文阈值") best = pick_best_branch(scheduler_report) # 最高均奖励, 字母序破平 mini = build_mini_paper(best) # 摘要/两节/originality_tag critic_result = CriticLoop(deterministic_critic(), deterministic_reviser() ).run(mini) # 迭代到收敛 full = mini_to_full_paper(critic_result.draft, best) # 加图 + 参考文献 manifest = PaperWriter(MockProseGenerator()).write(out_dir, full) return DemoReport(scheduler=scheduler_report, best=best, critic=critic_result, paper=manifest, stop_reason=scheduler_report.stop_reason)
设计要点:demo 的工是证组合即架构——五课四 import 一报告,加阶段时接线恰长一行。每阶段输出逐字透传到报告,demo 不转任何输出只组合,那是它测的。类型化失败短路使破输入不传下游。确定性构造(种子 numpy、固定序修订、mock 散文、迭代序破平)使跑两次比 manifest 可断言。内联桩替第 48~51 课使 demo 独立可跑,调两 import 换真原语。
真实自主研究代理(AI-Scientist v1/v2、Sakana AI、斯坦福 STORM)是本节 demo 的产品化版:真 LLM 替 mock、真实验执行(训真模型)替内联桩、真文献检索(第 49 节)替无、结果存 WandB/MLflow 替内存报告。LangGraph/CrewAI/AutoGen 把这包成图框架,节点是阶段、边是数据流,但组合契约同:每阶段产类型化输出、下游消费它、失败类型化短路。本节手写的价值是看清「组合即架构」——无框架魔法,纯 import + 纯函数透传,失败模式是契约破而非框架怪。研究循环的产品化难点在真 LLM 的随机性(批判/写作不收敛)、真实验的成本(GPU 时)、真文献的覆盖(第 49 节漏判),本节 mock 绕开这些先证骨架可组合。
code/main.py + code/tests/test_e2e.py(覆盖 demo 端到端跑发全五字段报告、跨两次运行确定、无分支跨阈值时 NoTriggerError、写作器契约破时 PaperValidationError、论文清单含选中分支图、调度器 stop_reason 是预期值之一)。run_demo(seed) 是编排器入口,返 DemoReport。demo 的存在本身是测试——五阶段组合的契约破则 demo 抓住。换真原语(真 LLM 批判、真实验运行器),run_demo 接线不动。
RetrievalClient,假设生成前先查重,观察队列变化。下一节,我们离开 AI Scientist 赛道进入多模态/VLM 赛道,做「视觉编码器 patch」——把图像切成 patch 网格、线性投影成 token,加 2D 正弦位置编码。