<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ML平台开发日志</title><link>https://JayWillow0.github.io/ml-dev/</link><description>Recent content on ML平台开发日志</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://JayWillow0.github.io/ml-dev/index.xml" rel="self" type="application/rss+xml"/><item><title>引言：为什么敢碰全栈开发</title><link>https://JayWillow0.github.io/ml-dev/docs/01-intro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/01-intro/</guid><description>&lt;h2 id="一个电化学工程师为什么敢碰全栈开发"&gt;一个电化学工程师，为什么敢碰全栈开发？&lt;a class="anchor" href="#%e4%b8%80%e4%b8%aa%e7%94%b5%e5%8c%96%e5%ad%a6%e5%b7%a5%e7%a8%8b%e5%b8%88%e4%b8%ba%e4%bb%80%e4%b9%88%e6%95%a2%e7%a2%b0%e5%85%a8%e6%a0%88%e5%bc%80%e5%8f%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我是一名做电池电化学仿真的工程师，日常工作是 COMSOL 建模和电池智能设计与优化、寿命预测算法。Python 和 scikit-learn 我比较熟悉，但 &lt;strong&gt;Django 是什么？HTML 怎么写？前端和后端怎么通信？Celery 怎么配？&lt;/strong&gt; 这些我统统不知道。&lt;/p&gt;
&lt;p&gt;但我有一个明确的需求：&lt;strong&gt;我想做一个网页平台，让我和团队可以上传实验数据，自动跑机器学习模型，保存训练结果，还能在线预测。&lt;/strong&gt; 不需要找前端，不需要找后端，就我一个人，加上 AI。&lt;/p&gt;
&lt;p&gt;这就是 &lt;strong&gt;Vibe Coding&lt;/strong&gt;——你不需要会所有的技术，你需要的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;清楚地知道自己要什么&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会用自然语言把需求拆解给 AI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能判断 AI 给出的方案是否合理&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;&lt;strong&gt;这篇文章的重点不是代码&lt;/strong&gt;，而是我和 AI 之间的每一轮对话是如何设计的——提示词怎么写、AI 建议了什么、我做了哪些调整、踩了哪些坑。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id="ml-平台概览"&gt;ML 平台概览&lt;a class="anchor" href="#ml-%e5%b9%b3%e5%8f%b0%e6%a6%82%e8%a7%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我要做的平台叫 &lt;strong&gt;ML计算平台&lt;/strong&gt;，核心工作流 7 步：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户登录 → 上传数据 → 选择特征和标签 → 选择学习类型 → 训练+调参 → 保存模型 → 在线预测&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="最终技术栈"&gt;最终技术栈&lt;a class="anchor" href="#%e6%9c%80%e7%bb%88%e6%8a%80%e6%9c%af%e6%a0%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;技术&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;前端&lt;/td&gt;
					&lt;td&gt;Bootstrap 3.4.1 + jQuery 3.6.0 + ECharts 5.x&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;后端&lt;/td&gt;
					&lt;td&gt;Django 3.2.9（Template + JsonResponse API）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;异步&lt;/td&gt;
					&lt;td&gt;Celery + SQLite broker（Windows solo pool）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据库&lt;/td&gt;
					&lt;td&gt;MySQL 5.7.31&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ML&lt;/td&gt;
					&lt;td&gt;scikit-learn + lazypredict + Optuna + pandas + numpy&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="开发周期"&gt;开发周期&lt;a class="anchor" href="#%e5%bc%80%e5%8f%91%e5%91%a8%e6%9c%9f"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;我从零开始搭建这个平台用了大约 &lt;strong&gt;4 天&lt;/strong&gt;（不包含前期 2 周学习 Django/MySQL/JS 基础的时间）。如果纯靠自己，这个时间可能是 2-3 个月，而且大概率中途放弃。&lt;/p&gt;</description></item><item><title>前端 + 后端 + 数据库速通</title><link>https://JayWillow0.github.io/ml-dev/docs/02-basics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/02-basics/</guid><description>&lt;p&gt;在正式开发之前，我&lt;strong&gt;花了 2 周的时间补前端和 Django 的基础知识&lt;/strong&gt;。以下是精炼后的核心要点。&lt;/p&gt;
&lt;h2 id="前端三件套你需要理解到什么程度"&gt;前端三件套：你需要理解到什么程度？&lt;a class="anchor" href="#%e5%89%8d%e7%ab%af%e4%b8%89%e4%bb%b6%e5%a5%97%e4%bd%a0%e9%9c%80%e8%a6%81%e7%90%86%e8%a7%a3%e5%88%b0%e4%bb%80%e4%b9%88%e7%a8%8b%e5%ba%a6"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;技术&lt;/th&gt;
					&lt;th&gt;你需要会的&lt;/th&gt;
					&lt;th&gt;不需要会的&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;标签结构（&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;）、表单提交&lt;/td&gt;
					&lt;td&gt;CSS 动画、复杂布局&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Bootstrap 栅格系统（&lt;code&gt;col-md-6&lt;/code&gt;）、按钮样式&lt;/td&gt;
					&lt;td&gt;手写响应式、Sass&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jQuery 的 &lt;code&gt;$.ajax&lt;/code&gt; 发请求、DOM 操作（&lt;code&gt;$('#id')&lt;/code&gt;）&lt;/td&gt;
					&lt;td&gt;原生 JS 闭包、原型链&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint tip'&gt;
&lt;p&gt;&lt;strong&gt;关键认知&lt;/strong&gt;：你不需要&amp;quot;学会前端&amp;quot;，你需要的是 &lt;strong&gt;能读懂 Bootstrap 模板并改文字&lt;/strong&gt;。真实项目中，我 95% 的 HTML 是 AI 写的，我只负责检查。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id="django-核心概念速通"&gt;Django 核心概念速通&lt;a class="anchor" href="#django-%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5%e9%80%9f%e9%80%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Django 的开发流程可以浓缩为一句话：&lt;strong&gt;定义 Model → 写 View → 配 URL → 填 Template&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;概念&lt;/th&gt;
					&lt;th&gt;类比&lt;/th&gt;
					&lt;th&gt;核心要点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Models&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;数据库表的定义&lt;/td&gt;
					&lt;td&gt;用 Python 类定义字段，&lt;code&gt;makemigrations&lt;/code&gt; + &lt;code&gt;migrate&lt;/code&gt; 两步建表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Views&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;后端业务逻辑&lt;/td&gt;
					&lt;td&gt;接收请求、操作数据库、返回响应（HTML 或 JSON）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;URLs&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;路由表&lt;/td&gt;
					&lt;td&gt;把 URL 路径映射到 View 函数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;HTML 模板&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;{% extends 'layout.html' %}&lt;/code&gt; 继承基模板，&lt;code&gt;{% block content %}&lt;/code&gt; 填内容&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="我踩的坑"&gt;我踩的坑&lt;a class="anchor" href="#%e6%88%91%e8%b8%a9%e7%9a%84%e5%9d%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint warning'&gt;
&lt;p&gt;&lt;strong&gt;App 注册&lt;/strong&gt;：创建 APP 后必须在 &lt;code&gt;settings.py&lt;/code&gt; 的 &lt;code&gt;INSTALLED_APPS&lt;/code&gt; 中注册，否则 &lt;code&gt;makemigrations&lt;/code&gt; 不会生成迁移文件。&lt;/p&gt;</description></item><item><title>架构构思与第一次提示词设计</title><link>https://JayWillow0.github.io/ml-dev/docs/03-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/03-architecture/</guid><description>&lt;h2 id="我的想法"&gt;我的想法&lt;a class="anchor" href="#%e6%88%91%e7%9a%84%e6%83%b3%e6%b3%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我要做的平台叫 &lt;strong&gt;ML计算平台&lt;/strong&gt;，核心功能是 7 步：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户登录 → 上传数据 → 选择特征和标签 → 选择学习类型 → 训练+调参 → 保存模型 → 在线预测&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我非常清楚机器学习做监督学习和非监督学习的工作流（尤其基于 scikit-learn 框架），但我的同事大多没有这方面的基础。因此方案需要从新手用户角度出发，尽可能避免用户做复杂的数据处理、特征工程、模型选择和模型调参工作。&lt;/p&gt;
&lt;h2 id="第一次提示词告诉-ai-我要什么"&gt;第一次提示词——告诉 AI &amp;ldquo;我要什么&amp;rdquo;&lt;a class="anchor" href="#%e7%ac%ac%e4%b8%80%e6%ac%a1%e6%8f%90%e7%a4%ba%e8%af%8d%e5%91%8a%e8%af%89-ai-%e6%88%91%e8%a6%81%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我花了&lt;strong&gt;大概 1 天的时间&lt;/strong&gt;写这段提示词（精简版）：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;我想开发一个具备登录认证、数据永久存储的机器学习算法平台，功能包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户导入 CSV/XLSX 数据&lt;/li&gt;
&lt;li&gt;用户选择特征和标签&lt;/li&gt;
&lt;li&gt;监督学习（回归/分类）走相关性分析 + lazypredict + optuna 调参；非监督学习走聚类&lt;/li&gt;
&lt;li&gt;模型保存、新数据预测、结果导出&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;前端用 HTML + Bootstrap + JavaScript，后端 Django，数据存 MySQL。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请先只实现 ML 算法部分（不涉及前端和 Django），集成到 ml_utils.py 中，方便后续导入 Django。&lt;/strong&gt; 我的环境是 Python 3.11.7、Django 3.2.9、scikit-learn 1.9.0、optuna 4.9.0。&lt;/p&gt;
&lt;/blockquote&gt;&lt;h3 id="为什么这么写"&gt;为什么这么写？&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%99%e4%b9%88%e5%86%99"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先限定范围&lt;/strong&gt;——&amp;ldquo;先不做前端&amp;quot;避免 AI 一次输出几千行代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;给出具体包名和版本&lt;/strong&gt;——避免 AI 用了不兼容的 API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;说清楚集成方式&lt;/strong&gt;——&amp;ldquo;集成到 ml_utils.py&amp;quot;让 AI 知道模块化要求&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="ai-的建议哪些我直接用了哪些我调整了"&gt;AI 的建议：哪些我直接用了，哪些我调整了&lt;a class="anchor" href="#ai-%e7%9a%84%e5%bb%ba%e8%ae%ae%e5%93%aa%e4%ba%9b%e6%88%91%e7%9b%b4%e6%8e%a5%e7%94%a8%e4%ba%86%e5%93%aa%e4%ba%9b%e6%88%91%e8%b0%83%e6%95%b4%e4%ba%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="book-tabs" &gt;

&lt;input type="radio" class="toggle" name="tabs-2" id="tabs-2-0" checked="checked" /&gt;&lt;label for="tabs-2-0"&gt;✅ 直接采用的&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;8 个类的模块化设计&lt;/strong&gt;：&lt;code&gt;DataImporter&lt;/code&gt;、&lt;code&gt;DataPreprocessor&lt;/code&gt;、&lt;code&gt;FeatureSelector&lt;/code&gt;、&lt;code&gt;SupervisedTrainer&lt;/code&gt;、&lt;code&gt;UnsupervisedTrainer&lt;/code&gt;、&lt;code&gt;ModelTuner&lt;/code&gt;、&lt;code&gt;ModelManager&lt;/code&gt;、&lt;code&gt;MLPipeline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lazypredict 批量训练 30+ 模型&lt;/strong&gt; + Optuna 自动调参的组合方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MLPipeline&lt;/code&gt; 作为编排器&lt;/strong&gt;统一调用其他类&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;91 项单元测试全部通过。&lt;/p&gt;</description></item><item><title>从不会 Django 到跑通第一个页面</title><link>https://JayWillow0.github.io/ml-dev/docs/04-django/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/04-django/</guid><description>&lt;h2 id="技术盲区"&gt;技术盲区&lt;a class="anchor" href="#%e6%8a%80%e6%9c%af%e7%9b%b2%e5%8c%ba"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ML 模块测试通过后（91/91），我需要把它融入 Django。问题是我的 Django 仅粗略地学习了两周。核心困惑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django 的 View 怎么和前端通信？&lt;/li&gt;
&lt;li&gt;前端怎么拿到训练结果并渲染图表？&lt;/li&gt;
&lt;li&gt;用户上传的文件怎么处理？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我的提示词把-ml-和-django-连接起来"&gt;我的提示词——把 ML 和 Django 连接起来&lt;a class="anchor" href="#%e6%88%91%e7%9a%84%e6%8f%90%e7%a4%ba%e8%af%8d%e6%8a%8a-ml-%e5%92%8c-django-%e8%bf%9e%e6%8e%a5%e8%b5%b7%e6%9d%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;接下来开发第二部分。前端使用纯 Django Template（HTML + jQuery/Bootstrap），要方便预留 Celery 异步处理节点。&lt;/p&gt;
&lt;p&gt;请将 ml_utils.py 融入 Django 架构，前端界面要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据管理：上传 CSV → 后台存入 Media → 前端展示前 5 行预览&lt;/li&gt;
&lt;li&gt;特征配置：多选框选特征和目标，选择填充策略&lt;/li&gt;
&lt;li&gt;模型看板：ECharts 渲染多模型对比柱状图、热力图&lt;/li&gt;
&lt;li&gt;在线预测：上传新数据 → 加载模型 → 预测 → 下载 CSV&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：View 返回 JsonResponse，用 jQuery AJAX 异步获取并渲染。MySQL 仅保存相对路径。&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;&lt;strong&gt;为什么强调&amp;quot;JsonResponse + AJAX&amp;quot;？&lt;/strong&gt; 传统做法是 View 直接 &lt;code&gt;render(request, 'xxx.html', context)&lt;/code&gt; 把数据塞进模板。但这不适合图表交互——ECharts 需要在前端 JS 中动态获取数据。所以我让 AI 用 &lt;strong&gt;API 分离模式&lt;/strong&gt;：页面 View 只渲染空 HTML 壳子，数据通过 &lt;code&gt;/api/&lt;/code&gt; 接口返回 JSON，前端 jQuery 获取后渲染。&lt;/p&gt;</description></item><item><title>数据处理模块的提示词设计</title><link>https://JayWillow0.github.io/ml-dev/docs/05-data-processing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/05-data-processing/</guid><description>&lt;h2 id="让-ai-理解我要清洗-csv做-one-hot-编码"&gt;让 AI 理解&amp;quot;我要清洗 CSV，做 one-hot 编码&amp;quot;&lt;a class="anchor" href="#%e8%ae%a9-ai-%e7%90%86%e8%a7%a3%e6%88%91%e8%a6%81%e6%b8%85%e6%b4%97-csv%e5%81%9a-one-hot-%e7%bc%96%e7%a0%81"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ML 的数据预处理包含很多步骤：缺失值填充、分类变量编码、数值缩放。这些步骤有先后依赖关系。我的提示词：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;数据配置面板应该有模型参数的配置，比如训练集测试集比例、optuna 优化参数等。ml_utils.py 中可以设置的参数都应该让用户可以修改且有默认值。&lt;/p&gt;
&lt;/blockquote&gt;&lt;h3 id="ai-的实现方案"&gt;AI 的实现方案&lt;a class="anchor" href="#ai-%e7%9a%84%e5%ae%9e%e7%8e%b0%e6%96%b9%e6%a1%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI 不是简单地把所有参数暴露到前端，而是 &lt;strong&gt;按训练模式分组&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="book-tabs" &gt;

&lt;input type="radio" class="toggle" name="tabs-2" id="tabs-2-0" checked="checked" /&gt;&lt;label for="tabs-2-0"&gt;监督学习参数&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;ul&gt;
&lt;li&gt;测试集比例（默认 0.2）&lt;/li&gt;
&lt;li&gt;特征选择方法（F 检验 / 互信息）&lt;/li&gt;
&lt;li&gt;p 值阈值（默认 0.05）&lt;/li&gt;
&lt;li&gt;Optuna 试验次数（默认 10）&lt;/li&gt;
&lt;li&gt;交叉验证折数（默认 3）&lt;/li&gt;
&lt;li&gt;随机种子&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;input type="radio" class="toggle" name="tabs-2" id="tabs-2-1" /&gt;&lt;label for="tabs-2-1"&gt;无监督学习参数&lt;/label&gt;&lt;div class="book-tabs-content markdown-inner"&gt;
&lt;ul&gt;
&lt;li&gt;聚类数 K&lt;/li&gt;
&lt;li&gt;K 搜索范围（如 2-10）&lt;/li&gt;
&lt;li&gt;是否降维&lt;/li&gt;
&lt;li&gt;随机种子&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;p&gt;切换训练模式时，前端 JS 动态显示/隐藏对应参数面板。&lt;/p&gt;
&lt;h3 id="我的调整一键全选特征"&gt;我的调整：一键全选特征&lt;a class="anchor" href="#%e6%88%91%e7%9a%84%e8%b0%83%e6%95%b4%e4%b8%80%e9%94%ae%e5%85%a8%e9%80%89%e7%89%b9%e5%be%81"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;原始设计中用户要逐个点击列名选特征，20 列数据要点 20 次。我额外要求：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;选择特征时增加一个选项，可以一键选择所有特征&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;AI 在列标题下方加了&amp;quot;全选特征&amp;quot;和&amp;quot;取消全选&amp;quot;两个按钮，全选时自动排除已选为目标列的那一列。&lt;/p&gt;
&lt;h2 id="关于特征重要性图的困惑"&gt;关于特征重要性图的困惑&lt;a class="anchor" href="#%e5%85%b3%e4%ba%8e%e7%89%b9%e5%be%81%e9%87%8d%e8%a6%81%e6%80%a7%e5%9b%be%e7%9a%84%e5%9b%b0%e6%83%91"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;训练完成后，有些数据集有特征重要性图，有些没有。我的提问：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;为什么有的数据集没有特征重要性分析图？&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;AI 的解释非常清晰：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;最佳模型&lt;/th&gt;
					&lt;th&gt;有特征重要性？&lt;/th&gt;
					&lt;th&gt;原因&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;RandomForest / DecisionTree 等&lt;/td&gt;
					&lt;td&gt;✓ 有 &lt;code&gt;feature_importances_&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;树模型自带&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ridge / Lasso / LogisticRegression&lt;/td&gt;
					&lt;td&gt;✓ 有 &lt;code&gt;coef_&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;线性模型用系数绝对值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SVR / KNN / GaussianProcess&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✗ &lt;strong&gt;没有&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;既无 &lt;code&gt;feature_importances_&lt;/code&gt; 也无 &lt;code&gt;coef_&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint note'&gt;
&lt;p&gt;AI 还主动建议可以用 &lt;code&gt;permutation_importance&lt;/code&gt; 作为回退方案覆盖所有模型，我暂时没有采用（因为这正是不同模型的特点，只有类似树模型自带有特征重要性分析）。&lt;/p&gt;</description></item><item><title>监督 / 非监督学习的 AI 协作</title><link>https://JayWillow0.github.io/ml-dev/docs/06-learning-modules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/06-learning-modules/</guid><description>&lt;h2 id="无监督学习的功能拆分"&gt;无监督学习的功能拆分&lt;a class="anchor" href="#%e6%97%a0%e7%9b%91%e7%9d%a3%e5%ad%a6%e4%b9%a0%e7%9a%84%e5%8a%9f%e8%83%bd%e6%8b%86%e5%88%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最初的无监督学习模块只有聚类，功能单一。我向 AI 提出了拆分需求：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;我觉得应该将无监督学习拆分成三个子功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;帮我找群体&lt;/strong&gt;（自动聚类）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;找出异常样本&lt;/strong&gt;（IsolationForest 异常检测）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简化数据看规律&lt;/strong&gt;（PCA + t-SNE 降维可视化）&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;&lt;h3 id="ai-发现的-3-个并发-bug"&gt;AI 发现的 3 个并发 Bug&lt;a class="anchor" href="#ai-%e5%8f%91%e7%8e%b0%e7%9a%84-3-%e4%b8%aa%e5%b9%b6%e5%8f%91-bug"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;我提出拆分需求时，AI 在实现过程中主动发现了 &lt;strong&gt;3 个我完全没意识到的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;details &gt;&lt;summary&gt;Bug 1：轮廓系数显示为 0&lt;/summary&gt;&lt;div class="markdown-inner"&gt;
&lt;p&gt;代码中 &lt;code&gt;c.get('silhouette_score') or 0&lt;/code&gt; 把 &lt;code&gt;None&lt;/code&gt; 强制转成了 0，用户会误以为聚类效果极差。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;code&gt;None&lt;/code&gt; 值在 ECharts 中显示为缺口（&amp;ldquo;N/A&amp;rdquo;），不再误导用户。&lt;/p&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;details &gt;&lt;summary&gt;Bug 2：SpectralClustering 没有运行&lt;/summary&gt;&lt;div class="markdown-inner"&gt;
&lt;p&gt;它不在 &lt;code&gt;DEFAULT_CLUSTER_ALGORITHMS&lt;/code&gt; 列表中，等于少了一种聚类算法。AI 加上了。&lt;/p&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;details &gt;&lt;summary&gt;Bug 3：无监督任务出现在预测页&lt;/summary&gt;&lt;div class="markdown-inner"&gt;
&lt;p&gt;无监督模型没有保存 &lt;code&gt;.joblib&lt;/code&gt; 文件，用户选了预测会报&amp;quot;模型文件不存在&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：前端过滤仅显示 &lt;code&gt;task_type === 'supervised'&lt;/code&gt; 的任务。&lt;/p&gt;
&lt;/div&gt;&lt;/details&gt;
&lt;blockquote class='book-hint tip'&gt;
&lt;p&gt;&lt;strong&gt;这就是 Vibe Coding 的核心价值之一&lt;/strong&gt;：你提出一个功能需求，AI 在实现的同时帮你发现你没想到的问题。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id="异常检测的-contamination-参数"&gt;异常检测的 contamination 参数&lt;a class="anchor" href="#%e5%bc%82%e5%b8%b8%e6%a3%80%e6%b5%8b%e7%9a%84-contamination-%e5%8f%82%e6%95%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用户选择的 &lt;code&gt;contamination&lt;/code&gt;（异常比例）对结果影响是决定性的。AI 的解释：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;code&gt;contamination&lt;/code&gt; 不改变 IsolationForest 的评分本身，只改变阈值——把评分最低的 N% 标记为异常。&lt;/p&gt;</description></item><item><title>异步预测：AI 引导搭建 Celery 任务</title><link>https://JayWillow0.github.io/ml-dev/docs/07-async-celery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/07-async-celery/</guid><description>&lt;h2 id="为什么需要异步"&gt;为什么需要异步？&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81%e5%bc%82%e6%ad%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最初训练是 &lt;strong&gt;同步阻塞&lt;/strong&gt; 的——用户点&amp;quot;开始训练&amp;quot;后，浏览器一直转圈等后端跑完整个 pipeline（可能几分钟到几十分钟）。这期间用户什么也做不了。&lt;/p&gt;
&lt;p&gt;AI 检查了我的代码，指出：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;前端有 2s 轮询机制（为异步设计的），但后端是同步的。用户看到的就是&amp;quot;训练中&amp;quot;转圈直到后端跑完才一次性更新为&amp;quot;已完成&amp;quot;。&lt;/p&gt;
&lt;/blockquote&gt;&lt;h2 id="我的提示词改造为-celery-异步"&gt;我的提示词——改造为 Celery 异步&lt;a class="anchor" href="#%e6%88%91%e7%9a%84%e6%8f%90%e7%a4%ba%e8%af%8d%e6%94%b9%e9%80%a0%e4%b8%ba-celery-%e5%bc%82%e6%ad%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;是的，改造为 Celery 异步。我的电脑是 Windows 系统。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;img src="celery-discussion.png" alt="我和AI讨论异步架构的对话片段" /&gt;&lt;/p&gt;
&lt;h3 id="ai-的关键设计决策"&gt;AI 的关键设计决策&lt;a class="anchor" href="#ai-%e7%9a%84%e5%85%b3%e9%94%ae%e8%ae%be%e8%ae%a1%e5%86%b3%e7%ad%96"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Windows 不支持 Redis 的默认 prefork 模式。AI 选择了 &lt;strong&gt;SQLite 作为 Celery broker&lt;/strong&gt;（零依赖，开箱即用）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# settings.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CELERY_BROKER_URL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sqla+sqlite:///celery_broker.db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CELERY_RESULT_BACKEND &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;db+sqlite:///celery_result.db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CELERY_WORKER_POOL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;solo&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Windows 单进程&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动 Worker 的命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;celery -A mysite worker --pool&lt;span style="color:#f92672"&gt;=&lt;/span&gt;solo --loglevel&lt;span style="color:#f92672"&gt;=&lt;/span&gt;info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="流程变化"&gt;流程变化&lt;a class="anchor" href="#%e6%b5%81%e7%a8%8b%e5%8f%98%e5%8c%96"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;之前: 用户点训练 → 浏览器转圈等后端跑完 → 一次性返回结果
现在: 用户点训练 → 立即返回 task_id → 前端每 2s 轮询状态
 → Celery worker 在后台跑 pipeline → 完成后 status 变为 completed&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="训练失败后的状态回退问题"&gt;训练失败后的状态回退问题&lt;a class="anchor" href="#%e8%ae%ad%e7%bb%83%e5%a4%b1%e8%b4%a5%e5%90%8e%e7%9a%84%e7%8a%b6%e6%80%81%e5%9b%9e%e9%80%80%e9%97%ae%e9%a2%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;训练失败后，我发现无法用同一个数据集重新训练，必须先删除失败的任务。&lt;/p&gt;</description></item><item><title>调试血泪史</title><link>https://JayWillow0.github.io/ml-dev/docs/08-debugging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/08-debugging/</guid><description>&lt;h2 id="bug-1png-图片保存到了项目根目录"&gt;Bug 1：PNG 图片保存到了项目根目录&lt;a class="anchor" href="#bug-1png-%e5%9b%be%e7%89%87%e4%bf%9d%e5%ad%98%e5%88%b0%e4%ba%86%e9%a1%b9%e7%9b%ae%e6%a0%b9%e7%9b%ae%e5%bd%95"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：训练完成后，项目根目录下出现一堆 &lt;code&gt;.png&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我的提示词&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;模型预测保存的 PNG 图片保存到了项目的根目录下了&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;AI 的修复&lt;/strong&gt;：&lt;code&gt;Visualizer&lt;/code&gt; 的 &lt;code&gt;output_dir&lt;/code&gt; 在 View 中没有显式设置，默认是 &lt;code&gt;'.'&lt;/code&gt;（当前工作目录）。改为 &lt;code&gt;output_dir='media/charts/&amp;lt;task_id&amp;gt;/'&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我的后续决策&lt;/strong&gt;：我发现自己根本不需要 PNG——ECharts 的 JSON 配置已经够用了。于是我问：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;我不需要生成 PNG 文件，应该注释哪里的代码？&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class='book-hint tip'&gt;
&lt;p&gt;AI 的回答很巧妙：不需要逐个注释所有 &lt;code&gt;plot_*&lt;/code&gt; 方法，只需让 &lt;code&gt;_save_png&lt;/code&gt; 方法跳过保存即可。&lt;strong&gt;一处改动控制所有 PNG 输出&lt;/strong&gt;。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2 id="bug-2无监督学习查看图表弹出的是空看板"&gt;Bug 2：无监督学习查看图表弹出的是空看板&lt;a class="anchor" href="#bug-2%e6%97%a0%e7%9b%91%e7%9d%a3%e5%ad%a6%e4%b9%a0%e6%9f%a5%e7%9c%8b%e5%9b%be%e8%a1%a8%e5%bc%b9%e5%87%ba%e7%9a%84%e6%98%af%e7%a9%ba%e7%9c%8b%e6%9d%bf"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：无监督任务训练成功后，点击&amp;quot;查看图表&amp;quot;跳转到模型看板，但没有任何图表展示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我的提示词&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;训练好的结果在点击&amp;quot;任务追踪&amp;quot;的&amp;quot;详情&amp;quot;→&amp;ldquo;查看图表&amp;quot;时返回的是&amp;quot;启动训练&amp;quot;看板，并没有出现图表页面&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;AI 的排查&lt;/strong&gt;：问题不在图表生成，而在页面跳转。Dashboard 只显示训练启动表单，不加载已有任务的图表。需要让 Dashboard 支持 &lt;code&gt;?task_id=xxx&lt;/code&gt; 参数，自动加载图表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修复方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View 从 URL 读取 &lt;code&gt;task_id&lt;/code&gt; 参数传入模板&lt;/li&gt;
&lt;li&gt;Dashboard JS 初始化时检测参数，非空则自动调用 &lt;code&gt;loadResults()&lt;/code&gt; 渲染图表&lt;/li&gt;
&lt;li&gt;任务列表的&amp;quot;查看图表&amp;quot;链接改为 &lt;code&gt;/dashboard/?task_id=&amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="bug-3降维为no时前端无图表"&gt;Bug 3：降维为&amp;quot;No&amp;quot;时前端无图表&lt;a class="anchor" href="#bug-3%e9%99%8d%e7%bb%b4%e4%b8%bano%e6%97%b6%e5%89%8d%e7%ab%af%e6%97%a0%e5%9b%be%e8%a1%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：聚类任务不选降维，后端运行正常（Celery 日志显示 succeeded），但前端不显示任何图表，连肘部图也没有。浏览器控制台报 500 错误。&lt;/p&gt;</description></item><item><title>用户体验优化：从能用到好用</title><link>https://JayWillow0.github.io/ml-dev/docs/09-optimization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/09-optimization/</guid><description>&lt;h2 id="优化的起点"&gt;优化的起点&lt;a class="anchor" href="#%e4%bc%98%e5%8c%96%e7%9a%84%e8%b5%b7%e7%82%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;平台基本功能跑通后，我问 AI 了一个开放性问题：&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;针对当前平台，从用户体验角度，有哪些可优化的方向？请按必要性排序。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;AI 返回了 8 个方向，我选了前 6 个（P0-P2）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;优先级&lt;/th&gt;
					&lt;th&gt;优化方向&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;训练过程可见性&lt;/td&gt;
					&lt;td&gt;用户盯着&amp;quot;运行中&amp;quot;三个字几分钟，完全不知道进度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P0&lt;/td&gt;
					&lt;td&gt;训练前数据探索&lt;/td&gt;
					&lt;td&gt;用户不了解数据分布就做特征选择&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;错误反馈可操作&lt;/td&gt;
					&lt;td&gt;Python traceback 看不懂&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P1&lt;/td&gt;
					&lt;td&gt;跨任务模型对比&lt;/td&gt;
					&lt;td&gt;每个训练结果相互隔离，无法横向比较&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P2&lt;/td&gt;
					&lt;td&gt;任务队列透明化&lt;/td&gt;
					&lt;td&gt;solo pool 排队中不知道前面还有几个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;P2&lt;/td&gt;
					&lt;td&gt;流程串联优化&lt;/td&gt;
					&lt;td&gt;6 个页面相互独立，上下文在跳转中丢失&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="p0训练过程可见性"&gt;P0：训练过程可见性&lt;a class="anchor" href="#p0%e8%ae%ad%e7%bb%83%e8%bf%87%e7%a8%8b%e5%8f%af%e8%a7%81%e6%80%a7"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AI 设计了一个很优雅的 &lt;code&gt;ProgressCallback&lt;/code&gt; 机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个 &lt;code&gt;task_type&lt;/code&gt; 定义阶段列表（如监督学习 7 步、聚类 4 步）&lt;/li&gt;
&lt;li&gt;每个阶段入口调用 &lt;code&gt;progress_callback('stage_name', message='...')&lt;/code&gt;，写入 &lt;code&gt;MLTask.progress_info&lt;/code&gt;（JSONField）&lt;/li&gt;
&lt;li&gt;前端每 2s 轮询时拿到进度数据：进度条百分比、当前阶段名、实时日志&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;监督学习进度条：
数据导入 → 预处理 → 相关性分析 → 特征选择 → 模型训练 → 超参数调优 → 模型保存&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="p1错误反馈可操作"&gt;P1：错误反馈可操作&lt;a class="anchor" href="#p1%e9%94%99%e8%af%af%e5%8f%8d%e9%a6%88%e5%8f%af%e6%93%8d%e4%bd%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AI 利用 &lt;code&gt;ml_utils.py&lt;/code&gt; 中已有的异常体系（&lt;code&gt;MLDataError&lt;/code&gt;、&lt;code&gt;MLFeatureError&lt;/code&gt; 等），按异常类型映射到 5 个类别：&lt;/p&gt;</description></item><item><title>结语：提示词工程的核心心得</title><link>https://JayWillow0.github.io/ml-dev/docs/10-conclusion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://JayWillow0.github.io/ml-dev/docs/10-conclusion/</guid><description>&lt;h2 id="核心原则"&gt;核心原则&lt;a class="anchor" href="#%e6%a0%b8%e5%bf%83%e5%8e%9f%e5%88%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;回顾整个开发过程，我总结出以下 6 条提示词工程原则：&lt;/p&gt;
&lt;h3 id="1-给上下文--给命令"&gt;1. 给上下文 &amp;gt; 给命令&lt;a class="anchor" href="#1-%e7%bb%99%e4%b8%8a%e4%b8%8b%e6%96%87--%e7%bb%99%e5%91%bd%e4%bb%a4"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;不要只说&amp;quot;帮我做 X&amp;quot;，要说&amp;quot;我要做 X，因为 Y，我的环境是 Z&amp;quot;。&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;❌ &amp;ldquo;帮我加 Celery&amp;rdquo;&lt;/p&gt;
&lt;p&gt;✅ &amp;ldquo;改造为 Celery 异步。我的电脑是 Windows 系统，目前用 Django 3.2.9，没有安装 Redis&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;后者让 AI 直接选 SQLite broker，省去了我安装 Redis 和排错的时间。&lt;/p&gt;
&lt;h3 id="2-先计划后执行"&gt;2. 先计划后执行&lt;a class="anchor" href="#2-%e5%85%88%e8%ae%a1%e5%88%92%e5%90%8e%e6%89%a7%e8%a1%8c"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;大型任务不要让 AI 直接写代码。我的做法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先让 AI 出方案（Plan Mode）&lt;/li&gt;
&lt;li&gt;我审查方案，确认技术选型和架构&lt;/li&gt;
&lt;li&gt;再让 AI 按方案执行&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我的平台有 5 次大的 Plan-then-Execute 循环，每次 AI 都会先输出一个详细的计划文件（如 &lt;code&gt;day1-2-plan.md&lt;/code&gt;），确认后才动手。&lt;/p&gt;
&lt;h3 id="3-分阶段推进每阶段验证"&gt;3. 分阶段推进，每阶段验证&lt;a class="anchor" href="#3-%e5%88%86%e9%98%b6%e6%ae%b5%e6%8e%a8%e8%bf%9b%e6%af%8f%e9%98%b6%e6%ae%b5%e9%aa%8c%e8%af%81"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;阶段&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
					&lt;th&gt;验证方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;ML 核心模块&lt;/td&gt;
					&lt;td&gt;91 项单元测试&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;可视化模块&lt;/td&gt;
					&lt;td&gt;157 项测试（含 ECharts/PNG 验证）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;Django 集成&lt;/td&gt;
					&lt;td&gt;手动走通上传→配置→训练→预测全流程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;Celery 异步&lt;/td&gt;
					&lt;td&gt;观察训练是否立即返回 + Worker 终端日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;UX 优化&lt;/td&gt;
					&lt;td&gt;6 步逐个验证&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="4-遇到错误时把完整信息喂给-ai"&gt;4. 遇到错误时，把完整信息喂给 AI&lt;a class="anchor" href="#4-%e9%81%87%e5%88%b0%e9%94%99%e8%af%af%e6%97%b6%e6%8a%8a%e5%ae%8c%e6%95%b4%e4%bf%a1%e6%81%af%e5%96%82%e7%bb%99-ai"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;错误日志 + 操作步骤 + 你期望的行为，三者一起给。AI 排查 Bug 的速度会快 10 倍。&lt;/p&gt;</description></item></channel></rss>