2022年,当AI开始绘画的时候,很多设计师们觉得没什么。当AI开始生成代码的时候,很多程序员也觉得没什么。当ChatGPT出现的时候,才将AIGC这一领域彻底引爆。被称为AI届的『iPhone时刻』。
ChatGPT对搜索引擎领域冲击巨大,百度仓皇应战,在今年二月高调官宣3月16号召开文心一言发布会。Robin信心满满地说:『十月怀胎,一朝分娩』。甚至扬言『ChatGPT不具备文生图的能力,站在另外一个桌子去比较的话,ChatGPT是落后百度的啊。』
看似百度早有储备,但文心一言(一格)最终衍变成你画我猜,是Robin所想不到的。
话分两头,在文心一言发布会前一天(3月15号),GPT-4横空出世。发布会的后一天(3月17号)微软宣布office全线产品全面接入GPT-4。而在3月16号当天,知名AI绘画产品Midjourney官宣了第5版发布的消息,不存在的中国情侣、特朗普被捕等AI画作以假乱真,震动业界。当然震动的不只是互联网领域、人工智能领域,也包含设计行业,以及模特行业。程序员们在感慨设计行业岌岌可危的时候,殊不知自己也在暗中进入了倒计时。
在OpenAPI发布GPT-4的同一天,同时宣布了旗下编程IDE:Cursor(官网:cursor.so)已经接入GPT-4。
咱也不知道3月16号前后是什么黄道吉日,还是微软、Midjourney你们和百度有仇,这么多AI产品震撼发布。
好了,废话不多说,言归正传。笔者初期也是以玩票的心态体验了这些产品,最终结果则是大为震撼。
ChatGPT我注册了账号,鉴于网上ChatGPT的经验对话已经太多,这里我就不放了。
我体验了一下最新的Midjourney V5。AI绘画与AI对话、生成代码不同,它们需要专业的prompt,我自然不专业,像模像样的看了几个后写了一些。因为我的公众号叫做『编程往事』,所以我写了一个 programming in the past 相关的prompt:
Chinese man, programming in the past, now only recall memories --v 5
--v 表示指定版本。这里用v5。生成结果确实相当震撼,足以乱真,下面有选项,不满意还可以继续调整。
再来一个,我随意写了一些词语:
daemon, chain, blue flame, fight, street, full boy,--v 5 --ar 9:16
--ar 表示指定生成的画面比例。比如上面这个就是9:16,当然它不是能支持任意比例的。对于不支持的比例会报错。这个生成的是2D插画风格的,看起来还不错。其实我只想要蓝色火焰(blue flame),上面大多是蓝黄火焰都有的,第四幅图更是没有蓝色火焰。不过这都没关系,毕竟我不会专业的prompt,我只是随意写的。而且Midjourney也并不完美。
再试一下卡通:
beauty with blond hair fly in the sky, by Toriyama Akira, side view --v 5 --ar 16:9
by指令用于指定图像的风格。Toriyama Akira就是鸟山明。不过生成风格来看其实不像是鸟山明,但确实已经是日本漫画的风格了。它对于欧美画家的风格会识别的更好一点。
看到小红书上有很多人在分享AI绘画,我也想把我生成的图片分享出去。虽然每次生成四张图点击U1 ~ U4四个选项,可以拿到4个加了细节的单图,但是我觉得太慢了。我就想把第一次生成的这4张图分享出去就行,于是我用手机相册编辑切割了半天。
心想着周末写个python脚本吧,一键切割。虽然我之前没写过python处理图像的代码,不过我知道python丰富的第三方库肯定能满足我,我只要google、百度一下,然后整理改改,再调试调试,花个把小时应该就能写出来。
咦,我为什么不让AI帮我做呀。于是我下载了Cursor。相比之前引起轰动的代码生成工具Copilot,Cursor不仅使用简单,而且免费。当然它也支持关联Copilot账号,关联之后生成的代码质量会更高,不过裸板也基本够用了。
我想实现的功能就是将一个图片从中间切割成4等份,并且新图片的名字前缀和原始图片名称一致。另外我发现Midjourney生成的四合一大图有时是webp格式,有时是png格式。我需要把webp格式转成jpg或者png。这是我是诉求,于是我打开Cursor 使用comman + K打开面板,输入:
python, 如果一个图片是webp格式则转成jpg格式。从中间切割成4个图片文件,每个图片名称的前缀和原图片相同。包含main函数,从命令行参数中获取原始图片的路径
既然师出名门OpenAI,这个用起来自然不需要专业的prompt,只需要用自然语言对话就行了,也支持中文。
很快,我得到一段脚本:
import os
import sys
from PIL import Image
def main():
if len(sys.argv) < 2:
print("Usage: python image_process.py [image_path]")
return
image_path = sys.argv[1]
if not os.path.exists(image_path):
print("Image path not exists!")
return
if image_path.endswith('.webp'):
image = Image.open(image_path).convert('RGB')
image.save(image_path[:-5] + '.jpg')
image_path = image_path[:-5] + '.jpg'
with Image.open(image_path) as img:
width, height = img.size
x_center, y_center = width // 2, height // 2
left, top, right, bottom = x_center // 2, y_center // 2, x_center + x_center // 2, y_center + y_center // 2
img.crop((0, 0, x_center, y_center)).save(f"{image_path[:-4]}_1.jpg")
img.crop((x_center, 0, width, y_center)).save(f"{image_path[:-4]}_2.jpg")
img.crop((0, y_center, x_center, height)).save(f"{image_path[:-4]}_3.jpg")
img.crop((x_center, y_center, width, height)).save(f"{image_path[:-4]}_4.jpg")
if __name__ == '__main__':
main()
保存执行,然后对上面几个图片分别执行。
确实可用。改都用不改了。预计周末花个把小时做的事情,就这么没了。
除了这些玩具性质的脚本,Cursor也可以用在工作中。作为程序员,如果你没有ChatGPT账号,没关系。Cursor也带有聊天模式。比如我在开发一个组件的过程中,忘记了一个protobuf的用法,平时我就会去一通搜索。现在在Cursor中command + L开启对话模式:
protobuf中MessageOptions和FieldOptions中的序号可以相同吗
完美回答了我的问题。
接着我用command + K让它帮我生成一个demo代码:
C++ protobuf中通过反射获取一个enum类型的数字值和字符串名
// Assume we have a protobuf message called "my_message"
const google::protobuf::Descriptor* descriptor = my_message.GetDescriptor();
const google::protobuf::Reflection* reflection = my_message.GetReflection();
// Get the field descriptor for the enum field
const google::protobuf::FieldDescriptor* field = descriptor->FindFieldByName("my_enum_field");
// Get the enum value using reflection
if (field->type() == google::protobuf::FieldDescriptor::TYPE_ENUM) {
const google::protobuf::EnumValueDescriptor* enum_value_descriptor = reflection->GetEnum(my_message, field);
int enum_value = enum_value_descriptor->number();
std::string enum_name = enum_value_descriptor->name();
std::cout << "Enum value: " << enum_value << std::endl;
std::cout << "Enum name: " << enum_name << std::endl;
}
这些其实都不是比较难的编程问题,但若是平时,我肯定会去google、百度,阅尽千篇,然后找到答案。但现在都不需要了。所以说ChatGPT引领的这一轮AI浪潮对搜索引擎的冲击是巨大的。很多时候搜索其实是伪命题,搜索引擎只不过是在技术达不到的年代,提供人们解决方案的一个折中产品。比如我想写一段代码,我想写一个汇报,搜索引擎都会根据query(搜索词)搜到海量的网页,然后排好序发给用户。但是用户本质诉求并不是阅读诸多文档,然后自己再各种阅读理解、杂糅加工。他就是想写一段代码、写一个汇报而已,现在可以直接满足,还要什么自行车啊。有趣的是这两家都已谁能搜索到文章多为荣,甚至google这个单词都是是这个含义,google源自googol,即10的100次幂,表示数量极大,即google能搜到到的文章量巨大。以后大概率搜索引擎会只用来搜索一些常识性的问题。
在不久的将来,使用AI工具的能力,就像二十年前使用计算机一样,变成一个基础技能。但这个门槛其实又不高……所以我在感慨AI帮助我们提高生产力的同时,也感到深深的恐慌和无力。
当然不管是ChatGPT、Cursor还是Midjourney可能都不会百分百淘汰某个行业。稍微岔开一下话题,在BERT等NLP领域的深度模型中,有一个叫做fine-tune(微调)的概念。即首先有一个基于大量通用数据预训练的模型,然后再针对这个模型进行某个领域的fine-tune,最终生成自己需要的模型。将模型训练过程分成两段,无疑减少了训练的时长(因为前者是很少需要重新再训练的)。这里我也借用一下这个概念:未来社会,人类职业慢慢会变成对于AI工具的工作成果进行fine-tune的过程。比如设计师,他们的技能除PS等设计软件之外,也需要学习Midjourney等AI绘画工具的prompt,然后对结果进行微调。程序员也类似,比如我前面生成的代码不能直接拿到工作中使用,需要调整,但程序员的工作会变成无数次与AI对话的过程,甚至向它咨询架构方案。
是不是觉得程序员的工作瞬间低端了,倒也不必过度悲观,就像我们处理数据库的时候使用的SQL语言,其实也不过是数据库的prompt罢了。行业就是这样一点一点发展过来的。不过技术栈需要及时调整是必然的了,未来这个调整的频率以及幅度会更剧烈。
所有技术发展出来都是在提高社会运行的效率,比如高铁飞机加快了物流、客运。比如信息技术加快了知识和资讯传播速度,让许多行业开始电子化办公。但社会效率提升的同时人们并不会因为原先一周干完的工作现在一天就能干完,而能休息四天。随着整个社会运转的加快,人们也会更加疲于奔命。AI不会百分百淘汰某个行业,但是会淘汰行业中相当比例的人。
夜已深,无端思绪惹闲愁。前些年一直被诟病的AI落地问题,似乎突然迎来了井喷。AIGC是一个比无人驾驶会更快冲击人们日常生活的领域。作为普通人似乎已经开始温和地走入了那个良夜,变成了命运沉睡的奴隶。若干年后当人们回首往事时,不知道是否会想起2022对世界的影响,远在疫情之外。