核心要点

  • 范式重定位Smart macrosLLM 只在「首次遇到新场景」时参与,把模型输出编译成普通 Kotlin 源码落盘,之后执行编译产物——零延迟、零费用、结果可复现。

  • 最小 APIasLlm(from, hint) 把非结构化输入转成类型化值;mockLlm<T>() 生成有状态接口实现。生成物可提交、评审、测试,运行时不需要插件。

  • 定量证据:Spring Petclinic Kotlin 评估 24/24 场景成功、热重载成功率 100%、运行开销约 1%;GitHub issue 解析器召回率约 0.89。

  • 适用边界:适合模式空间收敛的任务(解析、分类、格式转换);场景不收敛的任务(开放域对话)会退化为昂贵的运行时调用。

  • 风险边界:生成代码安全性依赖 code review;首次生成非确定;仅 Kotlin/JVM + IntelliJ IDEA 2025.2.x + JDK 21,且是研究原型。

简要回答

Smart macro 是一个普通 Kotlin 函数调用,函数体由 LLM 生成。生命周期是:调用点遇到新场景 → LLM 生成 Kotlin 源码 → 源码写入工程 → JDI 热重载进运行中的应用 → 后续同场景直接执行纯 Kotlin。本质是把 LLM 从「每次请求都调用的服务依赖」变成「只调一次的编译器」,同时保留了运行时才能获得的场景信息。它解决的是「开发期补全覆盖不了运行时场景、运行时调用又贵又慢又不稳定」的两难。

标准回答

一、机制:四阶段生命周期

KotlinLLM 的核心是 Smart macros——调用点看起来是普通 Kotlin 函数,但函数体由 LLM 生成。首次遇到新场景时,插件调用模型生成 Kotlin 源码,把源码写入工程目录(进入正常的提交/评审/测试流程),再通过 JDI(Java Debug Interface)热重载进正在运行的应用。之后同一场景执行的是仓库里编译好的纯 Kotlin——不再调用模型,因此没有延迟、没有费用、结果可复现。

二、为什么这个设计成立:因果链

运行时 LLM 调用有四个固有缺陷:非确定性、持续计费、高延迟、外部依赖。但很多运行时逻辑是「场景有限、模式稳定」的——issue 格式千变万化但结构收敛,反馈类别是固定的。对这类逻辑,让模型把模式一次性编译成代码,比每次调用更便宜、更快、更可靠。这正是「为什么运行时」(只有运行时才见得到真实场景)与「为什么生成而非调用」(场景收敛后代码优于 API)两个问题的统一答案。

三、与既有范式的对比

  • 开发期补全(Copilot/Cursor):模型只在写代码时参与,覆盖不了运行时才知道的场景;
  • 运行时 LLM 调用:灵活但贵、慢、不稳定;
  • KotlinLLM:占据「逻辑无法预先枚举、但模式空间最终收敛、且要求生产级确定性」的独特象限。

四、证据与边界

官方评估:Petclinic 24/24 场景、热重载 100%、约 1% 开销;issue 解析器召回率约 0.89——这是自测数据、样本小、无第三方复现。边界必须讲清:生成代码的漏洞风险转嫁给评审流程;首次生成仍非确定;长尾新场景有延迟尖峰;平台锁定 Kotlin/JVM + IntelliJ;定位是研究原型,无 SLA。

五、落地判断

选型口径:模式收敛 + 非关键路径 + 可接受平台约束 → 可实验级采用;生产关键路径 → 只跟踪范式、不采用工具。核心治理动作是给生成代码建立与手写代码同级的评审与行为级测试。

常见误区

误区一:「KotlinLLM 是另一个 Copilot。」 不是。Copilot 在开发期参与,产物经开发者中转;KotlinLLM 在运行时参与,应对的是写代码时根本不知道的运行时场景——两者解决的象限不同,不是竞品。

误区二:「生成后就不需要模型了,所以完全确定。」 已覆盖场景确定,但第一次生成什么代码由模型决定——不同时间、不同模型版本可能生成不同实现。回归策略应对生成快照做行为测试,而非代码比对。

误区三:「零成本零延迟。」 只适用于已覆盖场景。遇到新场景仍要同步等待生成 + 编译 + 热重载,在线路径上的延迟尖峰可能不可接受。

误区四:「生成代码进了仓库就等于安全。」 恰好相反:生成代码获得了「已提交代码」的信任地位,如果评审标准放松,风险敞口比运行时调用更大。

追问

追问 1如果让你为生成代码设计回归测试策略,会怎么做?

核心原则是测行为不测文本。生成代码的文本会随模型版本与提示词漂移,行为契约才是稳定的回归基线。具体做法:为每个 smart macro 调用点建立输入/输出样例集(从真实场景采样并脱敏),对生成快照跑行为断言而非源码 diff;模型或提示变更时重新生成并对比行为差异,差异超出阈值才人工评审。补充一条:样例集要覆盖边界输入(空值、超长、异常格式),因为生成代码最容易在边界处与手写实现分叉。

追问 2什么任务绝对不适合 Smart macros?给反例。

反例一:场景空间不收敛的任务——开放域对话、创意生成、实时个性化推荐。这类任务每个输入都是新场景,场景缓存永不命中,KotlinLLM 退化为更贵的运行时调用(多了生成、编译、热重载三段开销),应直接用运行时 LLM 调用范式。反例二:强合规路径——金融交易决策、医疗建议等需要确定性审计的链路,首次生成的非确定性无法通过审计,即使后续执行确定也不适用。判断口径一句话:问自己「这个任务的场景集合能否被有限枚举」,不能枚举就别用。

延伸学习

按主题分类的相关资源,便于系统复习