news 2026/9/25 6:59:22

算子深度解析:从数学定义到图像处理与GPU开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算子深度解析:从数学定义到图像处理与GPU开发实战

如果你最近在搜“算子”这个词,大概率会看到一堆看似完全不相干的东西:Sobel算子、Canny算子、kernel算子、拉普拉斯算子、AscendC融合算子、神经算子……有人在做图像边缘检测,有人在调Halcon,有人在搞GPU性能优化,还有人备考算子开发认证。这些场景聊的其实是同一个底层概念的不同侧面。

算子,简单说就是“对数据做一次变换的处理单元”。它既可以是一个数学上的映射关系,也可以是工程上一段可执行的函数,还可以是AI芯片上一个跑在加速硬件上的kernel。这篇文章就围绕这个词,把数学概念、图像处理经典算子、GPU执行原理、算子开发流程、融合算子这些内容串起来讲一遍,适合刚接触算子的学生、做视觉算法的工程师、以及正准备转行做算子开发的朋友。

1. 先搞懂一件事:算子这个词到底在说啥

1.1 数学背景:从函数到算子,名字听着唬人其实不复杂

很多人一看到“算子”两个字就发怵,觉得是个高深的数学概念。其实拆开来看没那么玄。数学里,函数做的事情是“数到数”的映射,比如 y = f(x),输入一个数,吐出一个数。算子做的事情是“函数到函数”的映射,输入一个函数,输出另一个函数。微积分里的求导、积分,本质上都是在作用在函数上的“操作”,所以被称作微分算子、积分算子。

但到了工程领域,“算子”这个词的含义被大大泛化了。只要是对数据做一次有意义的变换,都可以叫算子。图像处理里的滤波是一个算子,神经网络里的卷积是一个算子,矩阵乘法也是一个算子。你甚至可以把“给数组排序”也理解成一个算子,因为它也是“输入一份数据、输出变换后的数据”。所以别被名字吓到,它就是个“处理动作”的代称。

比如拉普拉斯算子,写作 ∇²,是二阶微分算子。放在图像里,它的作用是求像素点的二阶导数,用来检测灰度突变的位置,做边缘检测和图像锐化都靠它。一个图像经过拉普拉斯算子处理后,平坦区域输出接近0,边缘和角点处会出现明显的正值或负值。这个算子之所以经典,是因为它用一个固定的3×3卷积核就能实现,计算简单,效果直观。

1.2 图像处理里的三兄弟:Sobel、Laplace、Canny到底差在哪

图像处理领域可能是普通开发者接触“算子”一词最多的地方。Sobel、Canny、Laplace这三个词频繁出现在各类教程里,但很多人只会调API,不清楚它们背后的设计思路差异。我用一个表格把它们的核心区别列清楚:

算子数学原理主要用途输出特征
Sobel一阶差分近似梯度,结合了水平/垂直方向的加权平滑边缘检测、梯度幅值计算粗边缘,对噪声有一定抑制
Laplace二阶差分,对灰度突变更敏感边缘检测、图像锐化细边缘,对噪声敏感,常配合高斯滤波使用
Canny多阶段流程:高斯模糊 → 梯度计算 → 非极大值抑制 → 双阈值筛选高质量边缘检测单像素宽、连续且定位准确的边缘

这里有个常见误区:Laplace和Canny虽然都做边缘检测,但定位思路完全不同。Sobel和Laplace本质上是“用卷积核直接算梯度”,Canny是一整套算法流程,算子只是流程里的中间环节。Canny里的梯度计算环节就可以用Sobel算子完成。所以严格来说,Canny是一个“算法框架”,而Sobel和Laplace才是真正意义上的算子。实际项目中,如果要快速看梯度方向,用Sobel;要锐化图像,用Laplace;要做稳定的边缘提取,直接上Canny更省心。

1.3 Halcon手册里的“算子”:机器视觉世界的API全家桶

搜“halcon算子中文手册”的人,多半是在用Halcon做机器视觉项目。Halcon里“算子”这个词的含义更偏向“函数接口”,比如 read_image、threshold、find_shape_model、measure_pos 这些都是算子。它跟数学意义上的算子关系不大,纯粹是MVTec公司把算法封装成一个个可调用的操作单元,沿用“operator”这个词来命名。

Halcon算子的特点是参数多、组合灵活。同一个 find_shape_model,参数里能调金字塔层数、匹配分数、最大重叠、亚像素精度等一堆东西。新手最容易栽的坑是:照着手册抄了代码,换一张图就匹配不到目标了,然后怀疑算子有问题。其实大概率是参数没跟着场景调,比如对比度阈值设得太高、旋转范围没放开。学Halcon最好的路径不是从头到尾读手册,而是拿着真实图像,对着算子的中文说明,一个个参数试效果。手册本身体量巨大,当字典查就好,别当教材啃。

2. kernel算子:GPU和AI芯片语境下真正的硬核主角

2.1 为什么大模型时代“算子”这个词突然这么热

你去搜“算子”,会看到大量跟GPU、AI芯片绑定的内容,比如“算子开发GPU”“kernel算子”“大量使用算子对硬件性能的挑战”。这跟近两年的AI算力热潮直接相关。一个Transformer模型跑一次推理,本质上就是成千上万次算子调用:矩阵乘法、LayerNorm、Softmax、激活函数、注意力计算……每个环节都是一个算子,或者一组算子的组合。

模型越来越大,算子数量也水涨船高。硬件厂商的挑战在于:不同算子的计算特征差别极大。有的算子访存密集,数据搬进来搬出去的时间远大于计算时间;有的算子计算密集,把计算单元塞满都还不够用;还有的算子shape动态变化,序列长度一变,整个kernel的最优分块策略就不适用了。让成百上千个算子都能在硬件上高效运行,这是算子开发工程师每天都在解决的问题。所以“大量使用算子对硬件性能的挑战”这个热搜词,说的就是这回事——模型不是难在一个算子上,而是难在要让一堆算子协同高效跑起来。

2.2 GPU上执行一个算子的全流程:从CPU到GPU的完整链路

很多教程直接教怎么写kernel,但没讲清楚一个算子从调用到执行到底经历了什么。我拿CUDA举例子,把全流程拆开说。

第一步是数据准备。算子要处理的输入数据一开始在CPU内存里,需要先拷贝到GPU显存,这个过程叫H2D(Host to Device)。第二步是kernel launch,也就是启动核函数。这一步里CPU只负责下发指令,你把网格大小、线程块大小、核函数参数传进去,GPU开始执行。第三步是硬件调度,GPU内部的调度器把一个个线程块(Thread Block)分配到不同的SM(流多处理器)上,每个SM里又有多个CUDA Core并行执行线程。第四步是访存与计算,每个线程独立读取自己的那部分数据,算完写回显存。第五步是结果回收,如果后续需要在CPU上处理,再把数据从显存拷回CPU内存,也就是D2H。

这里我想用一个生活化的类比:CPU是饭店老板,GPU是后厨,kernel是菜谱,线程是厨师。老板把菜谱递给后厨,后厨里几十个厨师同时开火,每个人负责一道菜的一部分。老板不会亲自炒菜,他只管下单和收货。这也是为什么GPU适合大规模并行——不是单个线程跑得快,而是线程数量多到离谱,靠并发总量碾压CPU。

整个流程里最容易被忽视的是H2D和D2H拷贝的开销。如果算子本身计算量很小,数据拷贝时间可能比kernel执行时间还长。这也是为什么实际工程里要做算子融合、要减少host和device之间的交互次数。

2.3 访存密集和计算密集:决定性能优化方向的根本分叉

写算子干了一段时间后你会发现,优化手段翻来覆去就那么几样,但关键是要先判断这个算子属于哪一类。GPU上的算子大体分两种:访存密集型和计算密集型。

类型典型算子性能瓶颈优化重点
访存密集逐元素加法、Reshape、Copy、归一化显存带宽合并访存、向量化加载、减少全局内存访问次数
计算密集矩阵乘法、卷积、FFT计算单元吞吐分块、寄存器复用、数据重排、指令级并行
混合型卷积+激活、Softmax两者都可能成为瓶颈根据实测profiling数据动态调整策略

判断一个算子是访存密集还是计算密集,有个粗略的估算方法:算一下完成这个算子所需的计算量(FLOPs)和访存量(Bytes),两者相除得到“计算访存比”。如果这个比值远小于硬件本身的FLOPs/带宽比,说明数据搬运速度跟不上计算能力,是访存瓶颈;反过来则是计算瓶颈。比如把两个数组逐元素相加,每个元素只需要1次加法和至少2次访存,典型的访存密集。而一个1024×1024的矩阵乘法,计算量是十亿级别,访存量只有几百万,典型的计算密集。

这个判断直接决定了优化手段。访存密集算子的优化方向是把访问模式变规整:让相邻线程访问相邻内存,满足合并访问要求;能用float4一次读16字节就不要一个float一个float地读。计算密集算子的优化方向则是把数据尽量留在寄存器或者片上缓存里,减少重复从全局内存读取的次数,分块、tiling、register reuse都是这个思路。一上来就调优,不先判断类型,基本就是白忙活。

3. 算子开发实操:从零手写kernel到融合算子

3.1 算子开发的标准流程:不是上来就写代码

“算子开发GPU”这个热搜词背后,是一个完整的岗位方向。算子开发的日常不是从写代码开始的,而是从需求分析开始的。我总结了在实际项目中比较实用的六步流程:

第一步,需求梳理。明确输入输出的shape、数据类型、数据排布(NCHW还是NHWC)、是否需要支持动态shape。这一步不做清楚,后面全部要返工。第二步,算法拆分。把算子要做的数学变换拆成可并行的粒度,确认每个线程负责哪部分计算,需不需要线程间通信。第三步,kernel实现。用CUDA、AscendC或者其他编程模型把算法翻译成可在GPU或AI芯片上执行的代码。第四步,正确性验证。写一个CPU参考实现,跑同样的输入数据,对比输出,用误差阈值判断kernel是否算对了。第五步,性能调优。用profiling工具抓kernel的耗时、显存吞吐、计算单元利用率,找到瓶颈再针对性优化。第六步,工程接入。把调好的算子注册进推理引擎或者算子库,封装成对外接口,供上层框架调用。

有个特别重要的经验:一定先写CPU参考实现。很多人图省事,直接对着公式写GPU代码,算错了也不知道错在哪。有了CPU参考实现,任何一步出问题都能二分定位,是省时间利器,不是浪费时间。

3.2 手写一个Sobel边缘检测kernel:CUDA实操示例

光说不练假把式,这里给一个完整的Sobel算子CUDA实现。Sobel的核心是用两个3×3卷积核分别计算水平梯度Gx和垂直梯度Gy,然后合成梯度幅值。代码实现的基本思路是:每个线程处理输出图像中的一个像素,读取该像素周围3×3邻域的像素值,套卷积核公式计算出结果,写回显存。

__global__ void sobel_kernel( const unsigned char* input, unsigned char* output, int width, int height) { int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y; // 边界像素直接置0,避免越界访问 if (x < 1 || x >= width - 1 || y < 1 || y >= height - 1) { output[y * width + x] = 0; return; } // 读取3x3邻域 const unsigned char* p00 = &input[(y - 1) * width + (x - 1)]; int gx = -p00[0] + p00[2] - 2 * input[y * width + (x - 1)] + 2 * input[y * width + (x + 1)] - input[(y + 1) * width + (x - 1)] + input[(y + 1) * width + (x + 1)]; int gy = -p00[0] - 2 * input[(y - 1) * width + x] - input[(y - 1) * width + (x + 1)] + input[(y + 1) * width + (x - 1)] + 2 * input[(y + 1) * width + x] + input[(y + 1) * width + (x + 1)]; int mag = (int)(sqrtf((float)(gx * gx + gy * gy)) + 0.5f); output[y * width + x] = mag > 255 ? 255 : (unsigned char)mag; }

代码很简单,但有几个细节值得注意。首先是边界处理:3×3邻域在图像边缘会越界,我的写法是让边界像素直接输出0。其次是计算类型:卷积累积结果要用int,不能直接用unsigned char,否则中间值溢出会出错。第三是启动配置:假设图像是1024×1024,可以用16×16的线程块,grid维度就是64×64。这种每个线程处理一个输出像素的写法,是最朴素也最容易理解的版本,适合入门。

实际工程里没人这么写Sobel,因为访存效率太低——相邻线程读到的数据大量重复,用共享内存或者利用纹理缓存的局部性会快很多。但对理解kernel执行模型来说,这个版本把线程、网格、边界、数据类型这些核心概念全部覆盖了,作为第一个GPU算子非常合适。

3.3 融合算子:matmul + prelu 为什么非要粘在一起

热搜词里有个很有代表性的“ascendc融合算子matmul+prelu”。这个case很能说明算子融合的价值。先说场景:一个神经网络的线性层,通常就是先做矩阵乘法,再接一个激活函数,比如PReLU(带参数的ReLU)。不融合时,matmul算子算完会把中间结果写回全局内存,prelu算子再从全局内存读出来逐元素算激活。中间结果可能非常巨大,写一次再读一次,既浪费时间又浪费带宽,对显存小的设备更是灾难。

融合算子的思路是:把matmul和prelu合并成一个kernel。matmul在计算完一块结果后,数据还留在片上存储或者寄存器里,马上对它做prelu变换,只把最终结果写回全局内存。一次访存,省掉中间一次全量写入和一次全量读取。这个改动看起来不大,但对于频繁执行的大shape矩阵乘法,性能收益非常可观。特别是推理场景里算子数量动辄成百上千,每个算子少一点访存,累积起来差距巨大。

在AscendC这种面向AI芯片的编程模型里,实现融合算子的核心是理解“片上存储”的概念。你要把matmul产出的中间tile留在高速缓存里,而不是急着搬回DDR。这就引出了tiling策略——把大矩阵切成小块,让每个块的计算和激活都在片上完成,再流式处理下一块。融合算子的难点不在于把两段代码拼在一起,而在于重新设计数据流动的节奏,让中间数据尽量不落全局内存。

3.4 神经算子:一个容易混淆的“同名兄弟”

“神经算子”这个词有必要单独拎出来讲一下,因为它跟前面聊的算子完全不是一个赛道。神经算子(Neural Operator)是科学计算和深度学习交叉领域的一个研究方向,目标是学习“函数空间到函数空间”的映射。最著名的代表是傅里叶神经算子(FNO),用神经网络在傅里叶空间里学习偏微分方程的求解过程,实现对不同初始条件、不同参数下的解做快速预测。

打个比方:传统算子像是在“单个样本”上做变换,比如一张图经过Sobel得到梯度图;神经算子像是在“一堆函数”的层面上学习变换规律,给它一个新的初始条件,它直接预测整个解场。它和GPU kernel、图像处理算子完全不是一个概念,但搜索“算子”时经常一起出现。如果只是做视觉或者AI工程的同学,看到这个词知道它是科学计算方向的内容就行,不用深究。

4. 算子开发工具链与生态:LLVM自发现、Halcon手册、认证考试

4.1 LLVM算子自发现:让编译器替你找可优化的算子

“llvm算子自发现”是个偏小众但很有前瞻性的技术方向。传统算子开发是人工的:你定义一个算子,写一个kernel,让它跑得快。但在深度学习编译器里,还有一种思路是让编译器自己从计算图或者底层IR(中间表示)里“发现”某个算子,甚至“发现”一长串算子组合可以被替换或融合。

举一个具体场景:编译器扫描一遍IR,发现某个指令序列的语义恰好等价于一个已经优化过的库函数,比如一个循环展开的矩阵乘法、一组带shuffle的向量操作,那它就可以把这段IR替换成对高性能库的调用。这就是“自发现”的雏形。更进一步,编译器还能识别出“卷积+批归一化+ReLU”这种经典组合,直接融合成一个算子,或者替换成特化kernel。

这个方向的价值在于减少人工写算子的工作量。算子种类那么多,硬件平台又那么多,靠人力一个一个移植、优化,根本跟不上模型迭代的速度。编译器如果能自动发现和生成高性能实现,开发效率会大幅提升。目前TVM、XLA这类深度学习编译器里已经能看到类似的能力,但离“全自动发现任意算子并生成最优kernel”还有很长的路要走。

4.2 Halcon算子中文手册怎么用:别从头读,当字典查

Halcon的算子手册动辄上千页,中文翻译版本也有大量专业术语。很多初学者犯的错误是拿着手册从头开始读,读了两百页还停留在read_image和disp_obj,真到项目里依然不会用。正确姿势是倒过来:先明确自己要解决什么问题,然后按功能模块去搜索算子。

比如要做“圆环尺寸测量”,就先搜measure相关算子,看手册里对measure_pos、measure_pairs的说明,重点是输入参数表。手册里每个算子都有完整参数列表,务必搞清楚每个控制参数的物理意义,比如测量区域的宽和高、边缘阈值、平滑系数。接着看示例代码段,Halcon手册的示例通常会给一个完整的HDevelop程序,能直接跑通。最后再对照算子输出结果调参。

学Halcon算子还有个技巧:在HDevelop里双击算子,可以直接调出参数帮助界面,每个参数都有简短说明和取值范围。配合set_system算子里的一些全局参数设置,很多坑能提前避开。手册的作用是“查”不是“读”,带着问题去查,效率高出好几倍。

4.3 AscendC算子开发认证(中级):想入行算子开发怎么准备

热搜词里有一条“ascend c算子开发能力认证(中级)”,说明这个认证已经有相当多人在关注。它是面向昇腾AI处理器算子开发岗位的专项认证,考察的是对AscendC编程模型的理解和实际开发能力。考试范围包括:AscendC的编程范式、矢量计算指令的使用、核函数编写、内存管理与数据搬运、算子融合与性能优化、以及基本的tiling策略。

准备这个认证,我的建议是别一上来就啃理论文档,先搭好开发环境动手写。从最简单的逐元素算子开始,比如实现一个add算子,跑通kernel编译、上板调试、结果对比的完整流程。然后逐步进阶到需要tiling的算子,比如大矩阵的转置或者卷积。再往后,就是融合算子的实现。整个过程里要反复用profiling工具观察算子的实际运行指标,比如搬运耗时、计算耗时、流水线是否被打断。备考的本质是练熟整个开发闭环,而不是背语法。

这个认证对想进入AI芯片算子开发领域的人是有帮助的,因为它是一个相对标准化的能力证明,能让你在简历上很快被识别出来。但说实话,认证只是入门的敲门砖,真正的算子开发能力还是要靠项目喂出来。

5. 常见问题与排查技巧实录

5.1 算子输出和CPU参考实现对不上,先查这几个地方

这是新手写算子最常遇到的问题:代码逻辑看似正确,结果却不对。我排查这类问题有一个固定顺序,能覆盖大多数情况。

第一步查边界。尤其是图像类算子,边缘像素的处理方式非常容易出错,索引少个1或者多算一行,结果就会出现整行错位的诡异现象。第二步查数据类型。GPU kernel里如果卷积累积用了unsigned char,中间结果会溢出,颜色值直接从255跳回0。第三步查数据排布。CPU上跑的是NCHW还是NHWC,GPU kernel里是不是同一个排布,混了以后数据全乱。第四步查dtype精度。CPU用fp64计算,GPU用fp16跑,误差会被放大,特别是累加类算子要格外小心。第五步查同步。如果kernel之间依赖关系没设对,竞态条件会导致结果时好时坏。

排查工具上,想省时间的做法是写一个自动化diff脚本,让CPU实现和GPU实现读同一份输入数据,逐元素对比输出,超过阈值就打印出错位置和具体值。差多少、差在哪,一眼就能看出来,比肉眼盯代码高效得多。

5.2 算子跑得慢:先看profiling数据,别凭感觉调优

性能优化最忌讳的就是凭感觉。你先要回答一个问题:这个kernel的时间到底花在哪了?用NVIDIA的Nsight Systems或者Nsight Compute这类profiler抓一轮,重点看四个数据:kernel实际耗时、GPU利用率、显存吞吐、计算单元利用率。

如果显存吞吐已经接近硬件理论峰值,但计算利用率很低,说明算子访存密集,优化方向是减少访存次数、提高访存连续性。如果计算利用率很高但kernel还是慢,那可能是分块策略不好导致的计算冗余,或者是寄存器溢出。如果GPU利用率整体很低,可能是并行度不够——线程数太少,塞不满整个GPU,这时候要重新设计每个线程的工作粒度,增加grid尺寸。

这里分享一个真实案例:我之前优化一个LayerNorm算子,第一版比预期慢两倍。profiling一抓发现显存吞吐只有硬件峰值的30%,进一步看发现线程是以行尾对齐方式读取数据的,跨行访问完全不连续,合并访存失效。改成vectorized load之后,吞吐直接冲到80%以上,性能翻了一倍。这就是用数据说话的价值。

5.3 显存溢出和资源限制:不是代码错了,是资源没规划好

写kernel时还会遇到一类报错:launch失败、out of memory、或者编译时报“too many resources requested”。这类问题多半不是逻辑错误,而是资源规划出了问题。

显存溢出,优先检查中间缓存是否分配得太多。大模型场景里,shape很大时临时缓冲会非常占显存,考虑复用已有buffer。launch失败则要看grid和block维度是否超出硬件限制,CUDA里block的线程数不能超过1024,grid各维度也有上限。编译报资源过多,说明每个线程用的寄存器太多,或者是共享内存申请超过SM上限。解决办法是减少每个线程的寄存器用量、缩减block大小,或者把共享内存改成动态分配并按需申请。

还有一个不常被注意的坑:kernel里的同步操作可能造成死锁。比如一个block里的线程调用__syncthreads(),但是有些线程提前return了,这会让同步永远等不到所有线程,程序直接卡死。这类问题排查起来很折磨,最好在写代码阶段就约定:所有线程必须走同一个同步点,不能有条件分支导致部分线程提前退出。

5.4 独家避坑心得:这些年写算子攒下的几条经验

最后分享几条我个人觉得价值最高的实操经验。

第一,永远先写CPU参考实现。它不是浪费时间,而是你的“正确性锚点”。kernel写坏了,有锚点在就永远能找回来。第二,小shape算子的性能瓶颈往往是kernel launch开销,而不是计算本身。一次launch就有微秒级的固定开销,如果算子本身才几微秒,那基本就是launch在拖后腿。这种情况下别想优化kernel内部了,直接考虑算子融合或者持久化kernel,把多个计算任务合并到一次launch里。第三,访存模式是性能的第一决定因素。同一套计算逻辑,数据排布从AoS改成SoA,性能可能差好几倍。优化的第一步永远是让访存连续化、向量化,而不是琢磨指令级技巧。第四,每次改完kernel都要重新跑基准测试,用数字说话。觉得“这段代码应该更快”只是感觉,profiler的曲线图不会骗人。

这几点每一条都是真金白银换来的教训。写算子这件事,入门不难,难的是养成一套科学的开发习惯。

我在实际开发中的体会是,算子这个东西,从数学定义到工程实现,跨度非常大,但底层逻辑始终是“输入、变换、输出”这三件事。搜“算子”时看到的那些看似无关的词,其实都指向同一个知识网络:图像处理用算子提取特征,AI芯片用算子供模型跑推理,编译器用算子做优化自动发现,认证考试在考察你对这个链条的理解深度。搞明白这条线,再去看任何一个具体算子,都能很快定位它在整个计算系统里的位置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 6:59:03

Atlas 300V 24G推理加速卡部署YOLOv5实战:从模型转换到性能调优

前阵子在一个算法交流群里&#xff0c;有人贴了张板卡的照片问&#xff1a;“Atlas 300V 24G 是运算加速卡吗&#xff1f;”底下回复马上分成两派&#xff1a;一派说这就是张显卡&#xff0c;24G大显存&#xff0c;跑模型肯定猛&#xff1b;另一派说你见过没接口的显卡吗&#…

作者头像 李华
网站建设 2026/9/25 6:54:32

Atlas 300V Pro 24G部署YOLO全攻略:从模型转换到性能调优

作为常年跟边缘计算设备打交道的人&#xff0c;这两年被问得最多的硬件之一&#xff0c;就是昇腾系列的Atlas 300V Pro 24G。尤其是最近&#xff0c;社区里关于“Atlas 300V Pro 24G到底是不是运算加速卡”“怎么在这卡上部署YOLO模型”的讨论明显多了起来。很多人第一次接触这…

作者头像 李华
网站建设 2026/9/25 6:54:17

Agent Skills实战指南:与Prompt、Tool、Workflow的区别及手写方法

Agent Skills这个概念在2025年下半年突然刷屏&#xff0c;先是Anthropic放出Skills&#xff0c;紧接着OpenAI正式发布Agent Skills&#xff0c;LangChain也跟进做了开源实现。但说实话&#xff0c;大部分解读还是停留在"又一个大模型新功能"的层面&#xff0c;很少有…

作者头像 李华