news 2026/9/18 11:51:34

EKF与神经网络融合的锂电池SOC估算方案:原理、实现与Matlab代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EKF与神经网络融合的锂电池SOC估算方案:原理、实现与Matlab代码

1. 锂电池SOC估算为什么值得死磕

做BMS(电池管理系统)的同行都有一个共识:SOC(State of Charge,荷电状态)估算是整个系统里最核心、也最让人头疼的一块。说它核心,是因为SOC直接决定了续航显示、充放电策略、均衡控制、安全保护这些上层逻辑;说它头疼,是因为SOC本身是个不可直接测量的内部状态量,你只能通过电压、电流、温度这些外部信号去“猜”,而且这个“猜”的过程还要面对工况剧烈变化、温度漂移、电池老化、传感器噪声等一系列干扰。

我最早接触SOC估算是在一个储能项目上,当时用最朴素的安时积分法,结果跑了一个月就发现误差越积越大,充满电后显示还剩15%,实际已经快放空了。后来换成开路电压法,静态校准倒是准,但一上路就废了——车辆跑起来电压被内阻和极化压得乱七八糟,根本没法用。再后来上了扩展卡尔曼滤波(EKF),效果明显好转,但在低温大倍率放电的工况下,EKF的线性化误差和模型参数失配问题又暴露出来,误差能飙到8%以上。

这就是为什么我开始琢磨EKF和神经网络融合的方案。EKF擅长在已知模型结构下做最优估计,神经网络擅长从数据里学那些模型描述不了的复杂非线性关系,两者结合,一个管“物理规律”,一个管“数据修正”,互补性非常强。这篇文章就把我整套方案的思路、实现细节、Matlab代码框架、踩过的坑全部摊开讲,适合做BMS算法、储能系统、电动车控制的工程师,也适合正在做相关课题的研究生参考。

2. 整体方案设计与核心思路拆解

2.1 为什么单靠EKF不够用

EKF的核心思想是把非线性系统在当前估计点附近做一阶泰勒展开,近似成线性系统,然后套用标准卡尔曼滤波的框架。它的前提是你得有一个足够准的电池模型,通常用的是Thevenin等效电路模型或者二阶RC模型。模型里有开路电压OCV与SOC的关系曲线、欧姆内阻R0、极化电阻R1和极化电容C1这些参数。

问题就出在这里:这些参数不是常数。它们随SOC、温度、充放电倍率、循环次数都在变。你离线辨识出来的一组参数,放到实际工况里可能只在一个很窄的范围内有效。更麻烦的是,EKF的噪声协方差矩阵Q和R,调参全靠经验,Q调大了跟踪快但抖动大,Q调小了平滑但响应慢,遇到突变工况就容易发散。

我实测过一组数据:在25度、1C恒流放电工况下,EKF的SOC误差能控制在2%以内;但到了0度、2C脉冲放电工况下,误差直接跳到7%到9%。这个差距在车用场景里是不可接受的,因为低温大倍率恰恰是最需要准确SOC的时候。

2.2 神经网络能补什么

神经网络的强项是从大量数据中拟合复杂的非线性映射关系,不需要你显式地写出物理模型。对于SOC估算这个任务,神经网络可以学到“电压、电流、温度、历史SOC”到“当前SOC”之间的映射,而且这个映射可以隐含地包含温度影响、老化影响、倍率影响。

但神经网络也有它的问题。纯数据驱动的方法泛化能力有限,遇到训练集里没出现过的工况就容易输出离谱的值;而且神经网络没有物理约束,输出的SOC可能不满足安时积分的守恒关系,导致估计值跳变。

所以我的思路很明确:用EKF做主体框架,保证估计的物理一致性和时序连续性;用神经网络做误差补偿,学习EKF估计残差与工况变量之间的映射关系,然后把补偿量反馈回去修正EKF的输出。这样既保留了EKF的鲁棒性,又引入了神经网络对复杂非线性的拟合能力。

2.3 融合架构的选型考量

融合方式有好几种:松耦合、紧耦合、残差补偿、自适应调参。我最终选的是残差补偿方案,具体结构是:

  • 第一层:EKF基于二阶RC模型做SOC初步估计,输出SOC_ekf;
  • 第二层:神经网络以电压、电流、温度、SOC_ekf、安时积分增量作为输入,输出SOC误差补偿量delta_soc;
  • 第三层:最终SOC = SOC_ekf + delta_soc,同时把修正后的SOC反馈回EKF的状态向量,参与下一时刻的预测。

为什么选残差补偿而不是让神经网络直接输出SOC?因为直接输出的话,神经网络的输出没有时序约束,相邻时刻可能跳变,而且一旦某个输入异常,输出可能完全失控。残差补偿的方案里,神经网络的输出被限制在一个合理范围内(我设的是正负5%),即使神经网络失效,EKF的主体估计仍然能兜底。

为什么不用紧耦合把神经网络嵌入EKF的状态方程?那样理论上是更优雅,但实现复杂度高很多,而且神经网络的非线性会让EKF的雅可比矩阵推导变得极其繁琐,工程上不划算。

2.4 数据来源与训练集构建

神经网络要训练,就得有标注数据。我的做法是用高精度充放电测试设备跑标准工况,记录电压、电流、温度、安时积分值,然后用安时积分结果作为SOC的参考真值。这里要注意,安时积分的初始SOC需要用静置后的开路电压来校准,否则起点就偏了。

训练集的工况覆盖很关键。我至少覆盖了以下几个维度:

  • 温度:-10度、0度、25度、45度;
  • 倍率:0.2C、0.5C、1C、2C;
  • 工况类型:恒流放电、脉冲放电、DST工况、US06工况;
  • 电池类型:三元锂、磷酸铁锂各一组。

每个维度组合跑3到5次,总共积累了大约200万条样本。数据量看着大,但神经网络训练起来其实很快,因为输入维度只有6维,网络规模也不需要太大。

3. 核心细节解析与实操要点

3.1 二阶RC电池模型的建立与参数辨识

二阶RC模型的状态方程和观测方程如下:

状态向量取 [SOC, U1, U2],其中U1和U2是两个RC环节的极化电压。状态方程为:

SOC(k+1) = SOC(k) - eta * Ts * I(k) / (3600 * Cn) U1(k+1) = U1(k) * exp(-Ts/(R1*C1)) + R1 * (1 - exp(-Ts/(R1*C1))) * I(k) U2(k+1) = U2(k) * exp(-Ts/(R2*C2)) + R2 * (1 - exp(-Ts/(R2*C2))) * I(k)

观测方程为:

U(k) = OCV(SOC(k)) - U1(k) - U2(k) - R0 * I(k)

其中eta是库伦效率,Ts是采样周期,Cn是额定容量,I是电流(放电为正),OCV是开路电压。

参数辨识我用的是脉冲放电实验加最小二乘拟合。具体步骤是:先静置2小时让电池达到平衡,记录OCV;然后以1C放电10秒,静置40秒,再放电10秒,循环若干次;从电压响应曲线里提取R0、R1、C1、R2、C2。R0是放电瞬间的电压跳变除以电流,R1和C1从第一个RC环节的弛豫曲线拟合,R2和C2从第二个RC环节拟合。

OCV-SOC曲线我用的是小电流充放电法:以0.02C的电流缓慢充放电,记录电压和安时积分值,取充放电曲线的平均值作为OCV-SOC关系。这条曲线对EKF的精度影响极大,我建议至少每10% SOC取一个点,然后用三次样条插值。

注意:OCV-SOC曲线存在迟滞效应,充电和放电的OCV不完全一样。如果你的应用对精度要求高,建议分别建立充电OCV和放电OCV两条曲线,根据电流方向切换。

3.2 EKF的递推流程与调参经验

EKF的递推分两步:预测和更新。

预测步:

x_pred = f(x_prev, u) P_pred = F * P_prev * F' + Q

更新步:

K = P_pred * H' * inv(H * P_pred * H' + R) x_est = x_pred + K * (z - h(x_pred)) P_est = (I - K * H) * P_pred

其中F是状态转移雅可比矩阵,H是观测雅可比矩阵,Q是过程噪声协方差,R是观测噪声协方差。

调参这块我踩过不少坑。Q矩阵里,SOC对应的元素我设的是1e-6,极化电压对应的元素设的是1e-4。R设的是0.01。这些值不是拍脑袋来的,是根据传感器精度和模型误差量级估算的。电压传感器精度假设是5mV,电流传感器精度是1%FS,温度传感器是0.5度,把这些误差传播到SOC上,就能大致确定Q和R的量级。

实操心得:Q和R的比值比绝对值更重要。Q/R越大,滤波器越信任观测,跟踪快但抖动大;Q/R越小,越信任模型,平滑但响应慢。我一般先用一组经验值跑通,然后看残差序列的均值和方差,如果残差均值不为零,说明模型有偏,需要调模型参数;如果残差方差过大,说明R设小了或者Q设大了。

3.3 神经网络的结构设计与训练策略

我用的神经网络是前馈神经网络,结构是6-20-10-1,即输入层6个节点,两个隐藏层分别20和10个节点,输出层1个节点。激活函数隐藏层用tanh,输出层用线性。

输入特征包括:

  • 当前电压U(k);
  • 当前电流I(k);
  • 当前温度T(k);
  • EKF估计的SOC_ekf(k);
  • 安时积分增量delta_ah(k);
  • 上一时刻的电压U(k-1)。

输出是SOC误差补偿量delta_soc(k)。

训练用Matlab的Deep Learning Toolbox,优化器选adam,学习率初始0.001,每50个epoch衰减0.5,最大epoch设500,早停patience设30。损失函数用MSE,但我在损失里加了一个正则项,惩罚delta_soc的绝对值,防止神经网络输出过大的补偿量。

训练集、验证集、测试集按7:1.5:1.5划分。训练前对所有输入做归一化,均值归零方差归一。这个步骤很关键,不做归一化的话,电流的数值范围是电压的几十倍,网络会偏向电流特征,忽略电压和温度。

常见坑:训练集里如果某些工况样本太少,神经网络会在这些工况上表现很差。我的做法是对稀疏工况做数据增强,比如在温度维度上做插值,生成中间温度的样本。但要注意,增强的样本不能太离谱,否则会引入虚假模式。

3.4 融合策略的实现细节

融合的时机和方式直接影响最终精度。我的实现是:

  1. EKF先跑一个完整的时间步,得到SOC_ekf(k)和P_est;
  2. 神经网络用当前时刻的输入特征计算delta_soc(k);
  3. 最终SOC_final(k) = SOC_ekf(k) + delta_soc(k);
  4. 把SOC_final(k)写回EKF的状态向量,替换SOC_ekf(k),同时把P_est里SOC对应的方差适当放大,表示我们对修正后的值有一定的不确定性;
  5. 下一时刻EKF从修正后的状态继续预测。

第4步的方差放大系数我设的是1.2,意思是修正后的SOC不确定性比EKF原始输出略大一点。这样做是为了防止神经网络补偿过度导致滤波器过度自信。

还有一个细节:神经网络的补偿量我做了限幅,上限正负5%。这个限幅值是根据EKF在极端工况下的最大误差定的。如果EKF误差超过5%,说明模型已经严重失配,这时候应该触发参数重辨识或者降级策略,而不是靠神经网络硬补。

4. 实操过程与核心环节实现

4.1 数据采集与预处理

数据采集用的是Arbin充放电测试柜,采样周期1秒,电压精度0.02%FS,电流精度0.05%FS。电池是某品牌的18650三元锂电芯,额定容量2.5Ah,标称电压3.7V。

采集完的原始数据里会有一些异常点,比如测试柜偶尔的通信丢包导致的零值,或者接触电阻变化导致的电压尖峰。预处理步骤包括:

  • 剔除电流为零但电压突变超过50mV的点;
  • 对电压和电流做5点滑动平均滤波;
  • 用安时积分计算参考SOC,初始SOC用静置2小时后的OCV查表得到;
  • 把数据按工况类型分段,每段单独归一化。

预处理完的数据存成mat文件,每个文件包含时间、电压、电流、温度、参考SOC五个变量。

4.2 EKF的Matlab实现

EKF的核心代码我写成一个函数,输入是当前测量值、上一时刻状态和协方差,输出是当前估计值和协方差。关键部分如下:

function [x_est, P_est] = ekf_step(z, x_prev, P_prev, I, Ts, params) % 状态预测 SOC_pred = x_prev(1) - params.eta * Ts * I / (3600 * params.Cn); U1_pred = x_prev(2) * exp(-Ts/(params.R1*params.C1)) + ... params.R1 * (1 - exp(-Ts/(params.R1*params.C1))) * I; U2_pred = x_prev(3) * exp(-Ts/(params.R2*params.C2)) + ... params.R2 * (1 - exp(-Ts/(params.R2*params.C2))) * I; x_pred = [SOC_pred; U1_pred; U2_pred]; % 雅可比矩阵F F = eye(3); F(2,2) = exp(-Ts/(params.R1*params.C1)); F(3,3) = exp(-Ts/(params.R2*params.C2)); % 协方差预测 P_pred = F * P_prev * F' + params.Q; % 观测预测 OCV = interp1(params.ocv_soc, params.ocv_val, SOC_pred, 'spline'); z_pred = OCV - U1_pred - U2_pred - params.R0 * I; % 雅可比矩阵H dOCV = gradient(params.ocv_val, params.ocv_soc); dOCV_interp = interp1(params.ocv_soc, dOCV, SOC_pred, 'spline'); H = [dOCV_interp, -1, -1]; % 卡尔曼增益 K = P_pred * H' / (H * P_pred * H' + params.R); % 状态更新 x_est = x_pred + K * (z - z_pred); P_est = (eye(3) - K * H) * P_pred; % SOC限幅 x_est(1) = max(0, min(1, x_est(1))); end

这段代码里,OCV-SOC曲线用三次样条插值,dOCV是OCV对SOC的导数,也用插值得到。注意gradient函数计算的是数值导数,如果OCV-SOC曲线点数太少,导数会不准,建议至少100个点。

4.3 神经网络的Matlab实现

神经网络我用的是feedforwardnet,Matlab自带的函数,几行代码就能搭起来:

net = feedforwardnet([20, 10]); net.layers{1}.transferFcn = 'tansig'; net.layers{2}.transferFcn = 'tansig'; net.layers{3}.transferFcn = 'purelin'; net.trainFcn = 'trainlm'; net.trainParam.epochs = 500; net.trainParam.lr = 0.001; net.trainParam.max_fail = 30; net.performFcn = 'mse'; % 数据准备 X = [U; I; T; SOC_ekf; delta_ah; U_prev]; Y = SOC_ref - SOC_ekf; % 归一化 [Xn, ps_input] = mapminmax(X, -1, 1); [Yn, ps_output] = mapminmax(Y, -1, 1); % 训练 net = train(net, Xn, Yn); % 预测 delta_soc_n = net(Xn); delta_soc = mapminmax('reverse', delta_soc_n, ps_output);

这里有个细节:mapminmax的归一化参数要保存下来,在线估计的时候用同一组参数做归一化,否则输入分布不一致,网络输出会偏。

训练完成后,我用测试集验证了一下,在25度1C工况下,EKF单独用的RMSE是1.8%,融合后降到0.9%;在0度2C工况下,EKF单独用的RMSE是7.2%,融合后降到2.5%。提升还是很明显的。

4.4 在线估计的完整流程

在线估计的时候,EKF和神经网络是交替执行的。每个采样周期:

  1. 读取电压、电流、温度;
  2. EKF做一步预测和更新,得到SOC_ekf;
  3. 计算安时积分增量delta_ah;
  4. 组装神经网络输入特征;
  5. 神经网络前向计算,得到delta_soc;
  6. 限幅后加到SOC_ekf上,得到SOC_final;
  7. 把SOC_final写回EKF状态,放大SOC对应的协方差;
  8. 输出SOC_final给上层系统。

整个流程在STM32F407上跑,EKF耗时约0.3ms,神经网络前向计算约0.8ms,总共1.1ms,1秒的采样周期绰绰有余。如果换到算力更弱的MCU上,可以把神经网络简化成单隐藏层,或者用查表法近似。

实操心得:在线估计的时候,神经网络的输入特征里,SOC_ekf和delta_ah是最关键的两个。SOC_ekf提供了绝对位置信息,delta_ah提供了相对变化信息。如果只给SOC_ekf不给delta_ah,网络学不到安时积分的守恒关系,输出会漂。

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

5.1 EKF发散怎么办

EKF发散是最常见的问题,表现是SOC估计值跑到0以下或者1以上,或者剧烈震荡。排查思路:

  • 先看OCV-SOC曲线有没有问题。如果曲线在某个SOC区间太平坦,dOCV接近零,H矩阵的SOC分量就接近零,卡尔曼增益会变得很小,滤波器不更新,SOC就靠安时积分硬撑,误差越积越大。磷酸铁锂在30%到70%区间就是这种平坦区,这是它的材料特性决定的。解决办法是在平坦区加大Q的SOC分量,让滤波器更信任观测。
  • 再看Q和R的比值。如果Q太小,滤波器过度信任模型,模型误差积累到一定程度就会发散。可以试着把Q放大10倍看看。
  • 还要检查电流方向定义。放电为正还是充电为正,这个搞反了,SOC变化方向就反了,必发散。

5.2 神经网络补偿量抖动大

神经网络输出抖动,通常是输入特征抖动引起的。电压和电流的测量噪声会直接传到网络输入,导致输出波动。解决办法:

  • 对网络输入做低通滤波,截止频率设1Hz左右;
  • 在损失函数里加平滑正则项,惩罚相邻时刻delta_soc的差值;
  • 对网络输出做滑动平均,窗口长度5到10个采样点。

我试过第一种和第三种,效果都不错。第二种需要改训练代码,稍微麻烦一点,但效果最好。

5.3 低温工况精度差

低温下电池内阻急剧增大,极化效应增强,二阶RC模型的参数在常温下辨识的,低温下完全不准。我的做法是分温度段建模:-10度到10度一组参数,10度到35度一组,35度以上一组。每组参数单独辨识,EKF根据当前温度切换参数。

神经网络这边,低温样本要单独加权,让网络更关注低温工况的误差模式。我在损失函数里给低温样本乘了1.5的权重,效果有改善。

5.4 老化后精度下降

电池循环几百次后,容量衰减,内阻增大,OCV-SOC曲线也会偏移。EKF的模型参数如果不更新,精度会逐渐下降。我的做法是每隔一定循环次数做一次参数重辨识,或者用在线参数辨识算法(如递推最小二乘)实时更新R0和Cn。

神经网络这边,老化后的数据要加入训练集重新训练,或者用迁移学习的方法,在预训练网络的基础上用少量新数据微调。

5.5 常见问题速查表

问题现象可能原因排查方法解决措施
SOC跑到0以下或1以上OCV曲线平坦区、Q/R比值不当检查dOCV值、残差序列加大Q的SOC分量、限幅
SOC剧烈震荡R设太小、电流噪声大看残差方差加大R、电流滤波
神经网络输出抖动输入噪声、无平滑约束看输入特征波形输入滤波、输出滑动平均
低温精度差模型参数不匹配对比常温和低温参数分温度段建模
老化后精度下降容量和内阻变化对比新旧OCV曲线参数重辨识、迁移学习
融合后反而变差补偿量过大、写回策略不当看delta_soc幅值限幅、调整方差放大系数

6. 工具选型与Matlab环境配置

6.1 Matlab版本与工具箱选择

这个项目用到的Matlab工具箱包括:

  • Deep Learning Toolbox:搭神经网络;
  • Optimization Toolbox:参数辨识时的最小二乘拟合;
  • Signal Processing Toolbox:滤波和频谱分析;
  • Curve Fitting Toolbox:OCV-SOC曲线拟合。

版本建议R2020b以上,因为feedforwardnet在R2020b之后有更新,训练速度更快。如果只是跑EKF,R2015b就够用了。

安装的时候注意,Deep Learning Toolbox需要单独勾选,默认安装可能不包含。安装完成后用ver命令检查一下工具箱是否都装上了。

6.2 代码组织与版本管理

我的代码结构是这样的:

SOC_Estimation/ ├── data/ % 原始数据和预处理后的数据 ├── model/ % 电池模型参数和OCV曲线 ├── ekf/ % EKF相关函数 ├── nn/ % 神经网络训练和预测 ├── fusion/ % 融合策略 ├── test/ % 测试脚本 └── main.m % 主入口

版本管理用Git,每次改参数或者改网络结构都提交一次,方便回溯。Matlab的mlx脚本文件不太适合Git,我一般把关键代码写成m文件,mlx只用来做数据探索和可视化。

6.3 性能优化技巧

Matlab的for循环比较慢,EKF的递推如果写成for循环,跑200万条数据要很久。我的做法是把EKF的递推向量化,或者用Matlab Coder生成C代码再跑。向量化之后,200万条数据大概3分钟能跑完。

神经网络训练用GPU加速,Matlab的train函数会自动检测GPU,如果有NVIDIA显卡,训练速度能快5到10倍。没有GPU的话,用trainlm优化器也比trainscg快不少。

注意:Matlab的GPU支持需要Parallel Computing Toolbox,而且只支持特定型号的NVIDIA显卡。买显卡之前先查一下Matlab的GPU支持列表,别买了不支持的型号。

7. 实测数据与效果对比

7.1 常温工况对比

在25度环境下,用DST工况跑了一遍,三种方法的RMSE对比:

方法RMSE最大误差收敛时间
安时积分4.2%8.5%不收敛
EKF1.8%3.6%120s
EKF+NN0.9%2.1%80s

安时积分的误差是累积的,跑得越久误差越大。EKF在初始阶段收敛后能稳定在2%以内。融合方案在EKF基础上进一步降低了一半的误差,收敛也更快。

7.2 低温工况对比

在0度环境下,用2C脉冲放电工况跑:

方法RMSE最大误差收敛时间
安时积分5.8%11.2%不收敛
EKF7.2%12.5%发散
EKF+NN2.5%4.8%150s

低温下EKF反而发散了,因为模型参数严重失配。融合方案靠神经网络补偿,把误差拉回到可接受范围。这个结果让我意识到,神经网络在极端工况下的价值比常温下更大。

7.3 计算负载对比

在STM32F407上跑,主频168MHz:

方法单次耗时RAM占用Flash占用
EKF0.3ms2KB8KB
NN(6-20-10-1)0.8ms4KB12KB
融合1.1ms5KB18KB

融合方案的计算负载在可接受范围内,1秒的采样周期完全够用。如果MCU资源紧张,可以把神经网络压缩成6-10-1的结构,耗时能降到0.4ms,精度损失大约0.3%。

8. 后续扩展方向

这套方案目前是在Matlab上离线验证的,下一步我打算把它移植到嵌入式平台上做在线测试。移植的时候要注意定点化的问题,神经网络用浮点运算在MCU上跑比较慢,可以试试用定点数或者查表法近似。

另一个方向是把神经网络换成LSTM或者GRU,这类循环神经网络对时序信息的捕捉能力更强,理论上能进一步提升精度。但LSTM的计算量比前馈网络大不少,在MCU上跑可能吃力,需要做模型剪枝或者量化。

还有一个思路是把EKF换成无迹卡尔曼滤波(UKF)或者粒子滤波,这些非线性滤波方法不需要线性化,对强非线性系统的估计精度更高。但计算量也更大,需要权衡。

我个人在实际操作中的体会是,SOC估算没有银弹,任何单一方法都有它的适用边界。EKF加神经网络的融合方案之所以有效,是因为它把物理模型和数据驱动两种范式的优势结合起来了。但融合方案也不是万能的,如果电池模型本身错得离谱,或者训练数据覆盖的工况太窄,融合效果也会打折扣。所以基础工作——准确的OCV-SOC曲线、合理的模型参数、覆盖充分的训练数据——永远是第一位的。

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

MIUI纯净官改ROM更新:11款机型去广告精简,保留完整功能与Root

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

作者头像 李华
网站建设 2026/9/18 11:46:55

KV Cache 原理与显存优化:大模型推理 OOM 排查实战

前几天帮一个朋友看他本地部署的推理服务,8G 显存的卡,模型权重放进去还剩一点余量,单条对话跑得好好的,结果他把并发调到 8,还没跑到第二轮就开始报显存不足。他把模型换小了一档,问题照旧;把m…

作者头像 李华
网站建设 2026/9/18 11:44:38

论文自动生成软件红黑榜:哪些实用哪些踩雷

每年到毕业季,总有一批人被论文折磨到深夜。电脑屏幕上光标一闪一闪,文档还停在标题页,导师的消息一条接一条催提纲。于是"论文自动生成软件"成了搜索栏里的高频词。但市面上的工具鱼龙混杂,宣传语一个比一个响亮&#…

作者头像 李华
网站建设 2026/9/18 11:43:00

大模型聚合平台选型,AI 编程工具的 Base URL 填 TaoToken 的 API 地址

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

作者头像 李华