把一句自然语言规格说明,编译成一个可以本地运行的函数——这是"编译式训练"给出的降本新思路。

很多重复性的文本处理任务,描述起来很简单,写规则却很难,每次调用大模型又贵又慢。这项研究给出第三条路:编译期让教师模型生成示例,训练一个小适配器,之后运行完全不依赖远程模型。这篇我拆开讲清楚原理、精度和成本账。

一、开篇痛点

日常开发里有一类任务最尴尬:描述清楚、规则难写、但逻辑固定。比如"把地址里的省市区拆出来""把金额转成中文大写""把技术术语统一成项目词汇"。

这类任务如果用规则写,边界情况无穷无尽;如果每次调大模型,成本、延迟、网络依赖全来了。一个每天跑十万次的转换任务,按 token 计费一年下来是一笔不小的账单。

二、原理速览:编译式训练是什么

核心思路分两段:编译期和运行期。

编译期(一次):
    自然语言规格说明
        |
        v
    教师模型生成任务示例
        |
        v
    训练小型适配器(解释器)

运行期(无限次):
    输入 -> 本地小型函数 -> 输出(零远程调用)

编译期的教师模型只参与一次训练,跑出来的"函数"可以像普通软件一样存储、版本化、组合。之后每次调用都发生在本地,没有网络请求、没有按 token 计费。

三、精度实测:83.6% 语义准确率

在 FuzzyBench-Hard 基准上(一个快速编译器无法精确匹配的子集),编译式训练达到了 83.6% 的语义准确率。

代价是编译时间:大约一分钟,比秒级的快速编译器慢。但这是"一次性成本"——编译一次,运行无数次,分摊下来几乎可以忽略。

方案 编译时间 运行时依赖 语义准确率
快速编译器(Program-as-Weights) 秒级 基准子集无精确匹配
编译式训练 约 1 分钟 无(本地函数) 83.6%
每次调大模型 远程 API 取决于模型

关键差异在运行时:前两者零远程调用,第三种每次都要走网络、付 token 费。

四、方案落地:Python 接入示例

落地方式是把编译产物当成普通函数调用。我通过 4sapi(https://4sapi.com)统一接入层做编译期的示例生成,运行期完全离线:

# 编译期:用教师模型生成示例(只做一次)
from openai import OpenAI

client = OpenAI(api_key="4sapi-key", base_url="https://4sapi.com/v1")


def generate_examples(spec: str, n: int = 200):
    """用教师模型按规格生成 (输入, 输出) 示例对。"""
    examples = []
    for _ in range(n):
        resp = client.chat.completions.create(
            model="teacher-model",
            messages=[
                {"role": "system", "content": f"按规格生成示例:{spec}"},
                {"role": "user", "content": "生成一个输入输出对,JSON 格式"},
            ],
            response_format={"type": "json_object"},
        )
        examples.append(resp.choices[0].message.content)
    return examples

运行期就是加载编译好的本地函数:

# 运行期:零远程调用
import compiled_funcs  # 编译产物,可版本化、可组合

func = compiled_funcs.load("extract_address")
result = func("北京市朝阳区望京街道阜通东大街6号")
print(result)  # {'province': '北京市', 'city': '北京市', 'district': '朝阳区'}

编译一次、本地运行十万次,单次成本趋近于零。

五、成本账:什么场景值得编译

场景 调用量 是否值得编译
内部工具偶尔调用 百次/天 不值得,直接调模型
批量文本转换 万次/天 值得,本地函数显著降本
高并发生产链路 十万次/天 强烈推荐,延迟和成本双降
任务规则常变 频繁改规格 谨慎,每次改动要重新编译

判断标准很简单:调用量越大、规格越稳定,编译式训练越划算。

六、成本与风险提示

七、混合架构:本地函数 + 云端兜底

最稳的做法是两层配合:本地函数处理高频固定任务,云端模型兜底异常输入。我通过 4sapi 统一接入层把两层接在一起:

def transform(text: str):
    try:
        return compiled_funcs.load("extract_address")(text)
    except LookupError:
        # 本地函数兜不住,走云端
        resp = client.chat.completions.create(
            model="fallback-model",
            messages=[{"role": "user", "content": f"提取地址信息:{text}"}],
        )
        return resp.choices[0].message.content

兜底比例通常很低,整体成本仍以本地为主。

八、接入检查清单

  1. 统计任务的调用量与规格稳定性,确认值得编译;
  2. 用教师模型生成足量示例,覆盖边界情况;
  3. 训练后做语义准确率回归,记录基线;
  4. 本地函数版本化,规格变更走重新编译流程;
  5. 配置云端兜底,处理本地函数无法识别的输入;
  6. 监控兜底比例,异常升高时检查本地函数是否需要重编译。

九、我的结论

编译式训练把"描述清楚但规则难写"的任务,从"每次调大模型"变成"一次编译、本地运行"。83.6% 的精度配合云端兜底,足够覆盖大部分生产场景。这是我在降本清单里排前几名的方案:固定任务本地化,灵活任务留云端。

总结

把自然语言规格编译成本地神经函数,运行期零远程调用,语义准确率 83.6%。调用量越大越划算,配合云端兜底更稳。欢迎在评论区聊聊本地化推理的降本实践。