基于FastAPI构建生成式AI服务:全流程实现与中间件集成

一、技术选型与架构设计

生成式AI服务的核心需求包括模型加载、请求处理、结果返回和系统监控。FastAPI作为现代Python Web框架,凭借其异步支持、自动文档生成和类型注解特性,成为构建AI服务的理想选择。

1.1 系统架构分层

典型架构分为四层:

  • 模型层:负责加载预训练模型(如LLM、扩散模型)
  • 服务层:实现API路由和业务逻辑
  • 中间件层:处理请求/响应的横切关注点
  • 基础设施层:提供日志、监控等支撑能力

1.2 技术组件选型

组件类型 推荐方案 优势说明
Web框架 FastAPI 0.100+ 异步支持,性能优异
模型加载 HuggingFace Transformers 统一接口,支持多种模型类型
序列化 Pydantic v2 类型安全的数据模型
日志系统 Python标准库logging + 结构化扩展 灵活配置,易于集成

二、基础服务实现

2.1 项目初始化

  1. # 创建项目目录结构
  2. mkdir fastapi-ai-service && cd fastapi-ai-service
  3. python -m venv venv
  4. source venv/bin/activate # Linux/macOS
  5. # venv\Scripts\activate # Windows
  6. pip install fastapi uvicorn transformers pydantic

2.2 核心服务代码

  1. # main.py
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. from transformers import pipeline
  5. app = FastAPI(
  6. title="生成式AI服务",
  7. description="基于FastAPI的模型服务API",
  8. version="1.0.0"
  9. )
  10. # 模型初始化(实际生产环境应延迟加载)
  11. text_generator = pipeline("text-generation", model="gpt2")
  12. class GenerationRequest(BaseModel):
  13. prompt: str
  14. max_length: int = 50
  15. num_return_sequences: int = 1
  16. @app.post("/generate")
  17. async def generate_text(request: GenerationRequest):
  18. results = text_generator(
  19. request.prompt,
  20. max_length=request.max_length,
  21. num_return_sequences=request.num_return_sequences
  22. )
  23. return {"results": results}

2.3 启动服务

  1. uvicorn main:app --reload --host 0.0.0.0 --port 8000

访问 http://localhost:8000/docs 可查看自动生成的API文档。

三、企业级功能增强

3.1 请求日志中间件

  1. # middleware.py
  2. from fastapi import Request
  3. from datetime import datetime
  4. import logging
  5. logger = logging.getLogger("ai_service")
  6. logging.basicConfig(
  7. level=logging.INFO,
  8. format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
  9. handlers=[
  10. logging.FileHandler("ai_requests.log"),
  11. logging.StreamHandler()
  12. ]
  13. )
  14. async def logging_middleware(request: Request, call_next):
  15. start_time = datetime.utcnow()
  16. response = await call_next(request)
  17. process_time = (datetime.utcnow() - start_time).total_seconds()
  18. logger.info(
  19. f"Request: {request.method} {request.url}\n"
  20. f"Client: {request.client.host if request.client else 'unknown'}\n"
  21. f"Duration: {process_time:.4f}s\n"
  22. f"Status: {response.status_code}"
  23. )
  24. return response

main.py中添加中间件:

  1. app.middleware("http")(logging_middleware)

3.2 性能监控中间件

  1. # metrics.py
  2. from prometheus_client import Counter, Histogram, generate_latest
  3. from fastapi import Response, Request
  4. from fastapi.responses import PlainTextResponse
  5. REQUEST_COUNT = Counter(
  6. 'ai_requests_total',
  7. 'Total AI Requests',
  8. ['method', 'endpoint']
  9. )
  10. REQUEST_LATENCY = Histogram(
  11. 'ai_request_latency_seconds',
  12. 'AI Request latency',
  13. ['method', 'endpoint']
  14. )
  15. async def metrics_middleware(request: Request, call_next):
  16. with REQUEST_LATENCY.labels(request.method, request.url.path).time():
  17. response = await call_next(request)
  18. REQUEST_COUNT.labels(request.method, request.url.path).inc()
  19. return response
  20. @app.get("/metrics")
  21. async def metrics():
  22. return PlainTextResponse(generate_latest())

3.3 模型热加载机制

  1. # model_manager.py
  2. from transformers import AutoModelForCausalLM, AutoTokenizer
  3. from typing import Optional
  4. import threading
  5. class ModelManager:
  6. def __init__(self):
  7. self._model: Optional = None
  8. self._lock = threading.Lock()
  9. self._reload_flag = False
  10. def load_model(self, model_name: str):
  11. with self._lock:
  12. tokenizer = AutoTokenizer.from_pretrained(model_name)
  13. model = AutoModelForCausalLM.from_pretrained(model_name)
  14. self._model = {
  15. 'tokenizer': tokenizer,
  16. 'model': model
  17. }
  18. def get_model(self):
  19. with self._lock:
  20. if self._reload_flag:
  21. # 这里可以添加模型重新加载逻辑
  22. self._reload_flag = False
  23. return self._model

四、生产环境部署建议

4.1 容器化部署

  1. # Dockerfile
  2. FROM python:3.10-slim
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install --no-cache-dir -r requirements.txt
  6. COPY . .
  7. CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

4.2 水平扩展方案

  1. 负载均衡:使用Nginx或行业常见技术方案实现反向代理
  2. 无状态设计:将模型文件存储在共享存储系统
  3. 进程管理:使用Gunicorn + Uvicorn工作模式
    1. gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b :8000 main:app

4.3 监控告警体系

  1. 日志管理:集成对象存储实现日志归档
  2. 指标监控:通过消息队列收集Prometheus指标
  3. 告警规则:设置响应时间、错误率等阈值告警

五、最佳实践总结

  1. 模型加载优化

    • 使用torch.cuda.amp进行混合精度推理
    • 实现模型预热机制避免首次请求延迟
  2. API设计原则

    • 版本控制通过URL路径实现(如/v1/generate
    • 为不同模型类型设计专用端点
  3. 安全考虑

    • 实现请求速率限制
    • 对输入内容进行敏感词过滤
    • 使用HTTPS加密通信
  4. 成本优化

    • 根据负载动态调整工作进程数
    • 实现模型缓存机制减少重复加载

通过上述架构设计和实现方案,开发者可以快速构建出具备企业级特性的生成式AI服务。该方案不仅支持多种主流模型类型,还通过完善的中间件体系实现了请求追踪、性能监控等关键功能,为后续的模型迭代和服务扩展奠定了坚实基础。