粉丝502获赞2.2万


谁说大半夜原地转圈是发神经?我这是在致敬 c 家家的 s t d。 他 们个 flag。 燃烧 cpu 的 自选锁艺术。我看你是带马邪傻了吧,多现成的世界就像早高峰抢厕所。爸里面人还不出来,我要炸了。普通护智锁 mutax 是 敲门有人就回去睡,等人出来叫醒你, 睡醒再来,黄花菜都凉了。对,像你这样不睡觉死守门口疯狂确认。在 c 加加叫自旋 spinning, 这就是自旋锁,不让建成睡,让 cpu 空转,随时准备冲进去。那我肯定第一个抢到 实现这招虚特种兵。 c 加加标准库的 s t d atomic flag 跟普通波尔变量有啥两样大着呢?它是 c 加加唯一强制绝对无锁的原子类型。有啥两样大着呢?它是 c 加加唯一强制绝对无锁的原子。论变量有啥两样大着呢?它是 c 加加唯一强制绝对无锁的原子类型。有啥两样大着呢?它是 c 加加加唯一强制绝对无锁的原子类型。有啥两样大着呢? 先测后射,这是原子操作,看一眼状态并立马设为 chu, 一 气呵成,谁都插不了队。看着 while 循环, tencent 会返回修改前的值。 如果之前是 chu 有 人他返回 chu, 我 就得在 while 里一直跑。这就是自选,直到别人释放变 false, 你 读到 false, 跳出循环,同时瞬间抢锁,设为 chu, 用完条 clear 设为 false, 门就开了。代码太短了吧,短待深奥 miami。 设为 false, 门就开了。代码太短待深奥 miami 设为防 c p u 烂絮,保证抢锁后数据不出错 哦。原地转的我电量耗尽了,这是缺点,如果任务长县城一直空转站, cpu 发热耗电又浪费,像敲门半小时没进去纯属浪费生命。所以它适合进出极快的任务,比让县城睡去醒来快得多。 懂了,短任务暴力敲门玩自旋,长任务乖乖排队用护翅。精辟,这就是 c 家家的权衡之道。行了,别转了,回家吃饭。

大家好,这里是代码校的鹿文成员卡尔,那这次呢,是给大家介绍一个 java ai 项目啊,也就是 ai 智能体助手,我们管它叫做 jake 特曼啊,那这个项目呢,就是带大家呢开发一个 agent 啊,智能体, 那一些路友呢?可能呢也呃自己呢开发过 agent, 那 大家呢,听过 agent 这个词呢,可能也不陌生,对吧?啊,有些路友呢,自己开发一个 agent 呢,写到简历里啊,拿就去面试了, 那面试官呢,一般一句灵魂拷问就是你说你这个项目是 agent, 是 智能体,那么这个项目和直接调用大模型 a p i 有 什么区别 啊?那很多路友呢,虽然说自己开发了这个项目,但是这个问题还是不知道该怎么去回答啊,那这种情况的路友,一般他就是对 agent 呢,他了解的还是不够深入的,那我估计呢,正在看这期视频的路友呢,呃,可能也不知道我开发一个 agent 和直接调用大模型 a p i 有 什么区别呢? 那我在这里给大家举一个呃,简单的例子啊,那假如呢,我有一个任务啊,那我想呃统计一个网站的情况啊,这个网站呢,是卡马投递表啊,最近我刚上线的一个网站啊,是确实是刚刚上线的卡马投递表, 那我想统计卡马图 d 表里边录友们收藏岗位的情况啊,哪些岗位收藏的多,哪些岗位收藏的少啊?整理一个图表,然后发送到我的邮箱里。如果你把这个任务交给 ai 去做,交给大模型去做,那可能首先就遇到了一个问题, 那大模型他不知道你的卡马图 d 表里边的后台数据啊,他也不知道表结构是什么样的,他也不知道数据放在哪里了 对吧?啊,那有的路友的可能想,哎,这有什么难的啊,那个虽然说这个他通过公网互联网的手段可能访问不了啊,你这个路友们收藏这个岗位的信息啊啊,以及你这些表结构啊,那我可以把我的这个后台的数据库设计啊啊表设计啊 以及具体的信息啊,我的设计文档啊等等一起丢给大冒险啊,然后呢让大冒险再帮我去完成这个任务啊,去统计啊这个网站上所有的用户啊,路友们他们收藏岗位的情况。那这么做有一个什么样的缺点呢? 就是你给大模型提供了非常庞大的荣誉信息,其实完成你这任务呢,只需要一小坨信息,但是呢你提供了很多没有用的一起丢给他,什么表结构设计啊,包括以及这库里面的数据啊,以及你的系统的设计文档啊,都丢给他, 那这样呢,他会消耗很多啊,没有必要的托马斯啊,同时呢因为你给他提供了很多没有用的信息,属于啊这个噪音啊,他可能呢就会产生了一些幻觉了, 他产生幻觉的代价是什么?你要和他不断的去沟通啊,才能最终对齐你的需求是什么?可能你在跟他在和他沟通的过程中你就已经先崩溃了,他还没崩你就先崩了啊,所以呢这就是一个很大的一个问题啊,而且呢 我这里呢这个举的这个例子啊,卡码头的表啊,这个网站呢,它还是一个非常小的一个系统啊,如果一个稍稍大一点的系统的话啊,你把所有的设计信息啊,表结构啊以及数据库信息都丢给 ai 的 话,那真的是在非常庞大的信息里边,其实有用的只有那么一点点啊,这就会让 大模型呢就不知道你的真正的用意是什么啊,你在和大模型不断对齐你的需求的时候,你很容易就 啊,或者说大模型已经就开始胡言乱语了啊,那这是大模型的能力不够吗?其实并不是现在大模型都已经很强了,而是说你提供给大模型太多杂质了,而且是非常非常庞大的有用的信息,仅仅是那么一点点啊, 那如何解决这个问题呢?啊,那这里呢就要提到一个技术了,叫做 r g, 那 r g 呢就是用来帮助大模型去触达非公网以外的信息啊,那卡网统计表它的用户的所有收藏信息,这都是在服务器上的啊,这都不是公网可以访问的。 所以说呢啊,我们要把我们这些啊私域的这些信息呢给它做一个整理,让大模型可以触达啊,那 r g 呢就会把我们的这个 啊思域上的信息呢做一个向量模型,那向量模型呢就是帮助大模型在你的这些思域信息里边儿选举到有用的信息能够完成你这次的任务,而不是说啊这么庞大信息它要挨个去便利啊,哪些信息啊是会有用的? 那有了向量模型,它可以直接就去找到完成这个任务所需要的信息在哪里,把它提取出来,那这呢就是 r a g 的 作用。那用一句更直白的话说呢,就是 r a g 是 帮助大模型触达非公王以外的数据啊,那这个数据呢,可能就是你的私有数据啊,那或者说公司的啊,服务器上的数据等等啊, 那我们这个任务里面呢,把这个录友们收藏岗位的信息呢,统计出来之后呢,还要发到我的邮箱里,那你会发现那大冒险呢,没法把这个信息发到你的邮箱啊啊, 这里呢,大模型呢,就像是大脑啊,那他缺少手去干活啊,他需要外接一些工具,那例如说啊,这个发的邮件,那这就是一个工具,需要大模型连接到这个工具上,那么这里举的例子呢,仅仅是发一邮件这么一个工具啊,那真实中呢,可能我们还需要很多其他的工具, 那这些工具的管理呢?我们不能说一个工具就啊单独写一个协议,一个工具单独写一个协议让大模型去介入啊,那我们要如何统一去管理这些工具呢啊,那这里呢,我们就涉及到 m c p 协议, 大家可以理解 m c p 就是 帮助大模型去调用外部工具的啊,那讲到这里呢, r a g 加 m c p, 那 大家呢就可以感受到啊,那 大模型给大模型装上了手啊,大模型可以触达外部的工具啊,那给大模型呢啊,拓展它获取信息的能力,因为很多信息是攻王以外的,是我们自己的数据, 那么我们需要 r g 呢,把这些信息呢做一个向量模型,让大模型呢可以获取到啊,那这就是一个,呃,最小的一个完整的一个 agent 的 效果, 而且呢,在大模型思考的过程中呢,其实呢,呃,很多任务不是说一次对话就可以解决的啊,而是说要有很多次对话,那每一次对话呢,还依赖于上次对话的一个状态,所以这里呢,就涉及到一个循环控制的一个过程 啊。那么你的 agent 系统里面呢,还要控制啊,如何与大模型多次对话以及状态之间的啊这个串联啊,那说到这些呢,其实它都是一个系统设计问题啊,而不是说一个大模型它的智商强弱的问题 啊。那么我们讲到这里呢,大家可能发现,哎,我们做一个 agent 项目呢,它可能就不是说啊,你怎么写一个提示词啊啊,或者说用哪个模型啊啊, 那我们涉及到呢,其实都是呃非常熟悉的软件工程问题,比如说状态怎么管理啊?流程怎么控制啊,不确定性怎么兜底啊啊?组建之间如何结偶?或者说你系统如何在引进中而不失控啊?其实 ai 呢,是有呃不确定性, 它的不确定性呢,是很难彻底给它消灭的,至少目前很难消灭。那我们开发 agent 的 系统呢,其实就是把 ai 的 不确定性给它放到一个尽可能确定性的一个系统里,那接下来呢,再给大家介绍我们这个 agent 向 jay chartman 是 什么样的。 好,那接下来呢,我们来详细介绍一下这个啊, java agent 项目啊, java 啊,那么我们这个项目呢,是配套专栏讲解源码和呃专门的答疑的啊,那这个页面呢,我接下来是给大家这个介绍这个项目的详情。这个页面呢,大家是可以在蛋宝小鹿网站上啊, programmer carr 点 com 啊, 然后点击知识星球,然后点击这里啊,就能看到这个项目的介绍啊,我也是在这个页面上呢,来给大家做这个项目的一个呃讲解啊,那啊,大家加入到知识星球之后呢,可以在知识星球的置顶一啊,星球置顶一可以看到我们具体项目啊,那星球里边的项目呢,现在有二十多个啊, 那我们的 java agent 项目在这里呢,就可以获取到这个项目的详细装潢啊,那我们这个页面呢,是做这个项目介绍的啊, 好,那我们开篇呢,也是介绍了你开发一个 a 阵项目啊,和调用大模型的 a p i 啊,它有什么样的一个区别啊?那我们这个系统呢啊,采用了啊,一个循环思考的一个机制啊,它能够理解复杂的任务啊,规划去执行。 那这里再给大家拓展一下, agent 和工作流有什么区别啊?那么最近呢,这个工作流呢,其实也是挺火的啊,大家呢经常能看到各种视频上讲解的,就是啊,拖拖拽拽啊,然后呢,就把一个任务呢给分解到各个一个小模块里,然后这个工作流呢串解去啊,串联起来啊,去完成这个任务啊, 那呃工作流呢,其实是你呃设定好的,然后程序就按照这工作流去走啊,那么我们的 agent 呢,它是自己理解这个复杂任务,然后规划执行的步骤啊,也就是说你把任务交给它,这个任务如何拆解,如何去规划,是它自己去执行的啊,这是 agent 项目和工作流的一个区别啊, 然后呢啊,可以调用外部工具 b 基于啊 r g e 技术,从啊知识库里边儿解锁相关信息,完成多步骤的复杂任务啊,这是我们这个系统用一句话介绍就是这样的啊, 那么 agent 这个项目呢,它不是一个聊天机器人啊,它能够规划,能够调用工具,能够解锁数据库,能够把执行的过程呢实时展现给前端啊, 那做完这个项目的话呢,你在面试中呢就可以和面试官说啊,我这个不是只接了一个接口啊,那么我实现了啊,自主决策啊,循环思考啊,我也实现了啊,这个工具调用的框架化啊,可扩展,同时呢我也实现了 s s e 啊,实时推送啊, 那也就是我们这个状态和执行化,那大家呢,去用其他 a 针的时候呢,就会发现这个啊,他会把这个执行步骤啊实时给大家列出来,对吧?啊,那我们这个呃系统呢,我们会做了一些截图啊,大家可以看到我们这个系统呢,大概就是这样的啊, 呃呃,在这里边大家可以看到我们无论是选哪个模型作为我们这个系统的大脑啊,那都有一些参数啊,是要配置的啊,一直在这里边呢,我们是要上传一些本地的一些文档啊文件啊,来帮助我们这系统呢去更好的完成任务啊,那这是我们在执行任务中呢,会把每一个步骤啊, 执行的每个步骤的实时的去展现出来啊,那啊这个系统呢,我们会有个演示视频啊,那是在知识星球的专栏里边啊,大家加入大马小鹿知识星球之后呢,在星球置顶一啊,点击这个接叉的啊,点击这个项目里边可以看到专栏里边是有呃这个系统演示的啊, 好,那么我们来看一下我们这个啊,系统专栏的一个目录啊,我们这个系统专栏的讲解呢,是非常详细的,就默认你是一点关于 agent 的 基础知识都没有的,我们是从这个基础概念开始给大家讲解 啊,因为这个视频刚开头呢,我给大家讲解了这个 agent 和你直接调大模型 api 啊,有什么区别对吧?啊?我只是做了一个简单的一个讲解啊,在专栏这里边呢,是给大家做了一个更加详细的一个讲解啊, 那我们这个理论篇啊,模型与能力啊,然后呢是从一次回答啊,到推进任务的 agent, 那 ai 呢?如何真正的做事啊? 模型不知道的那件事,系统该怎么补啊?把这些概念放一起,就应该理解我们系统啊是如何真正运转起来的啊,这是我们这个 agent 它的基础概念啊。那这个,呃我们这个专栏啊,很多路友呢,看到我们这个理论基础啊,反馈都是很不错的啊,那大家呢,都是看了我们这个专栏之后呢才呃 对这个 agent 呢有一个非常呃,就是深入的一个理解啊,那接下来呢,我们这个目录呢,是我们的呃实践篇啊,就是 开始带你从头去开发这个项目了啊,那一共分为八张啊,接下,呃,然后呢就是求职篇啊,那求职篇呢,大家做完这个项目之后呢,简历写法应该怎么写啊?技术亮点 啊,那有哪些啊?那做完这个项目呢啊,大家拿去面试呢,会遇到哪些面试问题啊?包括理论基础的,包括项目实现的啊,那这些呢都给大家啊,整理好了啊,都在我们这专栏里边啊,包括我们这专栏里边其实还有讲解,就是我们这个系统性能啊,评测之类的这些细节啊, 这些都是啊,面试时候很容易问到的啊,大家呢?加入代码小鹿知识星球之后呢,做这个项目呢啊,不用担心啊,哪里不懂啊什么的得不到回答啊,我们星球里边的每一个项目呢,它都是有专门的答疑群的啊,那这个答疑群呢,在我们知识星球里边啊 啊,大家加入大秒算数知识星球之后呢,就可以进入到专属的答疑群啊,那我们这答疑群呢,就在星球置顶一里边,这里边每一个项目啊都有专属的答疑群啊,有不懂的就在群里问就好了啊,那现在知识星球里边是有二十多个项目的, c 加 java 和 go 啊, python 的 话呢,是有一个啊,主要就是侧开啊,侧开项目 好,那么我们这个系统的一个架构图啊,就是我们这个 a 站的系统啊,那我们这个应用层呢,主要就是知识库模块啊,聊天绘画模块以及智能体模块啊, 那么我们这个 api 呢,主要是调用大模型的 api 啊,那我们的系统服务呢,智能体管理啊,那智能体管理呢,包括我们这个生命周期控制啊,智能体配置啊,智能体定义啊,啊,那还有异步事件,就是遇到异常了,我们应该是怎么处理啊那?呃,这个 ai 模型如果不可控的话啊,那么我们这个系统如何去兜底啊,这些都是异常事件啊, 那聊天绘画管理啊,马克当解析 s s e 服务以及知识库管理啊,最后呢是我们智能体服务啊, r g 啊, ai 模型啊,记忆存储以及工具调用啊,这是我们整个这个项目的一个架构。 然后呢,大家呢,想获取我们这个项目的话啊,专栏源码加配套答疑啊,可以加入代码算数,知识星球,点击这里啊去加入啊,对知识星球的详细介绍呢啊,在这里啊,点击进去之后呢,这里会有知识星球详细介绍以及具体的加入方式啊。 好,那么我们再来看一下我们这个项目专栏的一些细节啊,那刚刚这个目录呢,大家也看了啊,那么我们的呃基础概念篇呢,先给大家讲模型与能力啊,就是在这里大家可以看一下我们这个讲解的一个细节啊,真的是可以帮助大家呢,就是呃对模型的能力,对 age 的 啊, 会有一个很好的一个理解啊,那可以给大家看一下啊,这个项目呢,大家加入代码赛路支持星球之后呢,这项目在星球置顶一啊,那可以给大家看一下这个项目呃,在这里啊,呃, 大家可以看一下啊,这是路友们的一个反馈啊,那其实讲的还是很通透的啊。 好呃,那么我们接下来呢再来看一下这个专栏的介绍啊,那下面这是实践篇啊,实践篇就开始带大家呢去开发这个项目了啊,文档也是写的很细的,那如果文档大家看不懂的话啊,可以在我们的专属大衣群里面是提问的啊,我都有专人去回答问题啊, 那这是实践篇啊,那这是第五张呢,就是啊,实现一个带记忆的聊天功能啊,那我们在实践篇里面呢,每一篇呢都会有一个呃,这个一个流程图啊,去帮助去大家去理解啊,我们的这个模块呢是怎么去设计的啊?在这里大家都可以看到啊, 那这里面呢是我们的一个 agent 循环的一个第一次落地啊,这里可以看到我们这个呃, ai 啊,它循环思考是怎么样的啊?我们是如何去做控制的啊?等等啊,那在下面呢就是引入知识库啊与 r g 啊,这是我们创业知识库和 r g 的 一个过程啊, 那最后呢?这个在实践篇最后呢就是完整呃,完成一个完整的一个任务的一个交付啊,那这里呢,大家可以看到我们这个任务交付啊,这个系统调用是怎么做的啊? 那最后呢?呃,这个我们在求知篇里边呢,我们这个项目的简历写法呢,都会给出来的啊,在视频里边就不给大家亮出来了啊,因为这个东西一旦亮出来的话,这个写法就很容易泛滥了啊,大家加入到知识星球之后呢,是可以看到的。在这里啊, 那我们不仅给出简历写法,还有我们的技术站的说明与亮点啊,这个大家可以在这里边看到我们的技术选型的理由啊,以及为什么啊选用这个啊, postgraduate 这个数据库啊,以及为什么选择啊? mybites 啊 那呃我们的那个技术难度和解决方案这里边呢,我们会把难点呢都给大家两呃,就是明确的写出来,这也是大家面试时候面试的过程中呢,呃,面试官很容易问的啊,以及我们的技术成长点啊,大家做完这个项目之后呢?这个,呃你的技术成长点在哪里啊?这里都给大家写的是比较详细的啊, 那还有呃大家做完这个项目之后呢,这个,呃很容易问的面试问题啊,这里都给大家列出来了啊,面试问题以及如何回答啊,那 理论基础篇啊,还有项目实战篇啊,这里呢都有给大家列出来啊,那呃大家如果啊把这个这里面的面试问题啊都看完,都消化吸收好的话,拿这项目去面试基本就不会有什么问题了啊,基本就都覆盖了啊, 那么,呃这里再给大家介绍一下我们这个项目的一个亮点啊,其实在之前呢也给大家介绍了啊,就是我们的呃循环思考我们的状态机啊,那这里呢不是调用一次大模型去结束的,而是多轮规划,多轮工具调用,状态管理啊,错误处理以及最大部署的控制啊, 防止呢无限死循环啊。这里的技术点就是怎样避免 a 帧的无线调用,工具怎么做状态管理,怎么做超时控制啊,那么我们的工具系统呢,包括固定工具,可选工具,可扩展,可治理啊,这些都有哪些问题呢啊?那很多人呢做工具调用呢,就是写几个 f x 啊,那我我们的这个系统呢,做的是框架化啊,工具呢是自动注册啊,固定工具和可选工具分类管理,可扩展以及呢禁止手动控制啊,我们的这个工具的调用流程的啊, 这里的一个技术链就是我们的工具调用是怎么做控扩展的,我们的工具失败怎么处理啊?那工具返回结果怎么进入这个?呃,对话历史框啊,这都是讲系统设计的地方 啊,那以及我们的 r a g 数据库,还有我们的多模型的支持,我们的 s s e 实时通信啊,这里都涉及到很多问题啊,例如 s s e 这里边也会涉及到啊,和 webshop 的, 它的区别在哪里?那连接怎么管理?超时怎么处理?病发怎么扛啊?这些呢,都是一系列问题啊,它不是一个单纯的一个大模型的问题,而是一个工程实践的一个问题啊,那学完我们这项目呢,你可以掌握 ai agent 的 核心能力啊,以及工具调用体系,二 g 全链路啊,多模型架构设计, 后端工程能力啊,实时通信以及可量化的表达结果啊,就是我们这个项目呢,它的测试情况都给大家写好了啊,那以及如何去测啊, 那获取这个项目呢,大家可以加入到代码小鹿知识星球啊,点击这里啊,加入代码小鹿知识星球啊,那大家了解代码小鹿知识星球呢,也可以访问代码小鹿网站 program com, 然后点击知识星球啊,这里呢就是关于知识星球的介绍以及加入的方式啊。 好,那么我们知识星球呢,是不仅仅只有这么一个项目,知识星球呢,是有二十多套啊,项目专栏的讲解以及配套的打印服务 啊,目前的知识星球呢,是有啊,全网比较稀缺的 c 加 ai 项目, go ai 项目以及 java ai 项目啊,这是我们的星球项目的一个呃列表啊,其实现在星球里边项目是比这个还要更丰富一些啊,因为有新加的啊,你 加入知识星球之后呢,后面新加项目也可以直接去看啊,那星球里边呢,也有精品的八股 pdf 都在星球置顶一啊,那学 习路线啊,以及我们的学习氛围啊,这里呢可以给大家简单看一下啊,就是我们在 知识星球里边可以看一下大家的一个打卡的一个情况啊,加入知识星球之后呢,大家都是会在这里边打卡去记录自己的一个学习情况的,学习氛围是很浓厚的,同时呢,你也可以在星球里边呢向我提问啊,包括面试疑惑,学习路线啊,以及职场规划,一对一答疑等等啊, 那么我们知识星球呢,你加入之后呢,是可以支持三天内啊,七十二小时内是可以全额退款的啊。加入知识星球之后呢,大家就可以在呃知识星球里边呢看到 对应的内容了啊,那也有知识星球呢,有网站端也有这个 app 版本啊,那 app 呢,大家在手机应用上去搜索知识星球下载就可以了啊,网站端呢,就访问这个页面啊,就可以看到星球里边的内容了。加入代码算术知识星球的方式呢, 大家可以访问代码算术网站 programmer com, 然后点击知识星球,这里边呢就有知识星球的一个完整的介绍啊,那呃, 也可以获取到我们本期视频的介绍的这个项目啊,那大家在这里面点击知识星球呢,我们的项目呢,在这里都有给大家列出来的啊,那这些项目呢,大家加入知识星球之后是可以一起获取的啊,不是说里边还有二次收费的情况啊?那刚刚呢给大家介绍的呢,就是这个项目啊。好,那这期视频呢,就给大家介绍到这里了,我们下期再见。

m c p scale 到底是什么?你一定听过很多关于它们的理论,但你的理解一定是正确的吗?比如 m c p 的 解析是大模型上下文协议,它可以和各种外部系统连接,请问大模型是直接调用外部的服务吗? 如果你所在公司的内网搭建了 m c p 的 服务,外部的大模型它怎么能够调用呢?再比如 skill 的 解释是技能,它是有具体的功能吗?要不为啥叫技能呢?它和 m c p 又有什么区别? 上面的问题你要是不能够准确的回答,不用怀疑,你一定没有真正理解。这不是你的问题,而是大部分视频都是基于局部的理论知识,缺乏局的视角和实战的经验。 今天这几个视频我会结合我的实战经验,循序渐进的帮你们弄清楚这些技术的本质,请一键三连给予鼓励,让我们开始。 首先你要明白这些 ai 的 概念,它不是突然一起出现的,而是先有 l m 大 模型,再有 n g t, 随后是 m c p, 最后才是 skill。 每一个新概念都是为了解决特定的问题,我们必须搞清楚 ai 在 发展的每个阶段到底遇到了哪些问题,我们才能够真正的去理解这些概念背后设计的初衷是什么。让我们先从 l m 开始, l i m 的 本质是基于概率去预测下一个字母,就像成语接龙一样,二零二二年恰的 g p t 三点五刚问世的时候,我们对它的使用就是对话式的向 ai 提问,写作文生成代码也不需要什么,而且的但是有一个问题就是说 你当时是不能够问 ai 最近发生的事情的,比如说今天是星期几,因为它是基于二零二一年九月份之前所训练的数据。那聪明的你肯定想到了,我们用大模型自己去网上搜索,然后给个结果告诉你,但大模型不具备这个能力,就好比你用大脑一年去操控电脑, 这个时候你要么自己去搜,要么你就写个爬虫去搜,然后再把这个结果发给这个大模型进行整理。 勤奋的你肯定是选择爬虫,而这个爬虫就是最古老的 ngram。 当然了, ngram 它感召智能体,它肯定不是爬虫这么简单。像现在顶级的 ngram, 比如说像 manasa cloud code, 它既能写程序,又能做报告,智能的程度让人不可思议,甚至会让人感到恐惧。 但是它本质上就是在循环的干以下三件事情,第一件事情,收集好信息之后发送给大模型。第二件事情,解析大模型的结果,然后获取这个执行的指令。 第三件事情就是执行指令操作,把执行的结果再次发给这个大模型,整个的操作都是循环进行的。然后接下来我们就来看一个具体的关于 code code 的 一个事例。 假设我们现在有两个文件,其中一个 hello 点加法是存在错误的,这个 user 的 格式函数我们把它写错了。现在我们用 color code 这个 n 的 智能体来帮我们找到这个问题的原因。请注意,用户提示词里面明确指明了这个文件的绝对路径,那么请问 color code 他会直接读取这个 hello 点加文件,然后发给大模型吗?大家暂停思考三秒钟,认为会的刷一,认为不会的刷二,答案是不会 ng 的。 他不会去解析这个提示词,更不知道如何去读取这个文件,他只会把结果发给大模型, 然后让他大模型来告诉他怎么读,去哪里读具体的流程,就像在线看病一样,用户提出问题了,然后再是 n g 的 把用户的问题封装成系统提示词,包括对应的工具,一起全部发给这个大模型,进行这种远程问诊。 这里的系统提示词就是告诉大模型你是一个编码专家,你要解决用户的是编码问题,你不要去解决用户的心理问题,或者是他的单身的问题。 然后工具的列表就是告诉大模型你在解决用户的问题的时候,你可以去开哪些检查,你去看病,如果不开检查,那么他怎么看病?这里面所谓的检查以及所谓的工具,其实就是去搜索提取 文件,大模型就会返回一个提取文件的检查指令,详细的告诉 n g 的 怎么去提取。 好,接下来的话, n g 的 就会乖乖听话去读取这个 hello 点加号文件,连同他的历史记录一起发给大墨琴。这里的历史记录就相当于是一个病历本,因为每次看病都不是同一个医生, 他得知道你是什么问题,你之前做了哪些检查,他只能通过宾利本来来获取这些信息,然后大模型看了 hello 点 java 的 内容之后,他还是不能断定这个问题在哪里,他继续就会开出这种搜索系统文件的指令,用来搜索这个 u 字点 java, 然后摁记着把搜索的结果发给大模型,大模型继续返回这个 u 字点, java 这个指令读完之后,再连同记历史记录一起发给大模型。 好,大模型终于拿到了 user 点加号的内容,也拿到了 hello, 点加号的内容,终于可以制定解决方案了。 ok, 然后把解决方案返回给用户,整个任务结束, 我们总共是经历了四次 http 请求的操作,前面讲的都是理论,接下来让我们来抓包实战的演示一下给大家。我们可以看到这里面有两个类,一个 hello, 一个 user, 然后在这里我们是错误了,引用了 user 的 过载函数。接下来我们把这个问题发给这个 code, 这里面我们采用的是绝对路径啊, 接下来我们来看一下啊,这里面我们用到了一个抓包工具叫做 proxima 啊,这是它的第一条请求,已经发送了。 第一条请求其实跟我们的这个问题的解决关系不大,它主要是让大模型来判断它当前是不是一个新的规划。接下来的话啊,我们来看一下。好,这里的话结果已经出来了,他已经给了我们解决方案,就是要给这个 u 的 构造函数添加对应的参数。 接下来的话,我们来看一下它到底发生了多少个请求,以及它整个的一个处理过程。 这里面总共是发送了一二三四五条请求,但实际上第一条请求的话应该是不算的,为什么呢?因为它这里面它只是让这个大模型去分析一下这个问题是不是一个新的问题,如果是的话,那你就返回一个 new topic, 然后它拷了扣的,在扣端里面添加个历史记录而已,跟我们解决问题的关系并不大啊,包括它对应的提示词也是非常的简单,这一个才是真正的去开始解决问题。这里面就发送了非常长的一段提示词,总共是有七十多 kb。 好, 那么大家想一下这里面包含哪些内容呢?哎,就是我们刚说过的,第一个是什么?第一个是用户的问题,对吧?第二个是系统提示词,第三个是 工具列表。哎,我们可以,你是一个医生,你可以开哪些检查啊?这就是我们的工具列表。 ok, 我 们来看一下是不是这些。好,来看啊,这一段提示词的话是告诉这个大模型用户,他之前执行了一个 kleil mini。 好, 这个跟我们的问题没关系啊,你不要去管他,这个才是真正的啊用户的问题。 接下来的话就是对应的系统提示词,这个系统提示词第一段就是告诉大模型你是 cloud code 的 这个大模型,你解决的是编码的问题,你不能够说去,你去解决什么心理医生之类的问题啊。好,接下来才是具体的告诉这个大模型你应该怎么去解决问题 啊?这一段提示词的话,大家可以把它复制下来,好好的研究一下。好,接下来第三个就是工具列表,就是,哎,你去解决这个问题的话,你可以采用哪些工具啊?那么我们来看一下,在下面啊,很长很长。第一个是啊,它支持哪些工具?有这个定义任务,然后任务输出啊, 然后这个也非常的长,看起来不是特别方便,我专门是做了一个解析器啊,然后我们把它复制到这里来,看起来就相当的方便了啊,你看啊,前面就是用户的提示词啊,这个是系统提示词啊,第一段,第二段,好,这个是工具列表,这里面的话总共是十七个工具,定义任务、任务输出啊, 那然后这里面有几个比较关键的工具啊,读取文件,第二个编辑文件,写入文件,还包括这一个啊,去网上进行搜索, ok, 好, 那么这些的话都会一股脑的全部发送给这个大模型,大模型拿到这些信息之后,他应该怎么做呢?他能够直接断定问题到哪里吗?他当然不会断定问题在哪里了,但是他会开检查呀,来,我们来看一下啊, 他这里面返回的是一堆的这个 s s 一 的内容啊。呃,这个内容的话看起来也不是特别方便,所以说我们还是得要把它复制过来,然后粘贴到我们的工具里面去。 好,你看大模型非常的简单和干脆啊,他就直接给你开了个检查,啥都不跟你说。 这个检查就是读这个 read, 这个 read 就是 我们刚刚所说的这个十七个列表当中的其中一个,它连参数都告诉你了, feel pass。 那 么 color code 接收到这个工具指令之后,接下来干嘛?肯定是读取这个文件,然后再把这个文件一起发送给这个大模型,我们来看一下它的第二次请求, 这一次请求里面的话要包含哪些信息啊?大家想一下,第一个是第一个应该是历史记录,就是我之前用过的问题,以及大模型返回的结果, 又要重新再发一遍。第二个就是读取的内容,我们来看一下,看这个还是原来的内容,一模一样没有变,对吧?包括用的问题,包括这个大模型返回的这个结果,结果就是要去读取这个文件,然后接下来就是,哎,我读取到了这个文件, ok, 然后再往下大家猜一下是什么,就跟之前发出的是一样的,还是对应的系统的提示词,以及对应的工具列表,一起全部发送给他。然后我们在看他返回的内容之前,我们先来猜一下大模型这个时候他应该怎么做 啊?假如是你,你应该怎么做?其实我已经读取到了这个加哇的对的这个代码,接下来的话,我们是不是要去搜索一下这个优优的这个列表,是不是大模型的话,接下来应该是要返回的是搜索, 搜索这个文件,搜索这个 user 这个文件肯定了你没有看过 user 文件之前,你不能够断定到底是哪里写错了,对不对啊?那么到底是不是这样的呢?我们把它复制过来,然后粘贴到这里来,我们来看一下啊,好大拇指说代码的语法没有问题, 但是我们要检查一下这个 user 类是不是存在,但是我又不知道 user 类去哪里读取,所以说他就给用户返回一个搜索的命令, 这就是我们的第二次请求,第三次请求想也想得到,直接就去搜索,然后把搜索的结果一起返回给他,连同历史记录一起返回给他。我们来看一下第三次请求, 第一步肯定是历史记录全部的所有的历史内容,接下来最后一个内容是他的搜索的结果, to a result, 搜索结果就搜索到的是这个文件,是这个路径,同样的还是系统提示时和对应的工具列表 发给他之后的话,他的返回的结果。想也想得到,肯定就是要你去读取这个文件了吗?让我们来看一下,你看啊,简单干脆你去读一下这个结果。好,最后一步的话,大家想也想得到,肯定是之前的历史记录,然后就是这个 user 的 读取的结果。好,我们也一起来看一下 一堆的历史记录,这一步就是这个 user 类的读取结果。好,读取完之后的话,你看大模型基于现在的这一次请求, 包括这个 hello 的 内容, hello 加 hello 点 java 的 内容,以及这个 user 点 java 的 内容。那么它是不是就能够断定是这个 user 的 构造函数 没写对,因为这里面只有一个构造函数,而且这个构造函数要传两个参数,而你在这里一个参数都没传好,这样它就能够基于现有的信息能够进行判案了,能够判断这个病情到底是在哪里了,这个时候它就会给我们返回实际的问题的解决结果。 讲道理来说应该就是这样的,我们来看一下它最终的返回结果。好,我们复制粘贴进来,你看已经找到问题了,问题是什么?怎么怎么解决?这就是这一二三四条请求,就是完整的 color code 和大模型的一个交互的过程。 ok, ok, 如果说你接下来你就可以继续说帮我修复,这样子你就可以进一步的观察到这个 color code 是 怎么去修复这个问题的。 ok, 那 么感兴趣同学可以自己去试一下,我这里面只是告诉大家它整个的一个 基础逻辑, ok, 另外如果说大家需要这个工具的话,也可以直接私信我,我会把对应的这个工具和源码一起发给大家。那么从刚刚的实战可以推断,我们无论执行多少次 h d d p 请求,但是 n g 的 本质上就是在不断的在执行, 一、收集信息,二、解析结果。三、执行操作。无论他执行多少次,都是在循环的干这三件事情,直到问题解决。那么接下来我们新的问题是,关于这个执行操作,他到底可以执行哪些操作呢? 除了 color code 自带的这十七个工具列表以外,我们还能不能够有更多的操作呢?这个时候就该 m c p 出场了,请看下集内容,点赞越多更新越快,让我们下期再见!

今天开始复习八国,我今天特别兴奋,我刚重新搞懂了这个堆内存和占内存的区别,我简单讲一下,就是迫不及待跟大家分享一下。嗯,那个占内存大家要知道,就是 啊,一个县城私有的,而且堆内存呢,是那个县城之间共享的,所以呢,大部分的对象是存放在堆内存当中的。那占内存是干什么的呢?就是它是用来存放方法加方法每个方法产生的战争的啊,战争就是 stick, 那 个战就是真是那个真理的。真 战争是什么呢?就是用来存放这个方法的信息的,比如说哪些参数啊,啊?什么呃,局部变量啊,临时数据啊,什么之类的,对不对?然后为什么叫做占内存呢? 占这个词嘛,对不对?先进啊,后进先出啊,对不对?后面进来的先出去啊。然后我们刚又说到占内存是用来存放 java 方法产生的战争的,而且又是县城私有的,每个县城都有一个占内存, 这简直简直是天作之合,你知道吗?就比如说我这个最大最外面这个方法里面应该会调用其他的方法,对不对?方法会一层一层往里调用啊?比如说我这个命令方法里面调用了一个 dfs, 对不对?那我没有这个方法,肯定会先用一个战争嘛,先入战,进入这个战内存,然后呢,里面又调用了一个 dfs 方法, dfs 方法它是不是又会是产生一个新的战争呢?又压入到这个战里面,然后这个 dfs 方法, dfs 方法执行结束了,弹出去啊,它的战争就可以弹出去了, 然后 mate 方法的战争还在最底下,对不对?因为 mate 还要执行其他的逻辑,然后 mate 执行完毕之后也弹出去,我就简直对应上了,就是战战,就这个意思,我的天呐,我现在很很兴奋啊。然后,呃,还有一个逃逸分析是什么呢?就比如说 你这个方法里面的一个对象,他不会被这个方法返回出去,也不会复制给其他的其他地方的一些变量,他只是在这个方法里面局限于这个里面和这方法结束之后,这个对象呢就不需要用了。 那我们这个 j b m 也很聪明啊,他就可能会判断到,哎,你这个东西这个对象是不会逃逸出去的,不会传到其他地方去,这个对象呢会随着这个方法的结束而结束, 会随时。所以呢,其实跟着这个战争同时结束的对不对?不需要分配到堆内存上去,我直接分配到这个战内存上去更方便,对吧?因为这个战内存它是随着战争这个方法的战争结束而结束,就直接销毁掉了。而如果你分配到堆内存上去呢, 就比较复杂,对不对?它需要用到这个 gc 啊,垃圾回收机制会去检测你是否还有残余的饮用,它就会慢一点,所以这就是优化了一个效率的地方。所以我总结一下啊,堆内存呢,就是一般的对象,大部分对象都是会存放在堆内存当中的,因为它是县城之间都是共享的 啊,然后呢,他需要用垃圾回收机制来回收判断你是不是要引用,嗯,然后占内存呢?自那个这个,呃,然后占内存就是你看这个名字又叫什么意思了吗?对不对?用来存放方法产生的战争的啊?后进先出, 所以呢你可以想到对不对?你一个大方法里面调用小方法,你们再调用方法,再调用方法,一层一层就像这样这样压进来,然后呢?到时候再弹出去,哎,就像那个 b f s, 我 们 b f s 是 不是用这个站来实现的,对不对? 所以就是类似的这个思路嘛。然后我们,呃,平时写算法题啊,我们这个递归退出条件写错了,对不对?像 dfs 那 个退出条件写错之后不是就是会无限递归了吗?一般都会报什么错误呢? stack overflow 对 不对?栈溢出了,就这个意思,你看无限的往里面放同一个 dfs 这个方法的战争,无限放,你这个栈内存是不是就被挤满了?所以就 stack overflow 了? stack 溢出了, 然后站那个堆列神,为什么会溢出呢?就是因为啊,你有太多大量的大大对象没有被回收掉,或者你有很多的垃圾回收不及时才会溢出,然后站溢出呢?就是刚刚说的你方法调用太多了,都没有, 都没有退出,就比如说无限递归下去了,我的天,我现在太通透了,我现在我现在太兴奋了,所以迫不及待跟他刚学会,就跟他发个视频分享一下。

今天用一张图带大家入门 java 的 基础语法。 java 基础语法就像搭积木,简单又有趣。从程序结构开始,一个 hello world 的 程序就是你的入门仪式。 public static void main 就是 程序的大门,一进门就打印 hello world, 超有仪式感。 接着是数据类型, int, double boolean, 叉儿还有 spring 字母串,就像给变量贴标签,让电脑知道他是什么人,控制流程更酷。 if else 是 选择题否和 y l 是 循环播放,让你的代码动起来。 书组合字母串系,数据仓库 score zero, greeting dot, uppercase, 操作起来超顺手。最后别忘了注视,各种各样的注视,就像给代码加说明书,让别人一看就懂。学完这五大块,你就是 java 小 能手了!点赞加关注,下一个互联网大厂架构师就是你!

先看单读,我当时直接,好家伙,那这哥们跟我吐槽说写了五年 java, 今天去面试居然被问什么是多肽?那关键是这种基础中的基础他还没打上来。我一直以为这种题只有十亿声效噪才会被问, 结果我去面试呀,看了一圈评论,发现一堆人都在海南,有人说学了一年,今天才真正理解多肽,还有人说写了四年代码,现在再看,居然还有新收获。所以今天我们不兜圈子,把多肽说透,让你以后面试不再翻车。 那翻译成人话就是八个字,一个指令,多种表现。 比如你写代码 animal a 等于 new dog, 那 左边是爸爸 animal, 右边是儿子 dog, 你 调用 a 点 salt, 虽然你拿着爸爸来引用,但 jimmy 会在运行时自动识别他是只狗,于是说出,汪汪。如果你把右边换成 cat, 他 就说出喵喵,那这就叫做你只管发指令。那具体怎么干,让指令自己去决定。那这里送给大家一个底层口诀,专门解决那些骚扰的鄙视点。 翻译看左边,运行看右边,编辑器,根据左边的复列,看到你能调用哪些方法,那真正执行时, jimmy 根据右边的实际对象,把虚方表里的子类版本找出来跑。 这时候有同学要问了,搞这么复杂干嘛?那直接用纸叠不香吗?兄弟,多肽不是为了秀操作,是让你少改代码少加班。你想啊,今天系统里有猫有狗,那明天产品经理脑子一热,非要加个猪?如果你没有多肽,你要到处改一副钥匙, 那有了多肽,你只需要先写一个 pick 类继承 animal 就 行了,原来的业务代码一行都不用动,直接兼容。那这就是架构里常说的对扩展开放,对修改关闭。那么实现多肽有三件事必须满足,第一,有继承或时间关系,那第二,子类重写方法,第三,父类引用指向子类对象,缺一不可。这 三点拍在桌上。再补一句,结偶和扩展性,那面试官基本没得挑。好了,最后问大家一句,你们觉得这题问的有意义吗?那多肽在实际工作中常用吗?评论区告诉我,我们下期见。

各位朋友大家好,今天我们来聊聊一个在 java 世界里,从第一天起就伴随着每一位程序员的老朋友 string 类。到了二零二五年, java 已经发展到了二十一版本, 但这个类的核心地位依然无可动摇。它就像我们编程语言里的空气和水,无处不在, 却又因其设计精妙而常常被我们忽略其深度。简单来说, s t r i n g。 在 java 里代表一个不可变的函数训练。什么意思呢? 就是你一旦创建了一个函数串对象,里面的内容就再也不能被改变了。这种不可变性是它所有特性的基石,带来了安全、高效和简洁。它不属于八大基本数据类型,而是一个真正的类。 但 java 给了它像基本类型一样直接赋值的特权,比如 string greeting 等于。你好,二零二五好! 理解了它的本质,我们一起来逛逛它身上那些琳琅满目的能力,也就是它的方法。这些方法大体可以分为几类, 创建与构造、信息获取、比较、判断、查找、解锁、操作变换以及一些非常实用的现代工具。首先,怎么诞生一个 string 呢? 除了直接写双引号,我们还可以用 new string 这个构造器。它有很多重载形式,比如传入一个字母数组叉, 可以把一堆散落的字母组装成字母串,传入一个字节簇组 byte, 并指定字母集名称 charson name。 可以 把网络传输或文件读取来的二进制数据解码成我们认识的文字。 这里要注意字母集这个参数直观重要。处理中文或特殊符号时,如果选错,就可能出现乱码。字母串诞生后,我们自然想了解它。 link 方法,返回字母的个数, 这是对象方法。 is empty 和 is blank, 这是 java 十一引入的,都能判断是否为空。 is empty 要求长度为零, 而 is blank 连纯空白字体如空格制表符也认为是空。 charit into index 是 对象方法,根据下标获取单个字体。记住,下标是从零开始的,可别越界哦。接下来是比较和判断。 equals object, an object 是 最常用的,它比较内容是否完全相同, 强烈建议用它替代,等于来比较内容。 equals ignore case, string another string 则忽略大小写。 compared to string another string 和 compared to ignore case 则用于排序比较,按字典顺序返回差值。 starts with s t r i n g prefix ends with s t r i n g suffix 用来检查开头和结尾。 contains char sequence s, 看看是否包含某个子序列。这些都是对象方法, 需要你有一个字序链来调用。当我们需要在字序串这个文本海洋里查找定位时, 有一组强大的工具, index off index, off string string。 从前往后找某个字母或子串第一次出现的位置找不到,返回负一。它们还有重载版本,可以指定起始搜索点。 from index 对 应的 last i, n, d, e, x, o, f 系列 则从后往前找。这些方法在解析路径,截取内容时非常有用,重头戏来了,操作和变幻。因为字母串不可变, 所以所有这些方法都会返回一个全新的字母串,原串丝毫不变。 sub string int begin index 或 sub string int begin index, int and index 用于截取子串。注意参数是开始下标和结束下标 不包含结束点。本身 concaten string 用来连接,但现在我们更常用加号或者 string join replace char old char char new char or replace char sequence, target char sequence replacement 进行字母或序列的替换, to lower case 和 to upper case 进行大小写转换。 trim 能去掉首尾的空白符,而 java 十一的 strip strip leading strip trail 则对空白符的定义更广泛,更推荐使用 split。 string regx 是 重量级方法,它根据给定的正则表达式,把字串分割成一个字串数组。这个正则表达式参数 rejects 功能强大,但需要学习, 比如用逗号分割就是 split 逗号反过来把多个字母串拼接起来。我们可以用类方法, string join char sequence de limiter char sequence elements。 第一个参数是连接符,后面是可变长参数,用起来非常优雅。例如 string join 两千零二十五零一零一。 java 八之后, string 也加入了函数式编程的潮流。 char 方法返回一个 i, n, t, s, t, r, e, a, m, 让你可以用流的方式处理每个字母。 java 十一的 lines 方法则直接把一个多行字幕串按行分割成一个流,处理文本文件内容简直不要太方便。还有几个非常实用的新方法, repeat int count 可以 将字幕串重复多次。 formatted object arcs 作为实利方法,相当于 string format 的 快捷方式,用来做字幕串格式化。说到类方法,除了刚才提到的 join, 最重要的就是 format string format object arg, x 和 value 系列了。 format 方法利用格式函数串和参数生成格式化后的函数串功能强大,而 v a, l, u, e, o, f 可以 把几乎任何类型整数、浮点数、对象等转换为其函数串, 表示他是一个多才多艺的静态工厂。最后,我们不能忘记字母串的内部秘密,应 turn 这个方法,他会主动将字母串放入字母串长量池。对于大量重复字母串的场景,合理使用它可以节省内存, 但一般情况下我们不需要手动调用。好了,关于 java 二十一中 string 类的核心方法,我们就先聊到这里,他就像一把设计精良的瑞士军刀, 每一个方法都为了解决特定问题而生。理解他们不仅能让你编码更高效,也能让你更深的体会到 java 这门语言在 api 设计上的深思熟虑。希望这次漫步 能让你重新认识这位最熟悉的陌生人。下次当你敲下 s t r i n g 点的那一刻,或许会有更多得心应手的感觉。感谢您的耐心观看,我们下期再见!