在本地跑通一个AI应用的Demo和把它部署到生产环境稳定运行,中间差着一整条鸿沟。Demo只需要关心"能不能跑",生产要考虑"跑得稳不稳、安不安全、出问题能不能快速恢复";
这篇文章是一个上线检查清单,每一条都是踩过坑之后才加上去的;
配置管理
用环境变量管理所有配置,不同环境用不同的.env文件:
import os
class Config:
MODEL_NAME = os.getenv("MODEL_NAME", "deepseek-r1:7b")
LLM_BASE_URL = os.getenv("LLM_BASE_URL", "http://localhost:11434/v1")
MAX_TOKENS = int(os.getenv("MAX_TOKENS", "2048"))
REQUEST_TIMEOUT = int(os.getenv("REQUEST_TIMEOUT", "60"))
DATABASE_URL = os.getenv("DATABASE_URL")
API_KEY = os.getenv("API_KEY")
CORS_ORIGINS = os.getenv("CORS_ORIGINS", "").split(",")
敏感信息(数据库密码、API密钥)不要写在代码里,也不要用.env文件(容易被提交到Git)。用密钥管理服务(Vault、AWS Secrets Manager、K8s Secrets)。
认证和限流
生产环境的API必须有认证。API Key验证是最简单的方式——从请求头里取Bearer token,和数据库里的合法Key对比;
限流用令牌桶算法,按IP或按用户限制每分钟请求数。大模型推理的成本和请求量直接挂钩,不限流就意味着有人可以刷爆你的预算;
错误处理和降级
AI服务的错误处理比传统Web服务复杂,因为除了网络错误还有模型本身的错误:
import asyncio
async def safe_chat(messages, primary_backend, fallback_backend):
try:
return await asyncio.wait_for(
primary_backend.chat(messages),
timeout=30
)
except asyncio.TimeoutError:
logger.warning("主模型超时,降级到备用模型")
return await fallback_backend.chat(messages)
except Exception as e:
logger.error(f"推理失败: {e}")
return {"error": "服务暂时不可用,请稍后重试"}
降级策略:模型超时→切换到备用模型或返回缓存结果;模型不可用→返回静态的错误提示而不是500页面;输出质量异常→对输出做基本检查(长度、格式),不合理的输出不返回。
日志
关键日志点:每次请求的输入摘要(不要记完整输入,可能有隐私)、模型名和参数、推理耗时、Token用量、错误信息;
import logging, time
logger = logging.getLogger("ai-service")
async def logged_chat(request):
start = time.time()
logger.info(f"Request: model={request.model}, msgs={len(request.messages)}")
try:
response = await backend.chat(request)
elapsed = time.time() - start
logger.info(f"Done: {elapsed:.2f}s, tokens={response.usage}")
return response
except Exception as e:
elapsed = time.time() - start
logger.error(f"Failed: {elapsed:.2f}s, error={e}")
raise
CI/CD流水线
name: Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install -r requirements.txt
- run: pytest tests/
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t ai-app:${{ github.sha }} .
- run: docker push registry/ai-app:${{ github.sha }}
- run: kubectl set image deploy/ai-app app=registry/ai-app:${{ github.sha }}
关键原则:测试不过不能部署;镜像tag用commit SHA而不是latest,方便回滚;部署后自动跑冒烟测试验证核心功能。
性能优化
响应缓存:相同或高度相似的问题缓存结果。用Redis存,设置合理的TTL;
请求合并:多个短请求可以合并成一个batch处理,提升GPU利用率;
异步处理:非实时需求的任务(比如批量文档分析)用消息队列异步处理;
上线检查清单
在点"部署"之前过一遍:API认证配了吗?限流配了吗?超时设了吗?日志全吗?监控有吗?告警有吗?数据库有备份吗?有回滚方案吗?压力测了吗?这九个问题,任何一个回答"没有"都不应该上线。
写在最后
Demo到生产的距离不是"再加几个功能",而是"把工程化体系补齐"。环境配置、认证限流、错误处理、监控告警、CI/CD,每一个都是必修课,没有捷径。