节省点 pass 这样一个函数,相信做前端的朋友都知道,也使用过他吧,他可以把一个节省制服串转化成一个 gs 的对象,但是呢,在使用他的时候,其实也有一些值得我们注意的点,接下来给大家介绍一下,大家看这样一个例子,他的输出结果是什么?可以给大家几秒钟时间想一想 好,其实他的输出结果就是报错了,因为呢,我们上面的这一个支付串并不是一个有效的节省支付串,大家可以看到那么他的这个 k 呢,实际上是没有这个引号包裹的,所以呢,如果不是一个标准的节省支付串,我们拿给接生点 pass 来进行一个转换的时候呢,他就会报一个 呃一个语法的一个错误,那么要解决这个问题呢,我们就在这给他加上一个,给这个 k 加上一个双引号,是吧? ok, 那么这样就 问题就解决了。那么与此相似的呢,就是一些错误的阶层格式,在这可以给大家再提一下,比如说我用这个答应号,那么他也是会报错的, 然后呢还有就是我如果用双引号,但是呢我的这个,我的这个末尾了,我再给他加上一个这样的 逗号,那这样也不是一个有效的节省格式,我们使用 pass 的话也会报错的。那么这个节省点 pass 除了传入我们需要解析的节省串之外呢,他也可以支持我们再传入一个回调函数作为参数,那么这个回调函数呢,可以在这个整个的解析过程当中,允许我们去自定义一些解析的值, 那么他的整个呃解析过程其实尊从一个,就是从上到下,从里到外的一个顺序,比如说我们现在把这个 k 和弯柳露出来,我们看他一个解析的 顺序,可以看他是不是先解析最上面的这个内幕属性,是吧?然后是小菜,然后接下来就是 basic 了,是吧? basic 是一个对象,那么他就遵循着从上到下,从里到外的逻辑继续往下解析,那么再解析 a 级是吧?十二点五,然后再解析 france, france, 他也是一个书组对象,那么我们就先解析书组的每一项,那么第零项是书纱, 然后第一项是小黑,是吧?那么这解析完了呢?然后再回到上一层,就是 friends, 就是就书上跟小黑这样一个数组,好,那么依次下去,我们就可以看到最后解析的值。 好的,那么有了这个回调函数,我们可以干些什么事情呢?那能干的事情其实就很多了,比如说我现在可以看到那么这个小菜的一些基本信息里边啊,包含他的朋友,是吧?他的朋友有苏三,然后还有小黑,但是实际情况呢?这个小黑其实不是小菜的朋友,所以我们在解期的时候需要把这个小黑给干掉,那么应该怎么办呢?我们看到那么遵循刚才 的解析方式,那么他肯定这个 k 就会解析到他的 france 这个地方,是吧?那么我们拿到这个 france 的时候就可以进行一个判断,比如说这个,比如说这个 k 等于 france 的时候, 那么我们就把他的这个 vanu 里边的这个小黑给删掉,是吧?那么我在这,呃,为了为了简单一点,我就直接给他围成一个 剩下的书纱就行了,就为了做演示就不做过多的那个代码了。好,那么其他情况呢?我们就直接 return 这个 van, 那么那么这样做之后呢?我们可以看看那么接下来解析的值,是吧?那么这个小菜的这个朋友列表里面就没有小黑了。好,这就是我今天要给大家介绍的所有内容。
粉丝3781获赞2.0万

用 ai 来抄别人的爆款带货视频到底应该怎么做?今天带大家把这套流程好好的梳理一遍。首先我们先找到我们要对标的爆款视频,这个视频的时长呢,一般在十五到二十秒左右,这个是最好对标的。我们把这个视频发给 jimmy, 给他一句提示词,按照 jason 的 格式, 我生成这个视频的视频提示词,我们就会得到一段这样的提示词,你们可以看到他基本上从各个方面都做了一个相应的对标,而且这次的提示词呢,他会更加的精确一下。一步我们把这个提示词继续发给 jimmy, 把我们自己的产品也发给他。比如说我们之前的这个模仿的对标视频,他是一个灰色的裤子,然后我们自己的产品是棕色的, 我们把自己的产品和之前的那个这样的提示词发给 jimmy 之后,再给大家加一句话,按照我的产品去修改这个提示词,我们就会得到属于我们自己产品的这个爆款的对标提示词。最后一步,我们把这个爆款的提示词直接给到 c n 十二,然后再配上我们自己的产品图,这样的话一段特别流利,而且对标的爆款视频就出来了,大家可以赶快去试一下。

好,说一下这个 python json 这个文件啊,这是五 u 源码里边这个文件,它里边包含了很多很多的字段,有可能说这个字段我看不懂啊,那我一试解释一下啊,这里边其实牵扯到工程化里边的很多知识,整体来说的话,这里边的字段啊,它包含两个部分, 一个部分呢是标准制段,就是 n p m 官方定义好的制段啊。第二个呢是非标制段。这种制段啊,那情况就很多了,有可能是作者自己定义的,比方说这个无忧园吧里边儿,由于些他自己定义的制段,自己给自己看的。另一部分呢,可能是一些工程化的工具,像什么构建工具啊,什么 t s 啊,这些东西看的啊, 都是有可能的,咱们一个个说吧。好,首先是这三个,这三个呢是标准字段啊,包的名字就是我们用 n p m 去下载的时候,包的名字就在这里定义,然后版本和描述没什么好说的。然后下边这个呢是标准字段啊,这个字段呢,我上节课是有详细讲解的啊,可以往回翻一翻。然后下边这个呢是飞标字段,它呢主要是给构建工具看的。 我们在使用一个构建工具的环境下,去导入一个包的时候,特别是使用那个 e s mark 的 方式来导入一个包的时候,那么它会把这个文件的内容给你,因为我们知道啊,在构建工具里边往往会使用一些树摇优化,是吧?那么树摇优化呢,它就必须要要求它是一个 e s mark, 那 么这个对应的文件呢,就是一个 e s mark 的 文件,它会把这个文件给你, 下边这个呢是给 t s 看的啊,就是整个包的类型定义文件啊,这四个都是飞标字段啊,下边这两个呢是 c, d, n 的 飞标字段,给 c, d, n 看的啊,这是两个 c, d, n, 对 吧啊? p k, g 以及呢? g, s, d, d, r 非常知名的两个 c d, n, 就是 有些用户呢,他在导入一些包的时候,他会使用 c, d, n, 用这种方式来导入的时候呢,那个 c, d, n 会从 n p m 上去下载对应的文件啊,如果说他没有的话,他就会去下载, 下载的时候他从哪里下载啊?给他指定一个文件路径,然后呢?下边那个呢是标准之端,它是指的我们这个包开发完成之后,不是要上传到那个 n p m 上吗?对吧?那么上传的时候它不一定是所有文件全部上传,比方说像这里啊,我们可以看到啊,这个目前这个包里边呢,其实还是有很多东西的, 那么他上传的时候呢,他到底上传哪些?由这个字来指定?比方说他这里就指定了两个东西,一个是 index, 一个是目录 guest, 只上传这两个东西。那么这就意味着当我们去安装这个包的时候啊,比方 我就安装一下啊, m p m i 好, 安装,这个好,安装完了你看一下啊,这里个 relative 里边是不是只有两个文件了啊?一个是 index, 一个是 disk, 那 其他的文件呢?都没有了是吧?就这么个意思。 好,下边这个字段是飞镖字段,它也是个构建工具,看的就在构建工具环境里边呢,你在导入包的时候可能有很多的导入方式,比方说你使用 import 方式来导入,那么他就对应到这,那如果说你使用别的方式导入呢?比方说 abc, 那 么他就对应到下边这种情况,那么在不同的导入方式的时候,他到底给你提供什么样的模块文件啊?由这个时段来指定啊?如果说你不写的话,他读啥?他读上面这个就 读这个东西了啊,你写的话,他就会按照这里的逻辑来进行细致的读取,那么这里边呢,有很多的配置方式啊,呃,详细情况呢,就是根据构建工具他自己的要求来定了。呃,比方说像这里,那么这里呢,就是说,呃,我们在导入这个包的时候呢,他可能有很多的场景,比如说有 ts, 他 要读取他的类型定义文件到哪里去读, 然后在漏的环境里边针对不同的模式,什么生产环境啊,开发环境啊,还是默认情况啊?那么他分别读到什么样的文件啊?就指定的是这么个东西 啊?下面这个呢是飞标字段,主要是给构建工具看的,来标识一下整个包有没有副作用,它会影响到树摇优化。下面这个呢是标准字段,它指的是整个包它上传过后呢,它的仓库的一些信息啊,仓库的类型,仓库的 u、 i、 l 地址以及呢仓库的目录,比如说我们到 n、 p、 m 上去搜索一下吧,就这个包好进去看一下啊,你看这里,他的仓库地址,这个地址的信息哪来的?就来自于这里。 下边这个呢是飞标字段,它是作者自定义的,就有一些自定义的这一块呢,如果说你研究过物流的原版的话,应该知道啊,它是用来提供一些 roll up 的 打包信息的啊,就它在编辑一个打包脚本的时候呢,它会读到这个信息, 比方说像这个 relative 这个包啊,就是做这个响应式的包,那么它取个名字,然后呢,它会打包成几个版本啊?下边是打包的几个方式,它会打四个包出来。好,下边这个呢是标准字段,这个字段呢表示说,嗯, app 上的搜索关键字,用什么样的关键字可以把它搜到下边儿那个作者, license, box, homepage, dependencies, 都是标准字段啊, license 不 用说了啊,提 供一个开源许可类型。然后呢, box 呢,是提交的 e q 的 地址,然后缓存呢,你看它就会影响这儿,一般是展示一些官网的主页,它没有官网的话,它往往会给一个 disshopper 的 地址。下边儿这个都没什么好说的啊,这就是整个 python 的 json 文件里边儿的所有字段了。

我去, ai 圈大地震了,只因国外爆火的接生提示词逆天玩法,它既不用列拉拉,也不用锁定面部 id, 仅靠接生提示词就可以保证人物的一致性,更关键的是它反推的提示词会更加的详细,它能将 nana pro 以及 c g 四点五发挥到极致,所以能复刻出超逼真的画面,要是用这种方式, 其他的反推工具都将沦为弟弟,所以大家都应该掌握 jason 写提示词的方法,那我来揭秘一下。我们首先截取这张照片,将图片粘贴到豆包里,然后输入这段提示词,我们点击生成一下,他就按照 jason 的 格式反推出来了,并且描述的非常的详细。 然后我们进入豆包的 ai 创作,然后将 jason 文件拷贝到框内。啊,这里要选择 c 均四点五比例,我们也可以进行锁定一下啊,点击生成 看到了吗?我只是输入了 jason 的 提示词,同一个形象我们就锁定了,并且四张图片都锁定了人物,无论是服装还是场景都是一致的,这个效果还不算是逆天的技术操作,我们可以将 jason 提示词修改成杭州西湖的背景, 这个效果逆天吧,人物与服装还是保证了一致性,背景发生变化了,说明 jason 文件是可以锁定人物一致性的,然后我们可以不断的修改 jason 文件, 这种方式可拓展性就比较大了。我们来演示 nana pro, 右边是我们参考的写实照片,左边的文本是豆包反推出来提示词啊,然后我们使用这个 nana pro 节点啊,我们需要调整成纹身图,依次生成两张,我们看一下, 看到了吗?这种反推的效果非常的逼真啊,像这种人物的感觉以及场景的逼真程度,完全看不出 ai 感,要是你不用接收文件,这种效果是很难实现的,所以大家快去探索吧!

它的特点是既方便我们人类去进行阅读,又方便计算机去进行阅读。怎么做到的呢?它其实靠的啊,就是这一套符号系统, 学会 ai 自动化,工作生活全拿下。大家好,我是瑞口,这节课呢,我们给大家讲一个非常重要的知识点,叫做 jason, 大家千万不要觉得它是一个非常偏技术的一个知识点,所以学起来是不是很难, 其实非常简单。什么是 jason 呢? jason 呢?它和 excel 一 样,是一种储存和传输数据的一种文件格式, excel 大家都比较熟悉,对吧?平时打开电脑储存数据啊,修改数据啊,找数据啊,都在里面, jason 其实也是这样的一个不同的数据格式 啊,那么相对于 excel 呢? jason 其实在整个计算机世界里的重要性可能会更重要一些,为什么呢?因为它是整个计算机世界的普通话,或者说数字世界的普通话 啊。我们知道我们平时生活当中可能会使用不同的设备啊,不同的系统,比如说安卓手机啊,苹果手机啊, windows 电脑呀,苹果电脑呀,或者是一些服务器啊等等,那不同的设备之间,他们如何进行数据的传递呢?那就需要一个普通话,否则如果各自用各自的数据,肯定就没办法打通了。那 jason 呢?其实就是实现这样的一个功能。 那为了方便大家理解啊,我们讲这节课时,还拿现实中的一些例子来进行举例,比如说最近大家不知道有没有 从网上下单买一些东西,当我们点击一个按钮去下单购物的时候呢?实际上除了这个,有一个实物的包裹会从电商公司发到我们家里面,实际上还有一些数据的包裹在进行传递,比如说你点击按钮的时候,会把你的相关信息,购物信息发送到云端的服务器, 那物流发货的时候呢,这个带着数据的数据包也会随着一起到你的手机上面,你可以看到这个快递的当前的状态啊等等,对吧?它也是数据包的形式,我们可以看到啊,这是一个快递的面单, 这个面单上面有一些数据,比如说发货人,收货人相关的产品信息等等,相关的快递的一些信息等等。那这个数据其实我们就可以用这样的一种形式来进行一个呈现,那这种形式呢,其实就是 jason, 看起来是不是非常的熟悉?没错,它就是前面我们讲的像 collection, 像 array 这样的数据来进行组成的,我们具体来看一下。 好,那 json 呢?其实它是结构化数据的万能容器,为什么说它是一种万能容器呢?那我们和 excel 相对比啊,我们知道 excel 其实它的特点是什么?它就是一行一列,对吧?它是很难实现无限层级的嵌套数据的,因为它有行列的数限制, 但是 jason 呢,它就没有这种限制啊,等一会我会给大家讲啊,它就可以无限层级的去进行嵌套数据,这是它的一个特点。第二个就是 文本杂乱的信息呢,适合用 excel, 但是呢它呈现的就比较杂乱啊,但是 jason 它就可以非常清洗的通过键值的关系,键值对的概念,上节课我们也讲了啊,还有就是 jason, 它更加适合网络传输,而 excel 呢,更加适合本地的储存,我们来看一下,就是这种。 jason 之所以能够成为非常重要的一种数据格式呢,因为它有两个特点啊,它既适合我们人类去进行阅读,它也适合 计算机去进行阅读,因为只有一个数据格式,只有当它方便我们人类去查看,又方便计算机查看的时候,它才能够成为一种非常重要的通用的结构化的数据表达。它是怎么实现的呢?这里也给大家去进具体的看一下。 首先啊,我们来看一下接收的核心的规则,因为他有这个规则,所以他就能够实现,我们来看一下啊,这个非常重要,大家可以认真的听或者是多听几遍。首先接收他就是键值,对,他其实就是一个非常复杂的,我们之前讲的 collection, 他 是由花括号括起来的, 看到没成对的花括号上面有花括号,所有的数据在这个里面。然后呢,他有键值对的概念, 比如说我们在 excel 写这个,一般是什么?姓名?瑞口,订单号多少?看键值,对这个概念,键左边是键,右边是值啊,然后呢,左边键都用引号括起来,值呢?只有文本需要引号,而其他的像时间呀, 想数量呀,这个数量对吧?布尔啊,他都不需要用引号扩起来,和我们之前讲的克拉克森是一样的,那同时呢,他支持刚才我们讲的四大天王,哼哼哈二将都在里面整体组成的一个克拉克森,而且他支持多层的嵌套。你看, 首先这是一层商品,是一层商品,里面呢又有无限鼠标,无限鼠标又有数量,那无限鼠标其实后面我们还可以加一个什么,加一个颜色呀什么的,有可能再克拉克森,再包含数组 collection 和数据库,是可以进行无限嵌套的。在这里面,那刚才我们讲了它的特点是既方便我们人类去进行阅读,又方便计算机去进行阅读。怎么做到的呢?它其实靠的啊就是这一套符号系统, 如何方便我们人类去阅读呢?因为他用的是键值队,你看当我们看这些消息的时候,人去看的时候很方便,就知道他代表什么意思,因为他有键对不对?他的键说这是一个订单号,所以后面就是订单号, 这个键说付款时间,他后面是个时间,那这个键告诉我们收款人的信息,所以这就是收获人的信息,所以通过键值队方便我们人去阅读。那他怎么样去通过计算机阅读的呢?他靠的是这一套符号系统, 当计算机看到有花括号的时候,知道它是一个 jason, 当计算机看到有一个报号的时候,那计算机就知道左边是键,右边是值。 当计算机看到值上面有引号的时候,计算机就知道它是一个文本型,当计算机看到这是个处或者 f 字的时候,知道它是布尔型。当计算机看到 它是一个方括号括起来的一个数据的时候,计算机知道这里面放的是一个数组,当计算机看到它有逗号的时候,说明它是隔开两个不同的键值。对,通过这个符号系统呢,计算机也能够非常方便的去 识别这个数据,所以呢它就实现了既方便我们人类去进行阅读,也方便计算机进行阅读。


用了半年 cloud code, 才发现有个功能我一直在用,但身边几乎没人知道,叫 hux, 今天直接给你六个配置,复制粘贴就能用。 hux 就是 让 cloud code 在 特定时机自动执行你预设的命令,不用你手动操作,也不用依赖 ai 自己判断纯确定性执行。 举个例子你就懂了,之前 cloud 改完代码格式是乱的,你得自己跑 prettier, 现在配了 hook, 它改完自动格式化之前它想动你的 ev 文件你根本不知道,现在直接拦住,之前任务跑完,你得盯着终端,等现在它需要你的时候,自动弹。桌面通知。 配置一是自动格式化 cloud 编辑文件后自动跑。格式化工具, java 用 google java format, 排放用 black go 用 java, 前端用 prettier, 根据文件后缀自动选,全区生效配一次,所有项目都能用。 配置二是桌面通知 cloud 跑长任务的时候你可以去干别的,它需要你审批权限,或者等你回来的时候自动带 mac os 通知,不用一直盯着终端了。 配置三式,保护敏感文件 emv credentials, 这些文件 cloud 碰都别想碰,直接用 exit。 二拦截。配置四式,自动跑测试, cloud 说搞定了,先跑一遍,测试,不过不许停。 配置五式,上下文压缩后自动注入项目规范,压缩完 cloud 可能忘了你用什么包管理器,这个 hold 自动补回来。配置六式,自动跳过 plan mode 的 确认弹窗,少点一个按钮, 实际配置长这样就是几行 j s o n 写在你的 settings j s o n 里, clock code 自动识别脚本放在 hux 目录下,所有项目全职生效。 就这几行 j s o n 的 事,把 hux 配好 clock code 就 从一个好用的工具变成一个真正贴你习惯的编程搭档。现在就去试试吧。

哎,你是不是也特烦,每次都得手动敲那些又长又复杂的提示词,感觉时间全浪费在复制粘贴上了,对吧?那如果我告诉你,这些破事都能用一个简单的命令一键搞定呢? 今天呢,咱们就来好好聊聊 open code 里面这个超好用的功能自定义命令,看看他到底是怎么解放我们的。 你看屏幕上这个问题,是不是感觉说的就是你?咱们做开发的,每天总有那么些重复的活,就是跑测试啊,生成一堆模板代码啊,审查代码变更什么的,来来回回的给 ai 输入差不多的指令,真的又费时间又费脑子。 好,那咱们就直奔主题,要解决这个问题啊,关键就靠 open code 的 这个超强功能自定义名令,说白了,他就是能让你把这些凡人的重复任务打包成一个你自己的专属的魔法咒语。 那这个自定义命令到底是个啥呢?其实很简单,它就是个让你把那些常用或者特别复杂的提示词存成一个简单命令的方法。你看这个例子,你只要敲一个短短的杠 test, 它背后呢,就自动帮你执行了一大长串的测试指令, 你说这效率是不是一下子就上来了?行,听起来是不是特心动?那到底该怎么创建咱们自己的命令呢?很简单, open code 给你准备了两种特别灵活的方式,这两种方式嘛,可以说是各有各的好处,咱们一个一个来看, 你看这张对比图,一目了然。左边呢是 markdown 文件的方式,你就在 command 目录里建一个 dot md 文件就行,文件名儿就是你的命令名儿,特别直观。右边呢是 json 配置的方式,直接在 open code 那 个主配置文件里面,这加 command 选项。 所以说一个适合把命令分开管一个呢,适合把所有配置放一块儿,看你个人习惯了。 咱们先来看第一种,用 markdown 文件,操作真的超级简单,你就在那个 open code slash command 文件夹里创建一个叫 test 点 m d 的 文件, 你看这个文件名 test, 它就直接变成了杠 test。 这个命令文件里面也分两部分,上面用三个短横线框起来的,叫 from error, 你 可以在里面写写描述什么的。下面这部分正文呢,就是真正要发给 ai 的 提示词模板了。 好,再来看第二种方法, json 配置。如果你是那种喜欢把所有配置都集中在一个文件里管理的人,那这个方式绝对是你的菜, 你只要在主配置文件里找到 command 这个地方,然后在里面定义你的命令就行了。你看还是那个 test 命令, template 字段就是提示词, description 就是 描述整个结构清清楚楚的。 ok, 到现在为止,创建一个静态的命令,咱们应该都学会了,但问题来了,很多时候我们的指令不是死的,是需要变化的,对吧?这时候啊,就得让我们的命令变得更聪明一点,也就是给它加上参数。 想加参数,你就得认识这个关键的站位符, s, a, r, g, m, u, n, t s documents。 咱们来看这个例子啊。这里我们创建了一个 components 到 md 命令,它的作用是生成一个新的 react component, 你 看它的提示词里面写着,创建一个名为 s a, r g, m u n t s 的 新 react component, 这个 s a r g m u n t s 啊,它其实就是个变量,等着我们从外面告诉它具体叫什么名字。 那用的时候该怎么存值呢?简直太简单了,你就在终端里敲杠线, component button 看到了吗? open code 就 会自动把那个 dollar arguments 换成你跟在后面的这个词儿 button。 这么一来,这一个命令就能用来创建任何名字的组建了,灵活性一下就上来了,对吧? 哎,那一个参数会了,如果我想传好几个参数进去怎么办呢?也简单,这时候就要用位置参数了,你看就是到了三,一到了三,二到了三,这种分别代表你输入的第一个、第二个、第三个参数。 我们看下面这个例子, create file 后面跟了三个东西,文件名, config 目录, s r c 还有一串 jason 内容。这三个东西就分别对应了 d l c 一、 d l c 二和 d l c。 三三各就各位安排的明明白白。 好,有了参数,我们的命令已经相当灵活了吗?不, open code 还有更厉害的招儿, 接下来咱们要看的这个功能啊,简直是把自动化推向了新高度,就是怎么把外部的东西,比如说你命令航跑出来的结果,或者一整个文件的内容直接塞到你的提示词里去。 大家先记住这个语法格式,一个感叹号,然后是两个反引号,中间包着你的哨名令。 它的作用就是先去执行这个命令,然后把命令输出的所有结果原封不动地塞到你提示词的这个位置。哇,这以下,你的命令就能和你本地的开发环境互动起来了。 来,咱们看个特别实际的例子,比如这个 analyze coverage 命令,它的提示词模板里就写了 at npm test。 这是什么意思呢?就是说,你每次运行这个命令,它会先自动帮你跑一遍 n p m test, 然后把所有的测试结果抓过来,跟你的其他提示词拼在一起,再发给大模型去分析。 这个自动化程度简直是拉满了好命令的结果。可以塞进去,那整个文件的内容行不行?当然行,而且语法更简单,就是一个 at 符号,后面直接跟上你的文件名。 这个例子也特别实用,你看,我们有个命令叫 review component slash button 点 t s x 这个主键, 当你运行它的时候, open code 就 会自动地去把 button 点 t s x 整个文件的代码都读出来,替换掉 at 那 一块,然后打包发给 ai, 帮你做 core review。 你 想想,再也不用手动去复制粘贴那长串代码了,多省事。 到这里,核心的功能咱们就都掌握了。不过呢,为了让你能进行更精细的控制, open core 还提供了一些高级的配置选项。这部分我们快速地看一下, 这张表里总结了几个关键的选项, template, 这个是必须的,没得说,就是咱们的提示词内容。 description 呢,是给这个命令加个描述,方便你自己看。后面这几个 agent model, subtask 都是可选的, 它们能干嘛呢?就是让你能给某个特别的命令指定一个不同的 ai 代理,或者换个大模型,甚至强制它作为一个子任务来跑。总之就是为了让你实现更复杂的工作流。 哦,对了,这里要特别提醒大家一句非常重要,你的自定义命令优先性是很高的, 也就是如果你创建的命令跟系统内置的命令重名了,比如说你也做了个杠 help 命令,那么你自己的版本会把官方的给覆盖掉,所以用的时候要稍微注意一下,别不小心把内置命令给搞没了。 好了,从最基础的命令创建,到加参数让它动起来,再到注入外部内容让它变得更强大。我们今天算是把 opencode 自定义命令这个功能给彻底讲透了,你要知道,它真的不只是个简单的快捷方式,它更是你打造个人数数自动化工作流的一把瑞士军刀。 那么,清完今天这些,您脑子里第一个冒出来的想法是什么?你最想把哪个凡人的任务给自动化了?是自动生成单元测试?还是一键审查同事的代码? 或者你有什么更酷更有创意的想法?别犹豫了,现在就动手去创造属于你自己的第一个神级命令吧!

很多人答 ai agent 上来就问 m c p 和 skills 有 什么区别?其实这个问题问错了,你真正该问的是它们分别在 agent 构里负责哪一层。今天三分钟给你讲清楚。先说共同基础, m c p 和 skills 底层都跟方生 call 有 关。什么是方生 call? 就是 模型调用外部工具的那个桥梁,你让 ai 查日历、发邮件、搜数据,背后走的都是这套机制。明白了这个,再来看两者的区别。 m c p 是 什么? m c p 全称 model context protocol, 本质上是把方针靠标准化、协议化。打个比方,以前每家餐厅点餐方式不一样,有的扫码,有的喊服务员,有的纸质菜单。 m c p 就是 统一推行了一套扫码点餐标准,不管哪家餐厅,模型都能用同一种方式点单。所以 m c p 解决的核心问题是工具生态的互操作性。 我定义好一个 m c p server, 任何兼容的 ai 系统都能接入,可插拔、可替换。 skills 不 一样,它不是协议,它是结构化的提示词文档,你可以把它理解成饶啊怎么完成某类任务的最佳实践,固化成一份可附用的执行手册。 比如我写了一个生成短视频脚本的 skill, 里面定义了什么时候触发,先做什么,后做什么,输出什么格式,遇到边界怎么处理,甚至还有势力 m c p 告诉模型星星能调什么工具, skills 告诉模型怎么完成整个任务星星。这里有一个很多人会问到的问题, m c p 工具里也有 description, 也在告诉模型什么时候用。我这不就是 skills 的 触发条件吗?对,在工具选择这一层,两者逻辑确实是同构的,但 skills 的 作用更大。它不只是说用我,它还定义了用完这个工具之后干什么,用哪几个工具,按什么顺序输出成什么格式。 一个 skill 可以 编排多个 m c p 工具, m c p 是 零件, skills 是 装配图,两者的关系可以用这个分层来记。防身 call, 底层协议模型调外部系统的桥梁, m c p 能力层, 标准化工具接口解决,能干什么? skills 策略层,业务编排,逻辑解决,怎么干?缺了 m c p 模型没有手,缺了 skills 模型有手不知道怎么用。现在知道什么时候使用 m c p, 什么时候 skills 了吗?欢迎在评论区留言讨论。如果你觉得这条视频对你有帮助,别忘了点赞关注我们,下期再见!

一会我们在聊天的时候啊,你好的时候他是不会回复的,为什么呢?因为在 providers 提供器里边,我们没有给他去配置, 就是在这没有配置,那么如果我们的套餐里面有很多一个低级模型,又等着你用,或者我们用不常用的模型怎么办?就是我们这样啊,大家注意看提供器 providers, 把这啊大家看,直接从这到这都给他去,从这到这都给他删掉, 然后打开笔记啊, 我们把这个大家注意看啊,你把你的模型的名字放在这, 然后其他的在这照抄就行了。这个是窗口的大小,这个是 max 头肯,虽然我选择了最小的一零二四,但是呢实际上他至少他不会这么小的。我们先看一下刚才这里面他的默认是多少,他是大概 是一百三十一 k 啊,就是他是这样的,一百三十多 k 除以一零二四。这个呢,我们给他尽量小一点,把这个拿过来, 把这个删掉啊,把这个一拿过来。这块大家要注意一下这里是否是推理, 那我们就给他这么写下, 那这个地方就是你的模型是推理还是不推理,就这写处或者 false, 其他的就照抄就可以了。然后我说一下窗口大小跟 max token 的 意思,什么意思? context 上下文窗口。上下文窗口是什么意思呢?指的是模型一次对话能记住最大的 token 数量,简单说模型一次能看到文字的历史内容,加上当前的输入, 那超出这个窗口它会怎么样呢?就会挤出去一部分,那么就会造成失忆。而这个 max 头款就是你每次最大输入的,这个我们是可以自己设置,从而呢让你的头款进行一个结缘,然后这个 id 呢是什么?就是你在这里面你选择模型的时候, 它是什么,你就可以给它写上。比如说咱们这个是赠送的四点五二,你就把后面这个给它拿过来,你看就放到 id 这上面。为什么咱们没有这个 z a i 杠?是因为 怎么外层有个 z a i o。 那 么如果同学们用的是我这个质谱跟我一样,直接照抄我这这个就可以了,那我是把多余的给它删掉了,只留一个四点五。为了让大家看着方便,这是提供器 proender 所主要的 pr i primary 这个单词, agent 默认的代理默认的模型,主要模型,这是主模型,后面是 forback, 是 备用模型。这个咱们要自己写啊。 如果咱们不是自己编辑这个文件,咱们在这选的话,你选完之后它就会变成一个 glm, 他这个是没办法去选咱们自定义的这种地段模型的。那么有同学发现设置完模型怎么都用不了, 那可以用这种方式去手动去修改模型,这个名字也是在这去选,你在这复制,带着前面斜杠左边的跟右边的完整的放到这, 那么这个文件设置完之后一保存就好了。但如果咱们在那保存完之后,在这,又比如说我现在又去保存一个,我再 continue, 那 它就会覆盖。比如我们现在再双击它, 我们再搜 friend, 大家看,只要你在命令行里面去设置了它的主模型,这儿就会改成不是。咱们要的就是咱们必须在这儿改完之后,不要在这里面再继续去,再 再去命令行再改一次,那么大家如果在命令行里面又去设置这个文件之后,我们还要去手动修改 open collog, 这次文件给它改成我们自己要用的模型, 那智普赠送给我们的套餐里面,他是没有五的,所以我们这不但不会消耗最低版本的这个四点五二,同时还会聊天报错,大家可以举一反三啊。看一下我们的 配置文件里面,它的主模型里面的版本是否是我们自己购买套餐里面所带的版本,如果不是就自己手动改一下这个 api k, api k 不 光是在命令行上设置在这里面, 大家注意看是在这个文件里面,它是能设直接去修改这个的。

大家好,我是方格,今天我们讲解面试片之场景题,关于 radis 如何去设计 k 和 value, 它遵循哪些原则的问题。好,那么这是快手的一道面试题啊,那么首先呢,我们先看一下啊,如何去设计 k, 然后我们再去看如何设计 value, 有 k 的 设计呢,需要保证以下三点,如果你最近也有专门面试,不知怎么准备的话,我这整理了能让大场面试官沉默的备考题库, 覆盖了 jvm 夺命连环、 one spring 灵魂包、谷高病发备考场景、 radis 深度陷阱、 maxgo 备考题库。说句谢谢就行, nice, 第一点叫可读性与规范性。那么 首先我们在定义 k 的 时候必须保证什么呀?它的这个可读性啊,可读性其实上就是,呃,我可以读到这个 k 的 时候啊,我又知道它的业务含义啊,它的业务含义,比如说 我通过这个 k 叫 user 冒号 profile, 然后冒号幺零零幺,那我就能这个界名之一的知道它是什么呢?用户 id 为幺零零一的个人信息 啊。再比如说下面这个就是 order status 二零二三零八零幺,那就知道它在保存的什么,订单日期为二零二三零八零幺的一个状态, 订单日期为他的一个状态。好,那么这是一个叫做可读性。那什么是规范性呢?那规范性就是说有一些特殊字符我们是不能用的啊,是不能用的啊,那么所以呢,推荐使用什么?用下划线分割每一部分的一个业务含义,或者用冒号分割都是可以的。好,这第一个可读性与规范性 好。第二维度就是咱们在定制 reis 里面的 k 的 时候,避免 k 过长,因为谁让你写一个很长名称的 k 啊,他占用的内存就会越多越多啊,那么查询效率呢,就会越低 啊,因为他们两个是成反比例的一个关系啊,所以啊,咱们尽量能定义出简洁明确的一个 k 啊,就是避免啊 k 过长。 好,最后一种就是控制 k 的 数量啊,就说 k 如果过多啊,在内存当中呢,它也会造成内存的碎片和管理的复杂度上升。那这个时候我们可以使用一些复合数据结构啊,复合数据结构呢,这里面我可以用什么呢?哈希或者 zset, 它们都能保存多组数据啊,以减少咱们 k 的 一个数量啊,减少 k 的 一个数量啊, 好,这是 k 的 一个设计规范。那么接下来我们聊一聊这个关于 value 啊,就是值的一个设计原则和规范。第一个就是首先我们要在合适业务场景下选择合适的数据结构, 好像这至于废话是吧,就是合适的场景选择合适的结构。嗯,那么当然呢,是这样子啊,这也是就是看大家的经验了,比如说我要缓存的是一个对象,然后只用于哈希就行了啊,因为这个对象呢,各个属性之间,它其实是没有一个先后次序的,使用哈希就可以,无需的就可以了。 当然如果说我是排行榜相关的一些数据啊,我就肯定需要有排序的一个即可。 z set 啊,哎, z set 是 这样子的啊,好,那么 再有就是社交关系的这一类,我就可以用 start 的 set 或者 set, 为什么呢?因为其实呢,我们会把最近的啊关注对吧?关注列表嘛,最近的关注放到最前边啊,所以就是也是有一些有序的一个集合来保存这些数据, 这是第一个选择和词的数据结构能第二种也是避免什么呢?大的 k 啊,就大的 value 啊,这得是大的 value, 因为, 呃,过大的 y 六啊,如果说,比如说单个 y 六的值如果能超过十 k, 那 这个时候呢,我们知道 ray 式呢,是单线称啊,单线称,那所以它就会主色啊, ray 是 单线称,那么影响咱们的性能啊,影响性能,那怎么去优化呢?首先呢,我们可以分片, 有时候摆啊,一个大的,一个哈气,才分成很多小的哈气,这是一种手段啊。第二种就是我使我摆啊,一个大的一个哈气,这是一种手段啊。第二种就是我用这个 g 格式啊,进行数据的压缩啊, 好,当然压缩的时候它也是要消耗这个 c p u 的 性能呢,所以我们要权衡 c p u 的 整体的开销情况啊。好,这是第二个最后一个期望,就是我们要合理地去设计啊,设置或者设计这个过期时间 啊,因为缓存嘛,缓存嘛,他必然是有这个内存大小的一限制啊,他不能放很多很多无限的数据,对吧?那么所以呢,我们就必须设置他的一个啊,过期的一个时间啊,避免冷数据啊,就说已经不是 这个热数据的数据,长时间占用咱们的内存啊,这个消耗的内存资源。好,那么最后呢,咱们给一个这个真实的这个场景啊,就是比如说缓存用户的信息, 然后 k 的 设计呢,可以是 user 啊, profile, 然后呢 user id, 用这种方式去设计,然后的 value 呢,就可以去设置成,你看啊,这是 k 嘛,后面这个以对象的形式,像 name 对 吧,就是以这种大括号对象的形式 来保存的 y 流值, name 是 alice, 然后 a g 是 三十啊,像前面那个用户权限也是一样的,对吧? 就是 user 啊, permission, 当然了一个 permission 也做了简写,因为毕竟咱们说只要做到什么就好,只要做到咱们所说的这个 啊,建明之意啊,能表达含义就行,不需要这个 k 的 设计过长啊,再占用内存资源。当然后面就是哪个用户又哪些权限值,当然也是以这种节省格式啊,做数据的体现的 好。那么基本上呢,就是今天我们讲解的这个关于 reese 的 k k 和 y 六怎么设计就到这里了,如果大家感觉今天的分享对大家有所帮助的话,大家可以一箭三连,那么最后呢,咱们还是感谢大家的收听,然后我们下次课程再见。

jason 格式提示词精准 ai 深图 适合室内景观建筑等空间可以选择约束条件风格类型 光源条件 光影品质镜头角度 分辨率及画面表现晴天自然光夜晚室内光白天奶油风下午北欧风傍晚蓝调风。

我的世界指令教学十二 tito tito 指令 先从最基础的 title 讲起,我们可以在 title 最后直接加上文本,可作为直接输出, 可以看到效果也是很好。同样我们也可以用 action bar, 会将文本显示在活动栏, 效果也是同样的 subtitle 副标题无法直接输出,必须搭配 tabo 一 起使用,所以通常会用两个命令方块找出拉杆激活一下,效果就是这样。 times 可以 改变你的文本显示时间放大解析一波,后面的三个数字分别是弹入、停留和弹出时间。数值为一时代表的是零点零 五秒,所以二十代表一秒,那么这串指令弹入时间是一秒,停留时间五秒,弹出时间一秒。下面的指令跟刚刚一样,最终效果如下, 但是有的时候我们停留时间不小心打的太长了怎么办?拉下拉杆之后,文本在屏幕上挥之不去, 这时候我们可以用 clear, 指令发送出去后,文本立马就消失了。另外开头选择器后面也可以接 reset, 作用就是将你的文本显示时间重置, 这里就不过多赘述了。接下来是本期的一个重点,通常以 tilde 和 tilde 连用大部分的服务器都能见到它的影子, 那就是我们的文本 justin, 每个 justin 都需要有个这玩意,之后往里面塞入令分子, 有多个令分子时需要用英文逗号隔开。首先讲解 text 来看这串指令,在刚刚提到的前置里加入了 text 文本内容,其含义和 title a t p action bar 你 好大径相同,但也会有不一样的地方马上会提, 可以看到我们出发后的效果和普通的胎透一模一样,但是不同点来了,我们可以在文本中添加 n, 做到换行效果, 效果就是这样。实际上网易版在一点二零之前胎透就可以换行,但是后来就不行了,所以现在只能通过 justin 的 字幕的。如图是 mc 里所有文本 justin 的 字, 但是在网易版只有第一个有用,输入,下面的几个会直接变成一意不明的符号。接下来讲解的是第二个令分子 select, 看如图的指令,我们在 select 键之中加入了 select 选择器。 以上指令的意思就是显示出所有玩家名字等同于开头 a p p, 开头 alpha。 看效果,由于服务器现在只有我一个玩家,所以只显示了我的名字 select 这个选择器中可以加速调进,例如 r 等于范围, square 等于计算百分之乘等于数值等。接下来要教学的是 square, 另分子 再的 c p, 结果就变成了一等 是什么特殊用法?放到最后讲,先把两种站位符最基础的用法讲掉, 可以看到 translate 的 文本加上了站位符,后面还跟了个 with with 后面又多了个新的前置,里面还塞进两个 text。 当指令执行时,站位符一会变成新前置里第一个 text 中的文本,二会变成后面第二个 text 文本 来展示效果也是很成功的输出了。当 translate 只剩一个站位符时,就会只替换对应文本。通过这个方法我们就可以有效的批量输出后面的文本。 接下来我们再来解析 s, 当站位符只有一个 s 时,我们可以理解为它的用法和异相同。输出时会显示后面的第一个 text 文本试试,但是如果输入两个 s 呢? 我们输出后会同时显示两个文本,所以通俗点理解,显示文本的数量取决于 s 的 数量,但是 s 的 数量绝对不超过后面的文本数量。现在我们在占位符中加入其他文本, 注意现在的输出内容。所以现在就可以得出一条结论,前面第一个 s 会替换成后面第一个文本,前面第二个 s 会替换成后面第二个文本,以此类推,可以添加第三个甚至第四个文本,我就不做示范了。 接下来来介绍一到九的特殊用法。首先,后面的新前置里有两个 selector 和 text, 可以 把一个 selector 和 text 理解为同一组,那这里面就总共有两组。前面的占位符就是后面的组数加一 来给后面的数据分个组。蓝色组表示,当 tts 分 数为一时,就显示文本二。红色组表示,当 tts 分 数为两时,就显示文本二。 当然条件不一定得是 scores, 同一组中都是前面的选择器,显示后面的文本,只要 select 后面跟的是一个玩家就行, 也可以增加组别,最多为八组。现在我的 t t s 分 数是一,所以会显示第一个文本,让我把 t t s 分 数改为两, 然后再输出就是第二个文本了。本期的教学就到这里了,今天讲的可能会有点难理解,可以多消化消化。感谢收看!

好,各位学前段同学说一个,在直播的时候啊,一位同学提出了一个问题,他有一个接收格式的字母串啊,这个字母串我这里就写死了哈,他那边是来自于别的地方,然后这字母串里边呢,它包含了一个属性啊,这个属性呢,是一个非常非常长的一个数字, 那么这样子一来的话,你把它转换成对象的话,你会发现啊,这个属性呢,它的精度呢,会有所损失,因为我知道在 gs 语言里边,它的数字它是有固定精度的,那么就会有精度的损失。 这个问题怎么解决?我们的核心思路呢?就是啥呢?我们的核心思路呢,就是我们希望呢,要保留这个精度,那么它转换出来的就不能是一个普通的数字类型了,就必须要么就是 begin, 要么呢就是一个字母串。但问题是呢,这个 jason 它转换的时候呢, 默认就是把它转换成数字的,那肯定就不能使用它的默认方式,因此呢,我们需要去干预它的接收格式的解析。那怎么来干预呢?好,就好在呢,这个函数啊,它给你提供了第二个参数,第二个参数呢,你可以写个函数来干预它的解析。这个函数呢,接收三个参数啊,一个是 key value, 一个是 context, 咱们打印看一下啊, 打印看一下 key, value, context。 好, 下面我们看一下,这是它打印的结果, key 是 big number 啊,就对应到这里,也就是说它在解析的过程中,每发现一个键值,对,它就会调用这个函数, 然后呢把它的键值里边的 key 和 value 的 值,对吧?它转换出来是 number 和 value 的 值,以及呢,它原始的这个内容,你看这个对象,它里边记录了它原始的这个字母串里边的值的内容啊,它是作为一个字母串来记录的,它都传给你,然后呢,它会使用你这个函数的返回的结果作为这个字段的值。 好,那么比方说啊,你这里返回的是一个一二三,你看一下,到这里打印,打印出来啊,你会发现呢,它这一块的转换结果就是一二三,懂这意思吧,所以呢,你这一块就可以处理了,怎么处理呢?非常简单啊,我们就判断一下啊,就是那些超长的那个数字的个字段名字的判断一下,如果说你的 key 等于啥呢?等于 big number 啊,那么这是个超长的一个数字的字段,那么我们要单独来处理其他的情况呢,我们直接返回它的 y 值就可以了, 那么这一块怎么处理呢?你就是把这个 source 啊,就是原始的这个字串返回就行了啊,返回这个什么 context 的 source 就 完事了,好,运行,看一下,是不是这样子呢,就可以保留精度了啊,当然也可以把它变成一个 bigint 啊,那改成 bigint 的 话,那么这里就是它放到 bigint 的 函数里边去,这样子呢,也可以保留精度啊, 运行看一下,对吧,它就变成一个 bigint 了,不过呢,你要注意一下啊,就是 bigint 呢,它是只支持整数哈,小数的话,你还是只能保留字母串哈。

关于提示词缓存,我们已经讲了三期视频了,但在评论区还是收到了不少大家的提问,比如说服务器是不是把之前大模型的回答存起来了,然后是不是像数据库查表一样,提示词前缀命中了,模型就不用跑,直接把存好的答案返回给我? 其实这些问题都是关于大语言模型的一些常见的误解,归根结底本质都是在问 prompt cash 里面到底具体存了什么,今天我就详细解答一下。要回答这个问题,需要先从 transformers 架构的推理过程讲起,它生成一致回答分成两个阶段,第一阶段叫做 prefill 预填充 模型,先把你发来的整个提示词一口气全部读进去,一边读一边理解上下文,为接下来的回答做准备。然后第二个阶段叫做 decore 的 解码, 准备好之后,模型开始写答案,但是这里有个不同,你的提示词哪怕有一千个 token, 那 么 preview 它都是一口气读完的。可是往外生成的时候,模型一次每次只能生成一个 token, 而且每生成一个 token 之前,它都要把前面所有的内容重新过一遍,再决定下一个 token。 这里说了,前面的内容就包括前面的所有的发来的整个提示词,也包括它刚才自己生成的输出的那些 token。 这种生成的方式它叫做 auto regressive 自回归模式。 提示词缓存优化的主要是第一阶段,这个 preview 预填充阶段。然后这期视频的难点来了,我们先把 attention 注意力机制复习一遍, 这是 transformer 的 核心,也是后面看懂 kvatch 的 关键 attention 要解决的问题是,模型在生成下一个 token 的 时候,前面的词并不是同等的重要,它需要能判断出此刻哪些词是最相关的。 举个例子吧,比如说提示词是喜欢唱跳 rap, 还有模型现在要预测下一个词,注意看这几条回看的箭头 越粗代表注意力权重越高,所以唱跳 rap 三个词的权重全部砸在它们身上, 喜欢还有基本不参与,所以最后模型输出的是篮球。为什么是篮球?因为模型在训练的时候见过太多坤坤的这个唱跳 rap 篮球的梗了,所以这种共同出现的关系早就刻在权重里了。所以一旦发现这个唱跳 rap 出现的时候,那么下一个就自然拎出这个篮球这个这个这个 token 了。所以这就是的 tension 机制, 不平均地看每一个词,而是按此刻谁更重要来加权挑选。那它具体是怎么算的呢?每一个 token 都会被投影成三个向量, cary, key 还有 value。 quarry 就是 这个 token 它想找什么,然后 key 就是 这个 token 它能提供什么信息,然后 value 才是这个 token 它真正携带的信息。这套命名规则其实是借鉴的信息检测和数据库,这个 query 就 像你在搜索框里输入的关键词,然后 key 就是 这个数据库里的锁影键, 然后 value 就是 这个锁影键真正取出来的数据值。当前的 token, 它拿自己的 query 去和前面每一个 token 的 key 逐一算一个匹配分数, 然后分数越高,说明那个 token 它越相关,然后按这个分数当权重把每个 token 的 value 加权汇总起来,这就是 attention 的 计算。 这公式是怎么来的呢?我们看一下这个 q 乘以 k 的 转制,其实就是刚才说的当前 query 跟每个 key 的 答匹配分数,然后除以这个根号 d 是 原始论文里的这个 scale 技巧,让这个分数不会至于太大, 然后外面它套一层 softmax, 是 把这堆分数归一成总和为一的权重,最后乘上一个 v, 就是 按权重把每个 token value 加权汇总。你看到这个公式,可能有的同学已经晕掉了啊,因为我是假设,大家对 transformers 的 架构已经有基本的了解了,因为如果要展开的话,连 karpai 老师这么会讲的都解释了三个小时, 所以我这里只是简单提一下理解 tencent 的 相关的底层原理。我们回到 attention 的 具体计算, 假设你的提示词有 n 个 token, 然后每一个 token 它投影出的 q kv 向量维度都是 d 维,那么把 n 个 token 的 query 向量一行一行摞起来就是一个 n 行地列的矩阵。 同理 k 和 v 也是一个 n 乘地的矩阵,所以现在看 prefer 真正做的事情就是把整个提示词的 q kv 都先算出来,然后把 q 矩阵乘上 k 矩阵的转置,这一步得到一个 n 乘 n 的 分数表,表示提示词里 token 之间两两的匹配分数, 然后我们再用这张表去加权乘以这个 v 矩阵,然后整个这个提示词的这个 attention 的 权重就这么一次算完了。所以这张表是一个 n 乘 n 的 n 长得越大,它这个计算量就长得越猛,所以这个 perf 阶段是吃的是 gpu 的 算力。我们再看 dico 的 解码阶段, dico 的 每生成一个新的 token, 它只新增这个 token 自己的这一行,所以它的 q, 它的 k 还有 v 都各是一个一乘 d 的 向量, 所以这个 k 矩阵和 v 矩阵都各往下多出一行,然后再拿新的这个 query 去和 k 矩阵里前面所有的行比, 然后再从 v 矩阵加权,取所有的 value 生成第二个 token。 第三个 token 就是 这两个矩阵不断地往下添加新行,一次添加一行, 而前面的那些行每生成一个新的 token, 都要被重新用一遍 decode, 这样一个字一个字的算。每生成一个新的 token, 都要把前面 token 的 k 和 v 都重算一遍,于是工程师们就想到在 decode 的 阶段把它们都存下来,于是这就是 kb cache。 为什么我们只存 k 和 v, 不 存这个 q 呢?因为每个 token 的 q 只在它自己生成的那一刻用了一次,下一步就换成新的 token 了。新的 query 和老的 query 不 一样,老的 query 就 立刻没用了,存了也是浪费, 而 k 和 v 算出来就不再变了,而且每一步 decode 生成新的 token 都要翻出来用,所以值得存。 k b cash 的 核心作用就是加速 decc 的。 比如说我们设当前的这个上下文的长度是 n, 那 么如果没有 k、 v cash, 每生成一个新的 token, 都要把前面 n 个 token 从头全部重算一遍。单部的计算量是 n 的 平方的级别, 那么有了 k、 v cash 以后,生成新的 token 就 只用算新的这一份 k 和 v 了,前面全部从 k v cash 里取,所以单部的计算量降到了 o n, 计算复杂度降了整整一个数量级,所以上下文几千个 token, 那 么每部就是快上万,那么就是快上万倍了。 ok, 那 么有了 k v cash 以后,我们看看整个完整的推理过程变成什么样了。那么在 preview 阶段,整段提示词的所有 token 的 k 和 v 一 次性全部算出来,然后整体写入这个一个空的 k v cash, 所以 整个 preview 阶段它就是 k v cash 的 始化阶段。 然后到了 decode, 我 们每生成一个新的 k 和 v, 然后再追加到 k v cash 的 末尾, 所以抵扣的就是不断给 cash 加一行。所以我们回答视频开头那个问题, prompt cash 里面具体存的是什么?就是提示词未进 transformer 之后, prefer 结束,出示好的那一份 k v cash, 它是模型算到一半的,中间结果并不是上次的回答, 更不是一个能直接返回给用户的字串。到这里 k v cash 解决的还只是一次推理内部的重复,同一次回答请求里面 decode, 它就不用重算前面的 k v 和 attention 了,而 a prompt cash 把这种赋用扩展到了跨请求。 什么意思呢?没有 prompt cash 的 时候,每来一个新的请求, prefill 都要从头开始算,你的系统提示词,工具定义,前几轮的对话,每一个 token 的 k 和 v 都要全部重算一遍。那么有了 prompt cash 以后呢?我们如果发现诶 这个前缀和上次的一模一样,那么它就可以直接搬出来上次 prefill 好 的 k 和 v, 直接用这一大段的 attention 计算整个跳过 模型,只需要算你这次新加的这一小段,然后算完接上上次缓存的,然后 delete 的 照样往下生成就行了。 注意,缓存命中不等于直接给你一个答案,它省掉,只是这一段 preview 的 计算模型,该生成还得生成。所以这是为什么命中缓存的 token 便宜得多,它并没让 gpu 重算它们。 ok。 最后我们做一个总结,把 k v cache 和 prompt cache 放在一张表里对比一下。 从本质上来说, kv cache 它存的是当前对话中已经生成的 token k 和 v 矩阵,而 brump cache 存的是多轮对话间完全相同,可以高频复用的前缀文本。比如说系统记时词的那一段 kv cache。 它们的核心目的呢? kb cache 是 为了消除 decode 的 阶段,每生成一个 token 都要把前面所有 token 的 k、 o, v 重新投影计算一遍的浪费。而 prompt cache 它消除的是 pref 阶段对静态的长文本反复算那张大表的浪费。从复杂度上来说, kb cache 把 decode 的 单步复杂度从 n 平方降到了 n 平方级,变成了向量。而 prompt cache 把命中部分的 pref 计算量从 n 平方直接抹平到常数级的 o, 一 诊断地跳过了。 最后在生命周期上, kb cache 它是一个动态的局部变量,对话结束就销毁了。而 prompt cache 它是一个静态的半持久的变量,跨请求长期的存在显存里面,按 l u 这种策略过期。 所以一句话, kb cache 它省的是同一次对话内 decod 的 重复计算,而 prompt cache 省的是跨请求 prefill 的 重复计算。两个方法搭配在一起,一个省 decod, 一个省 prefill。