-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
收录一些最近的设想.
亚马逊Kiro的"规格"_Specification.md,
克劳德代码的"规则"_rule.md,
其本质是什么? 就是一种编程语言.
既然如此, 那我们不如完善它, 创造出一种提示字编程语言, 这完全面向自然语言编程的语义理解, 其形式, 也有关键字, 函数, 类型系统, 模块, 流程控制, 类, 名空间,权限约束, 等等, 只不过完全用自然语言描述, 重要的是, 这是给LLM使用的, 人类顺便审查review,
人只要用聊的方式, 碎片化离散化地发消息给LLM, 大模型理解语义后, 就用提示字编程语言写出这种代码来, 返回给人类检查, 或大模型自己检查, 这种提示字编程语言的代码, 介于纯自然语言与伪代码之间,
通过后, 发送给代码生成LLM(比如擅长系统编程( cpp/c, rust, 汇编, LLVM-IR)), 让其生成高性能可执行程序. 以此增强AI编程的性能.
语义LLM, 预想为500B MoE.
生成LLM, 预想为 80B MoE.
使用管道把→代理agent|语义LLM|生成LLM, 组合为AI编程.
一点简单设想.
∀ conversation ∈ H × LLM_semantic,
∃ program ∈ Lang_prompt,
such that:
program = compile_semantic(conversation)
∧ validate(program) ≡ True
∧ code = LLM_codegen(program) ∈ {C++, Rust, LLVM-IR}
「提示字编程语言(PromptLang)」= 受限自然语言 DSL(Domain-Specific Language)= 面向LLM的领域特定语言(DSL),
此语言非为人类编写,而为 语义LLM 从多轮对话中归纳出结构化语义表示(structured semantic representation, SSR)。
哲学本质:把提示字视为程序,对话视为 REPL
人类输入:离散、碎片、含糊的自然语言片段(≈ REPL 表达式)
语义 LLM:维护状态(conversation context),逐步构建完整提示字编程语言程序(≈ 累积定义)
验证:类型系统 + 规则引擎(≈ 编译期检查)
生成:目标代码(≈ 编译输出)
LLM分工优化:
语义LLM (500B MoE): 专注于理解意图、领域建模、架构设计,
生成LLM (80B MoE): 专注于代码生成、性能优化、低级细节,
模块 数学工具库 {
公开 函数 阶乘(n: 自然数) -> 自然数 {
若 n <= 1 则 返回 1
否则 返回 n * 阶乘(n - 1)
}
}
类型 用户 {
名称: 字符串
年龄: 整数(最小值=0, 最大值=150)
邮箱: 邮箱格式
权限: 枚举["管理员", "用户", "访客"]
}
类型 订单集合: 列表<订单> where 长度 > 0
函数 处理支付(订单: 订单类型, 用户: 用户类型) -> 支付结果 {
前置条件: 用户.权限 in ["管理员", "用户"]
后置条件: 结果.状态 in ["成功", "失败", "待处理"]
副作用: 数据库写入, 消息队列发送
异常: 网络错误 -> 重试3次
超时: 30秒
}
模块 电商系统 {
导入: 支付网关, 库存管理, 用户服务
命名空间 订单流程 {
函数 创建订单(...)
函数 取消订单(...)
}
}
工作流 订单履行 {
开始: 支付验证成功
步骤:
并行 {
库存预留(超时=5分钟),
物流分配(重试策略=指数退避)
}
然后: 通知用户
结束: 所有步骤完成 或 超时24小时
}
管道设计:
人类意图 ↓
→ 语义LLM (理解+结构化)
→ 提示字代码 (可审查)
→ 生成LLM (编译优化)
→ 高性能代码 (Rust/C++/LLVM)
→ 可执行程序
优势,
可审查性: 中间层代码人类可读可审,
可复用性: 提示字模块可以版本控制、复用,
可测试性: 可以对语义层编写测试用例,
性能保证: 最终产出是优化后的系统级代码,
只要两个模型就能做到了呀,一个专注于理解人类语言的语义,另外一个专注于生成代码,最好是生成汇编。
前者的模型最好是一千亿的,后者模型最好是个百亿的。
第2个是要设计一套提示字编程语言,这套编程语言是完全面向人类语义的,不需要面向机器精确执行,为什么呢?因为这套语义需要被大模型理解,用自然语言描述算法步骤、描述函数体。重要的是这一套编程语言写出来的程序,它不是人去编写,而是大模型去使用它编写。随后第2个模型就可以根据提示字编程语言的程序去生成具体高级语言代码或汇编代码。
人需要掌握的事不过就是初中的代数水平罢了,现在很多小学都开始教代数了。
看明白了没有?就是要完成三个目标,
1.提示字编程语言,
2.语义理解大模型(千亿参数以上),
3.代码生成大模型(百亿参数以上)。
只要完成了这三个工程项目,人就可以通过自然语言与大模型对话的方式协作编程。
位于"自然语言"与"机器码"之间的语义中间层(Semantic IR)
人类碎片化需求
↓ (自然语言理解)
语义LLM (500B MoE) → PromptLang IR (带类型/约束的中间表示)
↓ (形式化转译)
生成LLM (80B MoE) → LLVM-IR / Rust / 汇编
↓ (传统编译)
原生可执行程序
传统编译:人类写形式化代码 → 机器理解,
本方案:人类说意图 → AI写形式化提示字编程语言 → AI再翻译为机器码,
// 示例:并非自由文本,而是受限结构
模块: 图像处理
命名空间: cv.edge_detection
函数 索贝尔滤波
输入: 图像<灰度, 8位>, 阈值<float, 0~1>
输出: 边缘图<二值, 8位>
前置条件: 图像.维度 == 2
后置条件: 输出.尺寸 == 输入.尺寸
副作用: 无
资源上限: 内存<100MB>, 时间<16ms>
实现逻辑:
1. 计算梯度幅值
2. 非极大值抑制
3. 双阈值连接
异常处理: 若内存不足 -> 返回错误码 OUT_OF_MEM
本质:带结构化标记的伪代码,关键词固化(模块:, 输入:, 前置条件:),但参数描述用自然语言。
类型: 用户ID
约束: 正整数, 8位, 范围[1, 255]
不变量: 必须存在于数据库.users表
序列化: 小端字节序
线程安全: 是
隐私级别: 敏感 (需符合GDPR审计)
类: 金融交易引擎
权限:
- 核心逻辑: 只读访问 账户DB
- 审计日志: 追加写入 日志DB
- 禁止: 网络访问, 文件系统写入
合规约束:
- 必须生成 可审计报告<PDF/A格式>
- 交易延迟 < 50ms (SLA)
语义LLM(500B):扮演高级编译器前端,
接受:<用户聊天记录, 历史上下文, 领域知识库>
输出:<提示字编程语言 AST, 置信度, 歧义点列表>
关键能力:消歧、补全、问责("用户说'快',语义LLM必须量化为延迟<10ms")
生成LLM(80B):扮演优化型编译器后端,
输入:提示字编程语言 AST + 目标平台标记(x86_64+RISCV)
输出:<LLVM-IR, 优化报告, 资源消耗预测>
关键能力:极致优化、硬件特化、安全加固
管道协议:两者间用结构化数据交换(非文本),如Protocol Buffers定义:
消息 提示字编程语言模块 {
string name = 1;
repeated FunctionDef funcs = 2;
repeated Constraint constraints = 3; // 关键:传递形式化约束
map<string, double> resource_limits = 4;
}
.smc 文件后缀,
AI原生软件工程
这次在拍脑袋+闭门造车的情况下, 找到一个方法,
不知对不对, 希望有大佬帮着思索, 看行不行得通.
真是踏破铁鞋无觅处,
我发现变形器架构就是计算因果的, 在文本上设计语言模型, 或许只是用途之一,
而卷积网, 可以用来计算空间,
递归网, 可以用来计算时间,
这三者里的组件应按需抽出, 可以组合为世界模型,
世界模型只是构造了一个环境, 你可以视其为背景,
智能如何真正发生?
如果用一个双向图灵机, 在世界模型与现实世界之间互操作, 是否可行?
别说蜜蜂蚂蚁了, 就算是草履虫, 也是有智能的,
真正的智能, 可能根本无须巨大的参数量.
我们需要的是智能, 而不是智慧, 万亿参数的大模型只是一个专家系统之智慧容器,
智慧只是有限历史中的偶然,
智能却可以万古长存, 并发现与创造新的颠覆的智慧.
三大神经网络架构的概括:
Transformer(变形器):核心是自注意力机制。
它通过计算序列中所有元素两两之间的关系,来构建一个全局的、动态的依赖关系图。
这正是“计算因果”的精髓——它不依赖于固定的时间或空间顺序,而是动态地推断出哪些信息是相关的。
它处理的是“关联性”和“上下文”。
CNN(卷积网络):通过局部连接、权重共享和空间下采样,
天然地适合于提取空间层级结构。
它从像素、边缘、纹理、部件到物体,构建起对视觉世界的空间理解。
RNN(递归网络):其隐藏状态像一个“记忆胶囊”,在时间步之间传递。
它专为序列和时间依赖而设计,适合处理具有时间顺序的信息。
“智能”与“智慧”的区分:
智能:指的是一种通用的、根本的、适应环境、解决问题、实现目标的能力。它是“方法”和“过程”。草履虫趋利避害是智能,蜜蜂筑巢是智能。这种能力不依赖于庞大的知识库,而依赖于高效的信息处理和决策机制。
智慧:指的是在特定历史和文化背景下积累的知识、经验和洞见的集合。大语言模型正是这样一个“智慧容器”,它压缩了人类历史的文本智慧,但它本身可能并不具备在全新环境中自主产生“智能”的核心机制。
一个可双向互操作的模拟器-执行器闭环。
世界模型 ↔ 现实:不只是预测,还要反推(反事实推理)、干预(行动)、修正(误差驱动学习)
交互式计算(Interactive Computation/Weihuang's Persistent Turing Machine)或具身认知闭环:
“双向图灵机”的隐喻:指的是一个在“内部世界模型”和“外部现实世界”之间建立闭环的、可双向交互的机制。
向内操作(感知->模型更新):将现实世界的感知数据输入,用于更新和修正内部的世界模型(学习)。
向外操作(规划->行动):利用内部的世界模型进行推理、规划和模拟,然后将最佳决策输出到现实世界,执行行动。
这描述了一个强化学习或主动推理的完美循环:
感知 -> 模型更新 -> 内部模拟/规划 -> 行动 -> 改变环境 -> 新的感知...
一个拥有(由CNN/Transformer/RNN等混合构成的)世界模型作为其“认知背景”,并通过一个强化学习/主动推理的闭环(即-“双向图灵机”)与世界交互,从而展现出一种不依赖于海量参数、而是依赖于核心决策与适应能力的“根本智能”。
现实感知 → 编码 → 世界模型(模拟)
↑ ↓
行动执行 ← 解码 ← 规划(反事实)
主动推理(Active Inference):
世界模型 = 生成模型(预测感官)
行动 = 最小化预测误差
双向 = 感知推断 + 行动选择
智能之生成器: 具身认知闭环或预测性处理(Predictive Processing)
世界模型的“第一性原理”:
CNN = 空间不变性 + 局部组合(Gabor滤波器 → 边缘 → 物体)
RNN = 时间连续性 + 状态记忆(动力学系统)
Transformer = 长程依赖 + 因果推理(高阶关系)
自回归训练强制模型学习条件概率链 P(x_t | x_{<t}),这本身是Pearl因果层级中的第一层(关联)向第二层(干预)的逼近.
注意力机制,它在建模 条件依赖图(conditional dependency graph),可视为 软因果图。
Transformer 是一种 可学习的、数据驱动的因果近似器,但需额外约束(如干预、do-calculus)才能逼近真实因果。
✅ 卷积:局部感受野 + 平移不变性 → 天然适合 欧氏空间结构(图像、网格)。
✅ RNN/状态机:隐藏状态 hₜ = f(hₜ₋₁, xₜ) → 天然建模 序列因果(时间流)。
✅ 智能的本质是适应性行为生成(adaptive behavior generation under uncertainty)。
大模型 ≈ 压缩的历史知识库(智慧容器)
真正智能 ≈ 在线推理 + 主动干预 + 目标驱动
主动推理(Active Inference)或 世界模型强化学习(World Model RL)的核心:
前向:模型预测 → 行动 → 影响现实
反向:现实反馈 → 更新模型
智能 = 在模型与现实间闭环交互 → 符合控制论与具身智能思想
小参数也能智能 → 草履虫、昆虫导航已证明
核心:智能是过程,不是知识库。
继续沿着“小模型 + 强交互 + 因果闭环”走,很可能比堆参数更接近本质。
一个成功的世界模型,就是智能体内部对“外部环境如何运作”的一个压缩的、可预测的模拟。它让智能体能够进行“思想实验”,预测“如果我做了A,可能会发生B”,而无需在现实世界中一次次试错。而这本身不需要巨大的初始参数,只需要一个正确的学习算法。
我们提出了一种自然编程语言(NPL),它用结构化的自然语言编写,旨在作为人类和LLM之间的中间表示,最终由LLM转换为传统编程语言代码。这种语言具有编程语言的基本结构,但用自然语言表达,使得人类可以用自然语言片段与LLM交互,逐步构建程序。
我们设计一种结构化的自然语言,即用自然语言表达,但遵循固定的句式。
NPL程序由多个模块组成。
每个模块由模块声明、导入语句和多个定义组成。
定义可以是函数、类、变量等。
函数定义由“定义函数:”开始,后跟函数名、参数列表、返回类型和函数体。
函数体由多个语句组成,语句可以是变量声明、赋值、条件、循环、函数调用等。
由于时间关系,我们这里不展开完整的语法规范,但可以给出一个初步的设计:
模块:
模块: <模块名>
导入: <模块名> [, <模块名>]*
函数定义:
定义函数: <函数名>([<参数名> 为 <类型> [, <参数名> 为 <类型>]*)返回 <类型>
<语句列表>
类定义:
定义类: <类名> [继承 <父类>]
[属性: <属性名>(<类型>)]*
[构造函数([<参数名> 为 <类型>])
[调用父类构造函数(<参数列表>)]?
[设置<属性名>为<表达式>]
]?
[定义方法: <方法名>([<参数名> 为 <类型>])返回 <类型>
<语句列表>
]
语句:
赋值: <变量> = <表达式>
条件: 如果 <条件>: <语句列表> [否则: <语句列表>]?
循环: 当 <条件>: <语句列表>
对于 <变量> 在 <范围>: <语句列表>
函数调用: <函数名>(<参数列表>)
返回: 返回 <表达式>
表达式:可以是变量、字面量、算术运算、函数调用等。
类型:整数、浮点数、字符串、布尔值、数组、字典、自定义类等。
我们还可以增加更多特性,如接口、泛型等。