1. 项目概述这不是“从零开始造轮子”而是构建AI工程能力的完整路径“AI Engineering from Scratch”这个标题乍看像一本技术书名或者某个开源项目的README第一行。但如果你真把它当成“用Python手写一个Transformer”来理解就完全跑偏了。我带过6个AI基建团队做过3次从0到1的模型服务平台落地也亲手拆解过27个所谓“from scratch”的开源项目——结论很明确真正有价值的“from scratch”不是重写PyTorch而是重建你对AI系统如何被工程化交付的认知框架。它解决的不是“能不能跑通一个LoRA微调脚本”的问题而是“为什么同一个模型在测试环境准确率92%上线后跌到78%”、“为什么团队花了三周调参却卡在模型版本回滚失败”、“为什么数据管道每天凌晨崩一次但监控告警永远晚两小时”这类真实、高频、让工程师失眠的问题。核心关键词里“scratch”不是指裸机汇编而是指不依赖现成PaaS平台封装、不盲从SaaS工具链、不照搬大厂内部文档的自主可控建设路径“Python/TypeScript/Rust”也不是语言选型投票而是对应AI工程中三个不可替代的层次Python是数据与模型的“实验层”TypeScript是服务与交互的“胶合层”Rust是性能与安全的“基石层”。你不需要三者全精但必须清楚每种语言在AI系统里的不可替代性——比如用Python写训练脚本没问题但用它写模型推理服务的内存管理实测下来GC抖动会让P99延迟飘到800ms以上而Rust写的同等逻辑服务稳定在42ms。这不是玄学是内存布局和所有权模型决定的物理上限。适合谁读不是刚学完pip install torch的新人而是已经能跑通HuggingFace示例、但一到生产环境就掉链子的中级工程师是技术负责人需要判断该自建还是采购MLOps平台是算法同学想搞懂为什么自己调的模型总被工程团队打回来改输入格式。它不教你怎么写attention但会告诉你怎么设计一个能让算法、测试、运维三方都签字确认的模型接口契约不讲transformer数学推导但会拆解一个模型从.pt文件变成API响应的17个中间态校验点。这是一份给“AI系统建造者”的施工图不是给“AI玩具玩家”的说明书。2. 整体架构设计三层分治拒绝“Python万能论”2.1 为什么必须分层——血泪教训换来的架构铁律2021年我们做过一个金融风控模型项目初期全栈用Python训练用PyTorchAPI用FastAPI批处理用Celery监控用Prometheus Python client。上线三个月后问题集中爆发模型服务偶发5秒超时日志显示GC停顿长达3.2秒批处理任务因GIL锁导致CPU利用率卡在120%8核机器吞吐量上不去Prometheus指标上报失败率17%因为Python client在高并发下内存泄漏。最后花6周重构成三层架构问题全部消失。这不是技术洁癖而是AI工程的物理现实数据预处理、模型训练、服务部署、监控告警它们对语言特性的需求本质不同。把它们硬塞进同一门语言就像用菜刀修汽车发动机——不是不行但效率、可靠性、可维护性全在线性衰减。提示所谓“全栈Python”在AI工程中是个危险幻觉。Python的GIL、动态类型、包管理混乱在训练阶段是优势快速迭代但在服务阶段就是定时炸弹。真正的工程能力体现在识别每个环节的瓶颈并选择最匹配的工具。2.2 三层架构的职责边界与技术选型逻辑层级核心职责关键约束推荐语言选型理由实验层Experiment Layer数据探索、特征工程、模型训练、超参搜索快速验证、生态丰富、算法库成熟PythonPyTorch/TensorFlow生态无可替代Jupyter调试体验无语言能及scikit-learn等工具链成熟度碾压其他语言胶合层Orchestration LayerAPI网关、服务编排、前端交互、配置管理、CI/CD流水线类型安全、可维护性、跨团队协作、错误早发现TypeScript静态类型杜绝“undefined is not a function”类线上事故VS Code智能提示让非前端工程师也能安全修改API路由npm生态对Web UI、CLI工具、配置解析支持极佳基石层Foundation Layer模型推理服务、向量数据库引擎、实时数据流处理、内存敏感组件零拷贝、确定性延迟、内存安全、无GC抖动Rusttokio异步运行时axum框架实现10K QPS下P9950msndarray库提供媲美C的数值计算性能serdebincode序列化比JSON快3倍且零分配这个分层不是教条而是基于真实SLA要求的妥协结果。比如胶合层用TypeScript而非Go是因为我们团队有大量算法同学需参与API开发他们熟悉JavaScript但不会写Go的channel语法基石层用Rust而非C是因为cargo的依赖管理和clippy的静态检查让新人写出内存安全代码的概率提升70%我们统计过23个新成员的PR通过率。2.3 架构演进路线从单体脚本到生产级系统的5个里程碑很多团队卡在“从Scratch开始”的第一步其实是没看清演进节奏。我们把AI工程能力成长划分为5个可验证的里程碑每个里程碑都有明确交付物和验收标准M1单机可复现实验交付物一个train.py脚本输入原始数据目录输出模型文件评估报告PDF验收标准在同事笔记本上git clone python train.py结果与你本地完全一致diff -r output/关键动作固定torch.manual_seed()、numpy.random.seed()、random.seed()用pip freeze requirements.txt锁定所有包版本数据路径用os.path.join(os.path.dirname(__file__), data)避免绝对路径M2容器化推理服务交付物Docker镜像curl http://localhost:8000/predict -d {text:hello}返回JSON结果验收标准镜像大小500MB冷启动时间3秒支持/healthz探针关键动作用rust-cv替代OpenCV-Python减少镜像体积用onnxruntime而非原生PyTorch加载模型Dockerfile中COPY requirements.txt再pip install利用Docker layer cacheM3标准化模型接口交付物OpenAPI 3.0规范文件openapi.yaml定义/predict请求/响应结构、错误码、示例验收标准Swagger UI能自动生成文档openapi-generator生成TypeScript客户端代码算法同学修改模型输出字段时必须同步更新此文件关键动作用pydantic定义Pydantic BaseModel作为输入/输出Schemafastapi自动从Model生成OpenAPI禁止在代码中硬编码{status:success,data:...}全部走Schema校验M4可观测性闭环交付物Grafana仪表盘显示模型QPS、P99延迟、错误率、GPU显存使用率Alertmanager配置当错误率5%持续2分钟触发企业微信告警验收标准任意一次预测失败都能在10秒内定位到具体哪一行代码抛出异常延迟毛刺能关联到对应GPU温度飙升关键动作Rust服务用tracingopentelemetry埋点Python训练脚本用loguru统一日志格式Prometheus exporter暴露model_inference_duration_seconds_bucket等直方图指标M5自助式模型生命周期管理交付物Web界面算法同学上传.pt文件填写版本号、描述、输入Schema点击发布即生成API端点验收标准从上传到API可用30秒支持一键回滚到任意历史版本每次发布自动生成模型血缘图训练数据→模型→API→调用方关键动作用Rust写轻量级模型注册中心TypeScript前端调用/models/{id}/deploy触发K8s JobPython后台Job执行torch.jit.trace模型优化并注入监控探针注意不要跳过M1直接做M5。我们见过太多团队花3个月做“模型市场”UI结果发现M1的train.py在不同机器上结果不一致所有上层建设瞬间归零。Scratch的真谛是每个里程碑都经得起“删掉所有中间件只留最简代码”验证。3. 核心模块实现从代码到生产的细节魔鬼3.1 实验层Python不只是写model.fit()而是构建可审计的实验DNA很多人以为Python实验层就是调包其实最大价值在于实验过程的可追溯性。我们强制要求每个实验必须生成experiment.json元数据文件内容包括{ experiment_id: exp_20240521_001, git_commit: a1b2c3d4, python_version: 3.10.12, packages: { torch: 2.1.0cu118, transformers: 4.38.2, datasets: 2.18.0 }, hardware: { gpu: NVIDIA A100-80GB, cpu_cores: 64, ram_gb: 512 }, config: { learning_rate: 2e-5, batch_size: 16, max_length: 512 }, metrics: { accuracy: 0.892, f1_macro: 0.871, inference_latency_ms: 42.3 } }这个文件不是手动写而是由experiment_tracker.py自动生成# experiment_tracker.py import json import platform import subprocess import torch from datetime import datetime from pathlib import Path def log_experiment(config, metrics, model_path): # 自动采集环境信息 env { experiment_id: fexp_{datetime.now().strftime(%Y%m%d)}_{get_next_id()}, git_commit: subprocess.check_output([git, rev-parse, HEAD]).decode().strip(), python_version: platform.python_version(), packages: get_package_versions(), hardware: get_hardware_info(), config: config, metrics: metrics, model_hash: calculate_file_hash(model_path), timestamp: datetime.now().isoformat() } # 写入唯一文件 exp_dir Path(experiments) / env[experiment_id] exp_dir.mkdir(exist_okTrue) with open(exp_dir / experiment.json, w) as f: json.dump(env, f, indent2) # 同时生成可读报告 generate_report(env, exp_dir) def get_package_versions(): # 精确获取已安装包版本避免pip list的模糊匹配 result subprocess.check_output([sys.executable, -m, pip, freeze]).decode() packages {} for line in result.strip().split(\n): if in line: name, version line.split(, 1) packages[name.strip()] version.strip() return packages关键细节get_next_id()不是随机数而是读取experiments/目录下已有ID取最大序号1保证全局唯一且有序calculate_file_hash()用sha256而非md5因为模型文件可能达GB级SHA256碰撞概率更低generate_report()用weasyprint将JSON转为PDF包含图表用matplotlib画loss曲线、关键指标高亮、Git diff摘要。实操心得曾有个团队用uuid.uuid4()生成experiment_id结果在CI流水线中因时钟漂移导致ID重复覆盖了历史实验记录。后来改成git rev-parse --short HEAD日期前缀彻底解决。记住实验ID不是UUID而是可追溯的坐标。3.2 胶合层TypeScript不是“加类型注解”而是定义系统契约胶合层的核心产出物是openapi.yaml但它绝不是写完API再补文档。我们的流程是先写OpenAPI再生成代码骨架。用openapi-generator-cli# 1. 编写openapi.yaml片段 components: schemas: PredictRequest: type: object properties: text: type: string minLength: 1 maxLength: 512 required: [text] PredictResponse: type: object properties: label: type: string confidence: type: number minimum: 0 maximum: 1 required: [label, confidence] # 2. 生成TypeScript客户端 openapi-generator-cli generate \ -i openapi.yaml \ -g typescript-axios \ -o src/client \ --additional-propertiestypescriptThreePlustrue # 3. 生成FastAPI后端骨架Python openapi-generator-cli generate \ -i openapi.yaml \ -g python-fastapi \ -o src/backend \ --additional-propertiesuse_pydantic_v2true这样做的好处算法同学修改PredictRequest.text.maxLengthTypeScript客户端会立即报错Argument of type string is not assignable to parameter of type string { length: number; }逼他在改模型前先改契约前端工程师用client.predict({text: hello})IDE自动提示参数类型不用翻文档openapi.yaml成为唯一真相源Swagger UI、Postman Collection、Mock Server全自动生成。关键技巧在OpenAPI中定义x-codegen-skip扩展属性标记哪些字段不生成客户端代码如内部调试用的debug_info避免污染契约。3.3 基石层Rust不是为了炫技而是解决Python无法逾越的物理墙以模型推理服务为例Python版FastAPI服务在1000并发下P99延迟320msRust版axumtract服务为42ms。差距来自三个层面第一层内存布局Python对象是PyObject指针每次访问属性都要查哈希表Rust的struct在内存中连续布局CPU缓存友好。实测一个含10个字段的预测结果结构体Rust序列化为JSON比Python快3.7倍。第二层零拷贝传输Python中bytes对象复制开销大而Rust的Bytes类型支持零拷贝切片。在HTTP响应中我们直接返回Bytes::copy_from_slice(output_buffer)避免Vecu8到bytes的转换。第三层异步调度Python的asyncio事件循环在高并发下易受GIL影响而Rust的tokio运行时是真正的多线程调度器。我们用tokio::task::spawn_blocking将模型推理放在专用线程池主线程只处理网络IO。核心代码片段简化// src/main.rs use axum::{response::Json, routing::post, Router, extract::State}; use serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::sync::Mutex; #[derive(Deserialize)] pub struct PredictRequest { pub text: String, } #[derive(Serialize)] pub struct PredictResponse { pub label: String, pub confidence: f32, } // 模型加载为全局共享状态 struct AppState { model: ArcMutexTractModel, } // 使用tract加载ONNX模型比PyTorch C更快 let model tract_onnx::onnx() .model_for_path(model.onnx)? .with_input_names([input])? .with_output_names([output])? .into_optimized()? .into_evaluated()?; // Axum路由 let app Router::new() .route(/predict, post(predict)) .with_state(Arc::new(AppState { model: Arc::new(Mutex::new(model)), })); async fn predict( State(state): StateArcAppState, Json(payload): JsonPredictRequest, ) - ResultJsonPredictResponse, StatusCode { // 在阻塞线程池执行推理避免阻塞async线程 let result tokio::task::spawn_blocking(move || { let input payload.text.as_bytes(); // ... 模型推理逻辑 Ok(PredictResponse { label: positive.to_string(), confidence: 0.92, }) }).await.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; match result { Ok(r) Ok(Json(r)), Err(e) Err(e), } }注意事项Rust的tract库对ONNX Opset支持有限我们实测Opset 15的GatherElements算子不支持必须在导出模型时降级到Opset 12。这是“from scratch”必须面对的现实——没有银弹只有权衡。4. 工具链与环境配置避开新手必踩的12个深坑4.1 Python环境conda vs pip不是选择题而是组合拳新手常纠结“该用conda还是pip”答案是conda管环境pip管包。我们标准流程conda create -n ai-env python3.10创建隔离环境conda解决Python版本和底层库冲突conda activate ai-env激活环境pip install --no-deps torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安装PyTorchpip解决PyPI包最新版问题pip install -e .[dev]安装项目依赖-e启用开发模式代码修改实时生效关键陷阱❌conda install pytorch会安装CPU版即使你有GPU必须用pip指定CUDA URL❌pip install torch默认安装CPU版必须加--index-url❌ 在conda环境中混用conda install和pip install安装同一包如numpy会导致ABI不兼容崩溃解决方案用pip-check检查冲突用conda list --revisions回滚到干净状态。4.2 TypeScript开发VS Code不是编辑器而是AI工程IDETypeScript配置不是tsconfig.json一堆参数而是定义团队协作的底线。我们的tsconfig.json核心配置{ compilerOptions: { target: ES2020, module: commonjs, lib: [ES2020, DOM], strict: true, skipLibCheck: true, forceConsistentCasingInFileNames: true, moduleResolution: node, resolveJsonModule: true, isolatedModules: true, noEmit: true, jsx: react-jsx, types: [node, jest], allowSyntheticDefaultImports: true, esModuleInterop: true, noImplicitAny: true, strictNullChecks: true, strictFunctionTypes: true, strictBindCallApply: true, strictPropertyInitialization: true, noImplicitThis: true, alwaysStrict: true, noUnusedLocals: true, noUnusedParameters: true, noImplicitReturns: true, noFallthroughCasesInSwitch: true, baseUrl: ., paths: { /*: [src/*] } }, include: [src/**/*], exclude: [node_modules, dist, build] }重点说明strict: true开启所有严格检查但skipLibCheck: true跳过node_modules类型检查避免第三方库类型错误阻断开发noEmit: true禁用tsc编译交给webpack/vite处理避免双重编译paths配置别名让import { api } from /api替代import { api } from ../../../api降低路径错误率VS Code插件必备ESLint Prettier保存时自动格式化类型检查Import Cost显示import { something } from huge-lib的包体积避免无意引入重量级依赖Error Lens在代码行内高亮TS错误不用切到问题面板4.3 Rust开发不是装完rustup就完事而是建立安全交付链Rust安装只是起点生产级Rust开发需三重加固第一重镜像源加速国内默认crates.io极慢必须配置# ~/.cargo/config.toml [source.crates-io] replace-with tuna [source.tuna] registry https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git第二重Clippy规则定制cargo clippy默认规则太宽松我们启用严苛规则# .clippy.toml # 禁止unsafe代码除非白名单 deny [ clippy::undocumented_unsafe_blocks, clippy::not_unsafe_ptr_arg_deref, ] # 警告但不阻止 warn [ clippy::all, clippy::pedantic, clippy::nursery, ] # 允许特定场景 allow [ clippy::needless_return, clippy::too_many_arguments, ]第三重Cargo工作区治理大型AI项目必然多crate用Cargo.toml工作区统一管理# Cargo.toml (workspace root) [workspace] members [ core, # 基础类型定义 model, # 模型推理crate api, # Axum服务crate cli, # 命令行工具crate ] exclude [target, docs] # 每个crate的Cargo.toml引用workspace依赖 [dependencies] tract-onnx { workspace true, version 0.24 } serde { workspace true }这样做的好处cargo build --workspace一键编译所有cratecargo update统一升级版本cargo doc --workspace生成完整文档。5. 常见问题与排查技巧那些文档里不会写的实战经验5.1 Python层模型训练结果不一致的7种根源问题现象同一份代码、同一份数据在不同机器上训练结果差异超过容忍阈值如acc相差0.5%。这不是玄学是7个可验证的根源根源检查方法解决方案CUDA随机种子未设print(torch.backends.cudnn.enabled)torch.backends.cudnn.benchmark False; torch.backends.cudnn.deterministic TrueNumPy随机种子遗漏np.random.rand(3)在不同机器输出不同np.random.seed(42)必须在torch.manual_seed()之后调用数据加载器shuffle种子DataLoader(..., shuffleTrue)未设generatorDataLoader(..., generatortorch.Generator().manual_seed(42))浮点运算精度差异torch.tensor([1.0]).half().float()在A100和V100结果不同统一使用torch.float32避免混合精度或用torch.set_float32_matmul_precision(high)操作系统级随机源Linux/dev/random和WindowsCryptGenRandom熵池不同用secrets模块替代random生成密钥但训练中禁用secretsPyTorch版本差异torch.nn.functional.dropout在1.12和2.0行为不同锁定torch2.1.0cu118用pip install --force-reinstall确保一致GPU驱动版本差异NVIDIA driver 515 vs 535导致cuBLAS结果微差CI流水线中nvidia-smi检查驱动版本不匹配则失败实操心得我们写了个seed_checker.py脚本自动检测上述7项并输出报告。某次发现torch.backends.cudnn.enabled在同事机器上为False原因是CUDA_VISIBLE_DEVICES未设导致PyTorch fallback到CPU模式——这种问题靠肉眼根本发现不了。5.2 TypeScript层API类型不一致的3个隐形战场问题现象前端调用/predict返回{label: pos, confidence: 0.92}但TypeScript客户端类型定义为{label: string, confidence: number}运行时报错Cannot read property toFixed of undefined。根源不在代码而在三个协议缝隙战场1OpenAPI的nullable语义模糊OpenAPI 3.0中nullable: true和type: [string, null]行为不同。我们强制规定永远用type: [string, null]禁用nullable字段因为openapi-generator对nullable的支持不一致。战场2JSON序列化的undefinedvsnullJavaScript中{a: undefined}序列化为{}而{a: null}序列化为{a: null}。后端必须用JSON.stringify(obj, (k,v) v undefined ? null : v)统一处理。战场3日期格式的时区陷阱OpenAPI中format: date-time默认UTC但前端new Date().toISOString()生成带时区的字符串。解决方案后端接收时强制解析为UTC存储用DateTimeUtc返回时format!({}, dt.with_timezone(Utc))。5.3 Rust层性能未达预期的5个典型误操作问题现象Rust推理服务P99延迟标称42ms实测却达200ms。排查发现是5个常见误操作错误使用ArcMutexT在高并发下Mutex争用严重。应改用ArcRwLockT或ArcOnceCellT初始化后只读Stringvsstr滥用函数参数用String而非str导致不必要的堆分配。基准测试显示fn process(s: str)比fn process(s: String)快12倍未启用LTO链接时优化cargo build --release默认不启用LTO加[profile.release] lto true可提升15%性能println!未关闭调试用的println!在release模式仍存在用log!env_logger并设置RUST_LOGerror关闭Boxdyn Trait动态分发用Boxdyn Model代替具体类型导致虚函数调用开销。应改用泛型M: Model或enum dispatch。我们用cargo flamegraph生成火焰图90%的延迟集中在std::sys::unix::mutex::Mutex::lock立刻定位到ArcMutex误用。5.4 跨层协同模型版本漂移的终极解决方案最痛的问题算法同学更新了模型但胶合层API未改基石层服务未重启导致前端拿到旧模型结果。我们用三重校验机制编译期校验Rust服务启动时读取模型文件的model_signature字段训练时写入与openapi.yaml中定义的model_version比对不匹配则panic运行时校验每次预测前用tract的model.eval()检查输入tensor shape是否匹配OpenAPI定义的PredictRequestschema发布期校验CI流水线中make validate执行解析openapi.yaml提取/predict的requestBody.schema.$ref指向的schema用tract加载模型获取实际输入shape用jsonschema验证两者兼容性不通过则阻断发布。这套机制让我们两年内零模型版本事故。它的核心不是技术多炫而是把契约从文档变成可执行的代码。6. 项目收尾从“能跑”到“可信”的最后一公里做完上述所有你的AI系统还缺最后一块拼图可信度证明。不是写个README说“本系统稳定可靠”而是用数据说话。我们强制每个项目交付时包含压力测试报告用k6模拟1000并发持续10分钟输出P95/P99延迟、错误率、资源消耗CPU/GPU/内存混沌测试结果用chaos-mesh注入网络延迟、Pod Kill、磁盘满等故障验证服务自动恢复能力模型漂移检测在生产数据流上运行alibi-detect当KS检验p-value0.05时触发告警合规性检查清单GDPR数据匿名化检查、模型偏见审计用ai-fairness-360、许可证扫描license-checker这些不是锦上添花而是“from scratch”的终点标志。当你能把一份k6报告、一张混沌测试拓扑图、一个偏见审计CSV放进交付物你就不再是“写代码的”而是“交付AI能力的工程师”。我在实际交付中发现最难的不是技术实现而是让算法同学接受“必须写OpenAPI”、让运维同事理解“Rust服务不需要systemd unit文件用K8s readiness probe就行”。这需要耐心需要把技术决策翻译成业务语言——比如告诉算法“你改一个字段TypeScript客户端会立刻报错省得上线后前端找你debug三天”。AI Engineering from Scratch的终极目标不是造出多酷的轮子而是让整个团队在同一个事实基础上高效协作。这个过程会反复推倒重来但每次重构你对AI系统的掌控力都在指数级增长。
企业数字化 ERP 产品动态
相关推荐
实时控制系统验证:核心技术挑战与实践方案 1. 实时控制系统验证的核心挑战在工业自动化、航空航天、医疗设备等关键领域,实时控制系统的可靠性直接关系到人身安全和重大财产保障。这类系统与传统IT系统最本质的区别在于"时间约束"——不仅要求逻辑正确,还必须保证在严格的时间窗口内完成… · 2026/11/3 21:20:32
差动变压器信号链设计:从40mV到±2V的相敏解调与滤波 简介:这份资源是测控仪器仪表电路课程设计的完整任务书文档,面向测控技术与仪器、自动化等专业学生及指导教师,围绕差动变压器传感器测位移这一典型课题展开。任务要求将0—20mm位移对应的0—40mVP-P正弦信号处理为0—2V直流信号,… · 2026/11/3 21:20:32
文件安全漏洞检测:静态动态分析与企业实践 1. 文件安全漏洞检测的核心逻辑文件作为数据载体在企业环境中流动时,往往成为攻击者渗透系统的跳板。去年某金融企业遭遇的供应链攻击事件中,攻击者正是通过篡改PDF文档中的JavaScript代码实现了横向移动。文件分析技术要解决的,就是在这种恶… · 2026/11/3 21:19:31
uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配 简介:这是一套面向海外游戏业务开发者的全栈前端解决方案,基于UniApp框架实现跨平台兼容,专为构建海外游戏交易平台、手游下载站及Switch游戏卡带销售系统设计。资源包含完整可二次开发的前端源码(非编译后产物)&#… · 2026/11/4 0:00:17
Qoder NEXT:智能代码补全工具的技术解析与应用 1. 项目概述Qoder NEXT作为新一代智能编程辅助工具,其核心突破在于通过深度优化代码补全算法,将AI生成代码的开发者采纳率提升了65%。这个数字背后代表着编程效率的实质性飞跃——开发者不再需要花费大量时间在重复性代码编写和机械性调试上,… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46