构建现实世界中有效的AI系统

在本文中,我将分析我在构建真实人工智能项目过程中遇到的 8 个难题(最终我找到了答案)。每个部分都包含实用步骤、完整的代码示例,以及我希望有人早点告诉我的经验教训。

构建现实世界中有效的AI系统

大多数人工智能教程都止步于真正的工作开始之处。它们只展示了如何加载模型、运行推理,甚至对小型数据集进行微调——但却很少讨论在实际系统中部署该模型时会发生什么。而这才是真正的挑战所在。

在本文中,我将分析我在构建真实人工智能项目过程中遇到的 8 个难题(最终我找到了答案)。每个部分都包含实用步骤、完整的代码示例,以及我希望有人早点告诉我的经验教训。

1、搭建高效的开发环境

刚开始的时候,我浪费了好几个小时来安装和重新安装库。解决办法是什么?从第一天开始就将你的环境容器化。

# Dockerfile for AI projects
FROM python:3.11-slim

RUN apt-get update && apt-get install -y \
    build-essential \
    git \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

为什么这很重要:可重复性。如果你的环境不可重复,那么当你从开发环境转移到生产环境时,你的模型就会崩溃。

2、数据清理和预处理

模型失败并非因为本身质量差,而是因为数据质量差。在我参与的 80% 项目中,最大的收益来自于数据清理,而不是花哨的架构。

import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("customer_data.csv")

# drop duplicates
df = df.drop_duplicates()

# handle missing values
df = df.fillna(method="ffill")

# encode categorical values
df = pd.get_dummies(df, columns=["city", "gender"])

# split data
train, test = train_test_split(df, test_size=0.2, random_state=42)

专业提示:务必可视化类别分布。不平衡的数据会悄无声息地破坏你的模型。

3、首先构建基线模型

在尝试最新的 Transformer 架构之前,务必先从一个简单的基线模型开始。你会惊讶地发现,它通常“足够好”。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

X_train = train.drop("label", axis=1)
y_train = train["label"]

X_test = test.drop("label", axis=1)
y_test = test["label"]

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

这虽然不怎么引人注目,但它能给你一个基准。只有这样,你才应该引入深度学习。

4、使用 MLflow 进行实验跟踪

如果您不跟踪实验,那么您就只能猜测了。像 MLflow 这样的工具可以防止您在尝试了 30 种超参数组合却忘记了哪种组合有效时陷入混乱。

pip install mlflow
import mlflow
import mlflow.sklearn

with mlflow.start_run():
    model = RandomForestClassifier(n_estimators=200)
    model.fit(X_train, y_train)
    mlflow.sklearn.log_model(model, "model")
    mlflow.log_param("n_estimators", 200)
    mlflow.log_metric("accuracy", model.score(X_test, y_test))

结果:每次运行都会记录指标、参数和结果。不再需要用便签记录超参数。

5、明智地使用预训练模型

微调可能成本高昂。通常,从预训练模型中提取特征就足够了。

from transformers import AutoTokenizer, AutoModel
import torch

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased")

inputs = tokenizer("AI is transforming workflows", return_tensors="pt")
with torch.no_grad():
    embeddings = model(**inputs).last_hidden_state.mean(dim=1)

print(embeddings.shape)  # (1, 768)

关键洞察:除非拥有大量高质量的数据,否则不要进行全面训练。请使用迁移学习。

6、使用 FastAPI 提供模型服务

如果没有人可以访问,您的模型就毫无用处。FastAPI 可以在几分钟内将模型转换为 API。

pip install fastapi uvicorn
from fastapi import FastAPI
import joblib

app = FastAPI()
model = joblib.load("model.pkl")

@app.post("/predict")
def predict(features: dict):
    prediction = model.predict([list(features.values())])
    return {"prediction": prediction.tolist()}

运行服务器:

uvicorn main:app --reload

现在你的模型是一个 HTTP 端点。简单、强大,并且可以投入生产。

7、生产环境中的监控

我第一次部署模型时,以为已经完成了。两周后,准确率下降了 20%。原因是什么?数据漂移。

from evidently.report import Report
from evidently.metric_preset import DataDriftPreset

report = Report(metrics=[DataDriftPreset()])
report.run(reference_data=train, current_data=test)
report.save_html("report.html")

经验教训:模型不会突然失效,它们会缓慢退化。监控并非可有可无。

8、使用 Gradio 构建用户界面

你的队友不会运行 Python 脚本,他们想要一个按钮。Gradio 来了。

pip install gradio
import gradio as gr
import joblib

model = joblib.load("model.pkl")

def predict(input1, input2):
    return model.predict([[input1, input2]])[0]

demo = gr.Interface(fn=predict, inputs=["number", "number"], outputs="label")
demo.launch()

现在任何人都可以通过简洁的 Web 界面使用你的模型。

9、结束语

经过多年的 AI 系统构建,我发现一个残酷的事实:最难的不是训练模型,而是围绕模型的一切。数据管道、监控、部署、可用性——项目生死攸关。

值得铭记的名言:“业余爱好者谈论模型,专业人士谈论数据管道。”

如果你想在人工智能领域更上一层楼,那就别再纠结于架构,开始掌握自动化、部署和监控。这才是交付真实系统的方法。


原文链接:Building AI Systems That Actually Work in the Real World

汇智网翻译整理,转载请标明出处