Jane Street 最近在 GitHub 上开源了一个名为 agent_skills 的仓库。作为全球高频交易与做市领域的头部机构,不少人看到这个仓库名称时,多半会以为他们会把内部用 OCaml 搭建的高频交易框架或统计套利工具公开。

然而翻开代码,仓库里的第一个核心模块叫作 socratic-tutor,也就是苏格拉底式导师。这是这家机构首次公开的 Agent 技能,一套用于引导深度推导的交互规约。仔细研读它的提示词设计,你会发现这套机制恰好戳中了大语言模型在学习辅助中的普遍缺陷:工整的答案常常让人产生“我懂了”的错觉,却掩盖了边界推演的不足。
为什么被动灌输难以建立真正的理解
多数人用通用大语言模型学习专业技能时,交互模式几乎一样:抛出一个概念问题,模型几秒内组织出几千字的长篇讲解,条理清晰、结构完整。这样的回答读起来很顺,但由于缺少认知对抗,读者往往只是顺着文本的行文逻辑走,大脑并没有真正启动推理机制去检验假设。
当场景切换到真实的工程环境,一旦约束条件发生改变,或者遇到数据层面的微小偏差,开发者依然很难避开隐蔽的逻辑漏洞。
认知科学的研究早已指出,单向的信息接收很难形成长期记忆,只有通过主动检索、预测与反例证伪,才能真正理清因果机制。
这也是 Jane Street 内部非常鲜明的工程师文化。这家机构的面试与日常技术讨论向来以严密的概率博弈与反直觉推导见长,技术人员很少被要求死记硬背某种公式,而是需要在一个个给定的规则体系下,不断承受来自反例的追问,直到推演出最底层的边界。
socratic-tutor 正是将这种思维训练方式,固化成了一套可复用的 Agent 规约。
苏格拉底导师的核心执行逻辑
翻看仓库中的 SKILL.md 文件,其核心逻辑建立在古希腊哲学的产婆术之上,通过连续提问逼迫学习者自行推演。
整个交互流程被框定在几条严格的规则之下:
-
意图过滤:如果使用者只是随口提出单次询问,模型按常规模式直接回答,并不触发教学循环。只有在明确收到系统性的学习指令时,诊断与推导机制才会启动。
-
单题推进与沉默约束:模型一次只提一个问题,提出后立即停止输出并等待反馈,绝不一次性抛出一组考题,也不在问题后附带任何提示或参考思路。
-
强制性的前置诊断:正式进入推导前,系统会先抛出 3 至 5 道难度梯度的摸底题,评估使用者在各子领域的真实基础。在摸底阶段,无论回答是对是错,模型都不做解释,只记录表现。
-
动态绘制掌握度地图:诊断结束后,模型会将课题拆解为多个子技能,以零至五级的标准输出一份字符图表,并根据薄弱环节建议切入点。在后续的推导阶段,即便学习者给出正确回答,模型也会偶尔扮演反方提出质疑,检验其对极端边界的防御能力。
时序因子特征工程的实测推导
为了验证这套技能在严密技术场景下的表现,我拿量化特征工程里最容易藏雷的题目做了测试:时序因子的防数据泄漏与抗过拟合。
在终端输入指令 /socratic-tutor teach me 如何在时序因子特征工程中彻底避免数据泄漏与过拟合,模型很快把主题拆成四个维度:时点对齐与发布时滞、滚动窗口的时间截断、交叉验证净化,以及多重测试偏差检验,随后直接进入四道连续诊断题。
第一道题考察财报数据的发布时滞。假设某上市公司年报截止日为 2025 年 12 月 31 日,审计报告签署日为次年 4 月 10 日,而交易所实际披露公告的时间是 4 月 14 日晚间 20:00。构建特征矩阵时,这组财务数据最早应该在何时生效?
在量化截面排序中,数据必须以市场公开且可获取的时间戳为准,因此正确答案是 2026 年 4 月 15 日盘前。若错误地使用报告截止日进行对齐,回测系统就相当于提前四个多月偷看了未来的财务数据。
第二道题关注日内高频调仓的时间截断。假设策略在每个交易日上午 09:35 产生调仓信号,若直接调用数据商提供的日频 20 日滚动波动率指标,而该指标在后台基于当日收盘价计算,回测便会产生严重的未来数据泄漏。在 09:35 生成信号时,真正合法可用的滚动窗口终点必须截断在 09:34。
第三道题深入到样本标签的跨期重叠。当模型预测目标是未来 5 个交易日的累计超额收益时,每个样本标签在时间轴上都覆盖了后续 5 天的行情。若采用常规的时序切分,训练集截止在周五,而测试集紧接着从下周一开始,训练集最后的标签实际上已经包含了测试集前几天的行情变动。这种跨界重叠会导致测试集的收益与夏普比率被显著高估。正确的处理方式是引入净化机制,从测试集开头剥离掉被训练集标签覆盖的样本。
第四道题直击大规模因子挖掘中的多重测试陷阱。在五年历史数据中测试一万个候选因子,即便通过样本内排序挑出夏普比率达到 2.8、t 统计量达到 3.5 的因子,单纯依据正态分布临界值宣称其有效也是不成立的。由于进行了海量测试,极值分布会导致严重的假阳性。要对其显著性进行统计修正,除了检验总次数 N,还必须考虑试验收益率之间的截面相关性,以此折算有效独立试验数,并结合收益的偏度与峰度共同调整显著性阈值。
技能地图与深层机制推导
答完四道摸底考题后,模型给出了阶段评估,并渲染出字符进度图:
Topic: 时序因子特征工程防泄漏与抗过拟合 overall: ███████░░░ 70%
-----------------------------------------------------------------
1. 点截面时点对齐与时滞 [████████░░] 4/5 * 独立掌握
2. 滚动特征计算与窗口隔离 [████████░░] 4/5 * 独立掌握
3. 净化交叉验证与标签去重叠 [██████░░░░] 3/5 <- 建议起点
4. 多重测试偏差与极值修正 [██████░░░░] 3/5
-----------------------------------------------------------------
等级标准:0 未知 . 1 听说过 . 2 能跟上 . 3 需协助 . 4 独立完成 . 5 能排查极端边界
评估显示,前两项已具备独立排查能力,而后两项处于需要协助的 3 级水平,模型据此建议将第三项净化交叉验证作为攻坚起点。
随即,它给出了第一道深层推导题:
在经典的净化交叉验证体系中,除了净化机制外,还有一项关键的隔离机制。假设在交叉验证切分中,测试集在时间轴上排在训练集的前面。从时间顺序来看,位于过去的测试集不可能偷看未来的训练集,为什么在这种切分下,依然必须在测试集结束后强制插入一段隔离期、删掉训练集开头的一部分数据?
如果仅是背诵过模型代码,很难迅速给出合理解释。从金融时间序列的微观结构来看,由于自回归效应与特征滚动窗口的存在,测试集产生的信息会顺着时间轴向后扩散。如果不做物理阻断,测试集引起的状态变化会通过滞后的自相关污染紧随其后的训练集特征,从而造成隐蔽的信息泄漏。
这种触及统计机理与工程细节的推导,正是传统大模型单向输出时最容易忽略的部分。
本地配置与实践方式
这套技能遵循标准的 Agent Skills 规范,可以直接集成到本地的工作流中。代码开源在 GitHub 的 janestreet/agent_skills 仓库中,核心定义集中在 socratic-tutor 目录下的 SKILL.md。
在对话中,你可以随时使用这些命令控制学习节奏:
- 触发教学:
/socratic-tutor teach me <任何你想彻底掌握的主题>
- 查看技能进度:
show progress(重新渲染当前的 ASCII 技能树)
- 调节难度:
harder 或 easier
- 临时要求直接解答:
just tell me(仅针对当前这一道题跳出苏格拉底提问模式)
- 存档进度:
save state(它会吐出一个紧凑的文本块,下次对话粘贴 resume from: <文本块> 就能无缝续上进度)
无论你平时搞量化研究、做机器学习,还是写系统内核、搭分布式架构,不妨挑一个自以为已经掌握的概念试试。用不了三道题,你就能看清自己的知识边界究竟在哪里。类似的工具解析与实战经验,也欢迎在云栈社区继续交流。