大家好,
欢迎收听老范讲故事的YouTube频道。今天咱们来讲一讲华为大模型演示翻车现场。
近期呢,非常多的AI相关的项目都在进行演示和发布,特别是国内。为什么它?因为时间到了。通常每年在这个时候也会有很多发布,因为每年在这个时候会开谷歌IO,大家喜欢在谷歌IO的前后进行信息的发布啊。因为谷歌IO算是全世界程序员或者开发者的一个盛会吧。那这个前后进行信息发布的话,如果它被安卓采用了,或者再跟谷歌搭上一点关系的这种技术会有更好的发展空间。
那今年呢,还有另外一个事情,就是拉玛3发布。前面其实国产很多大模型都是跟拉玛2有千丝万缕的联系。其实当时就已经预言过,我说拉玛3出来看多长时间之后,国内的大模型会争先恐后的再更新换代一波。现在呢,这个时间点就到了。前面阿里的通1,000问2.5发布,这两天还有几个,一个是零一万物的啊,叫e latch大模型发布,然后字节跳动的豆包大模型前两天也发布了啊。这豆包大模型主打的一个便宜,对别人的价格都便宜非常多,因为大模型的价格一般是按TOKEN算的啊,一般一个汉字是一个TOKEN,大概四个字母,还是几个字母的英文单词,是一个TOKEN啊,它这个算法比较奇怪。
华为呢,也在发布他们的升腾大模型。结果现场演示的一段视频就爆火了。现场演示什么呢?就是一个Python代码,啊而且是正在写的Python代码,他们还很神奇,直接在底下的命令行窗口里边就输入信息了,说请帮我输出一个什么什么图片,还号称是REG的一个图片生成。一开始啊,这位小哥输出的时候呢,就写错了,先写了请帮,然后啪打了一个回车。其实我们在做各种大模型实验的时候,这个事是很常见的啊,因为呢都是对话系统嘛。你一打回车,他就开始干活去了。所以呢,一开始写请帮,他打了一回车,打一回车呢,后边那个程序就开始跑了。他就打了个Ctrl-c,就是把这个程序中断掉。
将一般我们使用的,像Python这种解释性语言,或脚本语言的程序,都可以靠Ctrl-c把它中断下来。中断完了以后呢,大家就看到了一些信息,写的是输出到,叫做output点洁癖器,是调用的XMINDX的一个库。然后呢,大家真正关注的是,里头有一句话,叫time.sleep(6)这样的一个话在里面。
那么大家说说你这个到底在干啥啊?你是不是要等着6秒钟以后,再给我看图片就完事了呢?啊,因为大家也确实是呃,测试了一下视频啊,就是他正确的输入了以后,等了6秒钟,然后这个图片就生成出来了。大家就觉得你是不是在这骗傻子呢?
很多人在知乎啊,在很多地方就开始讨论了,说华为是不是又遥遥领先了呢?跟大家稍微解释一下这个事啊。啊,我个人是专门做职业的编程演示的,可能在国内比我更职业的人不多啊。为什么这么讲,我是原来Bolan的公司,大中华区的image list,就是每天就出去给人做演示啊,我的工作就干这事。这个事呢,我干了四年啊,大概是在全国各地演示了,应该有可能几百场啊,就各种新特性演示。
因为这次,其实你基本上把它认为是一种,叫做授权工程师,每一次Boland出什么新的编程特性了,然后我就出去给人演示去。所以这个事,我相对来说还是比较熟练的。那么他这一次演示呢,为什么会出这样的事情啊?我们也尝试帮他洗一洗,对吧咱们别老说老范,你是不是很讨厌华为,没有啊怎么可能呢,对吧咱们稍微讲一下,这事到底是发生了什么。
首先呢,我们要先想清楚他到底在掩饰什么,这个其实是比这个sleep(6)这个事更重要的。
要更奇葩的一个事。为什么呢?因为他演示了一个非常不常见的功能,叫做图片RA器。这个功能其实用的人不是没有,有人在用,但是呃,很少人用。
咱们先讲讲什么是reg啊。reg这个东西呢,叫检索辅助生成。为什么要做reg呢?因为我们知道,这个大模型经常会一本正经胡说八道。那我们怎么避免大模型一本正经的胡说八道呢?很简单,就是我们先给他准备好小抄啊,或者说准备好一堆的小纸条,说请把这些都背下来啊,请按照这个小纸条上的内容去给我回答啊,不允许自己瞎编啊。我们通常会通过这样的方式,来让大模型按照我们要求的方式去输出啊,这就是做Rag。
然后Rag的这个原理其实也很简单。我们先给他一大堆的这种小纸条啊,就是基础内容吧,然后呢让他去做嵌入啊,in bedding inviting的过程是什么呢?就是他把你给他的一段话啊,这段话通常还挺长,一般是可能500多字,有的有1,000多字,把这个话呢啊,变成一个数组啊,或者说变成一个矢量空间。但是呢他这个矢量空间不是二维的,不是三维的啊,而是可能 102四维,就是一个很高维度的一个矢量空间上的一个点。就是你给他一堆文字,然后这堆文字说哎,我认为这个文字在这个点上,然后再给他下一堆文字的时候,他再给他标注一个点啊,这个叫史量化。然后呢你再说我现在要问问题了,他呢把你的问题也做一次质量化啊,也在这个质量空间里头,1024维或者有的有4096维的这样的一个高维的空间里头啊,把你的问题做一个点,然后再下一步是什么呢?找到在这个更高维空间里头,离你的问题最近的5个点或者几个点,都是谁相对来说,就可以找到跟你提的问题模糊相关的内容信息。但是大家听到了我讲的这个过程没有?就是RAG整个干的活,其实基本上都是在文字基础上干的。他不是在图片基础上干的啊。所以他做图片RAG这件事,确实是比较奇葩。
通常我们做RAG演示都是什么呢?我们先把用户手册输进去,把各种报表把这些东西输进去,然后呢我们就问,大模型说哎,这个用户手册上说啊,这个按钮按了以后该怎么办啊,或者说这个报错了,然后出现哪个哪个报错码了,该怎么办啊?然后他先到这个史兰库里去搜,搜完了以后呢,找到四五条跟他相关的信息,然后呢去做一个事,叫提示搜工程。这个提示词工程一般这么写啊,说我们现在有一个问题啊,问题是这个用户提的,然后呢,我们通过RAG去找到了5条相关的答案,现在请对这5条答案进行总结输出,所有这个答案里头没有相关的内容,请不要去加编啊,我们一般会给他写一个这样的提示词,最前的是问题,后边是5条答案,下边是提示词,然后给你生成一个你想要的结果。通常还是要把这5条相关的信息,也都在后边备注下来,说你看啊啊,这个是我们当时搜到的这5个节点啊,你看看跟他是不是一致,因为他有的时候编的时候,还会总结的有问题嘛,他一般这样工作的。
但是图片RAG一般是怎么工作的,你们知道吗?啊他一般这样,就是说你先给他一堆图片,拿着这些图片以后啊,先要干什么叫做图片识别,我们先把图片都识别成文字,比如说这是一个男人长成什么样,然后如何如何,先识别一大堆这样东西出来,识别了以后呢,再把这个已经识别好的文字,再去做实量化,然后你说,我现在想要画一个什么样的图啊,照这个图片再去做rag生成的时候啊,也是可以做的啊,你比如说我现在,已经把一堆的这个图片放进去了啊,比如说中世纪的铠甲的,汉服的和服的啊,西装的休闲装的,我生成了一堆这玩意进去,生成完了以后呢。我现在给他一个新的人说,现在请给我把他换成一身这个什么样的衣服出来。这个其实就有点像RAG的过程啊,但是通常我们不这么干。通常干的过程呢,是直接用Ctrl night模型做端到端的处理啊。啊但是我们比如说就是做图片RAG了,那么你确实是可以这么来处理的啊。他最后能够保证什么呢?保证就是说哎,你输出里头有一部分是一致性的啊,这个人长得跟你输进来那个人还挺像的啊,中世纪铠甲跟你原来输进去的中世纪铠甲长得也挺像的,对吧这两个凑在一起还可以,这个就可以达到做图像rag的目的啊。但是呢呃,这种用途其实并不是那么常见了,可能用的更多的还是啊,直接在stable diffusion里面去呃做contranite,做一个换装,做这块的会做的稍微多一点点。现在他这个演示呢,就啊相对来说比较奇怪了。为什么奇怪呢?就是他演示的,是他最后底子说了一句话,前面的部分我们没看到,因为我们只看到最后翻车这一块嘛。啊前面到底是怎么演示的,如何入库的部分,我们没看到。通常情况下,这个RAG的完整演示,是要先给人演示入库的部分,然后呢,再演示这个检索和输出的部分。最后RAG真正给人看的是什么呢?就是你的输入跟输出之间的一致性,你看没有胡说八道啊,这个确实是原来我输入的东西,直接给他做出来了呀。一般是给人看这种东西,而不是说我给你一句话,然后你就给我输出一个图片,这个呢一般是做纹身图,会给人演示这个啊,所以他这个演示相对来说比较奇怪。当然也有可能是呃,我们前面的没看到前面有输入的部分,因为演示出了一些问题,然后导致这位做演示的小朋友呢,啊比较紧张,后边应该演示的部分没有演示出来,这个可能性是存在的。但是可能性没有那么大啊。待会我们再想为什么。那么,什么情况下会出现sleep(6)呢?这个sleep(6)其实很简单,就是停6秒钟啊,就是让这个程序什么也别干,等6秒钟以后再干活。大家甭管懂不懂编程的,会不会Python的sleep(6),这个跟大家想象的是一样的啊,就按语意意思去理解,没有任何毛病。
那么首先要想清楚一个问题,control c的时候,99.99999%的可能性会停在sleep(6)上。大家知道为什么吗?其实很简单啊,就是在正常程序运行的时候,每一个语句执行的速度都是很快的,你是没有办法说,我确定他停在什么地方。但是sleep(6),你想这6秒钟,他实际上就执行了这一句话。像其他的每一句话执行,可能只是零点几毫秒,或者是有一个毫秒,我估计一毫秒都不会有,只有一句话,是做了这个6秒钟的执行啊。那你打Ctrl-c,你想它停在这个sleep(6)上的概率有多大?所以你如果里头有sleep语句,你打control c的时候,99.999%的这个概率都会停在这句上。
第二个呢,有很多人就在猜了,说你是不是啥都没干,停了6秒钟,然后直接在后台哪学,不张图就扔出来了。现在很多人在猜测这件事啊。呃,我觉得这种可能性倒没有那么大啊。这个可能性没有那么大,为什么呢?有点太忽悠人了啊。虽然人家很遥遥领先,但是你想去华为上班也没有那么容易。像我现在这样的水平,要简历到华为,华为人还不要我呢。所以呢,我们不要随便小看天下人啊。
正常情况下,写这个sleep(6)呢,啊是两种情况啊。第一种情况呢,就是做大模型这个输出的时候,没有做状态监控,这个事呢,是很常见的。为什么呢?就是大模型输出啊,通常情况下,他是要等一会,不是说我在这头啪一回车,那头就出来了。一般情况下,我们执行一个程序,执行一个语句的时候,他如果是很快就可以出来,我们就让他锁在那跑,就完了。啊,什么叫锁在那他跑?就是说,当他需要进行长时间等待的时候,这个计算机是锁定状态。你在这个时候再输入任何信息进去啊,再动鼠标或者再做任何点击,他是不理你的啊。但是这个呢,很危险啊,因为有的时候他就锁死在里头,就出不来了。那所以很多呢,我们会让他在后台执行,就是他是前后台进程嘛,后台进程。
那么后台进行的时候呢,正常是什么呢?正常我们要监控他执行的结果。后台执行了哎,执行完了,你要告诉他说哎,现在执行完了,现在请展示出来。咱们经常看大模型执行的时候,那个字是一个字一个字出来的,对吧?你问他一个什么话,嘣嘣嘣嘣嘣,一个字往下跳。这种呢,叫stream输出,或者叫流式输出。那干嘛呢?就是说我这边命令你去回答问题了,然后呢我在那等啊,你出一个字了,我就赶快把这个字拿出来,给大家展示出来。再出一个字了哎,再赶快再把这事哎提出来,再给大家展示。然后一直到出完了啊,我知道哎,这句话出完了,再去执行后面的程序。正常情况下他是这么干活的。
但是呢,有些人说,我为了省事啊,我就不费这劲了,我也不监控你的结果了。我认为你大概6秒钟能跑完,我先背着他跑,然后另外一头呢,我等6秒钟啊,等完6秒钟以后直接去取结果,大概率不会出问题啊。有人这么干啊,不是说没有,特别是一些叫萝卜急了不稀泥的这种程序啊,就是我很着急写一个,我就不用写那么细致了。因为你要知道,从这个监控和后台这件事来说,是挺麻烦的,不是那么容易的。你可能需要现场写个,可能十几句,至少得写个三五句吧,你才能把后台进程的状态监控起来。这是一种情况。然后另外一种情况是什么呢?就是啊,他所调用的大模型是有RPM限制的。什么叫RPM限制?就是每分钟调用多少次是有限制的啊。因为现在大家知道算力很贵,对吧?那么大模型这些厂商为了不要让大家快速的、高频的去调用自己的大模型,他们会给这些调用方设置每分钟限制的次数。因为我自己的一个程序里头,也是写了sleep play啊。我调用的是谁家的?就灵异万物他们家的大模型。我是充了200块钱在里头,他给我设的是什么呢?是一分钟十次啊。就是我每分钟最多可以钓10次。那做个sleep(6)呗。我这头钓,钓完了以后停6秒钟,然后我再钓下一次。这样就肯定不会有什么问题嘛。这个是比较常见的啊。因为这种东西,你没法去监控服务器运转状态,然后说我是不是可以掉下一次了,这个事只能是自己sleep啊。当然也有一种这个更精确的方式是什么呢?就是我先钓了,钓完了以后啊,然后我去呃等一会啊,再钓一次,然后发现错了以后呢,等再等一会再去钓对吧。他有的时候会去做我们管他叫Retry吧,也有这么干的。但是这个呢,属于是非常不友好的钓用方式啊,因为虽然最后人家可能还是啊,6秒钟替你服务了一次,但是你在不停的去刷他的服务器啊,这类似于一种低DOS攻击,所以这种方式不是那么友好。所以这种sleep(6)也是很常见的啊。我们现场到底看到了什么?这是一个前端演示的程序员啊,大家一定要注意,他并没有给大家去做这种完整的客户端演示,而是告诉大家说哎,我怎么通过简单的编程,就可以看到一个什么样的效果。而这位朋友写的呢,也不是很熟练至少像我们以前出去给人演示,你各种演示的demo还要练几次,然后各种容易出的错误,你可能平时练习的时候都出过。各种预案:
我们会留的比较足,所以不会现场出这样的问题。这是第一个。
第二个呢,就是他这种代码正常应该是现场写的。就是他不可能说哎,我这个代码是已经写好了,然后呢我给大家看一下。这个绝不是这样啊,因为如果是工程里边,这个代码就写成这样的话,华为早就挂菜了啊,不可能啊。混了这么多天,被这么多人讨厌,还在这活的好好的。
为什么这么讲呢?time.sleep(6)这个事儿啊,其实不算过分。然后后边儿有一个叫写到output点儿洁癖记里头。大家有没有看到这一行代码?这个才是真正比较过分的。这叫什么东西?这叫呃,我们把输出文件名儿直接写死了,对吧?这个实在是很奇葩的一种玩法。
正常情况下,我们应该怎么办呢?应该询问用户叫什么文件名,对吧?这是第一种方式。第二种呢,我们一般会采用一个叫文件名生成的一个程序。我们会生成一个保证不重复的文件名,啊比如说我这个是用日期时间戳,再加上一个哈息数,再加上一定的啊表意的信息,然后生成一个完整的文件名啊,或者是说我再加上什么特定的路径啊,这样能够保证这个文件名随时都可以生成,而且不重名,甚至我们还会去写程序说,我保证啊,文件输出的时候,去进行文件名存在判断啊,说是不是有这个文件,如果有的话,我怎么再去换一个跟他不一样的文件名。这个是正常的工程里边的写法,而不是把这个文件名直接写死在里面。
所以通过这个来看呢,这个代码大概率是现场写的啊。那什么时候需要现场写代码?就是告诉大家说,这个他们叫做升腾大模型啊,因为上面有一个叫MINDX啊,有这样的一个提示出来,也是说我们在调这个库的时候啊,发生了这样的问题啊。这个MNDX呢,就是升腾大模型的意思啊,就是你吊这个东西的时候很方便。你不需要很强的工程能力。你也不需要很强的技术的门槛。你就随便就可以吊啊,随便写两句就能把它吊出来啊。他实际上在演示这种东西。
在这个里头,你出现各种不规范的代码,什么sleep(6)啊,什么写死了文件名儿啊,哪怕是重复了文件名儿,重名儿的,我直接把原来的覆盖掉。这个都不是什么大毛病啊。我们以前也经常这么干。
像我以前去做演示的时候,现场演示,虽然我那个代码都会提前练好啊,但是我一定要到现场敲。你一定不能是从一个文档里头,口碑出来,或者说你看我这有一个程序,我直接调用一下就完了啊。这个现场看的人是不买账的。
你万一后头藏了个几十万行代码,你说我我一调用,我一贴贴上去了,我就可以跑了,那人家说我学不会。你一定是你看啊,我就写了三句啊,5句第一句什么,第二句的什么,然后写到第五句,啪一回车,哎结果出来了。呃然后让人下边一看哇,是这样的。对一定是这么一个过程啊。
像我们以前经常干什么,叫什么A1 A2 A3 A4 B1 B2 B3 B4,这是干嘛呢,起这个变量名。大家知道,正常写程序,你按工程的要求来说,你是不可能这么起变量名的。你这么起变量名,这个程序大了以后,你根本没法改错误。
但是我们在现场演示的时候,都是这样的文件名啊。这个其实是蛮正常的,因为为什么你在现场,你再去想说,我到底按一个什么样的命名规则,去命名哪个大写,哪个小写,英文怎么拼写,然后拼对了,拼错了这个烦死了,对吧你还不如叫A1A2呢,这个多省事啊。然后最后你就直接把结果出来了啊。这个才是大家想要看到的啊。
所以啊,不要因为说他写了个sleep(6),你就觉得他在骗人了。跟后边那个right,什么output点GPG那个差远了。有这两句。只能说明,我们大家现在看到的这段代码,是在现场写的,而不是按照华为标准的工程要求去写的啊。只能说明这件事,这件事情,你说就不是在骗傻子吗?大概率还真是。为什么呢?虽然我刚才解释了,这个代码并没有什么大的问题,但是大家要想清楚,他在演示什么东西。他在演示RAG图像生成啊。其实华为的用户里头,做Rag图像生成这种需求的人,应该没有几个,对吧?什么人干这事?电商的人啊,我去做换装。而且通常情况下,人家也不是做reg图像生成,人家直接是stable diffusion做换装就完了啊。没有人去做这个。甚至还有一些人是干嘛呢?是去做这个游戏对吧。比如说我现在要去啊,做一个游戏工作室,然后我要保证说我输出的所有的骑士,所有的什么东西啊,这些要有一定的一致性。反正就是这个类目是存在的啊,但是真正实际用起来的人,本身是非常少的。而且你想,他最后写了这么一句话,写完了以后,那头就直接给你画出来了啊。我的感觉是什么呢?就是他喊了RAG的名字,因为现在特别是对于华为的用户,他的用户一般是企业用户,或者是政府用户,他们不可能去做电商,也不可能去做游戏啊。对于他们来说呢,你不给他讲RAG,不给他讲知识库呢,他们就不买单。所以,一定要把这个高大上的词给你讲上。然后呢,我如果直接给你看一下,我检索了啊,谁谁谁的讲话,谁谁谁的路线指导思想这个事呢,这又容易翻车。那怎么办呢?咱就现场给你画个画啊。这个画呢,还比较震撼,让你觉得啊,这个事情很有趣对吧。所以呢,你看哎,我也RAG了,最后我还画出一幅画来。所以这个演示的过程啊,可能有一定的欺骗性吧。我们觉得讲成这样,算是比较呃客观中立的一个讲法啊。这个呢,就是这一次华为升腾大模型展示。里边出现的bug啊,我们进行的一个解读啊,希望你甭管懂不懂编程啊,懂不懂这个RAG到底是干什么,懂不懂这个大模型怎么回事。啊,通过我的讲解呢,啊你能够对这个事情,有一个更深刻的理解。
好啊,这一期就讲到这里,感谢大家收听。请帮忙点赞点小铃铛,参加disco讨论群,也欢迎有兴趣、有能力的朋友加入我们的付费频道。再见。
Both comments and pings are currently closed.