Featured image of post AI Agent 时代的 Meta Programming

AI Agent 时代的 Meta Programming

本文探讨了AI时代的元编程概念,强调通过工作流(workflow)而非简单的循环(loop)来编写可靠代码,并给出了具体示例。

语速

AI 时代的 Meta Programming 是 workflow。

最近很多人在说自己使用 loop 进行编程,但是没有具体说怎么做。

本文是我的理解和实践。

什么是 meta programming

loop 这个说法过于模糊,实际上基于 loop 编程,指的是基于 workflow 来编程。

Meta Programming 中文是元编程。元类(metaclass)、C++ 宏编程、泛型,我认为均属于 Meta programming。

Workflow 为什么是 Meta Programming(MP)?

合适的 workflow 可以让 AI 写出更好的代码。

假设 MetaG 是一个「元函数」——它接收代码或约束作为输入,输出目标代码。例如 Python 虚拟机、C++ 预处理器都是 MetaG 的实例。

C++ 宏 - 一种 MP

以 C++ 宏为例,开发者编写宏模板作为输入,预处理器执行展开。

1
2
#define BAD(x) x*x        // BAD(2+3) → 2+3*2+3 = 11
#define GOOD(x) ((x)*(x)) // GOOD(2+3) → ((2+3)*(2+3)) = 25

此时 MetaG 就是 C++ 预处理器。

Python 元类

输入:元类定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class SingletonMeta(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class Database(metaclass=SingletonMeta):
    def __init__(self):
        print("初始化数据库连接")

# MetaG 接收 metaclass 定义和类定义,输出类 Database

此时 MetaG 是 Python 解释器。

输出:受元类控制的单例行为

1
2
3
db1 = Database()  # 输出: 初始化数据库连接
db2 = Database()  # 无输出
print(db1 is db2) # True

泛型

以 Go 语言为例。

输入:泛型函数定义

1
2
3
4
5
6
7
// 泛型函数:返回两个相同类型值的较小者(要求类型支持 < 运算符)
func Min[T int | float64](a, b T) T {
    if a < b {
        return a
    }
    return b
}

MetaG 接收泛型定义,根据类型参数生成具体的函数实例。

输出:泛型展开后的具体函数

1
2
3
// 省略实现细节
func Min(int)(a, b int) int {}
func Min(float64)(a, b float64) float64 {}

总结

在传统的 Meta Programming 中,MetaG 的输入和输出都是代码。MetaG 本身是一个确定性的程序(编译器、解释器、预处理器),输入模板或类型定义,输出展开后的代码。

一个 workflow 例子

/goal 是 Claude Code 中的一个命令,用于设定一个高层目标,让 agent 自主循环工作直到达成。以下是一个基于 /goal 的 workflow 例子。

输入:一段 workflow 脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# python 例子

set_goal('from user input')  # 目标来自用户输入
review_result = ''

while agent('Can exit loop? read the code and confirm the goal', get_goal()):
    agent('do programming', review_result)
    review_result = agent('do review')
    if round_max():
        break

agent 在每次循环中检查是否达成目标,未达成则继续编程和 review,直到 goal 完成或达到最大轮次。

MetaG 是可以执行 workflow 的 runtime,例如 Claude Code 或者 OMP。

输出

1
...当前项目的代码,经过了 LLM 生成和 LLM review 反复改进。

已有的 runtime

目前已有多个 runtime 支持执行 workflow,以下是两个典型的例子。

Claude Code

Claude Code 提供了更丰富的 workflow 原语,例如 parallelpipelinesubagent 等,支持并行、串行和委托等执行模式。

上面的例子只用了 agent 这个原语,实际上 Claude Code 生成的大多数是 parallel(agent1, agent2, agent3) 或者是 pipeline(agent1, agent2, agent3)

OMP - oh my pi

workflow 这个功能在 OMP 上体验更好。

可以通过对话将 Python workflow 落盘,下一次直接 eval 使用。在 Claude Code 中,workflow 用 JS 表示。

如果 py 文件里本身有 loop,那么下次 coding 的过程就是 eval loop 的过程。workflow 本身也可有输入输出。