联邦学习基础介绍:用 TaoToken 统一 Key 跑通本地模拟环境
1. 单机模拟联邦学习时多客户端 Key 管理为什么让人头疼如果你刚接触联邦学习大概率会先在一台机器上模拟多个客户端跑通「本地训练 → 上传参数 → 聚合 → 下发」这条链路。这个思路本身没问题但真正动手时很多人会卡在一个看起来不起眼、却极其消耗耐心的环节每个客户端节点都要调用模型服务凭证怎么管。我见过最常见的做法是把同一个 Key 硬编码在每个客户端的启动脚本里。两个客户端还好一旦扩到五个、十个问题就来了。你想换一个模型得挨个改配置文件某个 Key 额度用完了所有节点一起报错更麻烦的是日志里分不清到底是哪个客户端触发了限流。联邦学习本身强调「数据不出本地」结果凭证却在各节点之间复制粘贴这跟它的设计理念是拧着的。联邦学习Federated Learning是一种分布式机器学习技术核心思想是在多个拥有本地数据的数据源之间做分布式训练不交换原始数据只交换模型参数或中间结果从而在隐私保护和联合建模之间取得平衡。按数据分布不同它分为横向联邦、纵向联邦和联邦迁移学习三类。横向联邦按样本切分适合不同地区、同一行业的公司纵向联邦按特征切分适合同地区、不同行业的公司联邦迁移学习则用于用户和特征重叠都很少的场景。在真实生产里这些客户端往往分布在不同的机构、不同的网络环境凭证管理有成熟的方案。但在学习和验证阶段我们是在单机上模拟多客户端这时候如果还用「一个节点一份 Key」的笨办法调试成本会高得离谱。你需要的是一个统一的 API 通道所有模拟客户端共用一套凭证配置通过环境变量注入改一处就全局生效。这篇文章就聚焦这个场景。我会带你用 TaoToken 的统一 Key 跑通一个单机联邦学习模拟环境给出可以直接复制的环境变量和配置文件片段然后启动两轮联邦聚合校验各客户端的 loss 是否正常回传。整个过程不需要你有多卡 GPU一台普通开发机就能跑。适合谁看刚接触联邦学习、想先跑通流程再深入原理的开发者手头有多个模型调用需求、被凭证管理折腾过的同学以及想找一个统一 API 通道来管理多节点模型调用的工程实践者。先说清楚一件事TaoToken 在这里扮演的角色是统一的模型调用通道它不参与联邦学习的聚合逻辑也不接触你的训练数据。它解决的是「多个客户端如何用一套凭证稳定调用模型服务」这个问题。聚合算法、参数交换、loss 计算这些仍然由你自己的联邦学习框架完成。2. TaoToken 统一 Key 在联邦学习模拟环境里的定位与准备在单机模拟联邦学习的场景里每个客户端本质上是一个独立的训练进程。它们各自持有本地数据分片各自做前向传播和反向传播然后把梯度或模型参数交给聚合器。如果你的训练流程里需要调用外部模型服务——比如用大模型做特征提取、做样本增强、或者做联邦场景下的语义对齐——那么每个客户端进程都需要一个可用的 API 凭证。传统做法是给每个客户端配一个 Key。这在单机上模拟时问题不大但一旦你想模拟「客户端动态加入退出」「某个客户端额度耗尽」这些真实场景就会很别扭。TaoToken 的统一 Key 思路是所有客户端共享同一个 API Key通过 Base URL 指向同一个通道模型 ID 按需指定。这样你在配置文件里只需要维护一份凭证客户端数量变化时不用改 Key。先做前置准备。你需要一个 TaoToken 账号然后拿到 API Key。访问 API Keys 页面创建https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite创建后你会得到一串以sk-开头的 Key。把它保存好后面配置环境变量要用。注意不要在代码里硬编码也不要把带 Key 的配置文件提交到 Git。接下来确认你的调用入口。TaoToken 的 API 地址是https://taotoken.net/api这个地址不加 UTM 参数直接作为 Base URL 使用。模型对话相关的调试可以在模型对话页面做https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite如果你后续要做长期的编码类 Agent 任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台入口在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaude Code 相关的接入说明https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite这些链接你先收藏后面配置和排障会用到。现在回到联邦学习模拟环境本身。为什么要在联邦学习里引入统一 Key我举个具体例子。假设你模拟 5 个客户端每个客户端在本地训练时需要调用一个模型服务把本地样本转成 embedding然后再做联邦聚合。如果每个客户端用不同的 Key你会遇到三个问题第一Key 轮换时你要改 5 个地方第二某个 Key 触发限流你很难快速定位是哪个客户端第三你想统计整体调用量得把 5 个 Key 的用量加起来。统一 Key 之后这些问题一次性解决改一处、看一个面板、统计一个口径。这里要强调一个边界TaoToken 是模型调用通道不是联邦学习框架。它不会帮你做参数聚合也不会存储你的梯度。你的联邦学习逻辑——比如 FedAvg 聚合、客户端采样、通信轮次控制——仍然由你自己实现。统一 Key 只是让「多客户端调用模型服务」这件事变得干净。环境准备清单Python 3.9 以上能跑 PyTorch 或 TensorFlow 的开发机CPU 也行模拟环境不需要 GPU一个 TaoToken API Key网络能正常访问 API 地址。如果你用 conda建议单独建一个环境避免依赖冲突。conda create -n fl-sim python3.10 -y conda activate fl-sim pip install torch numpy requestsrequests是用来做 API 调用验证的后面我们会用它发一个测试请求确认 Key 和 Base URL 配置正确。torch 用来做本地训练模拟如果你用 TensorFlow 也可以逻辑一样。3. 可复制的环境变量与配置文件片段这一节是全文最核心的部分。我会给出完整的环境变量设置、JSON 配置文件、以及一个 Python 读取配置的片段。你直接复制就能用只需要把 Key 换成你自己的。先说环境变量。统一 Key 的核心思路是把凭证放在环境变量里所有客户端进程从同一个环境读取。这样你启动多个客户端时不需要给每个进程单独传 Key。在 Linux 或 macOS 下编辑~/.bashrc或~/.zshrc加入export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_MODEL_ID你的模型ID在 Windows 下用 PowerShell 设置用户级环境变量[Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY, sk-你的实际Key, User) [Environment]::SetEnvironmentVariable(TAOTOKEN_BASE_URL, https://taotoken.net/api, User) [Environment]::SetEnvironmentVariable(TAOTOKEN_MODEL_ID, 你的模型ID, User)设置完记得重开终端或者执行source ~/.bashrc让变量生效。验证一下echo $TAOTOKEN_API_KEY echo $TAOTOKEN_BASE_URL如果输出的是你设置的值说明环境变量生效了。注意不要把 Key 打印到日志里上面这个验证命令只是本地确认别写进脚本。接下来是配置文件。我建议用一个 JSON 文件管理联邦学习的模拟参数包括客户端数量、每轮训练轮数、聚合方式、以及模型调用配置。文件名用fl_config.json放在项目根目录。{ federation: { num_clients: 3, num_rounds: 2, clients_per_round: 3, aggregation: fedavg, local_epochs: 1, batch_size: 32, learning_rate: 0.01 }, model_service: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_id_env: TAOTOKEN_MODEL_ID, timeout_seconds: 30, max_retries: 2 }, logging: { level: INFO, log_dir: ./logs, save_client_loss: true } }这个配置里model_service部分不直接写 Key而是写环境变量的名字。这样配置文件可以安全地提交到仓库Key 留在环境变量里。api_key_env和model_id_env分别指向TAOTOKEN_API_KEY和TAOTOKEN_MODEL_ID程序运行时动态读取。如果你更习惯用 TOML等价配置如下文件名fl_config.toml[federation] num_clients 3 num_rounds 2 clients_per_round 3 aggregation fedavg local_epochs 1 batch_size 32 learning_rate 0.01 [model_service] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model_id_env TAOTOKEN_MODEL_ID timeout_seconds 30 max_retries 2 [logging] level INFO log_dir ./logs save_client_loss true两种格式选一种就行。JSON 更通用TOML 可读性更好。下面我用 JSON 版本继续。然后是 Python 读取配置的片段。新建config_loader.pyimport json import os from pathlib import Path def load_config(config_path: str fl_config.json) - dict: path Path(config_path) if not path.exists(): raise FileNotFoundError(f配置文件不存在: {config_path}) with open(path, r, encodingutf-8) as f: config json.load(f) model_cfg config[model_service] api_key os.environ.get(model_cfg[api_key_env]) model_id os.environ.get(model_cfg[model_id_env]) if not api_key: raise EnvironmentError( f环境变量 {model_cfg[api_key_env]} 未设置请先导出 API Key ) if not model_id: raise EnvironmentError( f环境变量 {model_cfg[model_id_env]} 未设置请先导出模型 ID ) model_cfg[api_key] api_key model_cfg[model_id] model_id return config if __name__ __main__: cfg load_config() print(客户端数量:, cfg[federation][num_clients]) print(聚合轮数:, cfg[federation][num_rounds]) print(Base URL:, cfg[model_service][base_url]) print(模型 ID:, cfg[model_service][model_id]) print(API Key 前缀:, cfg[model_service][api_key][:6] ...)这个加载器做了三件事读配置文件、从环境变量取 Key 和模型 ID、做非空校验。如果环境变量没设置它会直接报错而不是等到调用 API 时才失败。这一点很重要联邦学习模拟环境里客户端多早失败早定位。运行一下python config_loader.py预期输出类似客户端数量: 3 聚合轮数: 2 Base URL: https://taotoken.net/api 模型 ID: your-model-id API Key 前缀: sk-abc...到这里统一 Key 的配置部分就完成了。你有了环境变量、配置文件、加载器三件套。接下来所有客户端进程都通过load_config()拿配置Key 只存在于环境变量中配置文件可以安全共享。如果你用的是 Cline MCP 或者 Codex 这类工具配置思路是一样的Base URL 填https://taotoken.net/apiKey 填环境变量里的值Model ID 填你选的模型。三件套缺一不可少任何一个都会在调用时报错。4. 启动两轮联邦聚合并校验各客户端 loss 回传配置就绪后我们来写联邦学习的模拟主流程。这一节的目标很明确启动 3 个模拟客户端跑 2 轮联邦聚合每轮结束后打印各客户端的 loss确认 loss 正常回传且随轮次下降。先写客户端模拟。新建client.pyimport torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset class SimpleModel(nn.Module): def __init__(self, input_dim10, hidden_dim16, output_dim1): super().__init__() self.net nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_dim), ) def forward(self, x): return self.net(x) def train_local(model, data, labels, epochs1, batch_size32, lr0.01): model.train() optimizer optim.SGD(model.parameters(), lrlr) criterion nn.MSELoss() dataset TensorDataset(data, labels) loader DataLoader(dataset, batch_sizebatch_size, shuffleTrue) total_loss 0.0 num_batches 0 for _ in range(epochs): for batch_x, batch_y in loader: optimizer.zero_grad() pred model(batch_x) loss criterion(pred, batch_y) loss.backward() optimizer.step() total_loss loss.item() num_batches 1 avg_loss total_loss / max(num_batches, 1) return avg_loss, model.state_dict()这个客户端做的是最朴素的本地训练一个两层 MLPMSE 损失SGD 优化。每个客户端拿到自己的数据分片训练一个 epoch返回平均 loss 和模型参数。然后是聚合器。新建server.pyimport copy import torch def fedavg_aggregate(client_states, client_sizes): total_size sum(client_sizes) aggregated copy.deepcopy(client_states[0]) for key in aggregated.keys(): aggregated[key] torch.zeros_like(aggregated[key], dtypetorch.float32) for state, size in zip(client_states, client_sizes): weight size / total_size for key in aggregated.keys(): aggregated[key] state[key].float() * weight return aggregatedfedavg_aggregate按各客户端样本量加权平均模型参数。这是 FedAvg 的标准做法权重是客户端样本数占总样本数的比例。主流程main.pyimport copy import random import torch from config_loader import load_config from client import SimpleModel, train_local from server import fedavg_aggregate def generate_client_data(num_clients, samples_per_client200, input_dim10): client_data [] for i in range(num_clients): torch.manual_seed(42 i) data torch.randn(samples_per_client, input_dim) true_w torch.randn(input_dim, 1) labels data true_w 0.1 * torch.randn(samples_per_client, 1) client_data.append((data, labels)) return client_data def main(): cfg load_config() fed_cfg cfg[federation] num_clients fed_cfg[num_clients] num_rounds fed_cfg[num_rounds] client_data generate_client_data(num_clients) global_model SimpleModel() global_state global_model.state_dict() for round_idx in range(1, num_rounds 1): print(f\n 联邦轮次 {round_idx} ) client_states [] client_sizes [] client_losses [] for client_id in range(num_clients): local_model SimpleModel() local_model.load_state_dict(copy.deepcopy(global_state)) data, labels client_data[client_id] loss, state train_local( local_model, data, labels, epochsfed_cfg[local_epochs], batch_sizefed_cfg[batch_size], lrfed_cfg[learning_rate], ) client_states.append(state) client_sizes.append(len(data)) client_losses.append(loss) print(f 客户端 {client_id} 本地 loss: {loss:.6f}) global_state fedavg_aggregate(client_states, client_sizes) avg_loss sum(client_losses) / len(client_losses) print(f 轮次 {round_idx} 平均 loss: {avg_loss:.6f}) print(\n联邦聚合完成全局模型已更新。) if __name__ __main__: main()运行python main.py预期输出类似 联邦轮次 1 客户端 0 本地 loss: 1.234567 客户端 1 本地 loss: 1.198765 客户端 2 本地 loss: 1.256789 轮次 1 平均 loss: 1.230040 联邦轮次 2 客户端 0 本地 loss: 0.987654 客户端 1 本地 loss: 0.965432 客户端 2 本地 loss: 0.998765 轮次 2 平均 loss: 0.983950 联邦聚合完成全局模型已更新。关键验证点有三个。第一每个客户端都打印了 loss说明本地训练正常执行。第二第二轮的平均 loss 低于第一轮说明聚合后的全局模型在变好。第三三个客户端的 loss 量级接近没有某个客户端异常偏离说明数据分片和训练逻辑一致。如果你想让这个模拟更贴近真实联邦学习可以在客户端训练里加入模型服务调用。比如把本地样本通过 TaoToken 的模型服务做一次 embedding 转换再送入本地模型。调用片段如下import requests import os def call_model_service(prompt: str, config: dict) - str: model_cfg config[model_service] url f{model_cfg[base_url]}/v1/chat/completions headers { Authorization: fBearer {model_cfg[api_key]}, Content-Type: application/json, } payload { model: model_cfg[model_id], messages: [{role: user, content: prompt}], temperature: 0.0, } resp requests.post(url, headersheaders, jsonpayload, timeoutmodel_cfg[timeout_seconds]) resp.raise_for_status() return resp.json()[choices][0][message][content]注意这里的base_url是https://taotoken.net/api拼接/v1/chat/completions后就是完整的调用地址。所有客户端共用同一个config也就是共用同一个 Key。这样你在单机上模拟 3 个还是 10 个客户端凭证配置都不用改。验证请求是否成功可以单独跑一个测试脚本from config_loader import load_config from client import call_model_service cfg load_config() result call_model_service(用一句话解释联邦学习, cfg) print(模型返回:, result)如果返回了正常文本说明统一 Key 通道工作正常。如果报错对照下一节的排查清单。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节列出你在配置和运行过程中最可能遇到的几类报错以及对应的排查动作。每一条都来自真实场景不是凭空编的。401 Unauthorized这是最常见的错误意思是凭证没通过校验。可能原因有三个Key 没设置、Key 写错了、Key 前面多了空格或引号。排查步骤先确认环境变量存在。echo [$TAOTOKEN_API_KEY]注意方括号它能帮你看出有没有多余空格。如果输出是[]说明变量为空。如果输出是[sk-xxx ]末尾有空格需要重新导出。然后确认加载器读到的 Key 前缀正确python -c from config_loader import load_config; cload_config(); print(c[model_service][api_key][:8])如果前缀不对检查fl_config.json里的api_key_env是否写成了TAOTOKEN_API_KEY。如果环境变量名写错加载器会报EnvironmentError而不是 401。所以如果你看到的是 401说明 Key 读到了但值不对。还有一种情况Key 被复制时带了换行。用export设置时确保整条命令在一行内。local proxy failed这个报错通常出现在请求发出阶段提示本地代理连接失败。注意这里说的是你本机网络环境里的代理配置不是 TaoToken 的问题。排查步骤检查环境变量里有没有HTTP_PROXY、HTTPS_PROXY、ALL_PROXY。env | grep -i proxy如果有输出说明你的终端设置了代理。在联邦学习模拟环境里如果代理不可用请求就会失败。你可以临时取消这些变量unset HTTP_PROXY HTTPS_PROXY ALL_PROXY然后重新运行测试脚本。如果取消后正常说明问题出在本地代理配置上。注意这里只是排查网络环境不涉及任何绕过网络限制的操作。你的 API 请求应该走正常的网络通道。reading choices 或 KeyError: choices这个报错说明请求返回了但返回结构里没有choices字段。常见原因是模型 ID 写错了或者请求体格式不对。排查步骤先打印完整响应。resp requests.post(url, headersheaders, jsonpayload, timeout30) print(状态码:, resp.status_code) print(响应体:, resp.text)如果状态码是 200 但响应体里是错误信息通常是模型 ID 不存在。检查TAOTOKEN_MODEL_ID是否和你账号下可用的模型一致。可以到模型对话页面确认可用模型列表。如果状态码是 400检查payload里的messages格式。必须是[{role: user, content: ...}]这样的列表不能直接传字符串。还有一种情况base_url末尾多了斜杠拼接后变成https://taotoken.net/api//v1/chat/completions某些服务端会返回非标准响应。确保base_url是https://taotoken.net/api不带末尾斜杠。OAuth 相关报错如果你用的是 Claude Code 或类似的编码工具可能会遇到 OAuth 认证失败。这类工具通常有自己的认证流程和直接调 API 不同。排查步骤确认你用的是 API Key 模式而不是 OAuth 模式。在 Claude Code 的配置里Base URL 填https://taotoken.net/apiKey 填你的sk-开头的 KeyModel ID 填对应模型。三件套齐全后OAuth 相关的报错应该消失。如果工具强制走 OAuth检查是否有配置文件覆盖了你的设置。Claude Code 的接入说明在文档页面有详细步骤对照检查。客户端 loss 不下降这不是报错但属于验证失败。可能原因学习率太大、数据分片有问题、聚合权重算错。排查步骤先把学习率降到 0.001 试试。然后检查每个客户端的样本量是否接近如果某个客户端样本量特别小它的 loss 会波动很大。最后检查fedavg_aggregate里的权重确认是size / total_size不是简单的平均。配置文件读取失败如果load_config()报FileNotFoundError说明fl_config.json不在当前工作目录。用绝对路径或者确认你在项目根目录运行脚本。pwd ls fl_config.json如果文件在但报 JSON 解析错误用python -m json.tool fl_config.json检查格式。环境变量在子进程中丢失如果你用subprocess启动客户端进程环境变量可能不会自动传递。需要在启动时显式传入import os import subprocess env os.environ.copy() subprocess.run([python, client.py], envenv)这样确保子进程能读到TAOTOKEN_API_KEY。排查完这些你的联邦学习模拟环境应该能稳定运行。如果还有问题到接入文档页面找对应章节或者到控制台看调用日志。6. 把统一 Key 用在更接近真实的联邦场景里跑通两轮聚合只是起点。真实联邦学习里客户端会动态加入退出通信轮次可能上百模型服务调用量也会上来。这时候统一 Key 的价值会更明显。你可以做几个扩展实验。第一把客户端数量从 3 增加到 10观察 loss 收敛曲线是否依然平稳。因为所有客户端共用一套凭证你不需要改任何 Key 配置只需要改fl_config.json里的num_clients。第二模拟客户端掉线。在某一轮里跳过某个客户端的训练看聚合器如何处理缺失的客户端。这时候统一 Key 的好处是你不会因为某个客户端的 Key 失效而误判为掉线。第三加入模型服务调用。把本地样本通过 TaoToken 做 embedding再送入本地模型。这样你的联邦学习流程里就有了真实的 API 调用可以观察调用延迟、重试、限流对训练的影响。如果你要做长期的联邦学习实验或者把模拟环境扩展成带 Agent 的自动化流程可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite需要管理多个 Key 或查看调用量到控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite创建和管理 API Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite模型对话调试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewriteClaude Code 接入https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite最后分享一个我踩过的坑。最开始我把 Key 写在fl_config.json里然后不小心提交到了 Git。虽然马上删了但 Key 已经暴露。后来改成环境变量加api_key_env的写法配置文件里只有变量名再也没有这个问题。如果你也在做联邦学习模拟建议一开始就用环境变量别图省事。另一个经验是客户端数量超过 5 个之后日志会变得很难读。建议在logging配置里加上save_client_loss把每个客户端的 loss 单独存文件聚合时再读出来画图。这样你能清楚看到哪个客户端拖了后腿。联邦学习本身不复杂复杂的是工程细节。统一 Key 解决的是凭证管理这一环让你的模拟环境更干净、更可复现。先把这条链路跑通再去研究差分隐私、安全聚合这些进阶话题会顺很多。

相关新闻

Redis能做消息队列吗?三种实现方案与可靠性边界全解析

Redis能做消息队列吗?三种实现方案与可靠性边界全解析

最近在技术群里看到一位朋友吐槽,说某大厂二面被问到一个看起来人畜无害的问题:“Redis 能做消息队列吗?怎么实现?”他条件反射答了一句“能用 List,LPUSH 配 BRPOP”,结果面试官就像连珠炮一样追问&#x…

2026/10/12 9:58:48 阅读更多 →
周志华《机器学习》习题5.5:标准BP与累积BP算法从零实现与对比

周志华《机器学习》习题5.5:标准BP与累积BP算法从零实现与对比

1. 从一道课后习题看BP算法的真正门槛很多人学机器学习,卡在神经网络这一章,不是因为公式看不懂,而是因为看懂了公式却不知道代码怎么写。周志华《机器学习》第五章习题5.5就是这样一个典型:它要求你基于标准BP算法和累积BP算法&a…

2026/10/12 9:58:48 阅读更多 →
Claude Code 源码架构深度解析(二):拆解 Agent Runtime 的 1729 行——queryLoop 与 Streaming Tool Execution 如何驱动 TaoToke

Claude Code 源码架构深度解析(二):拆解 Agent Runtime 的 1729 行——queryLoop 与 Streaming Tool Execution 如何驱动 TaoToke

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

2026/10/12 9:58:48 阅读更多 →

最新新闻

Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

1. 一个被遗忘的注解,为什么还值得聊Required这个注解,如果你是从 Spring Boot 时代入行的,大概率没见过它,甚至在 IDE 里敲出来会发现它上面压着一道醒目的删除线。它属于那种"存在于文档里、消失在代码里"的元老级 AP…

2026/10/12 10:43:37 阅读更多 →
C++实战:课程安排中的约束建模与搜索优化

C++实战:课程安排中的约束建模与搜索优化

1. 从"排课"这个老问题说起:为什么值得用C认真做一遍课程安排这件事,看起来是个教务处的活儿,但真正动手写过的人都知道,它本质上是一个带约束的组合优化问题。每学期开始前,教务老师面对的是几十个班级、上…

2026/10/12 10:43:37 阅读更多 →
电磁场与电磁波教案:时变场与麦克斯韦方程组的课堂推导

电磁场与电磁波教案:时变场与麦克斯韦方程组的课堂推导

简介:面向电子信息类专业《电磁场与电磁波》课程的教案文档,适合高校教师备课、课后复盘及学生自学,内容覆盖法拉第电磁感应定律、位移电流、麦克斯韦方程组及不同介质交界面边界条件等核心知识点,强调积分形式与微分形式的对应转…

2026/10/12 10:43:37 阅读更多 →
Ubuntu 20.04 LTS 服务器安装与初始化配置全攻略

Ubuntu 20.04 LTS 服务器安装与初始化配置全攻略

简介:《Ubuntu 20.04 LTS操作系统安装及初始化配置指南》是一份面向Linux初学者、希望摆脱单一Windows/macOS环境的技术爱好者及开发者的实操文档,内容覆盖从镜像下载、Rufus启动盘制作到BIOS/UEFI启动项调整的完整前置流程,并详细讲解安装引…

2026/10/12 10:43:37 阅读更多 →
[特殊字符]Cursor降智别慌!WindSurf零代码开发MCP Server,五分钟给Claude和AutoGen挂载LightRAG知识库(附TaoToken统一Key配置)

[特殊字符]Cursor降智别慌!WindSurf零代码开发MCP Server,五分钟给Claude和AutoGen挂载LightRAG知识库(附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/12 10:43:37 阅读更多 →
从 Ubuntu 25.10 到 26.04 LTS:一次跨版本升级的完整技术路线图与 TaoToken 配置实践

从 Ubuntu 25.10 到 26.04 LTS:一次跨版本升级的完整技术路线图与 TaoToken 配置实践

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

2026/10/12 10:42:36 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →