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

从本地 Demo 到稳定上线:AI Agent 生产部署全流程实战手册

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

AI Agent 生产环境部署指南|附完整命令

随着大模型能力的快速提升,AI Agent(智能体)已经从“Demo 演示”逐渐进入真实业务场景:客服自动化、企业知识库问答、数据分析助手、运维机器人、自动代码审查、销售线索跟进等。
但从本地跑通一个 Agent,到真正部署到生产环境,中间存在大量工程问题:服务稳定性、权限隔离、日志追踪、成本控制、模型调用失败重试、向量数据库持久化、API 安全、灰度发布、监控告警等。

本文将以一个典型的 Python + FastAPI + LangChain/LangGraph + PostgreSQL + Redis + 向量数据库 + Nginx + Docker Compose 架构为例,完整讲解 AI Agent 的生产环境部署流程,并附上常用命令,帮助你从零搭建一个可上线、可维护、可扩展的 AI Agent 服务。


一、生产环境中的 AI Agent 架构

一个可用于生产环境的 AI Agent,通常不只是一个简单的 Prompt 调用大模型,而是由多个模块组成:

用户请求
   ↓
Nginx / API Gateway
   ↓
FastAPI Agent 服务
   ↓
任务编排 / Agent Runtime
   ↓
LLM Provider / 本地模型
   ↓
工具调用 / RAG / 数据库 / 外部 API
   ↓
结果返回

常见核心组件如下:

模块 作用
FastAPI / Flask / Node.js 对外提供 HTTP API
Agent Framework 如 LangChain、LangGraph、AutoGen、CrewAI
LLM 服务 OpenAI、Claude、DeepSeek、Qwen、GLM、本地 Ollama/vLLM
向量数据库 Milvus、Qdrant、Weaviate、pgvector、Chroma
Redis 缓存、会话状态、限流、任务队列
PostgreSQL / MySQL 用户数据、任务记录、调用日志
Nginx 反向代理、HTTPS、负载均衡
Docker Compose / Kubernetes 容器化部署
Prometheus / Grafana 监控与告警
ELK / Loki 日志收集与分析

二、服务器准备

本文以 Ubuntu 22.04 LTS 服务器为例,建议生产环境至少配置:

  • CPU:4 核及以上
  • 内存:8GB 及以上
  • 磁盘:100GB SSD 起步
  • 系统:Ubuntu 22.04 LTS
  • 网络:开放 80、443 端口
  • 如果部署本地大模型,建议使用 GPU 服务器

登录服务器:

ssh root@your_server_ip

更新系统:

apt update && apt upgrade -y

安装常用工具:

apt install -y \
  curl \
  wget \
  git \
  vim \
  unzip \
  htop \
  net-tools \
  ca-certificates \
  gnupg \
  lsb-release \
  software-properties-common

设置服务器时区:

timedatectl set-timezone Asia/Shanghai
timedatectl

创建应用目录:

mkdir -p /opt/ai-agent
cd /opt/ai-agent

三、安装 Docker 与 Docker Compose

生产环境推荐使用容器化部署,这样可以降低环境差异带来的问题,也方便后续升级和回滚。

安装 Docker:

curl -fsSL https://get.docker.com | bash

启动 Docker:

systemctl enable docker
systemctl start docker

查看 Docker 版本:

docker --version

安装 Docker Compose 插件:

apt install -y docker-compose-plugin

查看 Compose 版本:

docker compose version

如果希望当前用户免 sudo 使用 Docker:

usermod -aG docker $USER

重新登录后生效。


四、项目目录结构设计

一个生产级 AI Agent 项目,建议目录结构如下:

ai-agent/
├── app/
│   ├── main.py
│   ├── config.py
│   ├── agent/
│   │   ├── graph.py
│   │   ├── tools.py
│   │   └── prompts.py
│   ├── api/
│   │   └── routes.py
│   ├── db/
│   │   ├── session.py
│   │   └── models.py
│   ├── services/
│   │   ├── llm.py
│   │   ├── memory.py
│   │   └── vectorstore.py
│   └── utils/
│       └── logger.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
├── nginx/
│   └── default.conf
└── logs/

创建目录:

mkdir -p app/agent app/api app/db app/services app/utils nginx logs
touch app/main.py app/config.py
touch app/agent/graph.py app/agent/tools.py app/agent/prompts.py
touch app/api/routes.py
touch app/db/session.py app/db/models.py
touch app/services/llm.py app/services/memory.py app/services/vectorstore.py
touch app/utils/logger.py
touch requirements.txt Dockerfile docker-compose.yml .env nginx/default.conf

五、编写基础 FastAPI 服务

安装依赖文件 requirements.txt

fastapi==0.115.0
uvicorn[standard]==0.30.6
pydantic==2.8.2
pydantic-settings==2.4.0
python-dotenv==1.0.1
httpx==0.27.2
redis==5.0.8
psycopg2-binary==2.9.9
sqlalchemy==2.0.34
langchain==0.2.16
langchain-openai==0.1.23
langgraph==0.2.19
qdrant-client==1.11.1
tenacity==9.0.0
loguru==0.7.2

编写配置文件 app/config.py

from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    APP_NAME: str = "AI Agent Service"
    APP_ENV: str = "production"
    API_KEY: str

    OPENAI_API_KEY: str
    OPENAI_BASE_URL: str = "https://api.openai.com/v1"
    MODEL_NAME: str = "gpt-4o-mini"

    POSTGRES_HOST: str = "postgres"
    POSTGRES_PORT: int = 5432
    POSTGRES_DB: str = "agent_db"
    POSTGRES_USER: str = "agent_user"
    POSTGRES_PASSWORD: str

    REDIS_HOST: str = "redis"
    REDIS_PORT: int = 6379

    QDRANT_HOST: str = "qdrant"
    QDRANT_PORT: int = 6333

    class Config:
        env_file = ".env"


settings = Settings()

编写入口文件 app/main.py

from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel
from app.config import settings
from app.services.llm import ask_llm

app = FastAPI(title=settings.APP_NAME)


class ChatRequest(BaseModel):
    user_id: str
    message: str


class ChatResponse(BaseModel):
    answer: str


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


@app.post("/api/chat", response_model=ChatResponse)
async def chat(req: ChatRequest, x_api_key: str = Header(default="")):
    if x_api_key != settings.API_KEY:
        raise HTTPException(status_code=401, detail="Invalid API Key")

    answer = await ask_llm(req.message)
    return ChatResponse(answer=answer)

编写 LLM 调用服务 app/services/llm.py

from langchain_openai import ChatOpenAI
from app.config import settings
from tenacity import retry, stop_after_attempt, wait_exponential


def get_llm():
    return ChatOpenAI(
        model=settings.MODEL_NAME,
        api_key=settings.OPENAI_API_KEY,
        base_url=settings.OPENAI_BASE_URL,
        temperature=0.2,
        timeout=30,
        max_retries=2,
    )


@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential(multiplier=1, min=2, max=10)
)
async def ask_llm(message: str) -> str:
    llm = get_llm()
    response = await llm.ainvoke([
        ("system", "你是一个严谨、可靠的企业级 AI Agent。"),
        ("human", message)
    ])
    return response.content

六、配置环境变量

创建 .env 文件:

vim .env

写入以下内容:

APP_NAME=AI Agent Service
APP_ENV=production

API_KEY=replace_with_your_internal_api_key

OPENAI_API_KEY=replace_with_your_llm_api_key
OPENAI_BASE_URL=https://api.openai.com/v1
MODEL_NAME=gpt-4o-mini

POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=agent_db
POSTGRES_USER=agent_user
POSTGRES_PASSWORD=replace_with_strong_password

REDIS_HOST=redis
REDIS_PORT=6379

QDRANT_HOST=qdrant
QDRANT_PORT=6333

注意:生产环境中 .env 不应提交到 Git 仓库。可以添加 .gitignore

cat > .gitignore <

七、编写 Dockerfile

在项目根目录创建 Dockerfile

FROM python:3.11-slim

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

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

COPY requirements.txt .

RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

COPY . .

EXPOSE 8000

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

如果你在海外服务器上部署,可以改为默认 PyPI:

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

八、编写 Docker Compose 配置

创建 docker-compose.yml

services:
  ai-agent:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ai-agent
    restart: always
    env_file:
      - .env
    ports:
      - "8000:8000"
    volumes:
      - ./logs:/app/logs
    depends_on:
      - postgres
      - redis
      - qdrant
    networks:
      - agent-net

  postgres:
    image: postgres:16
    container_name: agent-postgres
    restart: always
    environment:
      POSTGRES_DB: agent_db
      POSTGRES_USER: agent_user
      POSTGRES_PASSWORD: replace_with_strong_password
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - agent-net

  redis:
    image: redis:7
    container_name: agent-redis
    restart: always
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"
    networks:
      - agent-net

  qdrant:
    image: qdrant/qdrant:v1.11.5
    container_name: agent-qdrant
    restart: always
    volumes:
      - qdrant-data:/qdrant/storage
    ports:
      - "6333:6333"
      - "6334:6334"
    networks:
      - agent-net

networks:
  agent-net:
    driver: bridge

volumes:
  postgres-data:
  redis-data:
  qdrant-data:

建议将 PostgreSQL、Redis、Qdrant 的端口只暴露给内网或干脆不暴露到宿主机,生产环境可以改成:

ports: []

或删除对应 ports 配置,仅允许容器内部访问。


九、启动 AI Agent 服务

构建镜像:

docker compose build

启动服务:

docker compose up -d

查看容器状态:

docker compose ps

查看日志:

docker compose logs -f ai-agent

测试健康检查接口:

curl http://127.0.0.1:8000/health

正常返回:

{
  "status": "ok",
  "service": "AI Agent Service",
  "env": "production"
}

测试聊天接口:

curl -X POST http://127.0.0.1:8000/api/chat \
  -H "Content-Type: application/json" \
  -H "X-API-Key: replace_with_your_internal_api_key" \
  -d '{
    "user_id": "u001",
    "message": "请介绍一下什么是 AI Agent"
  }'

十、配置 Nginx 反向代理

生产环境不建议直接暴露 8000 端口,而是通过 Nginx 暴露 80/443。

安装 Nginx:

apt install -y nginx

创建配置文件:

vim /etc/nginx/sites-available/ai-agent.conf

写入:

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

    client_max_body_size 20m;

    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_read_timeout 300;
        proxy_connect_timeout 60;
        proxy_send_timeout 300;
    }
}

启用站点:

ln -s /etc/nginx/sites-available/ai-agent.conf /etc/nginx/sites-enabled/

检查配置:

nginx -t

重载 Nginx:

systemctl reload nginx

访问:

curl http://agent.example.com/health

十一、配置 HTTPS 证书

生产环境必须启用 HTTPS。推荐使用 Certbot 申请 Let’s Encrypt 免费证书。

安装 Certbot:

apt install -y certbot python3-certbot-nginx

申请证书:

certbot --nginx -d agent.example.com

查看证书自动续期状态:

systemctl status certbot.timer

手动测试续期:

certbot renew --dry-run

HTTPS 测试:

curl https://agent.example.com/health

十二、日志与可观测性

AI Agent 生产环境中,日志非常重要。你需要记录:

  • 用户请求 ID
  • 用户 ID
  • 请求时间
  • 模型名称
  • Token 消耗
  • 工具调用记录
  • 向量检索结果
  • 错误堆栈
  • 响应耗时
  • 失败重试次数

示例日志工具 app/utils/logger.py

from loguru import logger

logger.add(
    "logs/app.log",
    rotation="100 MB",
    retention="30 days",
    encoding="utf-8"
)

app_logger = logger

在业务代码中使用:

from app.utils.logger import app_logger

app_logger.info("Agent request received")
app_logger.error("LLM call failed")

查看日志:

tail -f logs/app.log

查看 Docker 日志:

docker logs -f ai-agent

清理无用 Docker 日志和镜像:

docker system prune -f

十三、Redis 用于会话与缓存

AI Agent 常常需要保存短期上下文,例如多轮对话状态。Redis 可以用于:

  • 会话缓存
  • 限流计数
  • 工具调用结果缓存
  • 异步任务状态
  • 防重复请求

安装 Redis 依赖已经包含在 requirements.txt 中。示例代码:

import redis
from app.config import settings

redis_client = redis.Redis(
    host=settings.REDIS_HOST,
    port=settings.REDIS_PORT,
    db=0,
    decode_responses=True
)


def save_session(user_id: str, message: str):
    key = f"session:{user_id}"
    redis_client.rpush(key, message)
    redis_client.expire(key, 3600)


def get_session(user_id: str):
    key = f"session:{user_id}"
    return redis_client.lrange(key, 0, -1)

进入 Redis 容器:

docker exec -it agent-redis redis-cli

查看 key:

keys *

查看某个会话:

lrange session:u001 0 -1

十四、向量数据库与 RAG 部署

如果你的 AI Agent 需要企业知识库问答,就需要 RAG(Retrieval-Augmented Generation,检索增强生成)。
常见流程是:

文档上传
   ↓
文本切分
   ↓
Embedding 向量化
   ↓
写入向量数据库
   ↓
用户提问
   ↓
向量检索
   ↓
拼接上下文
   ↓
调用大模型生成答案

Qdrant 已经在 Compose 中启动,可以测试:

curl http://127.0.0.1:6333/collections

创建集合示例:

curl -X PUT http://127.0.0.1:6333/collections/company_docs \
  -H "Content-Type: application/json" \
  -d '{
    "vectors": {
      "size": 1536,
      "distance": "Cosine"
    }
  }'

查看集合:

curl http://127.0.0.1:6333/collections/company_docs

如果使用不同 Embedding 模型,size 需要根据模型维度调整。例如:

Embedding 模型 向量维度
OpenAI text-embedding-3-small 1536
OpenAI text-embedding-3-large 3072
BGE-small-zh 512
BGE-base-zh 768
BGE-large-zh 1024

十五、数据库初始化与数据持久化

PostgreSQL 用于保存业务数据,例如:

  • 用户信息
  • 会话记录
  • Agent 执行轨迹
  • 工具调用日志
  • 任务状态
  • 账单与 Token 消耗

进入 PostgreSQL 容器:

docker exec -it agent-postgres psql -U agent_user -d agent_db

创建示例表:

CREATE TABLE agent_requests (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(128) NOT NULL,
    message TEXT NOT NULL,
    answer TEXT,
    model_name VARCHAR(128),
    latency_ms INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

查看表:

\dt

退出:

\q

备份数据库:

docker exec agent-postgres pg_dump -U agent_user agent_db > backup_agent_db.sql

恢复数据库:

cat backup_agent_db.sql | docker exec -i agent-postgres psql -U agent_user -d agent_db

十六、接口安全与权限控制

生产环境中的 AI Agent 必须做好安全控制。至少需要考虑以下几点:

1. API Key 鉴权

本文示例已通过 X-API-Key 做了基础鉴权。但真实生产环境中,建议使用:

  • JWT
  • OAuth2
  • 企业 SSO
  • 内部网关签名
  • IP 白名单

2. 限流

可以在 Nginx 层添加限流:

limit_req_zone $binary_remote_addr zone=agent_limit:10m rate=10r/s;

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

    location / {
        limit_req zone=agent_limit burst=20 nodelay;
        proxy_pass http://127.0.0.1:8000;
    }
}

检查并重载:

nginx -t
systemctl reload nginx

3. Prompt 注入防护

AI Agent 容易受到 Prompt Injection 攻击,例如用户要求模型“忽略之前的系统提示词”。应采取:

  • 系统提示词与用户输入严格分离
  • 工具调用权限校验
  • 敏感操作二次确认
  • 不让模型直接拼接 SQL
  • 对外部网页内容进行不可信标记
  • 对工具参数做 schema 校验

4. 敏感信息保护

不要把以下内容直接传给模型:

  • 用户身份证号
  • 手机号
  • 银行卡
  • 内部密钥
  • 数据库密码
  • 未脱敏客户数据

十七、生产环境性能优化

AI Agent 服务的性能瓶颈通常来自模型调用,而不是 Web 框架本身。常见优化方式包括:

1. 设置超时

ChatOpenAI(
    timeout=30,
    max_retries=2
)

2. 使用缓存

对于重复问题,可以缓存回答:

问题 Hash → Redis → 命中则直接返回

3. 降低上下文长度

不要把所有历史对话都塞进模型,应使用:

  • 滑动窗口
  • 摘要记忆
  • 长期记忆检索
  • 用户画像压缩

4. 并发控制

如果模型 API 有速率限制,需要限制并发请求。可以使用队列或信号量。

5. 模型分级

不同任务使用不同模型:

任务 推荐模型
简单问答 小模型
意图识别 小模型
文档总结 中模型
复杂推理 大模型
代码生成 专用代码模型

这样可以显著降低成本。


十八、部署本地模型:Ollama 示例

如果你希望将模型部署在本地,可以使用 Ollama。

安装 Ollama:

curl -fsSL https://ollama.com/install.sh | sh

启动服务:

systemctl enable ollama
systemctl start ollama

拉取模型:

ollama pull qwen2.5:7b

测试模型:

ollama run qwen2.5:7b

调用 API:

curl http://127.0.0.1:11434/api/generate \
  -d '{
    "model": "qwen2.5:7b",
    "prompt": "请解释什么是 AI Agent",
    "stream": false
  }'

如果 FastAPI 容器要访问宿主机 Ollama,可以将 OPENAI_BASE_URL 替换为兼容接口,或使用支持 Ollama 的 LangChain 组件。


十九、服务升级与回滚

上线后经常需要发布新版本。推荐流程:

git pull origin main
docker compose build ai-agent
docker compose up -d ai-agent
docker compose logs -f ai-agent

如果新版本出现问题,可以回滚到上一个 Git 版本:

git log --oneline
git checkout 
docker compose build ai-agent
docker compose up -d ai-agent

查看服务是否正常:

curl https://agent.example.com/health

二十、常用运维命令汇总

查看所有容器:

docker ps -a

重启 AI Agent:

docker compose restart ai-agent

停止所有服务:

docker compose down

停止并删除数据卷,谨慎使用:

docker compose down -v

查看资源占用:

docker stats

查看端口占用:

netstat -tunlp

或:

ss -tunlp

查看磁盘空间:

df -h

查看目录大小:

du -sh /opt/ai-agent/*

查看系统内存:

free -h

查看 CPU 负载:

top

查看最近系统日志:

journalctl -xe

查看 Nginx 日志:

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

二十一、生产环境上线检查清单

上线前建议逐项确认:

  • [ ] 服务已容器化部署
  • [ ] .env 未提交到 Git
  • [ ] API 已开启鉴权
  • [ ] HTTPS 已配置
  • [ ] Nginx 已设置超时和限流
  • [ ] 数据库和向量库已持久化
  • [ ] 日志已落盘
  • [ ] 模型调用已设置超时和重试
  • [ ] 敏感信息已脱敏
  • [ ] 工具调用有权限校验
  • [ ] 数据库已配置备份策略
  • [ ] Redis 不对公网暴露
  • [ ] PostgreSQL 不对公网暴露
  • [ ] Qdrant 不对公网暴露
  • [ ] 已配置健康检查接口
  • [ ] 已准备回滚方案
  • [ ] 已进行压力测试

二十二、总结

AI Agent 的生产环境部署,重点不在于“能不能调用大模型”,而在于是否具备稳定、安全、可观测、可维护的工程能力。一个真正可上线的 AI Agent 至少需要解决以下问题:

  1. 服务化:通过 FastAPI 等框架提供标准 API;
  2. 容器化:使用 Docker Compose 或 Kubernetes 管理服务;
  3. 数据持久化:PostgreSQL、Redis、向量数据库都要做好持久化;
  4. 安全控制:API 鉴权、限流、Prompt 注入防护、敏感信息脱敏;
  5. 可观测性:日志、监控、调用链、Token 成本追踪;
  6. 稳定性:超时、重试、降级、缓存、回滚机制;
  7. 成本优化:模型分级、缓存、减少上下文长度、控制并发。

如果你的 AI Agent 只是内部小范围使用,Docker Compose 已经足够;如果面向大量用户或复杂业务场景,建议进一步升级到 Kubernetes,并引入 Prometheus、Grafana、Loki、Jaeger 等完整可观测体系。

最终,一个优秀的 AI Agent 不是“Prompt 写得好”就够了,而是需要模型能力、业务逻辑、系统架构和工程治理共同配合。只有这样,Agent 才能从实验室走向真正的生产环境。

目录结构
全文