Prompt 即代码是一种基于多种输入模态的编程范式,它通过结合文本、图像、语音等多种输入方式来提供更丰富的上下文信息,帮助程序员更好地表达自己的意图,并生成相应的代码实现。
Prompt 即代码将 prompt 作为代码的一部分,以及作为标准接口来定义生成的代码,同时提供注释和文档信息以支持可读性和可维护性。通过使用 prompt 即代码,程序员可以提高编码效率,同时生成更准确、更可靠的代码实现。
在前两篇 AI 编程文章《渐近式 AI 编程模式:Unit Mesh 架构的设计思路与探索》与《未来可期的 AI 编程:到底是程序员的终极解放还是失业的开始?》里,我们已经阐述了几年后、未来的 AI 编程带来的影响。
而在不考虑采用诸如 Unit Mesh 新架构的情况下,我们需要在现有的架构和工程体系中融入 AI 编程。因此在这篇文章里,我们将回到现在 —— 此时此该,我们应该如何与 AI 编程共处,让 AI 成为我们的 Copliot。
相关的例子可以见:https://www.clickprompt.org/zh-CN/github-copilot-samples/
自打 GitHub Copilot 正式发布以后,作为知名的开源挖坑作者,拿到了免费的版本,但是只能偷偷使用。公司明令禁止我们在公司项目使用,所以只能在业余项目、开源项目中用用。
从个人的使用体验来说,AI 大概提升了我 20% 的编码效率 —— 大抵是我写的代码都比较偏门。但是怎么说呢,抄、fork、生成 的代码质量都 TM 的不行(有可能我是 Clean Code 的忠粉),所以 ,我经常吐槽说,你在垃圾库里是训练不出好的模型的。
所以,简单来说,对于效率提升是大大的,如果是 CRUD 效率更高,但是质量不行。反正,以后重写速度比重构更快,代码质量不重要(手动狗头)。
除此,从个人的感受来说,编写 Copilot 所需要的 Prompt 是需要学习门槛的。
回到真实世界,我们要用好 AI 编码,需要考虑这个问题?
不论是 GPT-4 发布会的 Demo,还是令大家惊艳的 Cursor.so 开发工具。就当前的 GPT 能力而言,谈编程消失还太早了。GPT 只是一个复读机,解决不了任何复杂的编程问题。复杂场景下,GPT 容易丢失部分条件,需要由人来作这好 Tasking 的过程。
在条件不充分的情况,你可以轻松让 AI 生成一个页面、一个函数,但是他无法达到你想要的结果。所以在,Unit Mesh 架构下,一部分程序员成为了 AI 代码验证师 + AI 代码修复师,它将持续非常很长一段时间。
当前的 AI 编程只是取代你的转译过程:需求细分、转换需求成代码等。你可以看看你的提交历史:一天提交了几行代码,又是哪个时间提交的。有可能你算下来了,白天都在开会,只有晚上写代码。我记得知乎有一个相关的问题,大部分人的回答都是平均几十行、几百行。当然按行数是不科学的,成长期的项目的行数是远大于维护期的。
所以,如果你的编码时间很长,而架构设计、需求讨论等的时间很短,可能得考虑一下职业生涯,强化你的设计、拆解能力。毕竟,一旦效率提高的,还是有些程序员会失业的。
身处于各类可访问 ChatGPT 的微信群中,遇到很多问题的时候,我经常会抛出一句:”问 ChatGPT 啊“。很多人并不会真正意识到 ChatGPT 是一个工具,唯一的乐趣可能就是:”请帮我生成一个 KFC v50 的故事“。
这也是我们创建 ClickPrompt、ChatFlow、PromptPatterns 等项目的初衷,大部分人需要先意识到 AI 能做什么。然后,才是如何写好 Prompt,我们要摸摸我们的 Copilot 的脾气,然后再一起干活。诸如于:
函数名直接生成代码。
函数名 + 处理步骤生成代码。
每种模式的背后,都很有意思。
在进一步展开 Prompt 即代码之前,我们需要先了解一下如何写好 Prompt。如下是,我之前放在 ClickPrompt 上面的一部分 GitHub Copilot 示例。

功能定义:定义所需的功能,并为模型提供足够的上下文和信息。这可以帮助模型更好地理解其意图并生成相应的代码。示例 1:函数名、输入和输出,就能自动填充。
任务拆分:将任务拆分为小的子任务,并确保每个子任务的要求和期望输出都非常清晰。示例 2:如上图的按步骤设计示例,每一步都需要想好要怎么做。
确定输入与输出格式:Prompt 规范应该明确输入与输出格式和数据类型,以便模型可以正确地处理输入。示例 3:我们添加了 i18n 的 json 过来,让 Copilot 自动映射。
测试和调试:在生成代码之后,应该进行测试和调试,以确保其正确性和可靠性。同时,应该为模型提供反馈,以帮助它改进其生成的代码。示例:让 Copilot 编写对应的单元测试,我们对测试用例进行检查。
避免歧义:Prompt 规范应该避免使用歧义的语言和术语,并确保在多种上下文中生成的代码是一致的。只在出错时,我们才会发现这条原则是有用的。
编码标准:定义编码标准,并确保生成的代码符合这些标准。这可以确保生成的代码易于阅读和维护,并符合团队的编码惯例。这个就需要我们团队去做了。
看上去有没有像极你平时写的伪代码,作为一个伪代码工程师的你,是不是发现生产力可能爆炸了。
再重复一下定义:
Prompt 即代码是一种基于多种输入模态的编程范式,它通过结合文本、图像、语音等多种输入方式来提供更丰富的上下文信息,帮助程序员更好地表达自己的意图,并生成相应的代码实现。Prompt 即代码将 prompt 作为代码的一部分,以及作为标准接口来定义生成的代码,同时提供注释和文档信息以支持可读性和可维护性。通过使用 prompt 即代码,程序员可以提高编码效率,同时生成更准确、更可靠的代码实现。
当谈到 Prompt 即代码时,我们通常会将其定义为一种编程范式,它将自然语言或其他形式的输入作为代码生成的起点。Prompt 即代码则让程序员通过提供高度概括的自然语言描述或其他形式的输入来描述他们想要的功能,然后由 AI 系统自动生成代码。
所以,在这里我们分为两种方式:标准的 Prompt 即代码、多模态的 Prompt 即代码。
文本 Prompt 即代码是指使用自然语言或其他方式描述需求或问题,通过 AI 模型自动生成对应的代码。Prompt 作为代码的一部分或者核心,通过描述期望的输入和输出,以及需要执行的操作来生成代码。
尽管现有的 AI 工具都是多模态的,然而自然语言是作为中间语言存在的。所以,我想将文本形式的 prompt 称为标准的 Prompt 即代码,它可以方便地融入现有的编程体系。
Prompt 即注释。Prompt 作为注释与代码并存,在这种情况下,Prompt 与代码共存于同一个文件中。通常,Prompt 以注释的形式出现在代码中,以提供必要的上下文信息和生成代码的指令。这种方式适合于需要经常手动修改生成的代码的场景。
Prompt 即接口。在这种情况下,Prompt 作为一个标准的接口,代码则是实现这个接口的生成代码。这种方式适用于对生成的代码进行自动化测试和部署的场景,因为接口定义的一致性可以更好地保证代码的正确性。
Prompt 即代码。在这种情况下,版本管理工具中不再存储代码,而是存储 Prompt。生成的代码则可以根据 Prompt 来生成,Prompt 作为代码的一部分。这种方式适合于需要频繁更新代码和对代码进行版本控制的场景。
而,事实上,在我第一次将注释加入到 ClickPrompt 中的时候,我犹豫了很久。我们的过去的编程习惯,并不允许将思考过程作为注释到其中。

PS:感谢 ChatGPT 帮我考虑了这一部分。
多模态 Prompt 即代码是指在训练 AI 模型时,同时利用多种不同的输入模式(如文本、图像和语音)来提供更丰富的上下文,以帮助模型更好地理解程序员的意图并生成相应的代码。通过使用多模态 Prompt,AI 模型可以获得更多的信息,并在生成代码时更准确地反映程序员的意图。
例如,一个基于多模态 Prompt 训练的 AI 模型,可以同时考虑程序员在文本上下文中输入的代码片段,代码所处的项目信息、数据结构信息,以及程序员所提供的图像信息,如示意图、流程图等,从而生成更准确、更完整的代码。
PS:不过,这种技术需要大量的数据和计算资源,同时需要对不同的输入模式进行处理和整合,因此在实际应用中还需要进一步研究和优化。
过去的几个月里,每天层出不穷的 AI 新工具,都在让我们感受人类的智商上限和 AI 的下限。与现在的编程方式相比,未来几个月势必会出现新的、或者已经出现新的交互方式。
诸如于:
交互式 Prompt:在编写代码的过程中,模型可以提示程序员输入,从而帮助模型更好地理解程序员的意图,并生成更准确的代码。例如,Unit Mesh 采用的架构模式,便是由人类和 AI 共同完成的,并由 Unit Server 自动化部署。
面向场景的 Prompt:通过提供与特定场景相关的信息和上下文,可以帮助模型更好地理解程序员的意图并生成相应的代码。例如,面向 Web 开发的 Prompt 可能包括与 HTML、CSS 和 JavaScript 相关的信息和上下文。
等等。
Prompt 即代码的交互方式将会越来越多样化和智能化,以更好地满足程序员在不同领域和场景下的需求。
PS:最后,让 ChatGPT 3.5 总结一下本文的后半部分(毕竟 4K Unit)。
这篇文章介绍了 Prompt 即代码的写作方法,多模态输入的利用,以及 AI 模型生成代码的方式。好的 Prompt 规范包括功能定义、任务分解、输入输出格式、测试和调试、避免歧义、编码标准等要素。文本形式的 Prompt 可以使用自然语言或其他方式描述需求或问题,并通过 AI 模型自动生成对应的代码。最后,根据具体应用场景选择不同的 Prompt 与代码的结合方式。
PS:我的 Copilot,写得不行不行的。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: