上一篇 下一篇 分享链接 返回 返回顶部

从 Demo 到上线:一套可直接落地的 AI 工具生产部署实战指南

发布人:慈云数据-客服中心 发布时间:24小时前 阅读量:6

AI工具 生产环境部署指南|附源码

随着大模型、智能体(Agent)、RAG 检索增强生成、AI 编程助手等技术快速落地,越来越多团队开始把 AI 工具从“演示 Demo”推进到“生产环境”。然而,AI 工具的生产部署并不只是把一个接口跑起来那么简单,它涉及模型调用、鉴权、限流、日志、监控、异步任务、数据安全、成本控制、灰度发布、故障降级等一系列工程问题。

本文将以一个 AI 文本生成工具 为例,完整介绍从项目架构设计、接口开发、配置管理、Docker 化、Nginx 反向代理、生产环境部署、日志监控到安全加固的全过程,并附带一套可直接改造使用的源码示例。


一、为什么 AI 工具部署到生产环境更复杂?

很多 AI 项目在本地运行时非常简单:

python app.py

或者:

npm run dev

本地调通接口后,调用大模型 API 返回结果,看起来就完成了。但真正上线后,问题会很快出现:

  • 用户并发请求过多,接口响应变慢;
  • 大模型接口偶发超时,导致服务不可用;
  • API Key 泄露或被滥用,造成高额账单;
  • 没有日志,线上问题难以排查;
  • 没有限流,恶意请求会拖垮服务;
  • 没有健康检查,容器挂了无法自动恢复;
  • Prompt、上下文、用户输入没有隔离,存在安全风险;
  • 多环境配置混乱,开发、测试、生产互相污染;
  • 没有成本统计,无法知道每个用户消耗了多少 Token。

因此,生产级 AI 工具至少需要考虑以下能力:

能力 说明
稳定服务 支持异常捕获、超时控制、重试机制
安全鉴权 避免接口裸奔,保护模型调用权限
限流控制 防止接口被刷爆或恶意滥用
日志追踪 记录请求、响应、错误、耗时
配置隔离 开发、测试、生产配置分离
容器部署 使用 Docker 保证环境一致性
反向代理 使用 Nginx 统一入口、HTTPS、负载均衡
监控告警 及时发现服务异常
成本控制 控制 Token、并发、频率、调用额度
故障降级 模型不可用时返回友好提示

二、项目目标

本文示例项目是一个基于 Python FastAPI 的 AI 工具服务,提供一个文本生成接口。

功能包括:

  1. 用户通过 HTTP API 提交问题;
  2. 后端调用大模型接口生成回答;
  3. 支持 API Token 鉴权;
  4. 支持请求限流;
  5. 支持环境变量配置;
  6. 支持 Docker 部署;
  7. 支持 Nginx 反向代理;
  8. 支持健康检查;
  9. 支持日志输出;
  10. 支持生产环境启动脚本。

为了方便理解,本文采用通用的 OpenAI-Compatible 接口风格。如果你使用的是 OpenAI、通义千问、智谱、DeepSeek、月之暗面、火山方舟或私有化大模型,只需要调整模型接口地址和模型名称即可。


三、推荐生产环境架构

一个典型的 AI 工具生产部署架构如下:

用户浏览器 / 第三方系统
          |
          v
      CDN / WAF
          |
          v
       Nginx
          |
          v
   FastAPI AI 服务
          |
          v
 大模型 API / 私有模型服务
          |
          v
   日志、监控、数据库、缓存

如果系统规模进一步扩大,可以演进为:

客户端
  |
API Gateway
  |
认证服务 ---- 用户系统
  |
AI 应用服务 ---- Redis 限流
  |
任务队列 Celery / RabbitMQ
  |
模型调用服务
  |
向量数据库 / 业务数据库 / 日志系统

对于初创项目或内部工具,第一种架构已经足够使用。对于商业化产品,则建议从一开始就将鉴权、限流、日志、成本统计设计进去。


四、项目目录结构

下面是本文示例项目的目录结构:

ai-tool-production/
├── app/
│   ├── __init__.py
│   ├── main.py              # FastAPI 入口
│   ├── config.py            # 配置管理
│   ├── schemas.py           # 请求与响应模型
│   ├── security.py          # 鉴权逻辑
│   ├── limiter.py           # 简易限流
│   ├── ai_client.py         # 大模型调用封装
│   └── logger.py            # 日志配置
├── Dockerfile
├── docker-compose.yml
├── nginx.conf
├── requirements.txt
├── .env.example
└── README.md

该结构的核心思想是:
接口层、配置层、安全层、模型调用层、日志层分离。

这样做的好处是:

  • 后续更换模型厂商更容易;
  • 增加新接口不会影响底层调用;
  • 测试和生产配置可以隔离;
  • 出现问题时更容易定位;
  • 代码更符合生产项目规范。

五、环境变量配置

生产环境中,绝对不要把 API Key、数据库密码等敏感信息写死在代码里。推荐统一使用环境变量。

创建 .env.example

APP_NAME=AI Tool Service
APP_ENV=production
APP_HOST=0.0.0.0
APP_PORT=8000

API_AUTH_TOKEN=change-this-token

LLM_BASE_URL=https://api.openai.com/v1
LLM_API_KEY=your-llm-api-key
LLM_MODEL=gpt-4o-mini

REQUEST_TIMEOUT=30
RATE_LIMIT_PER_MINUTE=20

LOG_LEVEL=INFO

线上部署时复制为 .env

cp .env.example .env

然后修改真实配置。

注意:

  • .env 文件不要提交到 Git;
  • 生产 API Key 应定期轮换;
  • 不同环境使用不同 Key;
  • 对高价值接口必须设置访问鉴权;
  • 如果有用户体系,建议按用户维度统计调用量。

六、安装依赖

requirements.txt 内容如下:

fastapi==0.115.6
uvicorn[standard]==0.34.0
pydantic==2.10.4
pydantic-settings==2.7.0
httpx==0.28.1
python-dotenv==1.0.1

安装依赖:

pip install -r requirements.txt

七、配置管理源码

app/config.py

from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    app_name: str = "AI Tool Service"
    app_env: str = "development"
    app_host: str = "0.0.0.0"
    app_port: int = 8000

    api_auth_token: str

    llm_base_url: str
    llm_api_key: str
    llm_model: str = "gpt-4o-mini"

    request_timeout: int = 30
    rate_limit_per_minute: int = 20

    log_level: str = "INFO"

    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"


settings = Settings()

这里使用 pydantic-settings 自动读取环境变量。这样代码中不需要关心配置来自哪里,本地和线上只需切换 .env 即可。


八、日志配置源码

app/logger.py

import logging
import sys

from app.config import settings


def setup_logger():
    logger = logging.getLogger("ai-tool")
    logger.setLevel(settings.log_level.upper())

    formatter = logging.Formatter(
        fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )

    handler = logging.StreamHandler(sys.stdout)
    handler.setFormatter(formatter)

    if not logger.handlers:
        logger.addHandler(handler)

    return logger


logger = setup_logger()

生产环境中建议将日志输出到标准输出,然后由 Docker、Kubernetes 或日志采集系统统一收集,例如 Loki、ELK、Datadog、阿里云日志服务等。


九、请求与响应模型

app/schemas.py

from pydantic import BaseModel, Field
from typing import Optional


class GenerateRequest(BaseModel):
    prompt: str = Field(..., min_length=1, max_length=4000, description="用户输入的问题")
    temperature: Optional[float] = Field(0.7, ge=0, le=2)
    max_tokens: Optional[int] = Field(1024, ge=1, le=4096)


class GenerateResponse(BaseModel):
    answer: str
    model: str
    usage: dict | None = None


class ErrorResponse(BaseModel):
    detail: str

这里需要特别注意:

  1. prompt 设置最大长度,防止用户提交超大文本;
  2. max_tokens 设置上限,防止成本失控;
  3. temperature 设置范围,避免非法参数;
  4. 返回结构统一,方便前端或第三方调用。

十、API 鉴权源码

app/security.py

from fastapi import Header, HTTPException, status

from app.config import settings


async def verify_token(authorization: str | None = Header(default=None)):
    if not authorization:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Missing Authorization header",
        )

    prefix = "Bearer "
    if not authorization.startswith(prefix):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid Authorization format",
        )

    token = authorization[len(prefix):]

    if token != settings.api_auth_token:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Invalid API token",
        )

    return True

调用接口时需要带上 Header:

Authorization: Bearer your-token

虽然这个示例使用的是固定 Token,但生产环境中可以升级为:

  • JWT;
  • OAuth2;
  • API Key 管理系统;
  • 按用户分配 Key;
  • 按租户设置额度;
  • Key 绑定 IP 白名单;
  • Key 绑定调用频率和权限范围。

十一、简易限流源码

app/limiter.py

import time
from collections import defaultdict, deque

from fastapi import HTTPException, Request, status

from app.config import settings


request_records = defaultdict(deque)


async def rate_limit(request: Request):
    client_ip = request.client.host if request.client else "unknown"
    now = time.time()
    window = 60
    limit = settings.rate_limit_per_minute

    records = request_records[client_ip]

    while records and records[0] <= now - window:
        records.popleft()

    if len(records) >= limit:
        raise HTTPException(
            status_code=status.HTTP_429_TOO_MANY_REQUESTS,
            detail="Too many requests, please try again later",
        )

    records.append(now)
    return True

这是一个内存级限流器,适合单实例、小规模服务。生产集群环境建议使用 Redis 实现分布式限流,否则每个实例都有自己的计数,无法做到全局限制。

Redis 限流可以按以下维度设计:

  • IP 限流;
  • 用户 ID 限流;
  • API Key 限流;
  • 接口路径限流;
  • Token 消耗限流;
  • 租户级额度限制。

十二、大模型调用封装源码

app/ai_client.py

import httpx

from app.config import settings
from app.logger import logger


class AIClient:
    def __init__(self):
        self.base_url = settings.llm_base_url.rstrip("/")
        self.api_key = settings.llm_api_key
        self.model = settings.llm_model
        self.timeout = settings.request_timeout

    async def generate(
        self,
        prompt: str,
        temperature: float = 0.7,
        max_tokens: int = 1024,
    ):
        url = f"{self.base_url}/chat/completions"

        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
        }

        payload = {
            "model": self.model,
            "messages": [
                {
                    "role": "system",
                    "content": "你是一个专业、严谨、友好的 AI 助手。",
                },
                {
                    "role": "user",
                    "content": prompt,
                },
            ],
            "temperature": temperature,
            "max_tokens": max_tokens,
        }

        try:
            async with httpx.AsyncClient(timeout=self.timeout) as client:
                response = await client.post(url, headers=headers, json=payload)
                response.raise_for_status()
                data = response.json()

            answer = data["choices"][0]["message"]["content"]

            usage = data.get("usage")

            return {
                "answer": answer,
                "model": self.model,
                "usage": usage,
            }

        except httpx.TimeoutException:
            logger.error("LLM request timeout")
            raise RuntimeError("AI service timeout")

        except httpx.HTTPStatusError as e:
            logger.error(f"LLM HTTP error: {e.response.status_code} {e.response.text}")
            raise RuntimeError("AI service returned an error")

        except Exception as e:
            logger.exception(f"Unexpected AI client error: {str(e)}")
            raise RuntimeError("AI service unavailable")


ai_client = AIClient()

这里封装模型调用有几个关键点:

  1. 不在接口层直接请求大模型;
  2. 统一设置超时时间;
  3. 统一处理模型错误;
  4. 统一记录异常日志;
  5. 统一适配返回格式。

未来如果要切换模型,只需要修改 AIClient,接口层几乎不用变。


十三、FastAPI 主程序源码

app/main.py

import time

from fastapi import Depends, FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse

from app.ai_client import ai_client
from app.config import settings
from app.limiter import rate_limit
from app.logger import logger
from app.schemas import GenerateRequest, GenerateResponse
from app.security import verify_token


app = FastAPI(
    title=settings.app_name,
    version="1.0.0",
    docs_url="/docs" if settings.app_env != "production" else None,
    redoc_url="/redoc" if settings.app_env != "production" else None,
)


@app.middleware("http")
async def request_log_middleware(request: Request, call_next):
    start_time = time.time()

    try:
        response = await call_next(request)
    except Exception as e:
        logger.exception(f"Unhandled error: {str(e)}")
        return JSONResponse(
            status_code=500,
            content={"detail": "Internal server error"},
        )

    cost = round((time.time() - start_time) * 1000, 2)
    logger.info(
        f"{request.method} {request.url.path} "
        f"status={response.status_code} cost={cost}ms"
    )

    return response


@app.get("/health")
async def health_check():
    return {
        "status": "ok",
        "service": settings.app_name,
        "env": settings.app_env,
    }


@app.post(
    "/api/v1/generate",
    response_model=GenerateResponse,
    dependencies=[
        Depends(verify_token),
        Depends(rate_limit),
    ],
)
async def generate_text(payload: GenerateRequest):
    try:
        result = await ai_client.generate(
            prompt=payload.prompt,
            temperature=payload.temperature,
            max_tokens=payload.max_tokens,
        )
        return result

    except RuntimeError as e:
        raise HTTPException(status_code=503, detail=str(e))

这个主程序包含:

  • 请求日志中间件;
  • 统一异常兜底;
  • 健康检查接口;
  • 文本生成接口;
  • 鉴权依赖;
  • 限流依赖;
  • 生产环境关闭接口文档。

关闭生产环境 /docs 是一个比较推荐的做法。虽然接口文档很方便,但公开暴露后可能会增加被扫描和攻击的风险。


十四、本地运行测试

启动服务:

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

健康检查:

curl http://localhost:8000/health

返回:

{
  "status": "ok",
  "service": "AI Tool Service",
  "env": "development"
}

调用生成接口:

curl -X POST http://localhost:8000/api/v1/generate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer change-this-token" \
  -d '{
    "prompt": "请用三句话介绍什么是 RAG。",
    "temperature": 0.7,
    "max_tokens": 500
  }'

成功返回示例:

{
  "answer": "RAG,即检索增强生成,是一种将外部知识检索与大模型生成能力结合的技术。它会先从知识库中查找与问题相关的内容,再将这些内容作为上下文提供给大模型生成答案。相比单纯依赖模型自身参数,RAG 可以提升回答的准确性、实时性和可追溯性。",
  "model": "gpt-4o-mini",
  "usage": {
    "prompt_tokens": 45,
    "completion_tokens": 82,
    "total_tokens": 127
  }
}

十五、Dockerfile

生产环境建议使用 Docker 部署,确保本地、测试、生产环境一致。

Dockerfile

FROM python:3.11-slim

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc curl \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .

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

COPY app ./app

EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]

说明:

  • python:3.11-slim 镜像体积较小;
  • PYTHONUNBUFFERED=1 便于实时输出日志;
  • --workers 2 可根据 CPU 核数调整;
  • 不要把 .env 打进镜像,配置应在运行时注入。

构建镜像:

docker build -t ai-tool-service:1.0.0 .

运行容器:

docker run -d \
  --name ai-tool-service \
  --env-file .env \
  -p 8000:8000 \
  ai-tool-service:1.0.0

查看日志:

docker logs -f ai-tool-service

十六、Docker Compose 部署

docker-compose.yml

version: "3.9"

services:
  ai-tool-service:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ai-tool-service
    env_file:
      - .env
    ports:
      - "8000:8000"
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 5s
      retries: 3

启动:

docker compose up -d

停止:

docker compose down

重新构建:

docker compose up -d --build

restart: always 可以保证容器异常退出后自动重启,但这并不等于服务完全高可用。真正的高可用还需要多实例部署、负载均衡、健康检查和告警系统。


十七、Nginx 反向代理配置

生产环境不建议直接暴露 Uvicorn 服务端口,而是通过 Nginx 统一代理。

nginx.conf 示例:

server {
    listen 80;
    server_name ai.example.com;

    client_max_body_size 2m;

    location / {
        proxy_pass http://127.0.0.1:8000;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 10s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

如果大模型响应时间较长,需要适当增大 proxy_read_timeout。但不建议无限增大,否则会让大量慢请求占用连接资源。

配置完成后测试:

nginx -t

重载:

systemctl reload nginx

建议上线时使用 HTTPS,可以通过 Certbot 配置免费证书:

certbot --nginx -d ai.example.com

十八、生产环境部署流程

一个相对规范的部署流程如下:

# 1. 拉取代码
git pull origin main

# 2. 检查环境变量
cat .env

# 3. 构建镜像
docker compose build

# 4. 启动服务
docker compose up -d

# 5. 查看容器状态
docker ps

# 6. 查看日志
docker logs -f ai-tool-service

# 7. 健康检查
curl http://127.0.0.1:8000/health

# 8. 通过域名测试
curl https://ai.example.com/health

如果是团队协作,建议使用 CI/CD,例如:

  • GitHub Actions;
  • GitLab CI;
  • Jenkins;
  • Drone;
  • Argo CD。

典型 CI/CD 流程:

代码提交
  |
自动测试
  |
构建 Docker 镜像
  |
推送镜像仓库
  |
部署到测试环境
  |
人工确认或自动审批
  |
灰度发布到生产环境

十九、上线前检查清单

AI 工具上线前,建议逐项检查:

1. 配置安全

  • [ ] .env 未提交到 Git;
  • [ ] 生产 API Key 已单独配置;
  • [ ] API Token 足够复杂;
  • [ ] 关闭生产环境 /docs
  • [ ] Nginx 开启 HTTPS;
  • [ ] 服务器安全组只开放必要端口。

2. 接口安全

  • [ ] 所有敏感接口都有鉴权;
  • [ ] 设置请求体大小限制;
  • [ ] 设置 Prompt 长度限制;
  • [ ] 设置 max_tokens 上限;
  • [ ] 设置接口限流;
  • [ ] 对用户输入做必要过滤或审计。

3. 稳定性

  • [ ] 大模型调用设置超时;
  • [ ] 捕获模型异常;
  • [ ] 容器配置自动重启;
  • [ ] 提供健康检查接口;
  • [ ] 日志可查询;
  • [ ] 关键错误有告警。

4. 成本控制

  • [ ] 限制单次最大 Token;
  • [ ] 限制用户调用频率;
  • [ ] 记录 usage;
  • [ ] 设置月度预算告警;
  • [ ] 针对异常调用可快速封禁 Key。

5. 可维护性

  • [ ] 代码结构清晰;
  • [ ] 配置集中管理;
  • [ ] 模型调用封装独立;
  • [ ] 部署文档完整;
  • [ ] 具备回滚方案。

二十、生产环境常见问题与解决方案

问题一:模型接口偶发超时

原因可能是:

  • 模型服务繁忙;
  • 网络不稳定;
  • 用户输入过长;
  • 生成内容过多。

解决方案:

  • 设置合理超时时间;
  • 降低 max_tokens
  • 增加失败重试,但不要无限重试;
  • 对长任务改为异步任务;
  • 前端增加等待提示。

问题二:接口被恶意刷请求

解决方案:

  • 加 API Token;
  • 使用 Nginx 限流;
  • 使用 Redis 分布式限流;
  • 接入 WAF;
  • 对异常 IP 拉黑;
  • 对用户维度设置额度。

Nginx 简单限流示例:

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

    server {
        location /api/ {
            limit_req zone=api_limit burst=10 nodelay;
            proxy_pass http://127.0.0.1:8000;
        }
    }
}

问题三:成本突然升高

常见原因:

  • API Key 泄露;
  • 没有限流;
  • 某个用户大量调用;
  • Prompt 过长;
  • max_tokens 设置过高;
  • 代码异常循环调用模型。

解决方案:

  • 立即轮换 Key;
  • 查看访问日志;
  • 增加 Token 统计;
  • 设置用户额度;
  • 对调用异常用户进行封禁;
  • 接入账单告警。

问题四:回答质量不稳定

解决方案:

  • 优化 system prompt;
  • 降低 temperature;
  • 增加结构化输出约束;
  • 对高价值场景使用更强模型;
  • 对知识类问答使用 RAG;
  • 添加输出校验与后处理。

二十一、生产增强建议

本文示例适合小型生产服务,如果要面向大量用户,还可以继续增强。

1. 引入 Redis

用于:

  • 分布式限流;
  • 缓存常见问题;
  • 保存会话上下文;
  • 实现任务队列状态;
  • 防止重复请求。

2. 引入数据库

用于:

  • 用户管理;
  • API Key 管理;
  • 调用记录;
  • Token 消耗统计;
  • 账单统计;
  • 审计日志。

3. 引入异步任务

对于耗时较长的 AI 任务,例如:

  • 长文总结;
  • 批量文档分析;
  • 图片生成;
  • 视频分析;
  • 多轮 Agent 执行。

建议使用:

  • Celery;
  • Dramatiq;
  • RQ;
  • RabbitMQ;
  • Kafka。

4. 引入可观测性

生产 AI 服务应关注:

  • QPS;
  • 平均响应时间;
  • P95/P99 延迟;
  • 错误率;
  • 模型超时率;
  • Token 消耗;
  • 单用户调用量;
  • 模型成本趋势。

可选工具:

  • Prometheus;
  • Grafana;
  • Loki;
  • ELK;
  • OpenTelemetry;
  • Sentry。

5. 引入灰度发布

AI 工具非常适合灰度发布,因为 Prompt、模型和参数调整都可能影响结果。

可以按以下方式灰度:

  • 按用户 ID 灰度;
  • 按租户灰度;
  • 按请求比例灰度;
  • 按模型版本灰度;
  • 按 Prompt 版本灰度。

二十二、源码汇总

为了方便复制,下面给出核心文件清单。

ai-tool-production/
├── app/
│   ├── main.py
│   ├── config.py
│   ├── schemas.py
│   ├── security.py
│   ├── limiter.py
│   ├── ai_client.py
│   └── logger.py
├── Dockerfile
├── docker-compose.yml
├── nginx.conf
├── requirements.txt
└── .env.example

最小启动命令:

docker compose up -d --build

测试命令:

curl -X POST http://localhost:8000/api/v1/generate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer change-this-token" \
  -d '{"prompt":"请介绍 AI 工具生产环境部署的关键点"}'

二十三、总结

AI 工具从 Demo 到生产环境,核心差距并不在“能不能调用模型”,而在“能不能稳定、安全、可控、可维护地提供服务”。

一个合格的生产级 AI 工具至少要做到:

  • 配置不写死;
  • 密钥不暴露;
  • 接口有鉴权;
  • 请求有限流;
  • 模型调用有超时;
  • 异常有兜底;
  • 日志可追踪;
  • 服务可健康检查;
  • 部署可容器化;
  • 成本可控制。

本文给出的 FastAPI 示例虽然不复杂,但已经覆盖了 AI 工具生产部署的关键基础设施。你可以在此基础上继续扩展用户系统、Redis 限流、数据库审计、RAG 知识库、多模型路由、异步任务和监控告警,逐步演进为真正可商业化运行的 AI 平台。

如果你正在把一个 AI Demo 推向线上,建议不要急于堆功能,而是先把部署、安全、限流、日志和成本控制做好。因为生产环境中,稳定性和可控性往往比模型能力本身更重要。

目录结构
全文