news 2026/8/9 3:39:43

从零构建MLOps流水线:基于MLflow与FastAPI的模型部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零构建MLOps流水线:基于MLflow与FastAPI的模型部署实战

在当今企业数字化转型浪潮中,数据驱动的决策已成为核心竞争力。然而,许多团队在构建和部署预测模型时,常常面临流程割裂、工具链复杂、业务与数据科学团队协作效率低下等挑战。模型从开发到上线,往往需要经历漫长的工程化、部署和监控周期,任何一个环节的卡顿都可能导致商业机会的流失。

Sapiom 正是瞄准了这一痛点,致力于通过其统一的平台,将数据科学、机器学习和运营工作流无缝整合。近日,其成功获得 3500 万美元 A 轮融资的消息,不仅标志着资本市场对其愿景的认可,更反映出市场对高效、可扩展的 MLOps(机器学习运维)解决方案的迫切需求。本文将深入解析 Sapiom 平台的核心价值、技术架构,并提供一个从环境搭建到模型部署的完整实战教程,帮助开发者理解现代 MLOps 平台如何赋能业务,以及我们如何利用类似思路构建自己的自动化机器学习流水线。

无论你是数据科学家希望提升模型投产效率,还是后端工程师需要了解如何为 AI 应用提供稳健的基础设施,抑或是技术负责人评估 MLOps 工具选型,本文都将提供从概念到实操的完整参考。

1. 背景与核心概念:为什么需要 MLOps 平台?

在深入 Sapiom 或任何 MLOps 平台之前,我们必须理解它所解决的根本问题。传统的机器学习项目生命周期(如 CRISP-DM)侧重于模型开发本身,但在“开发”与“生产”之间存在巨大的鸿沟,我们称之为“模型部署的死亡之谷”。

1.1 MLOps 是什么?MLOps 是机器学习(Machine Learning)、开发(Development)和运维(Operations)的结合。它是一套工程实践,旨在可靠且高效地将机器学习模型从实验环境部署到生产环境,并对其进行持续的监控、管理和迭代。其核心目标是实现机器学习项目的自动化、可重复性和可审计性。

1.2 传统流程的痛点

  • 环境不一致:实验环境的 Python 包版本与生产服务器不同,导致“在我机器上能跑”的经典问题。
  • 手动部署:模型文件(如.pkl.h5)通过邮件或聊天工具传递,由运维人员手动上传到服务器,过程极易出错。
  • 缺乏监控:模型上线后,其预测性能是否随数据分布变化而衰减(概念漂移)?无人知晓。
  • 协作困难:数据科学家、机器学习工程师、软件工程师和运维人员使用不同的工具链,沟通成本高。

1.3 Sapiom 的定位Sapiom 将自己定位为一个“统一”的平台。这意味着它试图提供一个端到端的解决方案,覆盖从数据准备、模型训练、评估、部署到监控和再训练的全流程。其获得融资的关键,很可能在于它通过降低使用门槛和提升协作效率,帮助企业缩短了从模型创意到业务价值产生的时间。

2. 环境准备与版本说明

为了理解 MLOps 平台的核心功能,我们将模拟一个简化的场景:构建一个房价预测模型,并为其搭建一个自动化的训练与部署流水线。我们将使用最流行的开源工具来模拟 Sapiom 平台中的各个模块。

我们的技术栈:

  • 操作系统:Ubuntu 20.04 LTS / macOS Monterey 或更高版本 / Windows 10+ (WSL2 推荐)。
  • 编程语言:Python 3.8+。
  • 核心库
    • scikit-learn==1.0.2: 用于构建和训练机器学习模型。
    • pandas==1.4.2: 用于数据处理。
    • mlflow==2.3.0: 用于实验跟踪、模型注册和部署。这是模拟 MLOps 功能的核心。
    • fastapi==0.89.1&uvicorn[standard]==0.20.0: 用于将模型包装为 REST API 服务。
  • 容器与编排:Docker 20.10+, Docker Compose v2。用于封装模型服务,确保环境一致性。
  • 工作流编排:Apache Airflow 2.5+ (可选)。用于编排定期重训练任务。
  • 版本控制:Git。

项目结构预览:在开始前,我们先规划好项目目录,这是工程化的第一步。

mlops-pipeline/ ├── data/ # 存放数据集 │ └── raw_data.csv ├── notebooks/ # 用于探索性数据分析 (EDA) │ └── 01_eda.ipynb ├── src/ # 源代码 │ ├── __init__.py │ ├── data_preprocessing.py # 数据预处理逻辑 │ ├── train.py # 模型训练脚本 │ └── predict.py # 模型预测函数 ├── models/ # 本地保存的模型 (将被 MLflow 替代) ├── mlruns/ # MLflow 自动生成的实验跟踪目录 ├── docker/ # Docker 相关文件 │ └── Dockerfile ├── docker-compose.yml # 服务编排定义 ├── requirements.txt # Python 依赖 ├── pipeline.py # 主训练流水线脚本 └── serve_model.py # 启动 FastAPI 服务的脚本

3. 核心组件与原理拆解

一个完整的 MLOps 流水线包含多个关键组件。我们以开源工具为例,拆解其功能,这些功能正是 Sapiom 这类商业化平台所集成和增强的。

3.1 实验跟踪与模型注册 (MLflow Tracking & Registry)这是 MLOps 的“大脑”。它记录每次实验的参数、代码版本、指标和产出物(模型文件)。

  • 用途:避免实验混乱,可复现任何一次训练结果,方便团队对比不同模型性能。
  • 关键概念
    • Experiment(实验):一个研究项目的容器,例如“房价预测_v1”。
    • Run(运行):一次具体的模型训练过程。
    • Artifact(产物):运行产生的文件,如模型、图表。
    • Model Registry(模型注册表):管理模型生命周期(Staging, Production, Archived)的中心化仓库。

3.2 模型服务化 (Model Serving)将训练好的模型封装成可通过网络调用的 API 服务。

  • 用途:使应用程序能够实时或批量地获取模型预测结果。
  • 常见方式
    1. REST API:使用 FastAPI、Flask 等框架构建轻量级服务。
    2. 专用服务框架:如 MLflow Models、TensorFlow Serving、TorchServe。
    3. 无服务器部署:部署到 AWS Lambda、Google Cloud Functions 等。

3.3 工作流编排 (Workflow Orchestration)自动化执行模型训练、评估、部署等任务序列。

  • 用途:实现定期数据更新、模型重训练、自动化测试和部署(CI/CD for ML)。
  • 工具代表:Apache Airflow、Prefect、Kubeflow Pipelines。

3.4 监控与告警 (Monitoring & Alerting)持续监控生产环境中模型的预测性能、数据质量和服务健康度。

  • 用途:及时发现概念漂移、数据异常和服务故障。
  • 监控维度
    • 技术指标:API 延迟、吞吐量、错误率。
    • 业务指标:预测准确率、平均绝对误差(对于回归问题)。
    • 数据指标:输入特征的数据分布变化。

4. 完整实战案例:构建房价预测 MLOps 流水线

接下来,我们将一步步实现一个具备实验跟踪、模型注册、容器化服务和简单监控的迷你 MLOps 流水线。

4.1 项目初始化与依赖安装

首先,创建项目目录并安装依赖。

# 创建项目目录并进入 mkdir mlops-pipeline && cd mlops-pipeline # 创建虚拟环境 (推荐) python -m venv venv # 激活虚拟环境 # Linux/macOS: source venv/bin/activate # Windows: # venv\Scripts\activate # 创建 requirements.txt 文件并写入以下内容 cat > requirements.txt << EOF pandas==1.4.2 scikit-learn==1.0.2 mlflow==2.3.0 fastapi==0.89.1 uvicorn[standard]==0.20.0 python-multipart pydantic EOF # 安装依赖 pip install -r requirements.txt

4.2 数据准备与预处理脚本

我们使用一个虚拟的房价数据集。创建data_preprocessing.py脚本。

# 文件路径:src/data_preprocessing.py import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import joblib # 用于保存预处理对象 import os def load_and_preprocess_data(data_path: str, test_size: float = 0.2, random_state: int = 42): """ 加载数据,进行预处理,并划分训练集和测试集。 参数: data_path: 原始数据文件路径。 test_size: 测试集比例。 random_state: 随机种子。 返回: X_train, X_test, y_train, y_test: 处理后的特征和标签。 preprocessor: 拟合好的预处理对象(本例为标准化器)。 """ # 1. 加载数据 (假设数据包含‘面积’,‘房间数’,‘房龄’,‘价格’等列) df = pd.read_csv(data_path) print(f"数据形状: {df.shape}") # 2. 特征与标签分离 # 假设‘价格’是目标变量 X = df.drop(columns=['价格']) y = df['价格'] # 3. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=test_size, random_state=random_state ) # 4. 数值特征标准化 (这是一个简单的示例,实际中可能包含更多处理) numerical_features = X_train.select_dtypes(include=['int64', 'float64']).columns.tolist() scaler = StandardScaler() X_train[numerical_features] = scaler.fit_transform(X_train[numerical_features]) X_test[numerical_features] = scaler.transform(X_test[numerical_features]) # 5. 保存预处理对象,以便在服务时使用 os.makedirs('models', exist_ok=True) joblib.dump(scaler, 'models/scaler.pkl') print("预处理对象已保存至 models/scaler.pkl") return X_train, X_test, y_train, y_test, scaler if __name__ == "__main__": # 本地测试 X_train, X_test, y_train, y_test, scaler = load_and_preprocess_data('../data/raw_data.csv') print(f"训练集大小: {X_train.shape}, 测试集大小: {X_test.shape}")

4.3 集成 MLflow 的训练脚本

这是核心步骤,我们将训练过程与 MLflow 深度集成,实现实验跟踪和模型注册。

# 文件路径:src/train.py import mlflow import mlflow.sklearn from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score import argparse import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from src.data_preprocessing import load_and_preprocess_data def train_model(data_path: str, experiment_name: str = "House_Price_Prediction"): """ 使用 MLflow 跟踪实验,训练随机森林模型。 """ # 1. 设置 MLflow 实验 mlflow.set_experiment(experiment_name) # 2. 开始一个 MLflow Run with mlflow.start_run() as run: print(f"MLflow Run ID: {run.info.run_id}") # 3. 加载并预处理数据 X_train, X_test, y_train, y_test, scaler = load_and_preprocess_data(data_path) # 4. 定义模型参数 (可以将其记录为 MLflow 参数) n_estimators = 100 max_depth = 10 random_state = 42 # 5. 记录参数 mlflow.log_param("n_estimators", n_estimators) mlflow.log_param("max_depth", max_depth) mlflow.log_param("random_state", random_state) mlflow.log_param("data_path", data_path) # 6. 训练模型 model = RandomForestRegressor( n_estimators=n_estimators, max_depth=max_depth, random_state=random_state, n_jobs=-1 ) model.fit(X_train, y_train) # 7. 在测试集上评估模型 y_pred = model.predict(X_test) mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) # 8. 记录评估指标 mlflow.log_metric("mae", mae) mlflow.log_metric("mse", mse) mlflow.log_metric("r2_score", r2) print(f"评估结果 - MAE: {mae:.2f}, MSE: {mse:.2f}, R2: {r2:.4f}") # 9. 记录模型 (使用 MLflow 的 sklearn 集成) # 这里不仅保存模型,还记录了训练环境(conda.yaml) mlflow.sklearn.log_model( sk_model=model, artifact_path="random_forest_model", registered_model_name="house-price-rf-model" # 注册到模型注册表 ) print("模型已训练并记录到 MLflow。") # 10. (可选) 记录预处理对象 scaler 作为 artifact mlflow.log_artifact('models/scaler.pkl', artifact_path="preprocessor") return model, run.info.run_id if __name__ == "__main__": parser = argparse.ArgumentParser(description='Train a model with MLflow tracking.') parser.add_argument('--data-path', type=str, default='../data/raw_data.csv', help='Path to the training data CSV file.') parser.add_argument('--experiment-name', type=str, default='House_Price_Prediction', help='Name of the MLflow experiment.') args = parser.parse_args() train_model(args.data_path, args.experiment_name)

运行训练脚本:

# 确保在项目根目录 mlops-pipeline/ 下 python src/train.py --data-path ./data/raw_data.csv

运行后,启动 MLflow UI 查看实验结果:

mlflow ui --host 0.0.0.0 --port 5000

在浏览器中访问http://localhost:5000,你将看到实验记录、参数、指标和注册的模型。

4.4 构建模型服务 API

我们将使用 FastAPI 创建一个 REST API 来提供预测服务,并集成从 MLflow Model Registry 加载模型的功能。

# 文件路径:serve_model.py import mlflow.pyfunc import pandas as pd from fastapi import FastAPI, HTTPException from pydantic import BaseModel import joblib import os from typing import List # 定义请求体的数据模型 class PredictionRequest(BaseModel): # 根据你的特征定义字段,例如: area: float rooms: int age: float class PredictionResponse(BaseModel): prediction: float model_version: str # 初始化 FastAPI 应用 app = FastAPI(title="房价预测模型 API", version="1.0") # 全局变量,用于缓存加载的模型和预处理对象 MODEL = None SCALER = None MODEL_VERSION = None def load_production_model(model_name: str = "house-price-rf-model"): """ 从 MLflow Model Registry 加载标记为 ‘Production’ 的最新模型。 """ global MODEL, MODEL_VERSION try: # 获取生产环境的最新模型版本 client = mlflow.tracking.MlflowClient() model_version = client.get_latest_versions(model_name, stages=["Production"])[0] model_uri = f"models:/{model_name}/{model_version.version}" MODEL = mlflow.pyfunc.load_model(model_uri) MODEL_VERSION = model_version.version print(f"已加载生产模型: {model_name}, 版本: {MODEL_VERSION}") except Exception as e: print(f"加载生产模型失败: {e}") # 备选方案:从本地 mlruns 加载最后一次运行的模型 # model_uri = “./mlruns/你的实验ID/你的RunID/artifacts/random_forest_model” # MODEL = mlflow.pyfunc.load_model(model_uri) # MODEL_VERSION = “local_latest” def load_scaler(scaler_path: str = ‘models/scaler.pkl’): """加载预处理用的标准化器。""" global SCALER if os.path.exists(scaler_path): SCALER = joblib.load(scaler_path) print(f"已加载标准化器: {scaler_path}") else: print(f"警告: 未找到标准化器文件 {scaler_path}。假设输入数据已预处理。") SCALER = None @app.on_event("startup") async def startup_event(): """应用启动时加载模型和预处理器。""" load_production_model() load_scaler() @app.get("/") async def root(): return {"message": "房价预测模型服务已就绪", "model_version": MODEL_VERSION} @app.get("/health") async def health_check(): """健康检查端点。""" if MODEL is not None: return {"status": "healthy", "model_loaded": True} else: raise HTTPException(status_code=503, detail="Model not loaded") @app.post("/predict", response_model=PredictionResponse) async def predict(request: PredictionRequest): """接收特征数据,返回房价预测值。""" if MODEL is None: raise HTTPException(status_code=503, detail="Model is not loaded yet.") # 1. 将请求数据转换为 DataFrame input_dict = request.dict() input_df = pd.DataFrame([input_dict]) # 2. 应用预处理 (如果 SCALER 存在) if SCALER is not None: # 注意:确保输入 DataFrame 的列顺序与训练时一致 numerical_cols = SCALER.feature_names_in_ if hasattr(SCALER, ‘feature_names_in_’) else input_df.columns input_df[numerical_cols] = SCALER.transform(input_df[numerical_cols]) # 3. 进行预测 try: prediction = MODEL.predict(input_df)[0] except Exception as e: raise HTTPException(status_code=400, detail=f"Prediction failed: {str(e)}") # 4. 返回预测结果和模型版本 return PredictionResponse(prediction=float(prediction), model_version=str(MODEL_VERSION)) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)

4.5 容器化部署

为了确保服务环境的一致性,我们使用 Docker 进行容器化。

# 文件路径:docker/Dockerfile FROM python:3.9-slim WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY src/ ./src/ COPY serve_model.py . COPY models/ ./models/ # 包含 scaler.pkl # 暴露端口 EXPOSE 8000 # 启动命令 CMD ["uvicorn", "serve_model:app", "--host", "0.0.0.0", "--port", "8000"]

使用 Docker Compose 编排服务(可选,用于同时启动多个服务,如 MLflow UI 和模型 API):

# 文件路径:docker-compose.yml version: ‘3.8’ services: mlflow-ui: image: python:3.9-slim command: > bash -c “pip install mlflow && mlflow server --host 0.0.0.0 --port 5000 --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./mlruns” ports: - “5000:5000” volumes: - ./mlruns:/mlruns - ./mlflow.db:/mlflow.db networks: - mlops-net model-api: build: context: . dockerfile: docker/Dockerfile ports: - “8000:8000” environment: - MLFLOW_TRACKING_URI=http://mlflow-ui:5000 depends_on: - mlflow-ui networks: - mlops-net networks: mlops-net:

构建并启动服务:

# 在项目根目录下 docker-compose up --build

访问http://localhost:8000/docs查看自动生成的 API 文档并进行测试。

5. 常见问题与排查思路

在构建和运行 MLOps 流水线时,你可能会遇到以下典型问题。

问题现象常见原因解决思路
ModuleNotFoundError当运行训练脚本时1. 虚拟环境未激活。
2.requirements.txt未安装完全。
3. PYTHONPATH 未设置。
1. 确认并激活虚拟环境。
2. 运行pip install -r requirements.txt
3. 在脚本开头或运行前正确设置sys.path
MLflow UI 中看不到实验记录1. 跟踪 URI 未设置或设置错误。
2. 代码中未调用mlflow.start_run()
3. 日志存储路径权限问题。
1. 检查mlflow.set_tracking_uri()或环境变量MLFLOW_TRACKING_URI
2. 确保训练代码在with mlflow.start_run():块内执行。
3. 检查mlruns目录的读写权限。
模型 API 预测结果异常或报错1. 输入特征顺序或名称与训练时不一致。
2. 预处理步骤(如标准化)未在服务端应用。
3. 模型版本未正确加载(如加载了 Staging 版而非 Production 版)。
1. 在 API 中打印或记录输入数据,确保其结构与训练数据一致。
2. 确保scaler.pkl被正确加载并应用于输入数据。
3. 检查load_production_model函数,确认其从注册表加载了正确的模型阶段和版本。
Docker 容器构建失败1.Dockerfile中命令错误。
2. 依赖包版本冲突或网络问题。
3. 构建上下文文件缺失(如requirements.txt)。
1. 仔细检查Dockerfile语法和命令顺序。
2. 尝试在Dockerfile中使用pip install时指定国内镜像源。
3. 确保构建命令执行的目录包含所有必要的文件。
模型性能在生产环境中下降(概念漂移)1. 生产环境的数据分布与训练数据不同。
2. 业务逻辑或数据采集方式发生变化。
1. 实施监控:定期计算生产数据特征的统计量(如均值、方差)并与训练数据对比。
2. 设置自动化重训练流水线:当监控指标超过阈值时,触发新的训练流程。

6. 最佳实践与工程建议

将机器学习模型投入生产是一项系统工程,遵循以下最佳实践可以极大提升项目的成功率和可维护性。

6.1 版本控制一切

  • 代码:使用 Git,并通过mlflow.log_param(“git_commit”, commit_hash)将代码版本与实验关联。
  • 数据:对原始数据和预处理后的数据快照进行版本管理(可使用 DVC 等工具)。
  • 模型:严格使用 MLflow Model Registry 管理模型版本和生命周期(Staging, Production, Archived)。
  • 环境:使用conda.yamlrequirements.txt精确记录所有依赖,MLflow 会自动记录 Python 环境。

6.2 实现自动化流水线

  • 不要手动执行训练和部署。使用 Apache Airflow、Prefect 或 GitHub Actions 编排整个流程:
    1. 数据验证与预处理。
    2. 模型训练与超参数调优(可集成 Optuna 等)。
    3. 模型评估与验证(设定性能阈值)。
    4. 自动将验证通过的模型注册到 Staging 环境。
    5. 人工审批或自动化测试后,将模型提升至 Production。
    6. 自动部署新模型到预测服务。

6.3 建立全面的监控体系

  • 基础设施监控:CPU、内存、磁盘使用率,API 响应时间(P95, P99),错误率(4xx, 5xx)。
  • 模型输入监控:记录预测请求的特征数据,监控其分布(均值、标准差、缺失值比例)是否发生漂移。
  • 模型输出监控:对于分类问题,监控预测类别分布;对于回归问题,监控预测值的范围。
  • 业务指标监控:如果可能,将预测结果与后续的真实业务结果(如用户是否点击、实际房价)进行比对,计算线上准确率。

6.4 安全与合规

  • API 安全:为预测 API 添加认证(如 API Key、JWT Token)和速率限制。
  • 数据安全:确保传输中的数据和静态数据经过加密。避免在日志中记录敏感的个人身份信息(PII)。
  • 模型审计:保留所有模型版本、训练数据和参数,以满足合规性要求。

6.5 团队协作与文档

  • 清晰的实验命名:在 MLflow 中使用有意义的实验和运行名称。
  • 完善的文档:记录数据字典、特征工程逻辑、模型选择理由和部署流程。
  • 可复现性:确保任何同事都能通过一条命令(如make train)复现整个训练流程。

通过以上步骤,我们不仅复现了一个类似 Sapiom 平台核心功能的简易 MLOps 流水线,更重要的是,我们理解了每个环节背后的工程意义。从实验跟踪到容器化部署,再到监控与自动化,每一步都是为了解决模型生产化过程中的具体痛点。3500 万美元的融资验证了市场对这类一体化解决方案的渴望,而作为开发者,掌握这些构建块和最佳实践,将使你无论使用开源工具还是商业平台,都能游刃有余地管理和部署机器学习模型,真正让数据科学为业务创造持续、可靠的价值。

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

基于MCP协议构建简历查询API:让AI精准读取非结构化文档

1. 项目概述&#xff1a;当AI能读懂你的简历最近在折腾AI Agent开发的朋友&#xff0c;可能都绕不开一个核心痛点&#xff1a;如何让AI真正理解并高效利用我们手头那些非结构化的文档数据&#xff1f;比如&#xff0c;一份精心打磨的PDF简历。我们常常希望AI助手能像一位专业的…

作者头像 李华
网站建设 2026/8/9 3:36:57

Source Insight适配Monokai主题的配置指南

1. Monokai主题与Source Insight的适配背景Source Insight作为经典的代码阅读与分析工具&#xff0c;其默认的白色背景主题在长时间编码时容易造成视觉疲劳。Monokai作为一款源自Sublime Text的暗色主题&#xff0c;凭借其适中的对比度和科学的语法高亮配色&#xff0c;成为开发…

作者头像 李华
网站建设 2026/8/9 3:35:31

智能体能力体系升级:多模态记忆与检索技术解析

1. 项目概述&#xff1a;从“功能”到“能力”的范式跃迁最近在跟进一个智能体项目的迭代&#xff0c;团队内部讨论最激烈的&#xff0c;不是某个具体的功能点&#xff0c;而是一个听起来有点“虚”的词&#xff1a;能力。当产品更新日志里赫然写着“Skill 能力正式上线”时&am…

作者头像 李华
网站建设 2026/8/9 3:33:25

后端API接口设计原则与实践指南

1. 后端API接口设计核心原则后端API接口作为前后端交互的桥梁&#xff0c;其设计质量直接影响系统稳定性和开发效率。从业十年&#xff0c;我见过太多因API设计不当导致的联调噩梦。一个优秀的API接口应该像瑞士军刀——功能明确、结构简洁、使用可靠。1.1 契约优先的开发模式在…

作者头像 李华
网站建设 2026/8/9 3:31:54

从AI单点工具到智能工作流:Jeff Dean新动向揭示下一代AI应用范式

上周&#xff0c;当“Jeff Dean 离开谷歌”的消息在技术圈传开时&#xff0c;我的第一反应不是惊讶&#xff0c;而是好奇。不是好奇他为什么离开——功成名就后探索新方向&#xff0c;这在硅谷并不罕见。我好奇的是&#xff0c;他选择的下一个项目&#xff0c;那个名为“Discov…

作者头像 李华