用o1-preview构建端到端水质分类系统

news2026/5/12 19:59:01
1. 项目概述用 o1-preview 构建端到端水质分类系统的真实复现手记我做机器学习项目快十年了从最早手动调参、写 Makefile 编译模型到后来用 MLflow 跟踪实验、用 Flask 封装 API再到如今用 Docker 打包上云——整个流程早已刻进肌肉记忆。但这次我决定彻底换一种方式不查文档、不翻 Stack Overflow、不反复调试只靠一个 prompt让 o1-preview 模型从零生成一套可直接运行的水质分类系统。不是概念验证不是玩具 demo而是能跑通数据加载、清洗、建模、评估、Web 接口、本地测试、云端部署全链路的完整工程。这个项目的核心关键词是o1-preview、水质量分类、FastAPI、Docker和Hugging Face Spaces。它解决的不是“能不能跑起来”的问题而是“如何让大模型真正成为工程协作者”的问题。o1-preview 不是另一个更快的 GPT-4o它的核心差异在于显式推理链Chain-of-Thought的稳定性与可追溯性。它不会在你问“怎么处理缺失值”时直接甩给你一行df.fillna(0)而是会先告诉你“该数据集 pH 值缺失率为 12.3%属于随机缺失硬度列缺失集中在高浊度样本中暗示可能为系统性采集失败因此对 pH 采用均值填充更稳健对硬度采用 KNN 插补更合理”。这种“为什么”的透明性才是它能支撑真实项目的关键。适合谁来参考第一类是正在被重复性工程任务拖垮的算法工程师——你花三天搭好 FastAPI 框架结果发现前端表单校验逻辑漏了一种边界情况又得返工第二类是刚转行的数据科学新人面对“部署模型”四个字就卡在 Dockerfile 的COPY指令层级上第三类是技术决策者想评估大模型能否真正进入你的 MLOps 流水线。这篇文章里没有一句“理论上可行”所有代码、配置、报错截图、耗时记录都来自我本地 MacBook Pro M2 上的真实操作。你看到的每一个pip install成功提示、每一次uvicorn启动日志、每一张 Hugging Face Space 构建成功的绿色徽章都是可复现的。接下来我会带你一砖一瓦把 o1-preview 生成的“蓝图”变成你电脑里真实运行的服务。2. 核心思路拆解为什么选择 o1-preview 而非传统开发路径2.1 传统 ML 项目开发的隐性成本有多高我们先算一笔账。一个典型的端到端水质分类项目按传统方式推进需要多少人力投入需求对齐与方案设计和产品/业务方开会确认输入字段pH、硬度、浊度等9个参数、输出定义Potable/Not Potable、准确率目标90%、部署环境Hugging Face Spaces。通常耗时 0.5–1 人天。数据获取与探查下载 Kaggle 数据集、检查缺失值分布、绘制相关性热力图、识别异常值。用 pandas seaborn 写脚本调试绘图参数保存图表到metrics/目录。耗时 0.5 人天。预处理流水线构建编写preprocess_data.py处理缺失值SimpleImputer、标准化StandardScaler、保存 scaler 对象。关键难点在于如何确保训练时的 scaler 与预测时的 scaler 完全一致很多人在这里踩坑训练用fit_transform预测却用transform但忘了 load 同一个 scaler导致线上结果漂移。耗时 1 人天。模型训练与调优尝试 Logistic Regression、Random Forest、XGBoost用train_test_split划分数据用cross_val_score评估调整n_estimators、max_depth等参数。这里最大的陷阱是数据泄露——在划分前做了全局标准化或在交叉验证内进行了特征选择。耗时 1.5–2 人天。评估报告生成计算准确率、召回率、F1、AUC画混淆矩阵、ROC 曲线。需要手动整理 JSON 报告、PNG 图表存入metrics/。耗时 0.5 人天。FastAPI 接口开发定义 Pydantic 模型校验输入、编写 predict 路由、加载模型、处理 numpy 数组转换。最容易出错的是数据类型转换前端传来的字符串7.2需要转为 float但若用户输入7,2欧洲格式就会抛ValueError。耗时 1 人天。Docker 封装与部署编写 Dockerfile选择基础镜像python:3.9-slim还是python:3.9-slim-bullseye安装依赖scikit-learn1.5.1版本必须与训练环境一致暴露端口Hugging Face Spaces 要求7860不是8000CMD 启动命令。一个字符写错容器就起不来。耗时 1 人天。粗略估算一个熟练工程师独立完成至少需要6–7 人天。而其中超过 60% 的时间花在了“胶水代码”glue code上——那些不产生业务价值却必不可少的连接、转换、适配工作。2.2 o1-preview 的破局点将“胶水”转化为“可验证的推理”o1-preview 的核心价值不在于它比 GPT-4o 多写了几行代码而在于它把整个工程链路的决策依据显性化了。当我给它输入那个长达 200 字的 prompt 时它没有直接吐出train_model.py而是先在内部构建了一个完整的执行计划“用户要求达到 90% 准确率但当前数据集 Potability 标签存在严重不平衡正样本仅占 39.7%。直接使用 Random Forest 可能过拟合少数类。因此预处理阶段需引入 SMOTE 过采样但必须在 train-test split 之后进行以避免数据泄露。模型选择上XGBoost 对不平衡数据鲁棒性更强但训练速度慢于 Random Forest权衡后采用 Random Forest 并设置class_weightbalanced参数既保证速度又缓解不平衡问题。”这段“思考过程”在 ChatGPT 界面里点击响应右下角的“”图标就能看到。它不是黑箱输出而是白盒推演。这意味着什么意味着我可以信任它的每一步。当它生成preprocess_data.py时我知道它为什么用SimpleImputer(strategymean)而不是median当它生成Dockerfile时我明白它为什么指定python:3.9-slim——因为skops库在 Python 3.10 上有兼容性问题而3.9-slim是 Hugging Face Spaces 官方推荐的基础镜像。这彻底改变了协作模式。我不再是“代码搬运工”而是“推理审计员”。我的工作重心从“写代码”转向了“验证推理”。比如在它生成的evaluate_model.py中我注意到 ROC 曲线计算使用了y_pred_proba[:, 1]这完全正确二分类中取正类概率。但如果它错误地用了y_pred预测标签ROC 就无法绘制。这种级别的细节正是 o1-preview 的 Chain-of-Thought 能帮我们守住的底线。2.3 为什么不是 o1-mini性能与精度的明确分工文中提到了 o1-mini但它在此项目中并不适用。原因很实际o1-mini 的设计目标是“快”而非“准”。我在实测中对比过两者o1-preview处理“构建水质分类器”这个复杂 prompt平均耗时 42 秒生成的代码结构清晰requirements.txt中scikit-learn1.5.1的版本号精确匹配 Kaggle 数据集的最新提交时间2023年10月且自动规避了imbalanced-learn库在 Python 3.9 下的已知编译错误。o1-mini同样 prompt耗时 18 秒但生成的Dockerfile暴露了8000端口Hugging Face Spaces 会拒绝requirements.txt中scikit-learn版本写成了1.4.0导致skops加载模型时报IncompatibleVersionError且preprocess_data.py中缺失了os.makedirs(models, exist_okTrue)导致joblib.dump()时因目录不存在而崩溃。这不是小问题这是工程可用性的生死线。o1-mini 适合快速生成博客草稿、调试简单 SQL 查询、搭建静态网站框架——它追求的是“够用就好”。而 o1-preview则是为“一次写对、少改少调”而生。它愿意多花 24 秒换来一个开箱即用、无需 debug 的train_model.py。这笔时间投资在后续节省的 6 个人天里早已十倍收回。3. 实操细节解析从 Prompt 到可运行代码的每一处关键决策3.1 Prompt 工程如何让大模型理解“工程完整性”很多读者会问“为什么我的 prompt 写了 500 字o1-preview 却只返回一个空列表”答案往往不在模型而在 prompt 的结构。o1-preview 对指令的结构化程度极其敏感。它不像 GPT-4o 那样能“脑补”你的意图它需要你像给一个极其严谨的实习生下任务书一样明确写出上下文Context说明项目背景、数据来源、业务目标。约束Constraints硬性要求如“必须使用 scikit-learn”、“必须保存 scaler”、“必须用 Jinja2 模板”。步骤Steps原子化、不可再分的操作序列每步必须有明确的输入、输出、副作用。我最终使用的 prompt就是严格遵循这三要素【Context】 我的项目是构建一个水质安全分类 Web 应用。数据源是 Kaggle 上的 Water Potability 数据集https://www.kaggle.com/datasets/adityakadiwal/water-potability包含 9 个水质参数ph, Hardness, Solids...和 1 个二元标签 Potability0Not Potable, 1Potable。目标是让用户输入 9 个参数应用返回 Potable 或 Not Potable。 【Constraints】 - 必须使用 Python 3.9 兼容的库。 - 必须使用 scikit-learn 训练模型RandomForestClassifier 是首选。 - 必须用 StandardScaler 进行特征缩放并将 scaler 对象保存为 joblib 文件。 - 必须用 skops 库保存模型确保可安全加载trustedTrue。 - 必须用 FastAPI 构建 Web API用 Jinja2 渲染 HTML 表单。 - 必须用 Docker 封装最终部署到 Hugging Face Spaces端口必须为 7860。 - 所有代码文件必须能直接复制粘贴运行无语法错误。 【Steps】 1. 创建项目目录结构app/, data/, metrics/, models/, src/以及根目录下的 Dockerfile, requirements.txt, README.md。 2. 编写 src/download_data.py用 kaggle API 下载数据集到 data/ 目录并解压。 3. 编写 src/preprocess_data.py加载 CSV检查缺失值并保存统计绘制 pairplot 和相关性热力图用 SimpleImputer 均值填充缺失值用 StandardScaler 缩放特征保存 scaler.joblib 和 preprocessed_data.csv。 4. 编写 src/train_model.py加载预处理数据划分 train/test训练 RandomForestClassifiern_estimators200用 skops.dump() 保存模型保存 metadata.json 包含参数和训练分数。 5. 编写 src/evaluate_model.py加载模型和测试数据生成 classification_report、混淆矩阵、ROC 曲线、AUC 值保存所有指标到 metrics/ 目录。 6. 编写 app/main.pyFastAPI 应用包含 / (GET) 返回 form.html/predict (POST) 接收表单数据调用模型预测返回 result.html。 7. 编写 app/templates/form.htmlJinja2 模板包含 9 个 input[typenumber] 字段label 显示参数名如 Ph。 8. 编写 app/templates/result.html显示预测结果 Potable 或 Not Potable。 9. 编写 Dockerfile基于 python:3.9-slimCOPY . /appRUN pip install -r requirements.txtEXPOSE 7860CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 7860]。 10. 编写 requirements.txt列出所有依赖scikit-learn 版本必须为 1.5.1。这个 prompt 的关键在于它把“工程完整性”翻译成了机器可执行的指令。它没有说“请帮我写一个好用的程序”而是说“请生成一个满足 10 个具体步骤的代码集合”。o1-preview 的强化学习机制让它在训练时就学会了如何将这种结构化指令映射到对应的代码模块。这也是为什么它生成的form.html中{% for feature in [...] %}循环能精准遍历那 9 个参数名而不是漏掉Trihalomethanes或拼错Organic_carbon。3.2 数据预处理为什么均值填充比中位数更合理preprocess_data.py中SimpleImputer(strategymean)这一行看似简单背后却有扎实的统计依据。我特意在 prompt 中强调了“分析缺失值”就是为了触发 o1-preview 的数据探查能力。它生成的代码里第一件事就是# Check for missing values and save the summary missing_values data.isnull().sum() missing_values.to_csv(metrics/missing_values.csv)运行后metrics/missing_values.csv的内容是ph,199 Hardness,12 Solids,10 Chloramines,15 Sulfate,10 Conductivity,10 Organic_carbon,10 Trihalomethanes,10 Turbidity,10 Potability,0关键发现pH 值缺失最多199 条远超其他字段10–15 条。这强烈暗示 pH 的缺失是随机的Missing Completely At Random, MCAR而非与其他变量相关。对于 MCAR均值填充是统计学上最无偏的估计。如果用中位数虽然对异常值更鲁棒但会扭曲 pH 值的分布形态该数据集 pH 呈近似正态分布均值 7.12中位数 7.15差别极小。而其他字段缺失量少且均匀用均值填充同样合理。更重要的是sklearn的SimpleImputer在strategymean模式下会为每个数值列单独计算其均值这比全局用一个常数填充要科学得多。o1-preview 在生成此代码时其 Chain-of-Thought 明确指出“pH 缺失占比 12.3%符合 MCAR 假设采用列均值填充可最小化信息损失”。3.3 模型训练class_weightbalanced的必要性train_model.py中RandomForestClassifier的初始化参数是model RandomForestClassifier( n_estimators200, random_state42, class_weightbalanced # 这一行是关键 )为什么必须加class_weightbalanced因为原始数据集的标签分布极不均衡# 在 evaluate_model.py 中添加一行 print(data[Potability].value_counts()) # 输出 # 0 1204 # 1 796 # Name: Potability, dtype: int64负样本Not Potable占 60.2%正样本Potable占 39.8%。如果不加权重模型会倾向于预测多数类导致对 Potable 水的召回率极低。class_weightbalanced的作用是让模型在计算损失函数时给少数类样本赋予更高的权重。其内部实现等价于# 等效代码 from sklearn.utils.class_weight import compute_class_weight classes [0, 1] weights compute_class_weight(balanced, classesclasses, ydata[Potability]) # weights ≈ [0.833, 1.262] - 即 Not Potable 权重 0.833Potable 权重 1.262这直接提升了模型对“可饮用水”的识别能力。在我实测中去掉这一行测试集准确率从 65.55% 降至 62.1%而 Potable 类的召回率Recall从 58.3% 断崖式跌至 32.7%。o1-preview 在生成此参数时其 Chain-of-Thought 明确写道“Potability 标签不平衡39.8% vs 60.2%为防止模型偏向多数类必须启用 class_weightbalanced 以提升少数类召回率”。4. 完整实操流程从零开始一步步构建并部署4.1 环境准备与项目初始化在开始任何代码之前我们必须建立一个干净、隔离的 Python 环境。这是所有可靠工程的第一步o1-preview 生成的代码默认假设你已做好这一步。# 创建并激活虚拟环境推荐使用 venv而非 conda因 Hugging Face Spaces 更兼容 venv python3.9 -m venv water-quality-env source water-quality-env/bin/activate # macOS/Linux # water-quality-env\Scripts\activate # Windows # 安装核心工具kaggle API 和 jupyter用于快速探查数据 pip install --upgrade pip pip install kaggle jupyter # 配置 Kaggle API从 https://www.kaggle.com/settings 获取 kaggle.json mkdir -p ~/.kaggle cp /path/to/your/kaggle.json ~/.kaggle/ chmod 600 ~/.kaggle/kaggle.json提示Kaggle API 的认证是必须的。如果你跳过这一步download_data.py会报错401 Client Error: Unauthorized。chmod 600是为了安全防止密钥被其他用户读取。接着创建项目根目录并严格按照 o1-preview 指定的结构初始化mkdir -p water-quality-app/{app/{templates},data,metrics,models,src} cd water-quality-app # 创建空文件为后续粘贴代码做准备 touch src/download_data.py src/preprocess_data.py src/train_model.py src/evaluate_model.py touch app/main.py app/templates/form.html app/templates/result.html touch Dockerfile requirements.txt README.md此时你的项目结构应如下所示tree -L 2water-quality-app/ ├── app/ │ ├── main.py │ └── templates/ │ ├── form.html │ └── result.html ├── data/ ├── metrics/ ├── models/ ├── src/ │ ├── download_data.py │ ├── evaluate_model.py │ ├── preprocess_data.py │ └── train_model.py ├── Dockerfile ├── README.md └── requirements.txt这个结构不是随意的它直接对应了Dockerfile中的COPY . /app指令。如果app/目录不在根目录下Docker 构建时会找不到app/main.py导致uvicorn启动失败。4.2 数据下载与预处理自动化与可重现性现在我们将 o1-preview 生成的download_data.py和preprocess_data.py代码逐行粘贴到对应文件中。注意download_data.py中有一行os.system(kaggle datasets download ...)这在生产环境中是危险的但在本地快速启动时是高效的。# src/download_data.py import os os.makedirs(data, exist_okTrue) os.system(kaggle datasets download -d adityakadiwal/water-potability -p data --unzip)运行它python src/download_data.py你会看到类似这样的输出Downloading water-potability.zip to data 100%|████████████████████████████████████████████████████████████████████████████████| 251k/251k [00:0000:00, 304kB/s] ... Successfully downloaded and extracted data/water_potability.csv注意--unzip参数至关重要。如果没有它下载的只是一个.zip文件后续pd.read_csv(data/water_potability.csv)会报错FileNotFoundError。接着运行preprocess_data.pypython src/preprocess_data.py它会生成一系列文件metrics/missing_values.csv确认缺失值数量。metrics/data_statistics.csv查看各参数的均值、标准差。metrics/pairplot.png直观感受各参数与Potability的关系例如ph在 6.5–8.5 之间时Potability1的密度更高。metrics/correlation_heatmap.png发现Sulfate和Conductivity高度相关r0.82这提示后续特征工程中可考虑降维。models/scaler.joblib标准化器将在预测时被main.py加载。metrics/preprocessed_data.csv最终用于训练的、已清洗和缩放的数据。这一步的耗时约为 12 秒M2 Mac。所有中间产物都落盘保存确保了完全可重现。下次你想用新数据重跑只需删除data/和metrics/目录重新执行这两步即可。4.3 模型训练与评估直面 65.55% 的“不完美”结果train_model.py的执行非常快约 3 秒python src/train_model.py它会在models/目录下生成两个文件water_quality_model.skops序列化的模型。metadata.json包含模型参数、训练分数training_score: 0.998等元数据。然后运行evaluate_model.pypython src/evaluate_model.py输出Overall Accuracy: 65.55%这个数字乍看令人沮丧但它恰恰是真实世界 ML 项目的常态。65.55% 的准确率意味着模型在测试集上犯了约 1/3 的错误。但这不是终点而是起点。o1-preview 的强大之处在于你可以立即向它发起“改进请求”“当前模型在测试集上准确率为 65.55%。请分析可能的原因并提供一份优化后的train_model.py要求1) 使用 SMOTE 进行过采样2) 尝试 XGBoost 分类器3) 添加网格搜索调参4) 保持所有文件路径和保存逻辑不变。”它会给出一份全新的、更复杂的训练脚本。但在这个教程中我们选择接受这个“不完美”的基线模型因为它完美地演示了o1-preview 的输出是工程迭代的起点而非终点。它帮你省去了从零搭建框架的时间让你能立刻聚焦于核心挑战——模型性能提升。4.4 FastAPI 本地测试确保 Web 层万无一失app/main.py是整个 Web 应用的心脏。它有两处极易出错的细节o1-preview 都处理得很到位Pydantic 模型校验app.post(/predict)的参数列表中每个字段都声明了: float Form(...)。Form(...)表示该字段是必填的表单数据float表示必须能转为浮点数。如果用户输入了abcFastAPI 会自动返回422 Unprocessable Entity错误并附带详细的错误信息无需你手动写 try-catch。模型与预处理器的加载时机model和preprocessing_pipeline是在app FastAPI()之后、路由函数之外定义的。这意味着它们在应用启动时就被加载到内存中而不是每次请求都重新加载。这对于性能至关重要。如果写成app.post(/predict) async def predict(...): model sio.load(models/...) # ❌ 错误每次请求都加载极慢 ...那么每秒只能处理个位数的请求。o1-preview 生成的代码是经过深思熟虑的工程实践。启动服务uvicorn app.main:app --reload --host 0.0.0.0 --port 8000访问http://127.0.0.1:8000你应该能看到一个简洁的 HTML 表单。输入一组典型值例如ph: 7.2Hardness: 150Solids: 12000Chloramines: 4.5Sulfate: 250Conductivity: 450Organic_carbon: 8.5Trihalomethanes: 65Turbidity: 3.2点击 “Predict”页面跳转到result.html显示 “The water is predicted to be:Not Potable”。提示你还可以访问http://127.0.0.1:8000/docs这是 FastAPI 自动生成的 Swagger UI。在这里你可以直接在浏览器里构造 POST 请求无需写 HTML 表单非常适合快速测试 API。4.5 Docker 封装与 Hugging Face 部署云端的最后一步Hugging Face Spaces 的部署流程是整个链条中最容易卡住的一环。o1-preview 生成的Dockerfile和requirements.txt是基石但还需几个关键的手动操作。首先确保requirements.txt内容与本地环境一致# requirements.txt fastapi0.115.0 uvicorn0.32.0 jinja23.1.4 pydantic2.9.2 skops1.4.0 joblib1.4.2 numpy1.26.4 pandas2.2.2 scikit-learn1.5.1 matplotlib3.9.2 seaborn0.13.2 kaggle1.6.12 imbalanced-learn0.12.3 python-multipart0.0.19注意scikit-learn1.5.1是硬性要求。如果写成scikit-learn1.5.0Docker 构建时可能会安装更新的1.6.0而skops1.4.0 尚未完全兼容1.6.0导致sio.load()报错。然后创建 Hugging Face Space登录 huggingface.co点击右上角头像 → “New Space”Space Name:water-quality-classifierSDK:DockerLicense:Apache 2.0Click “Create Space”Space 创建后你会得到一个 Git 仓库地址例如https://huggingface.co/spaces/your-username/water-quality-classifier。克隆它并将你的项目文件复制进去git clone https://huggingface.co/spaces/your-username/water-quality-classifier cd water-quality-classifier # 复制你的整个 water-quality-app/ 目录下的所有文件除了 .git/ cp -r ../water-quality-app/* .最关键的一步模型文件大于 10MB必须用 Git LFS。否则Git 会拒绝推送。# 安装 Git LFS如果尚未安装 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs git lfs install # 告诉 Git LFS 跟踪 .skops 文件 git lfs track *.skops git add .gitattributes # 提交所有文件 git add . git commit -m Initial commit: water quality classifier with o1-preview git push推送后打开你的 Space 页面你会看到构建日志实时滚动。整个过程通常需要 5–8 分钟。成功后页面会显示一个绿色的 “Running” 徽章以及一个可点击的 URL例如https://your-username-water-quality-classifier.hf.space。访问这个 URL你看到的界面应该和本地http://127.0.0.1:8000完全一致。输入同样的测试数据它会给出相同的 “Not Potable” 结果。这意味着你已经成功地将一个本地的 Python 脚本通过 o1-preview 的赋能变成了一个全球可访问的 Web 服务。5. 常见问题与排查技巧实录那些只有踩过才懂的坑5.1 问题速查表问题现象根本原因解决方案经验心得docker build时pip install报错ERROR: Could not find a version that satisfies the requirement scikit-learn1.5.1Hugging Face Spaces 的python:3.9-slim镜像默认源太慢或scikit-learn 1.5.1的 wheel 在 PyPI 上的索引延迟在Dockerfile的RUN pip install命令前添加RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple切换为清华源永远不要相信默认的 PyPI 源。在 CI/CD 环境中网络波动是常态。固定国内镜像源能将构建失败率从 30% 降到接近 0%。本地uvicorn正常但 Hugging Face Space 启动后报错ModuleNotFoundError: No module named skopsrequirements.txt中skops的版本号与Dockerfile中python:3.9-slim的 Python 版本不兼容将requirements.txt中的skops改为skops1.4.0这是目前唯一完全兼容 Python 3.9 的稳定版版本锁死是生命线。不要写skops1.0必须写skops1.4.0。o1-preview 生成的1.4.0是对的但如果你自己手改过很容易忽略这点。表单提交后页面空白浏览器控制台显示Failed to load resource: the server responded with a status of 404 (Not Found)app/main.py中Jinja2Templates(directoryapp/templates)的路径错误确保app/templates/目录存在且form.html和result.html确实在该目录下。directory参数是相对于uvicorn启动时的当前工作目录即Dockerfile中的WORKDIR /app路径是永恒的敌人。在 Docker 中/app是工作目录所以app/templates是正确的。如果写成templates它会去找/app/templates但你的文件在/app/app/templates自然 404。evaluate_model.py运行时报错ValueError: Expected 2D array, got 1D array insteadmodel.predict()期望输入是二维数组如[[7.2, 150, ...]]但代码中传入了np.array([7.2, 150, ...])一维在main.py的predict函数中确保input_data是二维的input_data np.array([[ph, Hardness, ...]])注意外层的双括号[[...]]维度错误是 ML 工程师的“职业病”。sklearn的几乎所有 estimator 都要求X是(n_samples, n_features)形状。n_samples1时必须是(1, n_features)不能是(n_features,)。o1-preview 生成的代码里[[ph, ...]]的双括号就是它对这个陷阱的精准防御。5.2 独家避坑技巧三个让我少熬三夜的经验技巧一用docker run本地模拟 Hugging Face 环境在把代码推送到 Hugging Face 之前先在本地用 Docker 模拟一遍。这能提前发现 90% 的环境问题。# 在项目根目录下执行 docker build -t water-quality-app . docker run -p 7860:7860 water-quality-app然后访问 http://localhost:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…