当前位置: 首页 > news >正文

实时的软件生成 —— Prompt 编程打通低代码的最后一公里?

PS:这也是一篇畅想,虽然经过了一番试验,依旧有一些不足,但是大体上站得住脚。

传统的软件生成方式需要程序员编写大量的代码,然后进行测试、发布等一系列繁琐的流程。而实时生成技术则是借助人工智能技术,让计算机自动生成代码,并直接运行,从而大大提高了软件生成的效率和质量。

而实时生成技术是一种借助人工智能技术让计算机自动生成代码,并直接运行的方法,大大提高了软件生成的效率和质量。实现实时软件生成的一种方式是 Prompt 编程,可以将自然语言转化为直接运行的软件,而无需生成中间的一次性过渡代码。

引子

从 2019 年,写了那篇《无代码编程》开始,我也一直在思考,诸如于 2021 年和 2022 年 的前端趋势总结。

先前,我并不看好当前的低代码/无代码方案,先我们来思考一下这个过程:

第一步,业务需求需要在人类脑海里转换一遍,转换为程序逻辑。

第二步,专业人员(如程序员)将这些逻辑转换到无代码系统中,生成应用并直接部署。

第三步,如果这个专业人员是程序员,那么新的需要变更时,他可能直接去修改源码。

而随着 ChatGPT 的进一步普及,你会发现你可以很容易将需求转化为形式化格式,进而转化而软件,从而使得软件开发的效率和速度大大提升。这种一次性代码的新型软件工程方法就是实时软件生成,便可以进入真正的 “无代码” 时代。

Prompt 编程:真正的无代码

023f1828470e76d37699b2dafa80f203.png

Prompt 编程是实现实时软件生成的一种方式,可以将自然语言转化为直接运行的软件,而无需生成中间的一次性过渡代码。每当需要运行程序时,只需要再运行一下 prompt 或者触发词,就可以直接运行起某个软件。

我们尝试从编写 Prompt 的经验里,归纳出一套适合于 Prompt 编程的逻辑,方便于大家理解。Prompt 编程有以下特性:

1)从需求到代码的直接转换;

2)代码只是临时产物;

3)次序化的分解框架。

这种一次性代码的新型软件工程方法可以进入真正的 “无代码” 时代。

Prompt 编程特性 1:从需求到代码的直接转换

用户只需要简单输入自己的需求就能够生成符合要求的软件,无需具备专业的编程技能。示例:

我们来玩一个 mul 游戏,当我说 mul 开头,并输入数字时,你应该计算结果。
示例:
"""当我输入:mul 4,你应该输出:16"""

在这个游戏里,我们使用:

  1. 触发词。mul 作为街头暗号,告诉程序你要按这个步骤走。类似于编程里的函数名。

  2. 示例作为输入和输出。即预期输入某个结果时,输出我们想要的结果。

而在其实,已经是一个函数该有的样子:输入、输出、关系。值得注意的是,在简单的问题下,只要我们给定了示例,那么 AI 就会根据示例去计算输入和输出,不关注中间的处理逻辑。

接下来,再看一个隐含性编程的示例,依旧我们还是玩个游戏:

我们能玩一个名为 kfc 的谜语创作游戏,当我说 "kfc",你写一个谜题,要求:
1. 不少于 200 字
2. 谜题不能出现肯德基和星期四
3. 正文可以夹杂小语种语言,如 """他说:Ciao"""
4. 谜底必须是 ###原来今天是肯德基疯狂星期四!!!###
格式类似于:
"""
...
"""

这个例子已经相当的自由,我们也不关心中间的处理逻辑,只关注于结果。

Prompt 编程特性 2:代码只是临时产物

还记得在 Prompt 编写模式 中的 wula 游的例子吗?在 wula 游戏里,用户只需要输入问题,ChatGPT 便会自动给出代码、代码解释和文章。诸如于: wula: 头共10,足共28,鸡兔各几只?,那么 AI 便会开始自动开始二次编程:

这是一个鸡兔同笼问题,题目给出了头的数量和足的数量,要求求出鸡和兔的数量。
通常解决这个问题的方法是,
假设鸡和兔的数量分别为 x 和 y,那么可以列出如下方程组:
x + y = 10
2x + 4y = 28
解方程组可以得到 x=4,y=6,即鸡有4只,兔有6只。
鸡兔同笼问题的 JavaScript 代码实现
// 计算鸡兔数量的函数
function calcAnimals(heads, legs) {
.....

在传统的体系之下,我们要关注于中间生成的 JavaScript 代码代码能不能运行等等,所以我们在设计 wula 的时候,要求了:

第二步. 代码编写:你需要用 JavaScript 编写解决这个问题的代码,并输出对应的代码,
并介绍一下你的代码(不少于 200 字)。
第三步. 代码执行:你需要作为 JavaScript Console 执行第二步写的代码,
如果没有给出测试数据,你需要自己随机生成测试数据,并将这些数据输入到代码中进行计算。

但是,回到第一个例子里,我们并不需要 JavaScript 代码,我们不需要任何代码。ChatGPT 可以为我们生成这部分的程序!!!

唯一限制我们的是:

  1. ChatGPT 的上下文能力

  2. 我们的 Prompt 编写能力

而在复杂的场景之下,Prompt 编写需要足够的形式化,才能让机器理解,也因此,我才把它称为 Prompt 编程。

Prompt 编程特性 3:次序化的分解框架

仅就当前而言 AI 的上下文能力,限制了 AI 解决复杂问题的能力。所以,它无法一次性解决复杂、中大型的问题,甚至于小型项目都存在一定的难度。同样的,对于人类来说,也存在这样的局限性,只是人类的问题是领域知识有限

步骤详细见:DDD Sample

所以,作为编程核心的人类大脑,需要为机器设计一下工序,即每一步应该怎么做。所以,这个时候,就回到了 DDD(领域驱动设计)擅长的问题:

我们来定义一下 DDD 游戏的步骤,一共有 6 个步骤,步骤如下:
"""
第一步. 拆解场景。分析特定领域的所有商业活动,并将其拆解出每个场景。
第二步. 场景过程分析。选定一个场景,并使用 "{名词}已{动词}" 的形式描述过程中所有发生的事件,
其中的名词是过程中的实体,其中的动词是实体相关的行为。
第三步. 针对场景建模。基于统一语言和拆解出的场景进行建模,以实现 DDD 设计与代码实现的双向绑定。
……
"""

对于每一步,我们只要限定好我们的输出(Output),那么在给定输入的情况下,AI 就能给出我们想要的(也有可能跑偏了)结果:

ddd 第二步:场景过程分析。下面是每个场景的过程分析:
用户注册和登录用户注册:用户填写注册信息,系统验证信息合法性,生成用户账户并保存。用户登录:用户输入账户名和密码,系统验证账户密码,登录成功后跳转到用户中心。
商品展示和搜索商品列表展示:系统从数据库中获取商品列表并展示,用户可以进行商品分类和排序。商品搜索:用户输入关键词进行商品搜索,系统根据关键词从数据库中获取商品列表并展示。
……

在这时,我们就可以引导 AI 生成到 API 粒度:

a2258e1cca56a3609c3c8cd4cf6d63e1.png

也可以生成代码,甚至于在上下文足够强大的时候,也是能够直接运行和自动优化的。

Prompt 编程特性 4:语言即语言

DSL(领域特定语言)是指专门针对某个特定领域的语言,通常具有严格定义的语法和规则,并且可以用来描述该领域中的问题、概念、过程和数据等。而经过形式化处理的自然语言可以被视为一种 DSL,因为它们具有明确定义的语法和规则,可以用来描述特定领域中的问题、概念、过程和数据等。

所以,简单来说如果我们限定了输入和输出的格式,那么我们的自然语言也是一种 DSL。这就意味着,限制我们进行次序化的关键就是形式化的抽象。

而,我们也可以通过编写 Prompt 来生成新的 DSL: 帮我设计一个 DSL,用来写函数

好的,以下是一个简单的DSL设计,可以用来写函数:
1. 函数定义
在这个段落中,定义一个函数,包括函数名、参数和函数体等。

函数:函数名:描述函数的名称 参数:参数1:描述参数1的名称和类型 参数2:描述参数2的名称和类型 ... 函数体:描述函数的实现细节

2.。。。

简单来说,我们可以通过 Prompt :

  1. 借用 Prompt 设计自然语言式的 DSL

  2. 将自然语言式的 DSL 融入 Prompt

  3. 使用次序化的方式来实现 Prompt 自我编程

进而,我们就得到了一个可以自举的 Prompt。

Prompt 编程 Demo:引导 ChatGPT 创建语言与建模

1a39d94ab12637a8686bc2a714b6baae.png

说了,这么多我们来看一个结合我之前设计的 DSL 示例,即 Fklang。

阶段一:让 ChatGPT 与你学 DDD

在 Fklang 中,我们采用下面的形式来表示 ContextMap:

ContextMap TicketBooking {
Reservation -> Cinema;
Reservation -> Movie;
Reservation -> User;
}

但是,自己设计这样的 DSL 太累了,可以让 ChatGPT 来设计。在你开始之前,需要确认一下 ChatGPT 中的 DDD、DSL、事件风暴等的概念是否与你理解的一致。

第一个问题: 设计一个 DSL 来表示 DDD 里的 Context Map 。

ContextMap:
Subdomain { Name: [subdomain_name] }
[CollaboratesWith: [other_subdomain_name], ...]
[ConformistWith: [other_subdomain_name], ...]
[Antagonizes: [other_subdomain_name], ...]
...

第二个问题:用这个 ContextMap DSL 对在线电影订票系统建模。对于其它问题也是相似的。

第三个问题:设计一个 DSL 来描述事件风暴的 事件建模 吗?

第四个问题:能用 事件建模的 DSL 来表示用户购票的流程吗?

一旦,我们觉得设计跑歪了,就可以重新设计。如果下是生成的复杂的 DSL:

EventStorming:
Domain { Name: "电影订票系统" }
Event { Name: "用户提交订单" }
Triggered By: "用户选择电影、场次、座位,确认订单"
Description: "用户提交订单,包括所选电影、场次、座位等信息"
Actors: ["用户"]
Action: "将用户提交的订单信息保存到订单数据库中"
Outcome: "订单状态被标记为已提交"

第五个问题……

剩下的你都会了,不会的,可以问 ChatGPT。

阶段二:完整设计 + DSL 生成

第一个问题:能总结一下,我们这里用 DDD 设计 购票系统到落地代码的过程吗?

第二个问题:能为每个过程,设计一个合理的 DSL 吗,并展示他们?

展示一部分神奇的 DSL:

generate java-code from-domain-model
target-package: com.example.movieticket.order
source-model: order-domain-model
service-mapper 订单服务映射
map-method: 查询电影
to-class: MovieRepository
to-method: findBySchedule
map-method: 查询座位
to-class: SeatRepository
to-method: findByRowAndColumnAndStatus

现在,有意思的地方来,有了上面的一系列 DSL 之后,我们就可以接入到代码系统中。

阶段三:代码生成与低代码

只要 ChatGPT 上下文能力足够强壮,或者支持 LoRA 式的插件模式,我们就能实现从需要到现有的任何系统中。

第一个问题:为电影订票系统设计一个 DDD 风格 Java 工程的代码目录结构。

第二个问题:结合 Spring 设计一下购票流程的 RESTful API

……

有点懒,就先这样吧。后面的部分,就可以结合 GitHub Copilot 去实现了。

小结

结合 Prompt 编程,低代码到了一定的成熟度,我们就可以发现更好玩的东西:实时的软件生成

实时的软件生成:自然语言即 Prompt,Prompt 即代码

62f4d363475bf21e8ffdbf5c3a1365d4.png

实时软件生成核心思想是,通过算法和机器学习来自动生成代码,让计算机根据用户需求,快速生成符合要求的软件。这种技术能够自动化完成代码的编写、测试、发布等流程,大大缩短软件开发周期,降低了开发成本,提高了开发效率。

当我们想构建这样一软件用于实时生成软件时,它需要具备以下的特征:

  • 特征 1:自然语言即语言,语言即软件。即如上面的 Prompt 编程所述,可以通过设定层层转换,直接将需求直接转换为软件。

  • 特征 2:生成式的软件架构。软件本身不需要架构,架构是 AI 自动生成和调整的。

  • 特征 3:自底向上生成。现有的语言本身需要 REPL 环境、操作系统、编程语言、语言底层库、库等一系列软件,对于 AI 而言,他能学习这些通用能力,自操作系统底层一样,逐步往上构建出软件的运行环境,以及软件本身 。

当前的挑战

对于当前而言,我们还存在些挑战:

  • 现行组织架构难以支撑内部 ChatGPT。如内部权限、架构等的管理

  • 通用大模型无法满足。领域特定能力有限,需要构建 LoRA 以更好的支持。

  • 细节能力实现较差。在编程实现上,远不如 GitHub Copilot

当然了,受限于个人能力,可能还有别的一些挑战。

总结

本文介绍了 Prompt 编程的特点和实时软件生成的核心思想。Prompt 编程是一种次序化的分解框架,可以让机器根据用户需求自动生成代码。实时软件生成技术可以大大提高软件生成的效率和质量,同时也让软件开发变得更加简单。然而,现有组织架构难以支撑内部 ChatGPT,上下文能力有限,细节能力实现较差,这些都是实现 Prompt 编程和实时软件生成的难点。

相关文章:

实时的软件生成 —— Prompt 编程打通低代码的最后一公里?

PS:这也是一篇畅想,虽然经过了一番试验,依旧有一些不足,但是大体上站得住脚。传统的软件生成方式需要程序员编写大量的代码,然后进行测试、发布等一系列繁琐的流程。而实时生成技术则是借助人工智能技术,让…...

互联网工程师 1480 道 Java 面试题及答案整理 ( 2023 年 整理版)

最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开 Boss 直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉 Java 一个初中级岗位有上千人同时竞争&#…...

Spark开发

第一步:创建RDD Spark提供三种创建RDD方式:** 集合、本地文件、HDFS文件** 使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造一些测试数据,来测试后面的spark应…...

Tornado异步框架

简介: tornado是Python的web框架。tornado和主流的web服务器框架有明显的区别:它是非阻塞式服务器,而且速度非常快,得力于其非阻塞的方式和epoll的运用tornado可以每秒处理数以千计的连接(号称) 基本配置 …...

openpnp - error - 吸嘴没下降到板子上, 就将元件松开

文章目录openpnp - error - 吸嘴没下降到板子上, 就将元件松开概述笔记ENDopenpnp - error - 吸嘴没下降到板子上, 就将元件松开 概述 以前用过国内一家openpnp厂家出的设备, 他们家的openpnp是自己改过的. 贴片流程已经走过一遍. 这次还是按照以前记录的笔记, 按照国内那家的…...

【Java】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细

时间格式 时间格式(协议)描述gg时期或纪元。y不包含纪元的年份。不具有前导零。yy不包含纪元的年份。具有前导零。yyyy包含纪元的四位数的年份。M月份数字。一位数的月份没有前导零。MM月份数字。一位数的月份有一个前导零。MMM月份的缩写名称,在AbbreviatedMonthN…...

快鲸SCRM发布口腔企业私域运营解决方案

口腔企业普遍面临着以下几方面运营痛点问题 1、获客成本居高不下,恶性竞争严重 2、管理系统落后,人员流失严重 3、客户顾虑多、决策时间长 4、老客户易流失,粘性差 以上这些痛点,不得不倒逼口腔企业向精细化运营客户迈进。 …...

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。组合逻辑电路比较简单,仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时,输出几乎(信号在电路中传递时会有一小段延迟)立即就发生…...

2023前端菜鸟笔试血泪史html5-one--找到工作前都更新

1.说说对html语义化的理解 什么的HTML语义化,顾名思义,HTML语义化就是可以不通过了解HTML的内容,就可以知道这个部分所代表的的意义。 HTML语义化的意义:在使用HTML标签构建页面时,避免大篇幅的使用无语义的标签。 …...

蓝牙调试工具集合汇总

BLE 该部分主要分享一下常用的蓝牙调试工具,方便后续蓝牙抓包及分析。 目录 1 hciconfig 2 hcitool 3 hcidump 4 hciattach 5 btmon 6 bluetoothd 7 bluetoothctl 1 hciconfig 工具介绍:hciconfig,HCI 设备配置工具 命令格式&…...

Java 获取文件后缀名【一文总结所有方法】

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

UML常见图的总结

一、概述 UML:Unified Modeling Language,统一建模语言,支持从需求分析开始的软件开发的全过程。是一个支持模型化和软件系统开发的图形化语言、为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到…...

WebRTC系列-工具系列之音频相关工具

文章目录 1. audio_util数据格式转换类2. WavFile文件读写类2.1 读取wav文件2.2 写入wav文件这篇文章主要介绍WebRTC中一些音频工具这些,大部分都在 common_audio目录下,这个文件夹下提供音频的大量算法,包括sinc重采样算法,音频数据格式的转换:例如 float转int16_t格式等…...

7 线性回归及Python实现

1 统计指标 随机变量XXX的理论平均值称为期望: μE(X)\mu E(X)μE(X)但现实中通常不知道μ\muμ, 因此使用已知样本来获取均值 X‾1n∑i1nXi.\overline{X} \frac{1}{n} \sum_{i 1}^n X_i. Xn1​i1∑n​Xi​.方差variance定义为: σ2E(∣X−μ∣2).\sigma^2 E(|…...

适合小团队协作、任务管理、计划和进度跟踪的项目任务管理工具有哪些?

适合小团队协作、任务管理、计划和进度跟踪的项目任务管理工具有哪些? 大家可以参考这个模板:http://s.fanruan.com/irhj8管理项目归根结底在管理人、物,扩展来说便是: 人:员工能力、组织机制; 物:项目内…...

从100%进口到自主可控,从600块降到10块,中科院攻克重要芯片

前言 2月28日,“20多位中科院专家把芯片价格打到10块”冲上微博热搜,据河南省官媒大象新闻报道,热搜中提到的中科院专家所在企业为全球最大的PLC分路器芯片制造商仕佳光子,坐落于河南鹤壁。 为实现芯片技术自主可控自立自强&#…...

关于git的一些基本点总结

1.什么是git? git是一个常用的分布式版本管理工具。 2.git 的常用命令: clone(克隆): 从远程仓库中克隆代码到本地仓库 checkout (检出):从本地仓库中检出一个仓库分支然后进行修订 add(添加): 在提交前…...

PyTorch保姆级安装教程

1 安装CUDA1.1 查找Nvidia适用的CUDA版本桌面右键,【打开 NVIDIA控制面板】查看【系统信息】查看NVIDIA的支持的CUDA的版本,下图可知支持的版本是 10.11.2 下载CUDACUDA下载官方网址https://developer.nvidia.com/cuda-toolkit-archive找到适合的版本下载…...

MySQL 上亿大表如何优化?

背景XX 实例(一主一从)xxx 告警中每天凌晨在报 SLA 报警,该报警的意思是存在一定的主从延迟。(若在此时发生主从切换,需要长时间才可以完成切换,要追延迟来保证主从数据的一致性)XX 实例的慢查询…...

Git(狂神课堂笔记)

1.首先去git官网下载我们对应的版本Git - Downloading Package (git-scm.com) 2.安装后我们会发现git文件夹里有三个应用程序: Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多 Git CMD:Windows风格的命令行 G…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...