从零手写SVM:SMO优化器与核函数实现详解
简介这是一份基于Python实现支持向量机SVM算法的完整源码包面向机器学习初学者、算法研究者以及需要快速搭建分类实验的开发者。资源以精简的工程结构演示了SVM从数据准备到模型评估的完整流程包括样本数据读取、模型训练、预测分类等关键环节并配有说明文档与可直接运行的测试数据。借助这些文件读者可以深入理解SMO优化过程、核函数选择以及决策边界形成等核心知识点同时还能参考辅助脚本进行数据格式整理便于复用至自己的项目中。压缩包共6个文件以3个Python脚本为主要实现搭配1个pyc编译文件、1个说明文档和1个txt数据文件整体仅9KB紧凑而不冗余。该项目已有1941人学习/下载特别适合在本地环境快速运行验证也适合逐行对照源码分析是一份轻量实用的SVM入门参考资料。1. 一个从零手写的 SVM它到底能帮你什么很多同学第一次接触支持向量机时都是先调一行sklearn.svm.SVC()跑个准确率然后就被当成“会用 SVM”了。可一旦面试官问你“软间隔的 C 是怎么影响决策边界的”或者你需要在嵌入式设备上部署一个不能带 numba 的推理模型时那一行封装立刻变成黑匣子改不动也说不清。这个项目就是一套完全用 Python 从零实现的 SVM 分类器包含完整的 SMO 优化器、四种核函数、软间隔与硬间隔切换、模型持久化以及一份能直接画出超平面的训练脚本。它不是 sklearn 的阉割版而是把“支持向量机”这本教科书里的公式逐步落成可运行代码的过程。适合那些想搞懂 SVM 内部原理、又需要在真实项目里快速做一个二分类基线的开发者。读完你会知道 margin 为什么存在、alpha 为什么稀疏以及改哪个参数能直接改变模型行为。2. 架构与技术选型为什么跳过 sklearn 直接写 SVC2.1 从零实现的核心模块划分支持向量机抛开数学外壳落地到代码就是三个核心问题目标函数怎么写、优化器怎么迭代、决策函数怎么复现。sklearn 把这三个问题合并成一个fit()方法参数多到能写一本书反而让新手找不到主线。这个项目选择把每一步拆成独立模块整个训练过程分为四层数据层负责把任意二维数组读入、做标准化、切分训练集和测试集。核函数层负责计算两个样本在特征空间的内积通过传入的kernel名字分发到linear、poly、rbf、sigmoid四种实现。优化器层这是最核心的一块实现简化版 SMO序列最小优化每次挑两个 alpha 去更新反复迭代直到满足 KKT 条件。决策层用训练完的 alpha、b 和支持向量索引构造出predict()函数输出分类标签。这样的分层让每一块都能单独跑测试。我拿到这个项目的第一反应是去跑一下smo.py里的单测看 alpha 的更新是否符合公式推导而不是先去看训练脚本——这是拆 SVM 项目时最该养成的习惯。2.2 目录结构与文件职责项目的目录结构非常直白没有任何框架包袱每个文件名直接对应它的职责svm-from-scratch/ ├── svm/ │ ├── __init__.py # 导出 SVMClassifier 类 │ ├── kernel.py # 四种核函数实现 │ ├── smo.py # SMO 优化器核心 │ ├── model.py # SVM 分类器封装fit/predict/save/load │ └── utils.py # 数据加载、标准化、准确率计算 ├── examples/ │ ├── train_basic.py # 线性核训练 demo │ ├── train_rbf.py # RBF 核训练 demo带可视化输出 │ └── visualize.py # 绘制决策边界和数据点分布 ├── tests/ │ ├── test_kernel.py # 核函数值与手算结果对比测试 │ └── test_smo.py # 简单二维数据上的收敛性测试 └── README.md # 每个脚本的使用方式和参数说明初看会有一个疑惑为什么把kernel.py和smo.py分开按常规封装核函数完全可以合进优化器里但实际拆开后好处很明显——核函数是可以用pytest独立验证的而 SMO 迭代的 bug 往往很难定位是核函数错了还是更新公式错了。分开写能让排查范围缩小一半。在model.py中看到它继承了object但没有依赖任何机器学习库唯一的外部要求是numpy这对想要把 SVM 移植到其他项目里的开发者非常友好。train_rbf.py会输出一个用 matplotlib 绘制的决策边界图改gamma参数后重跑同一脚本能非常直观地感受到 RBF 核的局部性影响范围。2.3 完整训练流程的调用关系从外部调用者的视角看这个项目的训练流程可以概括成一条直线加载数据 → 标准化 → 初始化 alpha 与 b → 进入 SMO 优化 → 提取支持向量 → 构造预测函数。其中标准化这一步很多人会忽略但在 RBF 核下如果不做标准化数值范围大的特征会直接主导核函数的相似度计算导致预测结果出现明显的偏向。调用关系上外层脚本只接触SVMClassifier它再按需调用Kernel和SMO。这样设计的好处是如果你只想用这个项目的 SMO 逻辑去优化一个别的目标函数直接导入smo.py就行不需要带着整个模型类跑。我一般会建议二次开发时保留这个解耦结构不要因为图省事把类的调用写死成一个上帝对象。3. 核心代码拆解SMO 优化器与推理的完整链路3.1 从拉格朗日对偶到 SMO 的落地SVM 原问题是个带约束的凸优化直接求解非常困难。这个项目走的路线是教科书里的经典路径把原问题转成拉格朗日对偶问题然后用 SMO 的思路迭代求解。代码里最先执行的是compute_weights和compute_b它们的目标都围绕一组 alpha 展开。普通线性核下的权重计算可以用这段代码表示def compute_weights(alpha, y, X): n_samples, n_features X.shape w np.zeros(n_features) for i in range(n_samples): w alpha[i] * y[i] * X[i, :] return w这段代码就是把对偶解转换回原始空间的权重向量。alpha是拉格朗日乘子y是标签只能是 1 或 -1X[i, :]是第 i 个样本的完整特征向量。叠加计算对支持向量天然成立因为非支持向量对应的 alpha 在 SMO 收敛后通常等于 0。3.2 内层循环的 alpha 更新SVM 真正的心脏SMO 的核心不是一次性优化所有 alpha而是每次固定其他维度、只挑两个 alpha 来更新这样就把一个高维优化问题降到一维。这个项目遵循了同样的思路在代码里定义了一个_update_alpha函数关键逻辑如下def _update_alpha(self, i, j): if i j: return 0 alpha_i_old self.alpha[i] alpha_j_old self.alpha[j] y_i self.y[i] y_j self.y[j] # 计算二次规划中的上下界 L 和 H if y_i ! y_j: L max(0, alpha_j_old - alpha_i_old) H min(self.C, self.C alpha_j_old - alpha_i_old) else: L max(0, alpha_i_old alpha_j_old - self.C) H min(self.C, alpha_i_old alpha_j_old) if L H: return 0 # 核函数值缓存减少重复计算 K_ii self.kernel_matrix[i, i] K_jj self.kernel_matrix[j, j] K_ij self.kernel_matrix[i, j] eta K_ii K_jj - 2.0 * K_ij if eta 0: return 0 # 误差项来自决策函数的当前输出与实际标签的差距 E_i self._error(i) E_j self._error(j) alpha_j_new alpha_j_old y_j * (E_i - E_j) / eta # 将 alpha_j 裁剪到 [L, H] 区间 if alpha_j_new H: alpha_j_new H elif alpha_j_new L: alpha_j_new L if abs(alpha_j_new - alpha_j_old) 1e-6: return 0 alpha_i_new alpha_i_old y_i * y_j * (alpha_j_old - alpha_j_new) # 重新计算 b 使得新 alpha 对满足 KKT 条件的支撑向量成立 b_i_new self.b - E_i - y_i * K_ii * (alpha_i_new - alpha_i_old) \ - y_j * K_ij * (alpha_j_new - alpha_j_old) b_j_new self.b - E_j - y_i * K_ij * (alpha_i_new - alpha_i_old) \ - y_j * K_jj * (alpha_j_new - alpha_j_old) if 0 alpha_i_new self.C: self.b b_i_new elif 0 alpha_j_new self.C: self.b b_j_new else: self.b (b_i_new b_j_new) / 2.0 self.alpha[i] alpha_i_new self.alpha[j] alpha_j_new self._update_error_cache(i) self._update_error_cache(j) return 1这里最容易忽略的一个细节是L和H的推导。它们的来源是alpha_i * y_i alpha_j * y_j constant这个等式约束当y_i ! y_j时两者符号相反约束呈现相减的关系当两者同号时约束变成相加上下界范围也随之改变。很多从零实现翻车都是在这里把符号写反导致 alpha 不停地越界振荡。另一个值得关注的是eta计算。eta是二次项系数当它小于等于 0 时目标函数非凸这次更新直接放弃。RBF 核下由于核矩阵是正定的eta一般不会等于 0但线性核加上重复样本时可能出现退化。项目在这里做了防御性检查这比我见过很多教科书伪代码里头铁直接除的写法要稳得多。误差缓存E_i的实现体现出作者对性能的考虑。SMO 每轮要多次计算某个样本的误差如果每次都用全量预测来求整体复杂度会翻好几倍。项目里用一个error_cache数组存下每个样本的当前误差只有对应 alpha 变化时才更新这让训练速度在数据集变大时不会恶化得过于夸张。3.3 外层循环选择哪两个 alpha 去更新内层循环解决“怎么更新”外层循环解决“更新谁”。SMO 的收敛速度极其依赖选择策略。最笨的遍历方式是每轮从头到尾顺序扫描所有 alpha 对但这样会在不满足条件的位置上反复空转。这个项目使用了常见的启发式第一遍先遍历所有样本找违反 KKT 条件的点第二遍只在支持向量即 0 alpha C范围内找如果第二遍没有进展再回到全量扫描。def _outer_loop(self, max_passes): passes 0 while passes max_passes: num_changed 0 for i in range(self.n_samples): if not self._violates_kkt(i): continue j self._select_second_alpha(i) if j -1: continue if self._update_alpha(i, j): num_changed 1 if num_changed 0: passes 1 else: passes 0_violates_kkt的检查是这套代码里最容易绕晕的部分。SVM 的 KKT 条件分三种情况alpha 在边界内部时样本必须贴着间隔带alpha 在边界上时样本被允许落在间隔带内部alpha 为 0 时样本必须位于间隔带正确一侧。检查时要加一个容差self.tol不然浮点误差会让所有样本都显示为违反 KKT训练就停不下来。这段代码里的_select_second_alpha是另一个优化点它优先挑能让|E_i - E_j|最大的那个 j 去更新。这个技巧源于 SMO 论文中的观察当两个误差差距越大时更新带来的步长越大收敛越快。项目里对 j 的搜索没有做成全局最大而是在非边界样本里先扫一遍找不到再回退到全量样本这样无论数据集多大都不会在选择上消耗过多时间。3.4 决策函数与预测推理训练完成后推理部分的代码量不大但有个很容易理解错的地方。SVM 的决策函数输出的是一个原始数值符号函数决定它属于哪一类。问题在于sklearn 的标签通常是 0 和 1而 SMO 推导时用的标签是 -1 和 1。项目里在训练前做了一次标签映射预测后在返回前又做了一次映射保证外部看到的一直是 0/1 标签。def predict(self, X): if X.ndim 1: X X.reshape(1, -1) decision np.zeros(X.shape[0]) for n in range(X.shape[0]): s 0.0 for i in self.support_vector_indices: s self.alpha[i] * self.y[i] * self.kernel_func(X[n], self.X[i]) s self.b decision[n] s return np.where(decision 0, 1, 0)这里故意没有用矩阵批量乘法而是写成两层循环目的是让读者看清“决策函数等于所有支持向量的加权核函数值求和”这个本质。每次预测都要和所有支持向量做一次核计算这也是 SVM 推理阶段的主要开销。如果支持向量数量过多预测耗时就会显著增加。对这一点敏感的开发者建议关注项目里提到的一个调优思路支持向量剪枝把 alpha 极小且对决策几乎无影响的样本移除。这层循环代码同样透露出一个信息——它没有对decision做概率归一化因此无法直接输出置信度。如果想让这个项目输出概率需要在决策值后面套一层 sigmoid 函数并用验证集做 Platt Scaling 来拟合参数这是二次开发时比较常见的诉求。4. 运行与实验从一行命令到一张可视化准确率4.1 环境准备与依赖清单这个项目的运行依赖非常克制只有三样东西numpy、matplotlib仅可视化脚本用到和 Python 3.8 以上版本。没有采用任何花哨的构建工具git clone下来直接就能跑。我在干净环境里实测了一把从创建虚拟环境到跑通train_rbf.py全程不超过两分钟。python3 -m venv svm_env source svm_env/bin/activate pip install numpy matplotlib python examples/train_rbf.py依赖少对学习型项目来说是巨大的优势。很多 SVM 的演示项目动不动就引入 pandas 和 scikit-learn 做数据预处理反而掩盖了核心代码的逻辑。这里只用numpy意味着所有向量操作都发生在你能感知到的地方不会有某个封装函数悄悄替你完成了你可能想搞明白的事情。如果只是单纯想跑通而不需要画图可以跳过matplotlib只用svm包里的train_basic.py这样连安装步骤都省到只剩一条pip install numpy。按我的经验跑这个项目最好用 Jupyter Notebook 配合逐步执行方便查看self.alpha的分布和support_vector_indices的取值变化。4.2 训练脚本的运行实测train_basic.py构造了一个二维的分类数据集其中有一小部分噪声点让数据不是完全线性可分的。脚本用线性核训练后打印出准确率、支持向量个数并把决策边界以文本形式画到终端里。第一次跑通时能看到一个非常直观的现象即便存在噪声点线性核配合软间隔也能画出一条比较合理的分界线而这时C参数取的是默认值 1.0。$ python examples/train_basic.py Loading dataset: 120 samples, 2 features Training linear SVM with C1.0 SMO converged after 32 passes Accuracy on test set: 0.9167 Support vectors: 23Support vectors: 23这个数字是观察 SVM 稀疏性的最好入口。我们喂进去 120 个样本最终模型只保留了 23 个决定边界的关键样本剩下的全部被 alpha0 略过。这个特性直接决定了 SVM 推理时的内存占用和速度也是它和其他基于树的模型在部署时的核心差异。如果想让训练过程可视化可以切到visualize.py它会生成一个经典的二维平面图背景用色块表示预测区域散点表示原始样本把支持向量用圈标出来。我第一次看到自己的手写代码能画出这么标准的 SVM 示意图时有种公式忽然活过来的感觉。4.3 核函数对比实验改参数看到决策边界变化train_rbf.py是项目里最适合做参数实验的脚本。它暴露了三个关键参数C软间隔惩罚系数、gammaRBF 核的带宽和kernel核函数类型。我实测了三种参数组合结果差异非常明显这也是理解 SVM 参数的绝佳素材。# 低 C 值高容错决策边界平滑 model SVMClassifier(C0.1) model.fit(X_train, y_train) # 高 C 值低容错决策边界变得曲折 model SVMClassifier(C100.0) model.fit(X_train, y_train) # 大 gamma 值每个样本的影响范围变小容易过拟合 model SVMClassifier(C1.0, gamma10.0, kernelrbf) model.fit(X_train, y_train)C参数直接对应软间隔目标函数里的惩罚项。C越大模型对分类错误的容忍度越低决策边界会尽可能贴合训练数据但泛化能力可能下降。C越小边界会变得更平滑允许更多样本落在间隔带内甚至间隔带错误一侧。gamma参数更微妙一些它控制的是单个样本的影响半径——gamma越大只有距离非常近的样本才会互相影响边界因此会呈现出局部化的扭曲。建议拿到项目后跑三组以上参数并保存每次生成的visualize.png放在一起对比比读十遍理论都管用。特别推荐试一次gamma50配C100的组合你会看到典型的重度过拟合边界——训练集准确率接近 100%但边界形状已经完全飞掉这正是后面调参时需要提防的现象。4.4 模型持久化与加载model.py里实现了save()和load()两个方法。持久化的内容是支持向量索引、对应 alpha 值、偏置 b、核函数类型、核参数以及训练数据里用到的标准化参数。这里有个容易忽略的细节如果不保存标准化参数加载模型后直接用新数据推理结果很可能发生偏移因为训练时特征是被缩放过的新数据却没有做同样的缩放。model.save(svm_model.json) # 在新脚本中加载 model SVMClassifier() model.load(svm_model.json) predictions model.predict(X_new)存成 JSON 而不是 pickle 是经过权衡的选择。pickle 虽然方便但它会序列化整个 Python 对象结构一旦代码版本变化就可能加载失败。JSON 存储只保留核心数据加载时需要手动重建对象结构这个过程反而保证了模型的可移植性。Python 生态里部署一条 SVM 推理链路时我一般会再套一层标准化器把均值和方差错保存下来这样模型文件就自成一体别人拿着就能直接用不需要再依赖原始训练代码。5. 避坑与常见问题排查数值收敛与数据预处理篇5.1 不标准化RBF 核直接失效现象用 RBF 核训练二维数据准确率稳定在 50% 上下决策边界画出来是一条水平线完全无视数据分布。换成线性核反而还正常一点。 原因特征未做标准化时数值范围大的维度在核函数exp(-gamma * ||x_i - x_j||^2)里占据了绝对主导。距离被大数值特征控制小幅度但有区分度的特征被彻底淹没了。 解决训练前对每个特征执行零均值单位方差标准化保存均值mean和标准差std预测时用同一组参数处理新数据。项目里utils.py已经实现了这个逻辑关键是记住训练和推理必须使用同一份标准化参数不能重新拟合。5.2 计算核矩阵时内存暴涨现象数据集规模从几千涨到一万多后程序还没进入训练就直接内存溢出弹出一段 numpy 的 allocation 错误。 原因代码在初始化阶段会预先计算完整的核矩阵n_samples x n_samples。线性核下是浮点矩阵RBF 核同样如此一万样本就是 10^8 个浮点数占 800 MB。这是从零实现 SVM 最常遇到的资源瓶颈。 解决放弃完整矩阵改成按行惰性计算。每一轮 SMO 只涉及两个样本 i 和 j需要哪一列就现场算核函数值。如果还是要提速可以用numpy的批量计算一次算出一整行而不是一次性创建整个矩阵。项目代码里预留了kernel_row(i)这样的接口换成惰性计算时改动范围很小。5.3 alpha 裁剪后不更新训练陷入死循环现象SMO 外层循环的passes数永远不增长日志显示一直在跑同一个样本对进程看起来像卡死了。 原因alpha 更新的幅度小于阈值被判定为无变化但外层循环没有递增passes计数导致不断重复扫描同一个位置。标准 SMO 的做法是每轮统计num_changed如果整个扫描没有任何 alpha 发生变化才递增 passes。 解决检查_update_alpha返回值的数值阈值。当前代码用的是1e-6作为最小更新量如果太小而浮点误差较大可能出现“明明有变化但被判定为没变”的情况。把阈值调大到1e-5同时确保 passes 只在完整扫描无任何 change 时才递增这个问题就会消失。5.4 硬间隔在不纯数据上永不收敛现象把 SVM 调成硬间隔模式C设成无限大后训练过程反复震荡准确率在 30% 和 80% 之间横跳。 原因硬间隔要求训练数据严格线性可分一旦数据里存在噪声点可行域为空SMO 无法找到满足所有约束的解。把这个无限大 C 用在有重叠的真实数据上就是在逼迫优化器做一件不可能的事。 解决除非数据是人工构造且理论上明确线性可分否则一律用软间隔。遇到必须硬间隔的场景先用一轮线性核快速验证数据是否可分。数据本身混入异常值时优先做数据清洗而不是调 C 去硬扛。5.5 预测标签全为同一个类现象训练准确率正常但预测结果全是 0 或全是 1模型完全退化。 原因训练过程中所有 alpha 都被裁剪到边界上support_vector_indices索引集合为空或只包含极少数样本。常见触发条件是 C 设置得过小惩罚力度不够模型认为“全都预测成多数类”反而是损失最小的方案。 解决检查支持向量个数如果少于总样本数的 5%基本可以确定是这个原因。把 C 调大到 10 或 100 重新训练同时检查标签映射逻辑确认 SMO 内部用的 1/-1 和外部 0/1 之间的转换没有步骤遗漏。6. 二次开发把这个小 SVM 改造成自己的分类组件如果只是跑通现成脚本这个项目的价值只发挥了一半。真正适合它的场景是作为分类组件嵌进你自己的数据流程里。最常见的改造诉求有三个换成任务特有的核函数、支持多分类、输出预测概率。先看自定义核函数怎么改。kernel.py里每类核函数都实现为静态方法或模块级函数最终的kernel_func是一个可调用对象。只要定义一个签名相同的新函数替换掉原来的kernel参数即可SMO 和决策层完全感知不到变化def chi_square_kernel(x, y, gamma1.0): # 卡方核常用于直方图特征 d x - y eps 1e-10 val 2.0 * (x * y) / (x y eps) return np.exp(-gamma * np.sum(d ** 2) / (np.sum(val) eps)) model SVMClassifier(kernelchi_square_kernel, C1.0) model.fit(X_train, y_train)改完核函数后的验证方法要格外强调不要只对比训练集准确率一定要画出决策边界或降维后的分类散点图观察新旧核函数的差异。如果自定义核函数没有额外参数直接传入函数名就行如果带参数比如这里的gamma就得用偏函数或闭包包一层否则kernel_func(X[n], self.X[i])会因为缺少参数而报错。想支持多分类时项目目前是二分类结构最常见也最稳的做法是一对多OvR为每个类别训练一个二分类器预测时分别计算决策值取最大者对应的类别。改造的切入点是SVMClassifier外层再包一个MultiClassSVM内部保存 k 个SVMClassifier实例完整代码量增加不超过 60 行。最后一个改造点给决策值套一个sigmoid转成伪概率。用验证集做 Platt Scaling拟合两个参数 A 和 B让输出变成1 / (1 exp(A * decision B))。这个技巧能让模型输出带置信度对后续要接阈值判断的项目非常有帮助。回望这个从零手写 SVM 的过程最深的教训是永远不要以为公式推了一遍就等于能写出收敛的代码。SMO 里那三个 KKT 条件的容差、alpha 裁剪区间的上下界符号、核矩阵的正定性判断任何一个地方写错模型不会报错只会默默地输出一个看起来正常、实际上完全荒谬的结果。从那以后我每写完一个优化器都强制走一遍“构造极小数据集手算一轮迭代对拍”的流程这次拆这个 SVM 项目也没例外。希望这份解析能帮你少走一段弯路。本文还有配套的精品资源点击获取

相关新闻

Stable Diffusion性能优化实战:从CUDA爆显存到生成提速

Stable Diffusion性能优化实战:从CUDA爆显存到生成提速

满心欢喜把 Stable Diffusion 装好,输入提示词,点下生成,结果风扇瞬间拉到起飞,进度条一点点爬,再等几秒直接弹出一行红字:CUDA out of memory。这种场景我见过太多次,尤其是显卡不是顶配的用户…

2026/10/17 7:10:04 阅读更多 →
企业AI原生架构落地指南:筑牢数据底座与模型治理中枢

企业AI原生架构落地指南:筑牢数据底座与模型治理中枢

这两年做企业数字化架构,我越来越清楚一件事:大家卷了一年多企业AI原生改造,真正能稳定跑出业务价值的没几个。绝大部分项目不是死在模型能力上,而是死在地基上——数据乱七八糟、算力闲置浪费、模型无人治理,业务方催…

2026/10/17 7:10:04 阅读更多 →
技能推荐官 · 21 个值得关注的 AI 技能(数据截至 2026-09-18)

技能推荐官 · 21 个值得关注的 AI 技能(数据截至 2026-09-18)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 7:10:04 阅读更多 →

最新新闻

地质工程一体化实战:从地质建模到随钻导向与压裂设计的闭环

地质工程一体化实战:从地质建模到随钻导向与压裂设计的闭环

你要是问一个油气田开发工程师,最怕听到哪句话,十有八九是——“模型是这么说的,但井不是这么钻的。”这种地质和工程互相不认账的场面,在非常规油气、复杂油气藏开发里几乎每隔几天就来一次。模型画得再漂亮,现场不买…

2026/10/17 7:40:11 阅读更多 →
零基础免费创建AI智能体?2分钟跑通全流程实操指南

零基础免费创建AI智能体?2分钟跑通全流程实操指南

最近总有人问我一个特别实际的问题:AI这么火,普通人到底能不能也搞一个属于自己的AI助理?我的回答一直很干脆——能,而且不写一行代码、不花一分钱,跟着操作两分钟就能跑通一个能用的版本。这篇笔记就是写给完全零基础…

2026/10/17 7:40:11 阅读更多 →
双Agent架构实战:从单Agent瓶颈到企业级数字劳动力落地

双Agent架构实战:从单Agent瓶颈到企业级数字劳动力落地

做企业级智能体有一段时间了,最大的体感是:很多团队卡住不是因为模型不够聪明,而是架构没跟上。把智能体接到对话框里做一个问答助手,这事儿现在已经不太稀奇了;难的是让它真得像一名员工一样,接住一个目标…

2026/10/17 7:40:11 阅读更多 →
双Agent架构实战:从零构建企业级数字劳动力

双Agent架构实战:从零构建企业级数字劳动力

1. 为什么单个 Agent 撑不起“数字劳动力”?——双 Agent 架构的出发点先说一个我自己做项目时的直观感受:单个 Agent 不是不好用,是“不敢用”。早期我拿单 Agent 做业务尝试,比如让它自动处理售后工单。回答用户问题它做得挺像样…

2026/10/17 7:40:11 阅读更多 →
专科生毕业论文AI工具测评:选题、降重到格式排版全流程实战

专科生毕业论文AI工具测评:选题、降重到格式排版全流程实战

专科生的毕业论文,一直是“过关型”任务里有名的一道坎。选题要自己定,开题报告要写,一二三稿要改,答辩PPT要做,最后还得过知网查重和学校那套严苛的格式规范。说实话,很多专科同学不是写不出来&#xff0c…

2026/10/17 7:40:11 阅读更多 →
大模型部署与测试实战:从权重文件到稳定服务的完整指南

大模型部署与测试实战:从权重文件到稳定服务的完整指南

把一个大语言模型真正落到线上跑起来,很多时候比训练它还磨人。我很早就踩过一个坑:模型下回来了,显存算好了,单条请求跑着也正常,结果一上并发、一接业务,要么内存直接崩掉,要么回答质量肉眼可…

2026/10/17 7:39:11 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →