AI Agent 生产部署与工程化
生产部署涉及可靠性、可扩展性、成本控制等多个方面。
工程化实践确保系统稳定运行并便于维护。
生产部署架构
生产环境对系统有更高的要求。
需要考虑可靠性、可扩展性、监控告警等多个方面。
部署模式
单机部署
适合开发和测试环境。
简单易部署,但无法应对生产级流量。
分布式部署
适合生产环境,需要考虑多个方面。
负载均衡:分发请求到多个实例。
服务发现:动态管理实例列表。
状态管理:处理分布式状态一致性问题。
容错处理:单点故障不影响整体服务。
容器化部署
Dockerfile 示例
# 基于 Python 3.11 镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 创建非 root 用户(安全考虑)
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "agent.py"]
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 创建非 root 用户(安全考虑)
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "agent.py"]
Kubernetes 部署
Kubernetes Deployment 配置
span style="color: green;">
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent
labels:
app: ai-agent
spec:
# 副本数
replicas: 3
selector:
matchLabels:
app: ai-agent
template:
metadata:
labels:
app: ai-agent
spec:
containers:
- name: agent
image: your-registry/ai-agent:latest
ports:
- containerPort: 8000
# 资源限制
resources:
limits:
memory: "2Gi"
cpu: "1"
requests:
memory: "1Gi"
cpu: "0.5"
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: ai-agent-service
spec:
selector:
app: ai-agent
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent
labels:
app: ai-agent
spec:
# 副本数
replicas: 3
selector:
matchLabels:
app: ai-agent
template:
metadata:
labels:
app: ai-agent
spec:
containers:
- name: agent
image: your-registry/ai-agent:latest
ports:
- containerPort: 8000
# 资源限制
resources:
limits:
memory: "2Gi"
cpu: "1"
requests:
memory: "1Gi"
cpu: "0.5"
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: ai-agent-service
spec:
selector:
app: ai-agent
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
成本控制
Agent 系统的成本主要来自 LLM API 调用。
优化成本是生产部署的重要课题。
Token 优化策略
提示词压缩:精简提示词,减少不必要的文字。
上下文截断:只保留关键的上下文内容。
缓存响应:对相同或相似查询缓存响应。
代码实现
成本优化 Agent 实现
import hashlib
import json
from functools import lru_cache
class CostOptimizedAgent:
"""
成本优化的 Agent
通过缓存和压缩减少 API 调用成本
"""
def __init__(self, base_agent, cache, embedder=None):
# 基础 Agent
self.base_agent = base_agent
# 缓存存储
self.cache = cache
# 嵌入器(用于相似度缓存匹配)
self.embedder = embedder
def process(self, request):
"""
处理请求,包含成本优化逻辑
"""
# 生成请求指纹
request_fingerprint = self.generate_fingerprint(request)
# 检查精确缓存
cached_result = self.cache.get(request_fingerprint)
if cached_result:
return {
**cached_result,
"from_cache": True
}
# 如果有嵌入器,检查语义相似缓存
if self.embedder:
similar = self.find_similar_cached(request)
if similar:
return {
**similar,
"from_cache": True,
"similar_to": similar.get("request_id")
}
# 执行请求
result = self.base_agent.process(request)
# 缓存结果
self.cache.set(
request_fingerprint,
result,
ttl=3600 # 1 小时过期
)
return {
**result,
"from_cache": False
}
def generate_fingerprint(self, request):
"""
生成请求指纹
用于精确缓存匹配
"""
content = json.dumps(request, sort_keys=True)
return hashlib.sha256(content.encode()).hexdigest()
def find_similar_cached(self, request, threshold=0.95):
"""
查找语义相似的缓存结果
使用嵌入向量的余弦相似度
"""
if not self.embedder:
return None
# 将请求向量化
request_vector = self.embedder.embed([str(request)])[0]
# 在缓存中搜索相似请求
best_match = None
best_similarity = 0
for cached in self.cache.get_all():
cached_vector = cached["vector"]
similarity = cosine_similarity(request_vector, cached_vector)
if similarity > best_similarity and similarity >= threshold:
best_similarity = similarity
best_match = cached
return best_match
class ResponseCache:
"""
响应缓存
简单的内存缓存实现
生产环境可使用 Redis
"""
def __init__(self):
self.cache = {}
self.timestamps = {}
def get(self, key):
"""获取缓存"""
if key in self.cache:
# 检查是否过期
if self.is_expired(key):
self.delete(key)
return None
return self.cache[key]
return None
def set(self, key, value, ttl=3600):
"""设置缓存"""
self.cache[key] = value
self.timestamps[key] = time.time(
import json
from functools import lru_cache
class CostOptimizedAgent:
"""
成本优化的 Agent
通过缓存和压缩减少 API 调用成本
"""
def __init__(self, base_agent, cache, embedder=None):
# 基础 Agent
self.base_agent = base_agent
# 缓存存储
self.cache = cache
# 嵌入器(用于相似度缓存匹配)
self.embedder = embedder
def process(self, request):
"""
处理请求,包含成本优化逻辑
"""
# 生成请求指纹
request_fingerprint = self.generate_fingerprint(request)
# 检查精确缓存
cached_result = self.cache.get(request_fingerprint)
if cached_result:
return {
**cached_result,
"from_cache": True
}
# 如果有嵌入器,检查语义相似缓存
if self.embedder:
similar = self.find_similar_cached(request)
if similar:
return {
**similar,
"from_cache": True,
"similar_to": similar.get("request_id")
}
# 执行请求
result = self.base_agent.process(request)
# 缓存结果
self.cache.set(
request_fingerprint,
result,
ttl=3600 # 1 小时过期
)
return {
**result,
"from_cache": False
}
def generate_fingerprint(self, request):
"""
生成请求指纹
用于精确缓存匹配
"""
content = json.dumps(request, sort_keys=True)
return hashlib.sha256(content.encode()).hexdigest()
def find_similar_cached(self, request, threshold=0.95):
"""
查找语义相似的缓存结果
使用嵌入向量的余弦相似度
"""
if not self.embedder:
return None
# 将请求向量化
request_vector = self.embedder.embed([str(request)])[0]
# 在缓存中搜索相似请求
best_match = None
best_similarity = 0
for cached in self.cache.get_all():
cached_vector = cached["vector"]
similarity = cosine_similarity(request_vector, cached_vector)
if similarity > best_similarity and similarity >= threshold:
best_similarity = similarity
best_match = cached
return best_match
class ResponseCache:
"""
响应缓存
简单的内存缓存实现
生产环境可使用 Redis
"""
def __init__(self):
self.cache = {}
self.timestamps = {}
def get(self, key):
"""获取缓存"""
if key in self.cache:
# 检查是否过期
if self.is_expired(key):
self.delete(key)
return None
return self.cache[key]
return None
def set(self, key, value, ttl=3600):
"""设置缓存"""
self.cache[key] = value
self.timestamps[key] = time.time(